[26호] ICT 융합 공모전 -스마트 선풍기
글 | 경상대학교 전자공학과 김지완, 안민수, 김형진, 강수빈
‘스마트’를 이름 붙인 이유는 기존의 선풍기보다 똑똑하기 때문이다. 기존의 선풍기는 사용자가 직접 전원을 ON/OFF 시키므로 켜놓은 채 방치시키기도 한다. 그리고 현재 온도가 몇 도인지 알 수 없어서 사람이 덥다고 느낄 때마다 ON/OFF 시켜야한다. 이러한 한계점을 극복하기 위해 자동으로 ON/OFF되고, 현재 온도를 알 수 있는 선풍기를 제작하여 ‘스마트 선풍기’라고 이름을 지었다.
1. 작품 개요
본 작품은 센서에 의해 자동으로 제어되는 선풍기이다. 본 작품은 일반모드, 적외선 센서를 이용한 인체 감지 모드, 온도 센서를 이용한 온도 감지 모드로 모두 3가지 모드에서 작동할 수 있다. 일반적인 선풍기의 한계를 뛰어넘고 ICT와 융합하여 효율성을 증대시킨 작품이다. 본 작품은 에너지를 절약함으로써 여름철 전력난을 완화할 수 있고, PC방이나목욕탕, 관공서와 같은 공공시설에서 활용가치가 높다는 것이 장점이다.
2. 작품 설명
2.1. 주요 동작 및 특징
2.1.1. MODE 1
컨트롤 박스의 첫 번째 스위치이다. 이 스위치를 올리면 일반적인 선풍기와 같이 동작한다. 온도와 상관없이 사용하고 싶을 때, 사람이 없어도 동작하게 할 때 사용한다.
2.1.2. MODE 2
컨트롤 박스의 두 번째 스위치이다. 이 스위치를 올리면 적외선 센서로 제어되는 인체감지 모드로 동작한다.
사람이 앞에 있으면 적외선 센서인 LHI-878이 감지하여 선풍기를 동작시킨다. 센서가 동작하는지는 센서 옆에 있는 센서 동작 램프를 통해 알 수 있다. 센서의 동작 효율을 높이기 위해서 적외선 센서 전용 캡을 씌웠다. 적외선 센서의 특성상 연속적으로 감지하는 것이 아니라 딜레이가 없으면 동작이 연속적으로 되지 못한다. 그 문제를 해결하기 위하여 약 3초 정도의 시간 지연을 줌으로써 동작 오류를 완벽하게 제거하였다.
※ 시간 지연 루틴
void delay(unsigned int i)
{
while(i–);
}
2.1.3. MODE 3
컨트롤 박스의 세 번째 스위치이다. 이 스위치를 올리면 온도센서로 제어되는 온도 감지 모드로 동작한다.
미리 설정된 2개의 기준온도(상한 임계 온도, 하한 임계 온도)에 따라 붉은색 LED와 노란색 LED가 켜진다. 본 작품에서는 상한 임계 온도를 26도, 하한 임계 온도를 22도로 설정했다. 만약 현재 온도가 26도 이상이 되면 위의 사진과 같이 붉은색 LED가 켜지면서 선풍기가 켜진다. 현재 온도가 상한 임계 온도 이하로 떨어지게 되면 곧바로 붉은색 LED와 선풍기가 꺼지게 된다. 그리고 하한 임계 온도 이하로 떨어지게 되면 노란색 LED가 켜진다. 하한 임계 온도는 선풍기의 동작에는 관여하지 않지만 온도가 상당히 떨어졌을 때를 표시 할 수 있으며 나아가 히터를 작동시키는데 활용 할 수 있다.
※ 상한 임계 온도, 하한 임계 온도 설정
set_TH(0×00,0×34); // TH값 전송(+26℃)
set_TL(0×00,0x2c); // TL값 전송(+22℃)
2.1.4. 작품의 특징
디자인적인 측면에서 많은 노력이 들어갔다. 선풍기 부분의 헬로키티의 눈에 5색 LED를 부착했고 본체 부분은 작은 박스 안에 기판들을 집적하여 보기 좋게 만들었다.
2.2 전체 시스템 구성
MCU는 89S52를 사용했고 적외선 센서와 온도 센서로부터 정보를 받아서 선풍기를 제어하는 방식이다. 세 가지 MODE의 제어를 위해 스위치를 3개 만들었다. 7-세그먼트로 현재 온도를 확인할 수 있다.
본 작품의 상세 설명
본 작품 내부 모습
본 작품 옆면의 스위치
2.3 개발 환경
개발언어 : C언어
Tool : Keil uVision4, AVR Studio 4
사용시스템 : 89S52
3. 단계별 제작 과정
● 스케줄
● 아이디어 회의
실용적이면서 동시에 요즘 트렌드인 ICT에 적합한 작품이 없을까 하다가 물의 온도를 자동으로 바꿔주는 수도꼭지와 인체를 감지는 스마트 선풍기 2개를 두고 고민했다. 하지만 아이디어 회의 결과, 복지적인 측면에서 장애인들에게 실용성이 높고 이슈가 되는 전력난 해소에도 긍정적일 것 같아서 스마트 선풍기로 결정했다.
● 내용 구체화
세 가지 기능, 적외선 센서로 사람의 유무를 판단해 작동되는 기능과 온도를 표시해주고 정해놓은 온도에 따라서 선풍기가 작동하는 기능과 일반적인 선풍기처럼 작동하는 기능이 있다. 그리고 선풍기에 5색 led를 설치해 작동 여부를 쉽게 구분하고 미적인 측면과 재미를 강조하기로 했다. 전체 동작을 순서도로 작성하여 실제 제작과 프로그래밍을 할 때 알기 쉽도록 했다.
● 회로 설계
온도측정을 위해서 LM35DZ 온도 센서를 사용하려고 했지만, LM35DZ에서 받은 아날로그 신호를 다시 디지털로 바꾸기 위해서는 다른 칩이 많이 필요해 집적도가 떨어지는 문제가 발생해서 DS1620으로 대체했다. 적외선 센서는 많이 쓰이는 LHI-878을 사용했다.
● 프로그래밍
선풍기가 작동하는 온도인 상한 임계 온도는 26℃로 하한 임계 온도는 22℃로 설정했다. 그리고 적외선 센서의 감지 시간 딜레이를 넣지 않아 동작이 불안정한 것을, 약 3초의 딜레이를 프로그래밍에 추가해서 동작을 자연스럽게 만들었다.
● 회로 제작
효율성을 높이기 위해서 2명씩 짝을 이뤄서 1조는 회로를 제작했고 2조는 케이스를 제작했다. 우리는 제작에 사용할 선풍기를 구입하기 전에 컴퓨터에 사용되는 쿨링팬을 연결하여 테스트를 했다. 작동이 잘 되는 것을 보고 선풍기를 구입했고 테스트를 했지만 실제 선풍기를 작동시키기 위한 전류는 훨씬 커야 했다. 그 문제를 해결하기 위해 트랜지스터로 전류를 증폭했다. 적외선 센서와 온도 센서로부터 입력을 받는 부분에 동작이 불안정 했는데 중간에 버퍼를 사용해서 문제를 해결했다.
● 케이스 제작
하얀색 바탕의 상자를 제작해 스위치 3개와 온도센서, 적외선센서, 세그먼트가 나올 수 있는 구멍을 만들었다. 적외선 센서는 중앙에 배치해 인체감지에 용이하게 했고 바로 밑에 온도표시를 하는 세그먼트를 보이게 했다. 그리고 선풍기의 작동여부를 알기 쉽게 하기 위해서 인형 모형의 눈에 5색 led 2개를 장착했다.
4. 부품리스트
5. 참고 문헌
· 임석구, 디지털논리회로, 한빛미디어
· Behzad Razavi, 아날로그 CMOS 직접회로 설계, 한빛미디어
· Robert L,Boylestad,Louis Nashelsky, 전자회로, 홍릉과학출판사
· 강경일, OP-Amp회로실험, MC Graw Hill
· 임석구, C언어로 배우는 8051 마이크로프로세서, 한빛미디어
· 디바이스마트, http://www.devicemart.co.kr/
· 뉴티씨, http://www.newtc.co.kr/
· 전자공작, http://cafe.naver.com/circuitsmanual
· 당근이의 AVR 갖고 놀기, http://cafe.naver.com/carroty/
6. 소스코드
#include <reg51.h>
sbit DQ=P1^0; // DS1620의 직렬 데이터 입출력
sbit CLK=P1^1; // DS1620의 CLK
sbit RST=P1^2; // DS1620의 RST
sbit minus=P1^3; // 영상 또는 영하 디스플레이
sbit degree=P1^4; // 소수점 이하 디스플레이(0 또는 5)
sbit inn1=P3^0; // 모드1 입력
sbit inn2=P3^1; // 모드2 입력
sbit inn3=P3^2; // 모드3 입력
sbit outt=P3^4; // 출력
void delay(unsigned int i) // 시간 지연
{
while(i–);
}
void ds_write(unsigned char t_data) // 명령어 쓰기(89S52→DS1620)
{
unsigned char i;
for (i=0; i<8; i++) {
CLK=0; // CLK=Low
delay(10);
DQ=t_data & 0×01; // 명령어 쓰기
CLK=1; // CLK=High
delay(10);
t_data >>= 1; // 오른쪽으로 1비트 시프트
}
}
void ds_write_9bit(unsigned char t_sign, unsigned char t_data)
{ // 9비트 데이터 쓰기(89S52→DS1620)
unsigned char i;
for (i=0; i<8; i++) {
CLK=0; // CLK=Low
delay(10);
DQ=t_data & 0×01; // 데이터 쓰기
CLK=1; // CLK=High
delay(10);
t_data >>= 1; // 오른쪽으로 1비트 시프트
}
CLK=0; // CLK=Low
delay(10);
DQ=t_sign; // 부호비트
CLK=1; // CLK=High
delay(10);
}
unsigned char ds_read(void) // 데이터 읽기(DS1620→89S52)
{
unsigned char i, g_data, temp;
g_data=0×00;
temp=0×01; // 0000 0001B
for (i=0; i<8; i++) {
CLK=0; // CLK=Low
delay(10);
if (DQ==1) g_data |= temp; // 데이터 읽기
CLK=1; // CLK=High
delay(10);
temp=temp<<1;
}
return g_data;
}
// 3 Alarm Thermostat Operation
void set_TH(unsigned char th_sign, unsigned char th_data)
{
RST=1; // RST=High
delay(10);
ds_write(0×01); // TH 레지스터에 데이터를 쓰는 명령
ds_write_9bit(th_sign,th_data); // TH 데이터 전송(LSB 먼저)
RST=0; // RST=Low
delay(10); // 지연
delay(2000);
}
void set_TL(unsigned char tl_sign, unsigned char tl_data)
{
RST=1; // RST=High
delay(10);
ds_write(0×02); // TL 레지스터에 데이터를 쓰는 명령
ds_write_9bit(tl_sign,tl_data); // TL 데이터 전송(LSB 먼저)
RST=0; // RST=Low
delay(10); // 지연
delay(2000);
}
// 9비트 데이터(2 Bytes)로부터 온도계산
// data2: 부호, data1: 온도
void display_temp(unsigned char data2, unsigned char data1)
{
unsigned char temp, d100, d10, d1;
if (data2==0×01) { // 0000 0001B→영하표시
minus=0;
data1=~data1;
data1 += 1; // 2의 보수
} else {
minus=1; // 영상 디스플레이
}
temp=data1 & 0×01; // 0.5℃ 인지 0.0℃ 인지 점검
data1 >>= 1; // 실제온도=data1을 오른쪽으로 시프트
d100=data1/100;
d10=(data1%100)/10;
d1=(data1%100)%10;
if (temp) degree=1; // 7-세그먼트에 소수점 이하 값인 5를 디스플레이
else degree=0; // 7-세그먼트에 소수점 이하 값인 0을 디스플레이
P2=(d10<<4) | d1; // 7-세그먼트에 온도 디스플레이
}
void main(void)
{
unsigned char get_data1, get_data2;
// 초기화 및 구성 레지스터 동작모드 설정
// 1 Shot 동작모드(0×03), 연속동작모드(0×02)
RST=0; // 초기화, RST=Low
delay(10);
CLK=1; // CLK=High
delay(10);
RST=1; // RST=High
delay(10);
ds_write(0x0c); // 구성 레지스터에 데이터를 쓰는 명령
ds_write(0×02); // 구성 레지스터에 쓸 데이터 전송(연속 동작모드)
RST=0; // RST=Low
delay(10); // 지연
delay(2000);
set_TH(0×00,0×34); // TH값 전송(+26℃)
set_TL(0×00,0x2c); // TL값 전송(+22℃)
RST=1; // RST=High
delay(10);
ds_write(0×22); // 온도 변환 중지 명령
RST=0; // RST=Low
delay(10);
RST=1; // RST=High
delay(10);
ds_write(0xee); // 온도 변환 시작 명령
RST=0; // RST=Low
delay(10);
delay(50000); // 변환을 위해 지연
delay(50000);
do {
RST=1; // RST=High
delay(10);
ds_write(0xaa); // 온도 데이터 읽기 명령
get_data1=ds_read(); // 온도 데이터
get_data2=ds_read(); // 부호
RST=0; // RST=Low
delay(10);
display_temp(get_data2,get_data1);
// 온도를 계산하고 7-세그먼트에 디스플레이
if((inn1==0) || (inn3==0)) {
outt=0;
}
else if(inn2==0) {
outt=0;
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000); // 약 3초 지연
}
else {
outt=1;
}
} while(1);
}
7. 회로도