중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

방수형 온도센서

2014-10-24 16:11:17

개요



출처 : trendspectrum.co.kr
 
방수형 온도센서는 어디서 사용할 수 있을 까요?

쉽게 돌아보면 소아과에 가면 어린 아이들이 온도계를 입에 물고 있습니다.
아니면 귀에 넣고 온도를 측정합니다. 
실제로 위 사진 처럼 쉽게 온도를 측정할 수 있는 제품도 나와있습니다.

또 외부 날씨를 측정하기 위해서도 비와 눈에 견딜 수 있어야 합니다.

또는 엄마들의 경우 아이들의 이유식, 목욕온도를 측정해야 합니다.
하지만 방수가 되지 않는 센서일 경우, 방수처리를 따로 하는 것은 매우 어려운 일입니다.
 

출처 : itempage3.auction.co.kr

하지만 방수처리가 다 된 온도센서가 있습니다.
위 사진과 같이 물에 넣어서 뜨거운 물의 온도를 측정할 수도 있습니다.
 

본문에서는 방수형 온도 센서를 연결한 후 뜨거운 물의 온도를 측정해보겠습니다.
그 후 한글LCD에 표시해 보겠습니다.
 

미리보기 동영상

 

부품목록

NO 부품명 수량 상세설명
1 브레드 보드 1  
2 오렌지 보드 1  
3 점퍼 케이블 10  
4 방수형 온도 센서 1 DS18B20 칩을 기반으로한 방수형 온도 센서를 사용합니다.
5 4.7k ohm 저항 1 본 문에서는 5k ohm 저항을 사용하였습니다.
6 한글 LCD 1  

 

 

부품명 오렌지 보드 브레드 보드 방수형 온도 센서 점퍼 케이블 4.7k ohm 저항
사진 X1 X1 X1 X10 X10

 

 

 

부품명 한글 LCD
사진 X1

 

하드웨어 Making

회로도

브레드 보드 레이아웃

 

Software coding

아래의 스케치를 아두이노에 업로드 하세요.
 

/*
 본 스케치는 arduino.cc를 참고하였습니다.
 누구나 무료로 사용하실 수 있습니다.
*/

#include <OneWire.h> 

//#define  KLCD_NUL           0x00                   
#define  KLCD_HOME          0x01                     
#define  KLCD_CLSTART       0x02                     // 커서 줄 처음으로 이동
#define  KLCD_CRIGHT        0x03                     // 커서 오른쪽 이동
#define  KLCD_CLEFT         0x04                     // 커서 왼쪽 이동
#define  KLCD_CUP           0x05                     // 커서 위로 이동
#define  KLCD_CDOWN         0x06                     // 커서 밑으로 이동
//#define  KLCD_BELL          0x07                     
#define  KLCD_NORMAL        0x08                     // 일반 화면 흰색 바탕 + 검은색 글씨
#define  KLCD_REVERSE       0x09                     // 화면 색반전 검은색 바탕 + 흰색 글씨  
//#define  KLCD_LINEFEED      0x0A                                                     
#define  KLCD_CLEAR         0x0B                     // 화면 초기화 및 커서 위치 초기화
//#define  KLCD_ASCII_0C      0x0C                 
#define  KLCD_ENTER         0x0D                     // 엔터                  
#define  KLCD_LOCATE        0x0E                                                     
//#define  KLCD_ASCII_0F      0x0F 
// 각 명령어에 따른 코드 선언

void klcd(unsigned int v) {
//  1 바이트의 영문자/숫자/제어코드 또는 2 바이트로 구성되는 한글코드(KS5601-1987)를 
//  LCD화면에 출력합니다.
 unsigned char d;
 if (v > 0xFF) { d = (v>>8) & 0xFF;   Serial.write(d); }
  d = v & 0xFF; Serial.write(d); 
}

void klcd_locate(unsigned char r, unsigned char c) {
//  커서 위치를 설정합니다. 행(r)과 열(c)을 지정합니다 행은 0-3 범위이고 열은 0-15 범위의 숫자입니다. 
  unsigned char t;
  Serial.write(KLCD_LOCATE);
  t = ((r<<5) | (c & 0x1F));
  Serial.write(t);
}

int DS18S20_Pin = 2; //온도센서와 연결

OneWire ds(DS18S20_Pin); //2번 핀과 연결되 OneWire 객체 생성

void setup(void) {
 Serial.begin(9600);
 
 klcd(KLCD_CLEAR);                  // LCD화면 초기화
 delay(300);

 klcd(KLCD_CLEAR);                  // LCD화면 초기화
 klcd(KLCD_NORMAL);                 // 일반 화면(흰색 바탕 + 검은색 글씨)
}

void loop(void) {
 float temperature = getTemp(); //온도 측정 후 변수에 저장
 klcd(KLCD_CLEAR);            
 klcd(KLCD_NORMAL); 
  
 klcd(0xBFC2);     //온
 klcd(0xB5B5);     //도
 Serial.print(": ");
 Serial.print(temperature);    //온도 LCD에 출력
  
 delay(5000);   //5초마다 측정 후 출력
 
}

//온도 측정 후 반환하는 함수
float getTemp(){

 byte data[12];
 byte addr[8];

 if ( !ds.search(addr)) {
   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);    //변환

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

 
 for (int i = 0; i < 9; i++) { 
  data[i] = ds.read();  //Scratchpad 읽음
 }
 
 ds.reset_search();
 
 byte MSB = data[1];
 byte LSB = data[0];

 float tempRead = ((MSB << 8) | LSB); 
 float TemperatureSum = tempRead / 16;
 
 return TemperatureSum;
 
}

하드웨어 및 소프트웨어 설명

1. 스케치 설명

#include <OneWire.h> 

본문에서 사용하는 방수형 온도 센서는 DS18B20칩을 내장하고 있습니다.
이 칩은 저렴하고 라이브러리가 제공 되기 때문에 많이 사용 됩니다.
위 라이브러리가 바로 제공 되는 라이브러리로써 기본 아두이노 내장 라이브러리 입니다.
 

float getTemp(){

.......

ds.reset();
 ds.select(addr);
 ds.write(0x44,1);    //conversion

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

 
 for (int i = 0; i < 9; i++) { 
  data[i] = ds.read();  //Scratchpad read
 }
 
 ds.reset_search();

........

이 함수는 온도를 읽어와서 int로 변화시켜주는 함수입니다.
oneWire을 이용하여 온도를 읽어 올 때는 3가지 단계가 있습니다.
'conversion, wait, read' 입니다.
ds.write(0x44)를 통해서 conversion이 시작 됩니다.
이 함수를 호출하면 내부에서 특정 값을 읽은 후 Scratchapad 레지스터로 복사합니다.
그 후 온도로 변환 됩니다.

이 함수에 대해 완전히 이해 할 필요는 없습니다.
앞으로 oneWire 라이브러리를 사용하시면서 온도를 읽을 필요가 있을 때 스케치에
복사 붙여넣고 함수를 어떻게 호출 하고 사용하시는 지만 알면 됩니다.
oneWire 라이브러리에 대한 자세한 내용을 원하시면 다음 링크를 참고하세요.

float temperature = getTemp();

위 함수를 호출하는 부분입니다.
반환 타입은 float입니다.
이 값을 LCD로 출력하거나 타입을 바꾸거나 하는 것은 여러분의 자유입니다.

한글LCD에 대한 사용법은 다음 링크를 참고하세요.
 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

방수형 온도 센서, 아두이노, 오렌지보드