I2C센서에 비해 상대적으로 저렴하고 가격대비 온도도 잘 측정되는 1-wire 온도 센서 DS18B20를 아두이노에 연결해봤습니다.
DS18B20은 -55°C에서 +125°C까지 온도 측정이 가능하며 -10°C에서 +85°C 사이 측정시 ±0.5°C 정확도를 가진다고 합니다.
자세한 사양은 아래 링크에 있는 데이터시트를 참고하세요.
http://elcodis.com/parts/5415153/DS18B20.html#datasheet
최초 작성 - 2015. 1. 21
마지막 업데이트 - 2019. 1. 23
하드웨어 연결
원래는 오른쪽 회로도처럼 저항을 연결해야 동작합니다.
라이브러리 설치
아래 링크에서 라이브러리를 다운로드 받아서 압축을 푼 후 폴더를 복사해서
https://github.com/grappendorf/arduino-framework/raw/master/3dparty/DallasTemperature_372Beta.zip
http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip
아래 경로에 각각 복사해 줍니다. 압축풀린 폴더 안에 같은 이름의 폴더가 또 있으니 확인을 하세요.
정상적으로 설치되었다면 Arduino IDE에서 다음처럼 라이브러리의 예제가 보입니다.
소스 코드
메뉴에서 파일 > 새파일을 선택하여 다음 코드를 복사해줍니다.
#include <OneWire.h> #include <DallasTemperature.h> //DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 3번에 연결합니다. #define ONE_WIRE_BUS 3 //1-wire 디바이스와 통신하기 위한 준비 OneWire oneWire(ONE_WIRE_BUS); // oneWire선언한 것을 sensors 선언시 참조함. DallasTemperature sensors(&oneWire); //다비아스 주소를 저장할 배열 선언 DeviceAddress insideThermometer; void setup(void) { //시리얼 포트 초기화 Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); //1-wire 버스 초기화 sensors.begin(); //발견한 디바이스 갯수 Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); // parasite power 모드일 때에는 2핀(GND와 DQ 핀)만 연결하면 됨. Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); //버스에서 첫번째 장치의 주소를 가져온다. if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); //버스에서 발견한 첫번째 장치의 주소 출력 Serial.print("Device 0 Address: "); printAddress(insideThermometer); Serial.println(); //데이터시트에서 확인결과 9~12비트까지 설정 가능 sensors.setResolution(insideThermometer, 10); Serial.print("Device 0 Resolution: "); Serial.print(sensors.getResolution(insideThermometer), DEC); Serial.println(); } // 온도를 출력하는 함수 void printTemperature(DeviceAddress deviceAddress) { //섭씨 온도를 가져옴 float tempC = sensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); //화씨 온도로 변환 Serial.println(DallasTemperature::toFahrenheit(tempC)); } //디바이스 주소를 출력하는 함수 void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } void loop(void) { Serial.print("Requesting temperatures..."); //sensors.requestTemperatures(); //연결되어 있는 전체 센서의 온도 값을 읽어옴 sensors.requestTemperaturesByIndex(0); //첫번째 센서의 온도값 읽어옴 Serial.println("DONE"); //센서에서 읽어온 온도를 출력 printTemperature(insideThermometer); } |
실행 결과
아두이노에 업로드한 후, 메뉴에서 툴 > 시리얼 모니터를 선택합니다.
손가락을 센서에 올려놓으면 온도가 올라가는 것을 확인할 수 있습니다.
Requesting temperatures...Dallas Temperature IC Control Library Demo Found 1 devices. Parasite power is: OFF Device 0 Address: 28FF96170600000C Device 0 Resolution: 10 Requesting temperatures...DONE Temp C: 27.25 Temp F: 81.05 Requesting temperatures...DONE Temp C: 27.25 Temp F: 81.05 Requesting temperatures...DONE Temp C: 27.75 Temp F: 81.95 Requesting temperatures...DONE Temp C: 28.00 Temp F: 82.40 Requesting temperatures...DONE Temp C: 28.25 Temp F: 82.85 Requesting temperatures...DONE Temp C: 28.50 Temp F: 83.30 Requesting temperatures...DONE Temp C: 28.75 Temp F: 83.75 Requesting temperatures...DONE Temp C: 29.00 Temp F: 84.20 Requesting temperatures...DONE Temp C: 29.00 Temp F: 84.20 Requesting temperatures...DONE Temp C: 29.25 Temp F: 84.65 Requesting temperatures...DONE Temp C: 29.50 Temp F: 85.10 Requesting temperatures...DONE Temp C: 29.50 Temp F: 85.10 Requesting temperatures...DONE Temp C: 29.75 Temp F: 85.55 Requesting temperatures...DONE Temp C: 29.75 Temp F: 85.55 Requesting temperatures...DONE Temp C: 30.00 Temp F: 86.00 Requesting temperatures...DONE Temp C: 30.00 Temp F: 86.00 Requesting temperatures...DONE Temp C: 30.25 Temp F: 86.45 Requesting temperatures...DONE Temp C: 30.25 Temp F: 86.45 Requesting temperatures...DONE Temp C: 30.50 Temp F: 86.90 Requesting temperatures...DONE Temp C: 30.50 Temp F: 86.90 Requesting temperatures...DONE Temp C: 30.50 Temp F: 86.90 Requesting temperatures...DONE Temp C: 30.75 Temp F: 87.35 Requesting temperatures...DONE Temp C: 30.75 Temp F: 87.35 Requesting temperatures...DONE Temp C: 30.75 Temp F: 87.35 Requesting temperatures...DONE Temp C: 31.00 Temp F: 87.80 Requesting temperatures...DONE Temp C: 31.00 Temp F: 87.80 Requesting temperatures...DONE Temp C: 31.00 Temp F: 87.80 Requesting temperatures...DONE Temp C: 31.00 Temp F: 87.80 Requesting temperatures...DONE Temp C: 31.25 Temp F: 88.25 Requesting temperatures...DONE Temp C: 31.25 Temp F: 88.25 Requesting temperatures...DONE Temp C: 31.25 Temp F: 88.25 Requesting temperatures...DONE Temp C: 31.25 Temp F: 88.25 Requesting temperatures...DONE Temp C: 31.25 Temp F: 88.25 Requesting temperatures...DONE Temp C: 31.25 Temp F: 88.25 Requesting temperatures...DONE Temp C: 31.25 Temp F: 88.25 Requesting temperatures...DONE Temp C: 31.00 Temp F: 87.80 Requesting temperatures...DONE Temp C: 31.00 Temp F: 87.80 Requesting temperatures...DONE Temp C: 31.00 Temp F: 87.80 |
코드에서 Resolution을 올리면 정확도가 올라가는 대신 온도를 가져오는 속도가 느려집니다. 9~12 사이의 숫자를 사용할 수 있습니다.
sensors.setResolution(insideThermometer, 10);
센서 2개 연결하는 방법
아두이노 3번핀에 두 개의 DS18B20 2번핀을 연결합니다.
다음 코드를 사용합니다.
#include <OneWire.h> #include <DallasTemperature.h> //DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 3번에 연결합니다. #define ONE_WIRE_BUS 3 //1-wire 디바이스와 통신하기 위한 준비 OneWire oneWire(ONE_WIRE_BUS); // oneWire선언한 것을 sensors 선언시 참조함. DallasTemperature sensors(&oneWire); //다비아스 주소를 저장할 배열 선언 DeviceAddress Thermometer1, Thermometer2; void setup(void) { //시리얼 포트 초기화 Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); //1-wire 버스 초기화 sensors.begin(); //발견한 디바이스 갯수 Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); // parasite power 모드일 때에는 2핀(GND와 DQ 핀)만 연결하면 됨. Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); //버스에서 첫번째 장치의 주소를 가져온다. if (!sensors.getAddress(Thermometer1, 0)) Serial.println("Unable to find address for Device 0"); //버스에서 발견한 첫번째 장치의 주소 출력 Serial.print("Device 0 Address: "); printAddress(Thermometer1); Serial.println(); //데이터시트에서 확인결과 9~12비트까지 설정 가능 sensors.setResolution(Thermometer2, 12); Serial.print("Device 0 Resolution: "); Serial.print(sensors.getResolution(Thermometer1), DEC); Serial.println(); //버스에서 두번째 장치의 주소를 가져온다. if (!sensors.getAddress(Thermometer2, 1)) Serial.println("Unable to find address for Device 1"); //버스에서 발견한 두번째 장치의 주소 출력 Serial.print("Device 1 Address: "); printAddress(Thermometer2); Serial.println(); //데이터시트에서 확인결과 9~12비트까지 설정 가능 sensors.setResolution(Thermometer2, 12); Serial.print("Device 1 Resolution: "); Serial.print(sensors.getResolution(Thermometer2), DEC); Serial.println(); } // 온도를 출력하는 함수 void printTemperature(int num, DeviceAddress deviceAddress) { //섭씨 온도를 가져옴 float tempC = sensors.getTempC(deviceAddress); Serial.print("device: "); Serial.print(num); Serial.print(" Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); //화씨 온도로 변환 Serial.println(DallasTemperature::toFahrenheit(tempC)); } //디바이스 주소를 출력하는 함수 void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } void loop(void) { Serial.print("Requesting temperatures..."); //sensors.requestTemperatures(); //연결되어 있는 전체 센서의 온도 값을 읽어옴 sensors.requestTemperaturesByIndex(0); //첫번째 센서의 온도값 읽어옴 Serial.println("DONE"); //센서에서 읽어온 온도를 출력 printTemperature(0, Thermometer1); sensors.requestTemperaturesByIndex(1); //두번째 센서의 온도값 읽어옴 Serial.println("DONE"); //센서에서 읽어온 온도를 출력 printTemperature(1, Thermometer2); } |
실행시켜 보면 첫번째 온도 센서와 두번째 온도 센서에서 번갈아가며 온도 가져오는 것을 반복합니다.
첫번째 온도센서에만 손을 얹어보면 온도가 올라가는 것을 볼 수 있습니다. (노란색 줄)
Requesting temperatures...Dallas Temperature IC Control Library Demo Found 2 devices. Parasite power is: OFF Device 0 Address: 2899EE2F0A0000C1 Device 0 Resolution: 12 Device 1 Address: 28FF96170600000C Device 1 Resolution: 12 Requesting temperatures...DONE device: 0 Temp C: 24.81 Temp F: 76.66 DONE device: 1 Temp C: 24.75 Temp F: 76.55 Requesting temperatures...DONE device: 0 Temp C: 24.81 Temp F: 76.66 DONE device: 1 Temp C: 24.75 Temp F: 76.55 Requesting temperatures...DONE device: 0 Temp C: 24.81 Temp F: 76.66 DONE device: 1 Temp C: 24.75 Temp F: 76.55 Requesting temperatures...DONE device: 0 Temp C: 24.94 Temp F: 76.89 DONE device: 1 Temp C: 24.75 Temp F: 76.55 Requesting temperatures...DONE device: 0 Temp C: 25.69 Temp F: 78.24 DONE device: 1 Temp C: 24.81 Temp F: 76.66 Requesting temperatures...DONE device: 0 Temp C: 26.31 Temp F: 79.36 DONE device: 1 Temp C: 24.75 Temp F: 76.55 Requesting temperatures...DONE device: 0 Temp C: 26.75 Temp F: 80.15 DONE device: 1 Temp C: 24.81 Temp F: 76.66 Requesting temperatures...DONE device: 0 Temp C: 27.12 Temp F: 80.82 DONE device: 1 Temp C: 24.81 Temp F: 76.66 Requesting temperatures...DONE device: 0 Temp C: 27.37 Temp F: 81.27 DONE device: 1 Temp C: 24.81 Temp F: 76.66 Requesting temperatures...DONE device: 0 Temp C: 27.56 Temp F: 81.61 DONE device: 1 Temp C: 24.81 Temp F: 76.66 Requesting temperatures...DONE device: 0 Temp C: 27.69 Temp F: 81.84 DONE device: 1 Temp C: 24.81 Temp F: 76.66 Requesting temperatures...DONE device: 0 Temp C: 27.87 Temp F: 82.18 DONE device: 1 Temp C: 24.81 Temp F: 76.66 Requesting temperatures...DONE device: 0 Temp C: 27.94 Temp F: 82.29 DONE device: 1 Temp C: 24.81 Temp F: 76.66 Requesting temperatures...DONE device: 0 Temp C: 28.06 Temp F: 82.51 DONE |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!