프로그래밍 소스

by 조경식 | 2016-09-23 11:28
부화기

부화기 아두이노 소스 입니다.


아래 소스는 온습도 센서 SHT-20 기준으로 작성 되어 있습니다.

SHT-15 와 호환되는지는 검증이 되지 않았습니다.


#include "LCD4884.h"  /* LCD4884 모듈을 사용하기 위해 필요 */
#include <Wire.h> /* I2C */
 
#define ON 1
#define OFF 0
#define TARGET_TEMP 38.0 /* 부화기 설정 온도 */
#define ALPHA 0.5            /* 38.5 ~ 37.5 도 에서 동작 하도록 함 */
 
const int light = 13;        /* 전구는 아두이노 13번 포트를 사용 */
 

/* 시간 표시를 위한 변수 */
unsigned int day;            
unsigned int hour;
unsigned int minute;
unsigned int sec;
 
/* 초기화 */
void setup()
{
    Serial.begin(9600);     /* UART 초기화 */
    Wire.begin();              /* i2c bus 초기화 */
    lcd.LCD_init();            /* LCD 초기화 */
    lcd.LCD_clear();     /* LCD 화면 클리어 */
    lcd.LCD_backlight(0); /* LCD 백라이트 값 설정 */
             
pinMode(light, OUTPUT); /* 13번 포트 출력모드로 설정 */
     
digitalWrite(light, ON);   /* 백열 전구를 ON */
 

    /* 시간 값 초기화 */
day = 0;
hour = 0;
minute = 0;
sec = 0;
}
 
#define SHT20_I2C_ADDRESS 0x40    /* SHT20 I2C 주소 */
#define SHT20_I2C_CMD_MEASURE_TEMP 0xe3    /* 온도 읽는 명령 */
#define SHT20_I2C_CMD_MEASURE_HUMI 0xe5 /* 습도 읽는 명령 */


/* Send Command */
void sht20_cmd(byte cmd)
{
Wire.beginTransmission(SHT20_I2C_ADDRESS); // transmit to device
Wire.write(byte(cmd)); // sends instruction byte
Wire.endTransmission(); // stop transmitting
}
 
/* Read Value */
unsigned int sht20_cmd_read()
{
byte msb,lsb;
byte checksum;
unsigned int measure;
 
Wire.requestFrom(SHT20_I2C_ADDRESS, 3); // read request for measure msb, lsb and checksum
msb = Wire.read();
lsb= Wire.read();
checksum = Wire.read();
 
measure = msb<<8 | (lsb & 0xfc);
 
return measure;
}
 



/* UART 를 통해 data 전송 */
void sendPlotData(String seriesName, float data)
{
Serial.print("{");
Serial.print(seriesName);
Serial.print(",T,");
Serial.print(data);
Serial.print("}");
}


/* Main Loop */
void loop()
{
float temp = 0.0; // temperature
float humi = 0.0; // releative humidity
 
    /* 1번째 줄에 온도 표시 */
sht20_cmd(SHT20_I2C_CMD_MEASURE_TEMP); /* 온도를 읽으라는 명령 */
temp = -46.85 + 175.72 * sht20_cmd_read()/65536; /* 온도를 읽어 변환 */
lcd.setCursor(0,1);    /* LCD 의 커서 위치 1번줄 0번째 칸으로 이동 */
lcd.print("TEMP : "); /* "TEMP : " 출력 */
lcd.print(temp); /* 온도 출력 */
 
 

    /* 2번째 줄에 습도 표시 */
sht20_cmd(SHT20_I2C_CMD_MEASURE_HUMI);
humi = -6.0 + 125.0 * sht20_cmd_read()/65536;
lcd.setCursor(0,2);
lcd.print("HUMI : ");
lcd.print(humi);
 
    /* 읽은 온도에 따라 전구를 켜고 끔 */
if(temp > TARGET_TEMP+ALPHA)
digitalWrite(light, OFF); // off
    else if (temp < TARGET_TEMP-ALPHA)
digitalWrite(light, ON);
 
    /* UART에 온도와 습도 값을 출력 */
sendPlotData("TEMP", temp);
sendPlotData("HUMI", humi);

    /* 1 초 기다림 */
delay(1000);
 
    /* 시간 값 갱신 */
sec++;
if(sec == 60 ) {
sec = 0;
        minute ++;
    }
if(minute == 60) {
minute = 0;
        hour ++ ;
    }
if(hour == 24) {
hour = 0;
        day ++ ;
    }
 
    /* 시간 출력 */
lcd.setCursor(0,4);
lcd.print("DAY :");
lcd.print(day);
 
lcd.setCursor(0,5);
lcd.print("TIME:");
 
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
lcd.print(":");
lcd.print(sec);
lcd.print(" ");
}






댓글 0

MADE BY

조경식

3d modeling, 3d printer, 3d printing, blender tutorial, drone, Linux, programming, raspberry pi, schematic drawing, 아두이노