수온 센서마다 주소 값이 다르므로 반드시 스캔하여 확인이 필요
원와이어 통신을 이용하여 수온센서를 연결
모든 센서를 같은 물속에 두고 동시에 측정하여 온도 보정이 필요
/* 각 온도센서 주소
주소 스캔은 DallasTemperature라이브러리 예제에서 하나씩 연결하며 확인, 확인 후 센서에 표시
1번 { 0x28, 0xCE, 0x4E, 0x43, 0xD4, 0x5E, 0x74, 0x04 }
2번 { 0x28, 0x03, 0x86, 0x43, 0xD4, 0xB5, 0x16, 0x42 }
3번 { 0x28, 0x9B, 0x5B, 0x46, 0xD4, 0x5E, 0x2C, 0xF7 }
4번 { 0x28, 0xB1, 0x8E, 0x43, 0xD4, 0xEC, 0x02, 0x2C }
5번 { 0x28, 0x49, 0xB8, 0x43, 0xD4, 0xC8, 0x50, 0x7A }
6번 { 0x28, 0x64, 0xEC, 0x43, 0xD4, 0xD0, 0x50, 0x96 }
*/
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
// DS18B20 데이터 핀을 Arduino 디지털 핀 2번과 3번에 연결
#define ONE_WIRE_BUS 2
// OneWire 객체 생성
OneWire oneWire(ONE_WIRE_BUS);
// DallasTemperature 라이브러리 객체 생성
DallasTemperature sensors(&oneWire);
// DS18B20 센서 주소 (여기에 각 센서의 고유 주소를 입력)
DeviceAddress sensor1 = { 0x28, 0xCE, 0x4E, 0x43, 0xD4, 0x5E, 0x74, 0x04 };
DeviceAddress sensor2 = { 0x28, 0x03, 0x86, 0x43, 0xD4, 0xB5, 0x16, 0x42 };
DeviceAddress sensor3 = { 0x28, 0x9B, 0x5B, 0x46, 0xD4, 0x5E, 0x2C, 0xF7 };
// DeviceAddress sensor4 = { 0x28, 0xB1, 0x8E, 0x43, 0xD4, 0xEC, 0x02, 0x2C };
// DeviceAddress sensor5 = { 0x28, 0x49, 0xB8, 0x43, 0xD4, 0xC8, 0x50, 0x7A };
// DeviceAddress sensor6 = { 0x28, 0x64, 0xEC, 0x43, 0xD4, 0xD0, 0x50, 0x96 };
// I2C LCD 객체 생성 (LCD I2C 주소: 0x27, LCD 크기: 16x2)
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
// 시리얼 통신 시작
Serial.begin(9600);
// 센서 시작
sensors.begin();
// LCD 초기화
lcd.begin(20, 4); // 16x2 LCD
lcd.backlight();
// 센서 주소 확인
if (!sensors.isConnected(sensor1)) Serial.println("Sensor 1 not found!");
if (!sensors.isConnected(sensor2)) Serial.println("Sensor 2 not found!");
if (!sensors.isConnected(sensor3)) Serial.println("Sensor 3 not found!");
}
void loop() {
// 온도 센서 업데이트
sensors.requestTemperatures();
// 센서 1 온도 읽기
float tempC1 = sensors.getTempC(sensor1);
// 센서 2 온도 읽기
float tempC2 = sensors.getTempC(sensor2);
// 센서 3 온도 읽기
float tempC3 = sensors.getTempC(sensor3);
float forTime = millis()/1000; // 온도계 작동 경과시간 표현하기 위한 시간 계산. 초 단위로 표현
// 시리얼 모니터 출력
Serial.print("Sensor 1: ");
Serial.print(tempC1,1);
Serial.print(" , Sensor 2: ");
Serial.print(tempC2,1);
Serial.print(" , Sensor 3: ");
Serial.println(tempC3,1);
// LCD 출력
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Timer: "); //타이머에 작동 이후 경과시간을 분과 초로 표시
lcd.print(forTime/60);
lcd.print(":");
lcd.print(forTime%60);
lcd.setCursor(0, 1); // 첫 번째 줄 첫 번째 위치
lcd.print("S1: ");
lcd.print(tempC1+0.4,1); // 온도 보정값 적용
lcd.setCursor(0, 2);
lcd.print("S2: ");
lcd.print(tempC2,1);
lcd.setCursor(0, 3);
lcd.print("S3: ");
lcd.print(tempC3-0.4,1); // 온도 보정값 적용
// 2초마다 갱신
delay(5000);
}
수온 센서마다 주소 값이 다르므로 반드시 스캔하여 확인이 필요
원와이어 통신을 이용하여 수온센서를 연결. 3개씩 2그룹으로 연결
모든 센서를 같은 물속에 두고 동시에 측정하여 온도 보정이 필요
/* 각 온도센서 주소
주소 스캔은 DallasTemperature라이브러리 예제에서 하나씩 연결하며 확인
1번 { 0x28, 0xCE, 0x4E, 0x43, 0xD4, 0x5E, 0x74, 0x04 }
2번 { 0x28, 0x03, 0x86, 0x43, 0xD4, 0xB5, 0x16, 0x42 }
3번 { 0x28, 0x9B, 0x5B, 0x46, 0xD4, 0x5E, 0x2C, 0xF7 }
4번 { 0x28, 0xB1, 0x8E, 0x43, 0xD4, 0xEC, 0x02, 0x2C }
5번 { 0x28, 0x49, 0xB8, 0x43, 0xD4, 0xC8, 0x50, 0x7A }
6번 { 0x28, 0x64, 0xEC, 0x43, 0xD4, 0xD0, 0x50, 0x96 }
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// DS18B20 데이터 핀을 Arduino 디지털 핀 2번과 3번에 연결
#define ONE_WIRE_BUS_1 2
#define ONE_WIRE_BUS_2 3
// OneWire 객체 생성
OneWire oneWire1(ONE_WIRE_BUS_1);
OneWire oneWire2(ONE_WIRE_BUS_2);
// DallasTemperature 라이브러리 객체 생성
DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);
// DS18B20 센서 주소 (여기에 각 센서의 고유 주소를 입력)
DeviceAddress sensor1 = { 0x28, 0xCE, 0x4E, 0x43, 0xD4, 0x5E, 0x74, 0x04 }; // 데이터 핀 2번에 연결된 첫 번째 센서
DeviceAddress sensor2 = { 0x28, 0x03, 0x86, 0x43, 0xD4, 0xB5, 0x16, 0x42 }; // 데이터 핀 2번에 연결된 두 번째 센서
DeviceAddress sensor3 = { 0x28, 0x9B, 0x5B, 0x46, 0xD4, 0x5E, 0x2C, 0xF7 }; // 데이터 핀 2번에 연결된 세 번째 센서
DeviceAddress sensor4 = { 0x28, 0xB1, 0x8E, 0x43, 0xD4, 0xEC, 0x02, 0x2C }; // 데이터 핀 3번에 연결된 첫 번째 센서
DeviceAddress sensor5 = { 0x28, 0x49, 0xB8, 0x43, 0xD4, 0xC8, 0x50, 0x7A }; // 데이터 핀 3번에 연결된 두 번째 센서
DeviceAddress sensor6 = { 0x28, 0x64, 0xEC, 0x43, 0xD4, 0xD0, 0x50, 0x96 }; // 데이터 핀 3번에 연결된 세 번째 센서
// I2C LCD 객체 생성 (LCD I2C 주소: 0x27, LCD 크기: 16x2)
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
// 시리얼 통신 시작
Serial.begin(9600);
// 센서 시작
sensors1.begin();
sensors2.begin();
// LCD 초기화
lcd.begin();
lcd.backlight();
// 센서 주소 확인
if (!sensors1.isConnected(sensor1)) Serial.println("Sensor 1 not found on pin 2!");
if (!sensors1.isConnected(sensor2)) Serial.println("Sensor 2 not found on pin 2!");
if (!sensors1.isConnected(sensor3)) Serial.println("Sensor 3 not found on pin 2!");
if (!sensors2.isConnected(sensor4)) Serial.println("Sensor 4 not found on pin 3!");
if (!sensors2.isConnected(sensor5)) Serial.println("Sensor 5 not found on pin 3!");
if (!sensors2.isConnected(sensor6)) Serial.println("Sensor 6 not found on pin 3!");
}
void loop() {
// 온도 센서 업데이트
sensors1.requestTemperatures();
sensors2.requestTemperatures();
// 센서 1 온도 읽기 (핀 2)
float tempC1 = sensors1.getTempC(sensor1);
// 센서 2 온도 읽기 (핀 2)
float tempC2 = sensors1.getTempC(sensor2);
// 센서 3 온도 읽기 (핀 2)
float tempC3 = sensors1.getTempC(sensor3);
// 센서 4 온도 읽기 (핀 3)
float tempC4 = sensors2.getTempC(sensor4);
// 센서 5 온도 읽기 (핀 3)
float tempC5 = sensors2.getTempC(sensor5);
// 센서 6 온도 읽기 (핀 3)
float tempC6 = sensors2.getTempC(sensor6);
// 시리얼 모니터 출력
Serial.print("Sensor 1: ");
Serial.print(tempC1);
Serial.print(" C, Sensor 2: ");
Serial.print(tempC2);
Serial.print(" C, Sensor 3: ");
Serial.print(tempC3);
Serial.print(" C, Sensor 4: ");
Serial.print(tempC4);
Serial.print(" C, Sensor 5: ");
Serial.print(tempC5);
Serial.print(" C, Sensor 6: ");
Serial.print(tempC6);
Serial.println(" C");
// LCD 출력
lcd.clear();
lcd.setCursor(0, 0); // 첫 번째 줄 첫 번째 위치
lcd.print("S1: ");
lcd.print(tempC1);
lcd.setCursor(10, 0);
lcd.print("S2: ");
lcd.print(tempC2);
lcd.setCursor(0, 1);
lcd.print("S3: ");
lcd.print(tempC3);
lcd.setCursor(10, 1);
lcd.print("S4: ");
lcd.print(tempC4);
lcd.setCursor(0, 2);
lcd.print("S5: ");
lcd.print(tempC5);
lcd.setCursor(10, 1);
lcd.print("S6: ");
lcd.print(tempC6);
// 2초마다 갱신
delay(5000);
}
수온 센서마다 주소 값이 다르므로 반드시 스캔하여 확인이 필요
원와이어 통신을 이용하여 수온센서를 연결
하나씩 연결하여 주소 확인 후 기록 필수