임베디드/아두이노
[아두이노] 38. 병아리 부화기 및 육추기 겸용 만들기 (6) 초기화 및 온습도 소스 코드
copynull
2024. 5. 27. 21:15
하드웨어는 지난 시간까지 다 구성하였습니다. 이제 남은건 소스코드를 작성하여 정상적으로 작동하도록 코드 작성을 진행해 보도록 하겠습니다.
이번 시간에는 아두이노 초기화 부분과 온 습도 값을 읽어서 처리하는 코드를 작성하도록 하겠습니다.
아두이노의 경우 setup() 함수와 loop() 함수로 이루어지며, setup()의 경우 최초 아두이노 구동시 1번 구동되고 loop() 함수가 반복적으로 구동되는 코드로 이루어져 있습니다.
우리는 setup() 함수에 초기화 부분을 설정하고 나머지 구동되는 코드를 loop() 함수로 작성하면 되겠습니다.
아두이노에서 사용되는 포트를 define 하고 setup() 함수에서 초기화하여 사용할 수 있도록 코드를 구성하고, DHT11 온습도 센서와 NTC 온도센서를 사용할 수 있도록 함수와 코드를 구성해 보도록 하겠습니다.
아래는 코드 전문입니다.
(모든 소스코드는 분할 코딩 되어 있습니다)
Incubator_Main.ino
#include <avr/wdt.h> // 와치독
#include <DHT.h> // DHT11 사용시 필요한 헤더파일
// 아두이노 핀 설정
#define BUTTON_SETUP 2 // 설정
#define BUTTON_UP 3 // ↑
#define BUTTON_DOWN 4 // ↓
#define BUTTON_SAVE 5 // SAVE
#define BUTTON_RESET 6 // RESET
#define HUMIDITIER 7 // 가습기
#define HUMIDITY_SENSOR 8 // 습도 센서
#define LIGHT 9 // 전등 (220v 릴레이)
#define EGG_MOVER 10 // 전란기 (220v 릴레이)
#define FAN 11 // Fan
#define NTC_PIN A7 // NTC 온도 센서
extern float NTC; // 온도
extern float humidity; // 습도
unsigned long beforeTime; // 이전시간
unsigned long nowTime = 0; // 현재타이머시간
int day, hour, min, sec;
DHT dht(HUMIDITY_SENSOR, DHT11); // DHT11 객체 생성
void setup()
{
pinMode(FAN, OUTPUT); // 팬
pinMode(LIGHT, OUTPUT); // 전구
pinMode(EGG_MOVER, OUTPUT); // 전란기
pinMode(HUMIDITIER, OUTPUT); // 가습기 ON OFF
// 버튼 (풀업 저항 사용)
pinMode(BUTTON_SETUP, INPUT_PULLUP); // 설정 버튼
pinMode(BUTTON_UP, INPUT_PULLUP); // ↑
pinMode(BUTTON_DOWN, INPUT_PULLUP); // ↓
pinMode(BUTTON_SAVE, INPUT_PULLUP); // MODE (SAVE로 사용)
pinMode(BUTTON_RESET, INPUT_PULLUP); // RESET
dht.begin(); // DHT11 객체 초기화
beforeTime = millis(); // 이전 시간 설정
wdt_enable(WDTO_4S); // 와치독 타이머 설정 (시스템 다운시 자동 재부팅 시작)
}
void loop()
{
// 이전 시간보다 1초가 지났다면
if(millis()-beforeTime>=1000)
{
// 시간 카운트(초)
nowTime++;
beforeTime = millis();
// 온도 습도 읽기
GetTempHumi();
// 와치독 리셋
wdt_reset();
}
}
_readHumidity.ino
#define R1 10000 // 저항의크기(10k옴 = 10000옴)
float NTC = .0f; // 온도
float humidity = .0f; // 습도
// 온도 습도 읽기
void GetTempHumi()
{
// 습도 읽기
humidity = dht.readHumidity();
//NTC서미스터 온도 구하기
float voltage_value = analogRead(NTC_PIN);
float voltage = (5.0 * voltage_value) / 1023.0;
float R2 = (5.0 * R1) / voltage - R1;
NTC = 1.0 / ((1.0/(273.15 + 25.0)) + (log(R2/R1)/3435.0)) - 273.15;
}
_time.ino
#define MIN 60
#define HOUR (60*60)
#define DAY (60*60*24)
// 초 -> 시분초
void GetSecToTimeDay()
{
// 초 -> 일시분초
sec = nowTime%MIN;
min = (nowTime/MIN)%MIN;
hour = ((nowTime/HOUR)%HOUR)%24;
day = (nowTime/DAY)%DAY;
}
// 시분초 -> 초
void GetTimeDayToSec()
{
// 시분초 -> 초
nowTime = (long)day * DAY;
nowTime += (long)hour * HOUR;
nowTime += (long)min * MIN;
nowTime += sec;
}