Hardware | DS18B20 온도센서

|

1. 온도 센서

지금까지 온도센서를 4개 구동시켜 봤습니다.


* Hardware | AM2322 Temperature & Humidity Sensor

http://chocoball.tistory.com/entry/Hardware-AM2322-Temperature-Humidity-Sensor


* Hardware | Arduino 비접촉 온도센서 GY-906 MLX90614

http://chocoball.tistory.com/entry/HardwareArduinoMLX90614


* Hardware | Arduino BMP280 고도/온도/기압 센서

- http://chocoball.tistory.com/entry/HardwareArduinoBMP280


* Hardware | BME280 sensor

- http://chocoball.tistory.com/entry/HardwareBME280


온도라는 것은 생물이 살아가는 지구 환경의 특성을 나타내주는 중요한 바로메터 이기 때문에

시장에는 사용 용도에 따라서 여러 센서가 존재하는 듯 합니다.


이제 5번째 센서를 구동시켜보기로 합니다.




2. 수온 측정용 온도센서

물의 온도를 측정하기 위해서는 방수가 되어야 합니다.

알루미늄 방수캡으로 커버된 온도센서가 "DS18B20" 입니다.


원래는 아래 그림처럼 Dallas사에서 만든 세발달린 칩으로 되어 있습니다.



그것을 알루미늄 캡과 고무로 실링을 한 제품입니다.



데이터쉬트는 다음과 같습니다.


DS18B20.pdf


사양을 보면, 중간에 저항을 넣어줘야 하는 군요.

센서가 타버리지 않게 꼭 저항을 챙기도록 합니다.





3. 주문

오늘도 AliExpress 에서 구매합니다.


https://ko.aliexpress.com/item/1pcs-DS18B20-Stainless-steel-package-1-meters-waterproof-DS18b20-temperature-probe-temperature-sensor/32467815969.html





4. Layout

데이터쉬트에 표기되어 있듯이 "저항"을 꼭 챙기도록 합니다.



Datasheet 를 보면 3~5V 에서 구동한다고 되어 있으므로, Arduino Nano 에서는 3.3V 단자에 연결했습니다.


  DS18B20 | Arduino Nano
------------------------------
   Black  |     GND
    Red   |     3.3V (4.7k Ohms)
   White  |     D2 (4.7k Ohms)
------------------------------


빵판 모습은 다음과 같습니다.



Pullup 저항도 달아 줍니다. 이 pullup 저항이 왜 중요한지는 이 글의 마지막에 적어 놨습니다.

AliExpress 에서 구매한것 치고 4.7k Ohms 는 꽤나 정확하네요.



미지근한 물, 냉장고의 물, 급탕기로 뎁힌 뜨거운 물을 준비합니다.

자, 이제 준비 완료 입니다.







5. IDE Sketch

유명한 센서라서 여러 사이트에서 소개되고 있습니다.


가장 간단한 스케치는 다음과 같습니다.

https://create.arduino.cc/projecthub/TheGadgetBoy/ds18b20-digital-temperature-sensor-and-arduino-9cc806


- OneWire Library : https://github.com/PaulStoffregen/OneWire

- DallasTemperature Library : https://github.com/milesburton/Arduino-Temperature-Control-Library


/********************************************************************/
// First we include the libraries
#include <OneWire.h>
#include <DallasTemperature.h>
/********************************************************************/
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
/********************************************************************/
// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
/********************************************************************/
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
/********************************************************************/
void setup(void)
{
 // start serial port
 Serial.begin(9600);
 Serial.println("Dallas Temperature IC Control Library Demo");
 // Start up the library
 sensors.begin();
}
void loop(void)
{
 // call sensors.requestTemperatures() to issue a global temperature
 // request to all devices on the bus
/********************************************************************/
 Serial.print(" Requesting temperatures...");
 sensors.requestTemperatures(); // Send the command to get temperature readings
 Serial.println("DONE");
/********************************************************************/
 Serial.print("Temperature is: ");
 Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? 
   // You can have more than one DS18B20 on the same bus. 
   // 0 refers to the first IC on the wire
   delay(1000);
}



cactus.io 에서 제품 자체의 시리얼 넘버까지 친절하게 보여주는 소스는 다음과 같습니다.

http://cactus.io/hookups/sensors/temperature-humidity/ds18b20/hookup-arduino-to-ds18b20-temperature-sensor


"cactus_io_DS18B20.h" 라이브러리는 다음 링크에서 다운받으면 됩니다.

cactus_io_DS18B20.zip


/* Example sketch for Maxim Integrated DS18B20 temperature sensor Written by cactus.io, and requires the cactus_io_DS18B20 library. This sketch was tested using the Adafruit Prewired DS18B20 Sensor. For hookup details using this sensor then visit http://cactus.io/hookups/sensors/temperature-humidity/ds18b20/hookup-arduino-to-ds18b20-temperature-sensor */ #include <cactus_io_DS18B20.h> int DS18B20_Pin = 2; //DS18S20 Signal pin on digital 2 // Create DS18B20 object DS18B20 ds(DS18B20_Pin); void setup() { ds.readSensor(); Serial.begin(9600); Serial.println("Maxim Integrated DS18B20 Temperature Sensor | cactus.io"); Serial.println("DS18B20 Serial Number: "); // we pass the serial number byte array into the printSerialNumber function printSerialNumber(ds.getSerialNumber()); Serial.println(""); Serial.println(""); Serial.println("Temp (C)\tTemp (F)"); } void loop() { ds.readSensor(); Serial.print(ds.getTemperature_C()); Serial.print(" *C\t"); Serial.print(ds.getTemperature_F()); Serial.println(" *F"); // Add a 2 second delay. delay(2000); } // We call this function to display the DS18B20 serial number. // It takes an array of bytes for printing void printSerialNumber(byte *addr) { byte i; for( i = 0; i < 8; i++) { Serial.print("0x"); if (addr[i] < 16) { Serial.print('0'); } Serial.print(addr[i], HEX); if (i < 7) { Serial.print(", "); } } }




6. 결과

실제로 "실내 공기 > 미지근한 물 > 냉장고의 차가운 물 > 급탕기로 뎁힌 물" 을 차례로 측정한 온도 변화 입니다.



동영상으로도 찍어 봤습니다.



전체 과정은 아래 동영상 입니다.



잘 되네요!




7. 주의

처음에 GND 와 VCC를 서로 바꿔 연결했더니만, 온도센서쪽이 불덩이가 되었습니다.

잠깐 만지기만 해도 손이 데일 정도였으니, 100도이상 순식간에 올라갔던 것 같습니다.


다행이 식힌 다음 제대로 연결했더니 센서 동작에는 문제가 없었습니다.

다른 센서들은 핀 연결을 잘못해도 문제가 생길 여지가 없는데, 이 센서는 왜 pullup 저항을 달아 놓는지 조금 이해가 갈 것 같습니다.




FIN

5개째 온돈세서 구동기였습니다.

더이상 다른 온도 센서는 없겠지?


And