아두이노프로세싱 프로그래밍

아두이노 방수온도계 DS18B20 온도 측정

coding art 2020. 11. 22. 15:34
728x90

아두이노 온도 측정에는 DHT11 이 잘 알려져 있지만 그 용도가 대기의 기상 온습도 측정용인 반면에 냉각수 즉 액체 상태의 온도를 측정할 수는 없다. 이에 대한 대안으로서 Dallas Temperature Sensor DS18B20 센서 사용 방법을 알아보자. 다음 그림과 같이 3개의 배선 중 검정색과 빨간색 배선은 GND 5V 전원을 나타내며 노란색이 신호선이다. 실장된 형상체서처럼 방수 처리가 되어 있어 액체 속에서 온도 측정이 가능하며 화분 토양속의 온도 측정도 가능하다. 배선 구조만을 놓고 본다면 DHT11 과 그다지 다를 바 없이 주어진 라이브러리 OneWire.h 를 사용하여 온도 측정이 가능하다. 아두이노 인터페이스 측면에서 보면 아두이노 디지털 핀과 OneWire 방식으로 통신한다.

OneWire.h 라이브러리 설치 과정을 살펴보자. 아두이노 IDE의 스케치 탭에서 라이브러리 포함하기의 라이브러리 관리를 누르면 팝업 창이 나타난다.

 

 

 

팝업 창에서 onewire를 입력하면 나타나는 OneWire by Jim Studt 버전 2.3.5를 설치하도록 하자.

유사한 라이브러리로서 DS18B20 도 있는데 앞으로 필요에 대비해서 설치하는데 여기서는 앞서 설치한 OneWire.h 를 사용한 온도 측정만을 다루어 보도록 한다.

이 라이브러리들이 제대로 설치되었는지 스케치 탭의 라이브러리 포함하기 메뉴에서 확인해 보도록 한다.

 

 

 

 

 

 

 

 

 

 

 

DS18B20 온도측정 센서를 사용하는 배선과 코드의 기본 구조를 살펴보자. 4.7kΩ의 풀업(pull up) 저항이 사용되고 있음에 유의하자.

 

 

 

 

라이브러리 OneWire.h를 불러옴과 동시에 DB18B20 센서의 신호 배선을 연결하기 위한 아두이노 디지털 핀 번호를 지정한다. setup() 에서는 코딩 연관 부분이 전혀 없으며 loop()에서 getTemp() 루틴을 불러 온도를 측정 후 적정한 지연시간을 주어 loop를 도릴도록 한다. 한편 getTemp() 루틴이 좀 길긴 하지만 제조사에서 예제를 통해 제공하므로 첨부된 코드에서 그대로 복사해서 쓰면 된다.

다음은 창밖에 둔 화분 토양의 온도 측정 사례이다.

//DS18B20

#include <OneWire.h>

int DS18S20_Pin = 10; //DS18S20 Signal pin on digital 10

OneWire ds(DS18S20_Pin); // on digital pin 10

 

void setup(void) {

Serial.begin(9600);

}

 

void loop(void) {

float temperature = getTemp();

Serial.println(temperature);

delay(300000);

 

}

 

 

float getTemp(){

//returns the temperature from one DS18S20 in DEG Celsius

byte data[12];

byte addr[8];

 

if ( !ds.search(addr)) {

//no more sensors on chain, reset search

ds.reset_search();

return -1000;

}

 

if ( OneWire::crc8( addr, 7) != addr[7]) {

Serial.println("CRC is not valid!");

return -1000;

}

 

if ( addr[0] != 0x10 && addr[0] != 0x28) {

Serial.print("Device is not recognized");

return -1000;

}

 

ds.reset();

ds.select(addr);

ds.write(0x44,1); // start conversion, with parasite power on at the end

 

byte present = ds.reset();

ds.select(addr);

ds.write(0xBE); // Read Scratchpad

 

 

for (int i = 0; i < 9; i++) { // we need 9 bytes

data[i] = ds.read();

}

 

ds.reset_search();

 

byte MSB = data[1];

byte LSB = data[0];

 

float tempRead = ((MSB << 8) | LSB); //using two's compliment

float TemperatureSum = tempRead / 16;

 

return TemperatureSum;

}