티스토리 뷰

목차
1.개발 배경
2.회로
3.소스 코드
4.데모

1. 개발배경

지난 글에서도 언급드렸듯이 저희 집 뒤뜰에는 닭 세 마리가 살고 있는 집이 있습니다. 매년 여름과 같이 더운 계절이 오거나 겨울과 같은 추운 계절이 오면 제 아이들은 닭들이 얼어 죽지는 않을지 더위 먹지는 않을지 노심초사입니다. 제가 키우는 닭들은 혹한에서도 잘 견디는 닭이라고 입이 닳도록 말을 해줘도 아이들인지라 매년 걱정을 합니다. 그래서 닭장 안에 히터를 놔줘야 한다고 때를 쓰지만 잘못하면 오히려 불이 날 수 있기 때문에 안된다고 타이르기 일쑤입니다. 여름의 뜨거운 햇빛아래 닭들이 입을 벌려 헥헥거리고 있으면 양동이에 물을 떠놓고 한 마리씩 살포시 담갔다가 빼주곤 합니다. 닭들도 시원한지 신기하게도 퍼덕이지 않고 얌전히 있습니다. 아이들과 함께 어떤 프로젝트를 해볼지 상의하다가 닭장이 추워지거나 더워질 때 LED 색으로 구분해서 알려주는 시스템을 만들어 보기로 했습니다.

2. 회로

이번 프로젝트에는 온도를 측정하는 센서가 추가되는데 DS18B20이라는 부품입니다. 기존의 온도센서 출력은 아날로그로 되어있기 때문에 아두이노에서 입력을 디지털로 받기 위해서는 analog를 digital로 변경해 주는 부품을 추가로 추가해야 합니다. 그래서 DS18B20안에 A/D변환 칩을 넣어 한번에 해결하였습니다. 가격도 기존 구성회로보다 낮출 수 있어 경제적이고 신호를 출력하는 Onewire 통신이 있어 아두이노 플랫폼과 완벽하게 호환됩니다. 소스코드 부분에서 설명드리겠지만 이 부품을 사용하기 위해서는 특정한 라이브러리를 사용해야 합니다. 우선 회로 구성은 아래와 같습니다.

회로를 보시면 중간에 저항(register)가 있습니다. 이 저항은 pull up register라고 하며 아두이노 입력 포트를 데이터가 잘 전달 될수 있도록 보드의 입력 전압과 동등한 수준으로 올려주는 역할을 합니다. 한마디로 데이터가 잘 들어올 수 있도록 문을 열어준다고나 할까요? 전자회로적으로 설명하면 너무 복잡해지기 때문에 아이들에게 쉽게 설명할 수 있도록 적었습니다. 회로를 그리면 아래와 같으며 보통 4.7K ohm 저항을 사용합니다. 

센서 핀 구성도
회로 구성
Pull-up register(R1=4.7K ohm)

3. 소스 코드

코드를 보시면 OneWire.h와 DallasTemperature.h 헤더파일이 있습니다. 컴파일을 하기 위해서는 아두이도 프로그램에서 라이브러리를 설치해야 하는데 아래에서 찾으실 수 있습니다. 라이브러리 매니저에서 ds18b20과 onewire로 검색 후 설치하시면 됩니다. 

라이브러리 관리 메뉴
라이브러리 설치

#include<OneWire.h>
#include<DallasTemperature.h>

int RLED = 9; // R,G,B LED를 아두이노 우노 보드 9,10,11번 핀에 연결
int YLED = 10;
int BLED = 11;
float celcius; // 섭씨 온도를 소수점까지 표시
float farenheit; // 화씨 온도를 소수점까지 표시

#define ONE_WIRE_BUS 2 // 데이터 아웃핀을 아두이노 2번에 연결

OneWire oneWire(ONE_WIRE_BUS); // Onewire 통신을 활성화 시켜줌

DallasTemperature sensors(&<style="letter-spacing: 0px;">oneWire); // < style="text-align: start;">Onewire 설정 값을 라이브러리로 전달

void setup(void)
{
 pinMode(RLED, OUTPUT); //세가지 LED 핀을 출력으로 설정
 pinMode(YLED, OUTPUT);
 pinMode(BLED, OUTPUT);
 sensors.begin(); // 라이브러리를 활성화
 Serial.begin(9600); // 시리얼 모니터 시작
}

void loop(void)
{
 sensors.requestTemperatures();// 온도를 확인하라는 명령을 보내줌
 celcius = sensors.getTempCByIndex(0);//읽어들인 온도값을 저장
 farenheit = (sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0; //화씨 온도로 변경
 
if(celcius <22) // 섭씨 온도가 정해진 값보다 낮으면 파란색 LED를 켜줌
{
 digitalWrite(BLED, HIGH);
 digitalWrite(YLED, LOW);
 digitalWrite(RLED, LOW);
}
 else if(22< celcius < 25) // 섭씨 온도가 정해진 값 사이에 있으면 노란색 LED를 켜줌
{
digitalWrite(BLED, LOW);
 digitalWrite(YLED, HIGH);
 digitalWrite(RLED, LOW);
}
 if(celcius > 25) // 섭씨 온도가 정해진 값보다 높으면 빨간색 LED를 켜줌
{
   digitalWrite(BLED, LOW);
   digitalWrite(YLED, LOW);
   digitalWrite(RLED, HIGH);
 }
   Serial.print("Temperature: ");
   Serial.print(celcius);
   Serial.print("C | ");// 시리얼 모니터에 섭씨온도 표시
   Serial.print(farenheit);
   Serial.println("F");// 시리얼 모니터에 화씨온도 표시
   delay(500);
}

닭장에 설치하려면 온도 세팅을 저온은 0도 이하, 고온은  30도 이상으로 해야하지만 데모하기가 어려워 22~25도 사이로 세팅해 놓고 데모를 해봤습니다. 한국에서는 섭씨를 사용하기 때문에 섭씨 기준값으로 LED를 컨트럴 하였습니다.

4.데모

==================================================================================

1. 낮은 온도 -> 중간 온도

 

시리얼 모니터 화면
파란색 -> 노란색

==================================================================================

2. 중간 온도 -> 높은 온도

 

시리얼 모니터 화면

 

노란색 -> 빨간색

============================================================================================

3. 높은온도 -> 낮은 온도

 

빨간색 -> 파란색

설정한 온도가 되니 LED 색이 잘 바뀌었네요. 이제부터 이걸 어떻게 닭장에 설치할지 고민을 해봐야겠습니다. 아니 설치하는 시늉이라도 해야 아이들이 기뻐하겠네요. 이번 포스팅은 여기서 마무리하고 다음 프로젝트에서 뵙겠습니다.