안녕하세요~ 매드 입니다.
이번시간에는 DS18B20 온도센서에 대해서 알아보도록 하겠습니다.
날씨가 겨울이 다 갔는지 점점 따뜻해지고 있네요! 기다리고 기다리던 봄이 오고 있습니다.
ㅠ 온도센서 영상들 보시면 아시겠지만 실내온도를 17도 정도로 맞추고 사는 매드이기에 (ㅠㅠ) 겨울은 참 힘듭니다.(ㅋㅋㅋ)
오늘은 ... 저도 미리 예습을 안한 관계로 즉흥적으로 강좌를 진행하니 많은 양해 부탁드립니다. (영상 보시면 아시겠지만 자고 일어나서 제정신 아님 ㅋ)
자 그럼 한번 DS18B20 온도센서를 알아볼까요?~
14-1. DS18B20 란?
DS18B20 은 온도센서 입니다. 심플하네요. 지난 시간에 했던 온습도 센서랑 머가 다르냐하면 스펙이 다릅니다! 동작 전압, 온도 측정 범위, 정확도 등이 다른데요. 그 중 에서도 가장 큰 특징은 방수용 모델이 있다는 것입니다! 두둥
< 출처 : 구글 사진 >
오른쪽 맨 끝에 있는게 방수형 모델인데요~ 좀 찾아보니 어항용으로 많이 사용하시는 것 같네요. 물고기 키울 때 물 온도도 굉장히 중요한가 봅니다.
간단히 스펙을 보자면
사용가능한 온도범위: -55 to 125°C (-67°F to +257°F)
9에서 12 bit까지 선택가능한 분해능
1-wire 인터페이스 사용으로 통신시 한개의 디지털 핀만을 사용함
칩에 구워진 고유한 64비트 ID
여러개의 센서가 한개의 핀을 공유가능
-10°C ~ +85°C 구간에서 ±0.5°C 의 정확도
온도 한계치 알람 시스템
쿼리 타임은 750ms이하
3.0V~5.5V 파워/데이터와 사용가능
이야... 독특한 기능들이 몇개 있네요. 우선 1-wire 인터페이스 사용으로 여러개의 DS18B20을 하나의 선으로 연결하여 사용할 수 있다는 것! 만약 온도센서가 여러개 필요하다면 굉장한 장점이 될 것 같네요.
두번째는 64bit 고유 ID! 아마도 1-wire 인터페이스 사용 때문에 고유 ID를 사용하는 것 같은데 이부분도 64bit 확률로 부품 겹칠일은 없겠죠?~
세번째는 온도 한계치 알람 시스템! ㅎㅎ 신기하네요 특정 온도 한계까지 가게되면 알람 신호도 주나 봅니다.
지난 시간에 했던 온습도 센서는 온도범위가 0~50도 였는데 이건 -55도~125도라니 실외에서 사용해도 충분할 것 같네요.
확실히 온도에 특화된 센서 인 것 같네요.
아두이노 같은 경우 기본적인 통신이 i2c, spi, uart 가 있는데 이 1-wire 통신은 조금 다른 통신이다 보니 직접 제어를 통해 데이터를 읽어와야 할 것 같습니다.
그런데... 아두이노가 멉니까! 10년간 누적된 자료들이 있는 오픈 소스/하드웨어 아니겠습니까~
검색해보니 이미 자료가 있네요!
라이브러리는 두가지를 설치해주셔야 하는데요. one wire 라이브러리와 ds18b20 라이브러리 입니다. 자세한건 동영상의 중간 부분 부터 확인해보시면 될 것 같습니다.
그럼 일단 연결을 해볼까요.
14-2. DS18B20 회로 연결
< 출처 : 구글 사진 > |
여기서 중요한건 Pull-UP 저항이 필요하다는 것! 4.7k옴 저항을 달라고 했는데 없으시면 10K옴이나 47K옴 달으셔도 됩니다. 너무 낮은 저항은 풀업으로 제대로 동작 안할 수도 있으니 참조하세요~
14-3. 서미스터?
< 출처 : 구글 사진 > |
지금까지는 디지털 출력의 온도센서들을 다루어봤는데요. 빛의 밝기에 따라 저항값이 변하는 CdS를 이전시간에 했었는데 온도센서도 마찬가지로 온도에 따라 저항값이 변하는 센서가 있었으니 바로 '서미스터' 라고하는 센서 입니다.
CdS와 마찬가지로 저항값이 변화하기 때문에 전압분배 법칙을 이용해서 회로를 구성해 주시면 되구요. 회로는 CdS 대신에 서미스터를 연결해주시면 됩니다.
-> 참조링크 : http://maduinos.blogspot.kr/2016/01/10.html
자 그럼 다시 DS18B20으로 돌아와서 펌웨어 코드를 한번 봐볼까요.
14-4. 펌웨어 코드
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup(void)
{
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
sensors.begin();
}
void loop(void)
{
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));
}
흐흐.. 언제나처럼 실습은 영상으로 대체하겠습니다.
다음시간에는 많은 분들이 기다리고 기다리던 리모컨으로 제어하는 것을 실습해 보도록 하겠습니다!!!
많은 무선 어플리케이션에 적용 가능한 아이템인 만큼 >.< 기대해주세요.
7 댓글
안녕하세요 대학교에서 프로젝트를 하다가 문제가 생겨 블로그를 방문하게되었네요
답글삭제다름이아니라 DS18B20 방수형 센서모듈을 사용하여 온도를 측정하는데 처음에할때는 온도측정이 잘되다가
다시해보니 -127도 만 계속해서 나오네요 저항이랑 센서 둘중하나가 문제인것같은데 데이터전압도 측정해봤는데
0.94v에서 왔다갔다하는데 이정도 수치는 의미없는건가요??
안녕하세요~
삭제처음에 잘 되다가 안되시는거면 센서가 망가졌을 가능성이 있습니다.
저항은 망가지는 일은 없구요 ㅎㅎ
연결에 문제 없는지 다시 확인 해보셔야 할 것 같네요.
데이터전압은 RMS 측정이라 무언가 신호는 나오는 것 같은데 제대로된 신호인지는 알 수 없구요.
오실로스코프나 로직아날라이져로 찍어보셔야 할 것 같네요.
제일 빠른 방법은 새로운 센서로 교체하는 방법인데
그전에 반드시 +,- 연결 문제 없는지 잘 확인해보시구요~
감사합니다 결국 센서 문제엿네요 ㅎㅎ
삭제질문이 있습니다. 매드정님의 강의를 듣고 DS18B20를 이용하여 작품을 만들려고하는데 혹시 저희가 설정한 온도를 센서가 인식하여 설정한 온도가 되면 펠티어를 작동시키고 싶은데 어떠한 방식으로 작동을 시켜야할지 고민이어서 글을 올리게 되었습니다.
답글삭제답변이 많이 늦었네요. 펠티어의 경우 전류를 많이 소비하기 때문에 스펙에 맞는 PowerFET를 사용하여 ON/OFF 스위칭 회로를 구성하고 특정 온도가 되었을 때 아두이노로 제어해주시면 될 것 같습니다.
삭제내용은 좋은데.... 온도 편차가 무지 심한 것도 적어 주셨으면 더 좋았을텐데...
답글삭제그냥 매 초 측정하면 소수점 이하는 그냥 널뛰기 해서 사용이 매우 무지 어렵다고 판단됩니다.
4초간 측정값을 더해서 평균한 값을 쓰니 0.1~0.4 정도 오락가락하네요.
물론, 1초에 100번 더해서 평균값 계산해도 소수점 이하는 많이 널뛰기 하네요.(한마디로 설계가 잘못된 센서로 판단 됨)
현재 재고가 천 개 정도 있는데, 모두 폐기 처분 해야 할 듯 하네요.
혹시 다른 모르는 분들의 온도 센서 고려의 대상이 될듯해서 몇 자 적었습니다.
이 센서 절대 사용하지 마세요. 속 터져 죽습니다.
-10°C ~ +85°C 구간에서 ±0.5°C 의 정확도
삭제라고 스펙에 명시되있는데 설계가 잘못된건 아닌듯요...
저 센서 자체가 저렴한 가격에 1도 정도의 차이만 나면 되는 상황에 필요한 센서인데
편차가 크다고 말씀하시는건;;