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 (풀업용)
구성 배선도-실내 온도 시리얼 모니터로 확인해 보기
구성 배선도-수온 측정해서 시리얼 모니터로 확인해 보기
사용된 예제소스
사용된 라이브러리
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은 데이터 전송속도가 느리기 때문에
온도변화가 반영되는데 시간이 조금 걸리는 단점이 있습니다
'Arduino(아두이노) 활용 강좌' 카테고리의 다른 글
Arduino Uno 로 3색 신호등 모듈을 사용해서 신호등 구성해 보기 (0) | 2021.04.20 |
---|---|
Arduino Uno 로 CDS 조도센서 ISD1820 음성녹음 재생모듈을 사용해서 실내 밝기변화에 따른 경고방송 만들어 보기 (0) | 2020.12.23 |
Arduino Uno 로 MLX90614 비접촉 온도센서를 사용해서 실내온도 측정해 보기 (0) | 2020.07.16 |
Arduino Uno 로 FSR 압력센서 를 사용해서 DC모터 구동시켜 보기 (0) | 2020.05.27 |
Arduino Uno 로 MAX7219 (8X8) 도트 매트릭스 모듈과 MPU-6050 자이로센서를 사용해서 미로 탈출 게임 만들어 보기 (0) | 2020.05.09 |
댓글