본문 바로가기
Arduino(아두이노) 활용 강좌

Arduino Uno 로 DS18B20 온도센서를 사용해서 실내온도 및 수온 측정해 보기

by 오마이엔지니어 2020. 11. 7.
반응형

Arduino Uno 로 DS18B20 온도센서를 사용해서 온도를 측정하는 방법을 알아보고 실내온도 및 수온을
측정해 보는 프로젝트 입니다

<DS18B20 온도센서 이미지>

DALLAS 의 DS18B20 IC 기반의 디지털 타입의 온도센서 모듈로 위 이미지 처럽 다양한 타입의 제품이 있습니다
아두이노 등의 마이크로 컨트롤 보드와 연결해서 사용가능하며
동작전압은 3.3V ~ 5V 이며 온도 측정범위는 -55 ° C ~ +125 ° C (-67 ° F ~ +257 ° F) 입니다
방수형 프로브 타입은 PVC 플라스틱으로 센서를 감싸고 있으므로 약 100 ° C 이하에서 사용하는것을 권장합니다
One Wire 라이브러리를 사용합니다
프로브 타입이나 TO-92 타입은 VCC와 DATA 핀을 풀업저항 4.7K ohm 으로 연결해서 사용합니다
풀업(pull-up)이란? 외부 변화가 생기기전에 입력 핀을 VCC(5V) 입력 상태로 묶어두는 것입니다
자세한 내용은 https://rockjjy.tistory.com/2441 를 참조

One Wire 라이브러리를 사용하는데
One Wire는 I²C와 비슷한 듯 하지만, I²C는 선 하나는 클럭신호를, 나머지 선 하나는 데이터를 전달하기때문에 차이가 있습니다
One Wire는 Dallas Semiconductor(현재 Maxim Integrated)에서 만들었으며,
데이터 전송속도가 느리고, 장거리 통신이 가능한 장점이 있습니다
보통 온도계나 기상 관측장비같은 비싸지 않은 장비들에 많이 사용됩니다
One Wire 네트워크에 연결된 디바이스들중 마스터 디바이스는 MircoLAN 이라고 부릅니다
마스터에서 타이밍을 이용하여 디바이스를 초기화 하고, 데이터를 쓰고, 읽어옵니다

DS18B20은 -55℃~+125℃까지의 범위 측정이 가능하며,
-10℃~+85℃사이는 ±5℃의 정확도를 갖습니다.
또한 9-bit~12bit로 온도값을 정밀하게 가져오도록 프로그래밍 가능합니다


<DS18B20 온도센서 상세사양>

Digital temperature conversion and output
Maximum 12-bit resolution, accuracy up to ±0.5 degrees Celsius
Temperature detection range: -55 ° C ~ +125 ° C (-67 ° F ~ +257 ° F)
Supply Voltage: 3.3V to 5V
Temperature range :-55 °C ~ +125 °C
Size: 28 mm X 12 mm X 10 mm
One Wire Library for 18B20


사용된 부품

Arduino Uno R3 (Italy)
DS18B20 온도센서 (모듈타입)
DS18B20 온도센서 방수형 프로브
미니브래드보드

점퍼케이블(숫놈-암놈)
점퍼케이블(숫놈-숫놈)
막대저항 4.7K Ohm (풀업용)

구성 배선도-실내 온도 시리얼 모니터로 확인해 보기

구성 배선도-수온 측정해서 시리얼 모니터로 확인해 보기

 



사용된 예제소스

실내온도 측정해 보기.txt
0.00MB
수온 측정해 보기.txt
0.00MB

사용된 라이브러리

Arduino-Temperature-Control-Library-master.zip
0.03MB
OneWire-master.zip
0.02MB


Arduino-Temperature-Control-Library
OneWire
테스트 하는데 위 2가지 라이브러리가 필수적으로 필요합니다

주의사항

위 이미지 처럼 프로브 타입이나 TO-92 타입은 VCC와 DATA 핀을 풀업저항 4.7K ohm 으로 연결해서 사용합니다
(모듈 타입은 풀업저항이 PCB에 달려 있으므로 별도 구성없이 테스트 할수 있습니다)
저항은 풀업용 이므로 반드시 4.7K ohm 으로 사용해야 하는것은 아닙니다,
본 테스트 에서는 1K ohm 으로 테스트 하였습니다

먼저 실내온도를 측정하는 예제코드를 살펴보면

#include <OneWire.h>
OneWire 라이브러리를 사용합니다

int DS18S20_Pin = 2; 
데이터 출력핀 2번을 사용합니다

void setup(void) {
Serial.begin(9600);
}
9600 보드레이트로 시리얼 통신합니다

void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);
One Wire 로 온도값을 측정해서 터미널로 출력해 춥니다

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;
}
연결 된 One Wire 가 제대로 동작하는지 확인합니다

ds.reset();
ds.select(addr);
ds.write(0x44,1);
온도값을 읽어 ADC로 변환하여 레지스터에 저장합니다

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE);

메모리 맵을 읽어옵니다

for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
읽어온 메모리맵의 값을 바이트 배열에 넣어줍니다

byte MSB = data[1];
byte LSB = data[0];

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

마지막 2바이트(메모리 맵의 0과 1번지)의 데이터를 연산하여 온도값을 구합니다

수온을 측정하는 예제는
DallasTemperature.h 라이브러리를 사용해서 더 간단하게 온도값을 구할수 있습니다


프로젝트 동영상 - 실내 온도 시리얼 모니터로 확인해 보기


프로젝트 동영상 - 수온 측정해서 시리얼 모니터로 확인해 보기

 

위 동영상에서도 확인할 수 있듯이 DS18B20은 데이터 전송속도가 느리기 때문에
온도변화가 반영되는데 시간이 조금 걸리는 단점이 있습니다

반응형

댓글