아두이노 학습을 목적으로 스마트팜(smart farm)을 만드는 실습을 해 보았다.
스마트팜 개발 시나리오
- 아두이노 UNO 보드에 모듈을 연결하여 스마트팜을 구성
- 가변저항을 다이얼처럼 돌려서 5등분하여 메뉴를 조절
- LED와 물 펌프의 동작은 2채널 릴레이 모듈로 조절
- 온습도 센서: 온도 감지 / 조도 센서: 조도 감지 / 토양 수분감지 센서: 토양 습도 감지
- 현재 메뉴와 상태를 표시하는 LCD: 16×2 디스플레이 모듈
메뉴 | 활동 |
4 물 펌프 동작 | LCD에 ‘Pump ON’ 표시, 물 펌프 동작 |
3 LED 동작 | LCD에 ‘LED ON’ 표시, LED 동작 |
2 온도 | LCD에 현재 온도 표시 |
1 토양 습도 | LCD에 현재 토양 습도 표시 |
0 AUTO | 토양 습도와 온도 LCD에 표시. 습도가 낮으면 물펌프 작동, 조도가 약하면 LED 작동 |
BOM (Bill of Material)
품명 | 금액 [원] | 수량 | 합계 [원] | 판매처 |
아두이노 우노 Uno R3 SMD 호환보드 | 4,400 | 1 | 4,400 | 에듀이노 A-1 |
아두이노 우노용 USB B 케이블 50cm | 1,000 | 1 | 1,000 | 에듀이노 E-51 |
아두이노 브레드보드 400홀(투명) | 2,900 | 1 | 2,900 | 에듀이노 E-81 |
아두이노 보드 전원 공급용 9V 1A 어댑터 | 12,500 | 1 | 12,500 | 에듀이노 E-62 |
아두이노 점퍼케이블 암-수 20cm 40핀 | 3,000 | 1 | 3,000 | 에듀이노 E-44 |
아두이노 점퍼케이블 수-수 10cm 40핀 | 2,500 | 1 | 2,500 | 에듀이노 E-49 |
아두이노 LCD 16×2(I2C 제어) 디스플레이 모듈 | 3,400 | 1 | 3,400 | 에듀이노 D-23 |
아두이노 광 포토셀 CdS 조도센서 모듈 | 1,100 | 1 | 1,100 | 에듀이노 C-54 |
아두이노 2채널 5V 릴레이 모듈 | 3,300 | 1 | 3,300 | 에듀이노 D-43 |
아두이노 토양 수분감지 센서 모듈 | 2,200 | 1 | 2,200 | 에듀이노 C-5 |
물 펌프와 같은 모듈은 그냥 교수님께 받아서 썼는데 판매처를 찾지 못해서 기록하지 못했다...
아두이노 소스코드
// LCD 출력 설정
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// 온습도 센서 설정
#include <DHT.h>
#define DHTTYPE DHT11
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE);
#define LPIN 3 // LED PIN, HIGH에서 켜짐
#define PPIN 4 // Pump PIN, LOW에서 켜짐
void setup() {
pinMode(LPIN, OUTPUT);
pinMode(PPIN, OUTPUT);
lcd.begin();
lcd.backlight();
lcd.home();
}
void loop() {
delay(2000);
lcd.clear();
int menu = map(analogRead(A0), 0, 1023, 0, 5); // 가변저항으로 메뉴 조절
if(menu!=3) digitalWrite(LPIN, LOW);
if(menu!=4) digitalWrite(PPIN, HIGH);
if(menu==0) { // AUTO
lcd.print("AUTO");
lcd.setCursor(0, 1); // 다음 줄
int h = map(1023-analogRead(A1), 0, 1023, 0, 100); // 토양 습도
int t = dht.readTemperature(); // 온도
lcd.print("Hu:");
lcd.print(h);
lcd.print("% ");
lcd.print("Tp:");
lcd.print(t);
lcd.print("C");
if(map(1023-analogRead(A1), 0, 1023, 0, 100)<10){ // 습도가 낮으면
lcd.setCursor(0, 0);
lcd.print("PUMP ON");
digitalWrite(PPIN, LOW); // 물펌프 작동
}
if(analogRead(A2)<300){ // 조도가 낮으면
lcd.setCursor(0, 0);
lcd.print("LED ON");
digitalWrite(LPIN, HIGH); // LED 작동
delay(1000);
}
}
else if(menu==1) { // Soil Humidity
int h = map(1023-analogRead(A1), 0, 1023, 0, 100);
lcd.print("Soil Humidity: ");
lcd.setCursor(0, 1);
lcd.print(h);
lcd.print("%");
}
else if(menu==2) { // Temperature
int t = dht.readTemperature();
lcd.print("Temperature: ");
lcd.setCursor(0, 1);
lcd.print(t);
lcd.print("C");
}
else if(menu==3) { // LED ON
lcd.print("LED ON");
digitalWrite(LPIN, HIGH);
delay(1000);
}
else if(menu==4) { // Pump ON
lcd.print("PUMP ON");
digitalWrite(PPIN, LOW);
delay(1000);
}
}
사진

메뉴 별로 LCD에 나오는 글자에 집중해서 보면 좋을 것 같다.
손으로 돌리고 있는 게 가변저항이고, 옆에 원기둥 모양이 물펌프, 물티슈로 싸 놓은 게 토양 수분감지 센서이다.