코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-10-24 16:11:17
본문에서는 방수형 온도 센서를 연결한 후 뜨거운 물의 온도를 측정해보겠습니다.
그 후 한글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 |
아래의 스케치를 아두이노에 업로드 하세요.
/* 본 스케치는 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; }
#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
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!