아두이노 메가 2560과 센서를 이용한 스마트 수경재배 시스템
부품 및 소모품
| 부품 |
수량 |
| 아두이노 메가 2560 (Arduino Mega 2560) |
1 |
| DHT22 온도 센서 / DHT11 습도 센서 |
1 |
| 릴레이 (일반) |
1 |
| RobotGeek 광 센서 (LDR 기반) |
1 |
| 온도 센서 (LM35) |
1 |
앱 및 온라인 서비스
프로젝트 개요
토양 없는 수경재배 방식을 아두이노로 자동 제어하는 시스템입니다. 상추 재배를 기준으로 온도(25~30°C), 습도(50~80%), 광량(250 μmol/m²/s)을 최적 범위로 유지합니다. 코코넛 파우더를 배지로 사용하여 수분과 영양분 공급을 정밀 제어합니다.
세부 제어 시스템
광량 제어
적색 LED 8개, 청색 LED 8개 총 16개를 4개씩 직렬로 연결하고 병렬로 구성하여 12V 전원으로 구동합니다. 옵토커플러(4N35)를 통해 아두이노에서 제어하며, LDR 광센서로 현재 광량을 측정하여 목표치(250 photons/sec) 미만 시 LED를 켜고 초과 시 끕니다.
온도 제어
LM35 센서로 온도를 감지하여 설정 범위(25~30°C) 이탈 시 대응합니다:
- 온도 > 30°C: 냉각 팬 ON
- 온도 < 25°C: 히터(백열전구) + 온풍 팬 ON
히터는 별도 박스에 설치하여 광센서에 영향을 주지 않게 하고, 팬으로 뜨거운 공기를 내부로 유입시킵니다. 모터 드라이버로 팬을, 릴레이로 히터를 제어합니다.
습도 제어
DHT11 센서로 배지 습도를 모니터링합니다. 설정 범위(50~80%) 미만 시 물펌프를 가동하여 점적 관수 방식으로 수분을 공급하고, 과습 시 냉각 팬으로 습도를 낮춥니다.
주의사항
- DHT11 응답 시간 1Hz → 측정 간격 최소 1초 확보
- LED 직렬 4개 연결 시 12V 전원 필요
- 230V 교류 회로 작업 시 안전 절연 필수
- 옵토커플러 입력에 반드시 저항 직렬 연결
- 브러시리스 DC 팬은 단방향이므로 장착 방향 주의
소스 코드
#include <SimpleDHT.h>
int pinDHT11 = 41;
int coolingFan = 50;
int heatingFan = 48;
int heater = 3;
int LEDrow1 = 25;
int LEDrow2 = 27;
int LEDrow3 = 29;
int LEDrow4 = 31;
int pump = 31;
SimpleDHT11 dht11;
void setup() {
Serial.begin(115200);
pinMode(coolingFan, OUTPUT);
pinMode(heatingFan, OUTPUT);
pinMode(heater, OUTPUT);
pinMode(LEDrow1, OUTPUT);
pinMode(LEDrow2, OUTPUT);
pinMode(LEDrow3, OUTPUT);
pinMode(LEDrow4, OUTPUT);
pinMode(pump, OUTPUT);
}
void loop() {
temperature();
light();
humidity();
}
void temperature() {
int value = analogRead(A10);
float volts = (value / 1024.0) * 5.0;
float temp = volts * 100.0;
Serial.print("temp=");
Serial.println(temp);
delay(1000);
if (temp < 25) {
digitalWrite(heater, LOW);
digitalWrite(heatingFan, HIGH);
} else {
digitalWrite(heater, HIGH);
digitalWrite(heatingFan, LOW);
}
if (temp > 30) {
digitalWrite(coolingFan, HIGH);
} else {
digitalWrite(coolingFan, LOW);
}
}
void light() {
float ldrdata = analogRead(A8);
float resistorVolt = (1024 - ldrdata) / 1024.0 * 5.0;
float ldrVolt = 5.0 - resistorVolt;
float ldrResistance = ldrVolt / resistorVolt * 5000.0;
float lux = (12518931) * (pow(ldrResistance, -1.405));
float photons = lux * 0.019;
delay(1000);
if (photons < 50) {
digitalWrite(LEDrow1, HIGH);
digitalWrite(LEDrow2, HIGH);
digitalWrite(LEDrow3, HIGH);
digitalWrite(LEDrow4, HIGH);
}
if (photons > 100) {
digitalWrite(LEDrow1, LOW);
digitalWrite(LEDrow2, LOW);
digitalWrite(LEDrow3, LOW);
digitalWrite(LEDrow4, LOW);
}
}
void humidity() {
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.println(err);
delay(1000);
return;
}
int humid = (int)humidity;
Serial.println(" H");
delay(2000);
if (humid < 85) {
digitalWrite(pump, HIGH);
digitalWrite(coolingFan, LOW);
}
if (humid > 94) {
digitalWrite(coolingFan, HIGH);
digitalWrite(pump, LOW);
}
}