배운 모든 기술(입출력, 센서, 모터 릴레이, 디스플레이)을 종합하여 **"스마트 가든 (자동 식물 물주기) 시스템"**을 완성합니다.
1. 프로젝트 회로 핀맵 연결표
| 부품 모듈 | 아두이노 핀 | 전원 연결 | 비고 |
|---|---|---|---|
| I2C LCD (SDA) | A4 핀 | 5V / GND | I2C 데이터 라인 |
| I2C LCD (SCL) | A5 핀 | 5V / GND | I2C 클록 라인 |
| 토양 수분 센서 | A0 핀 | 5V / GND | 아날로그 입력 |
| 5V 릴레이 모듈 | 디지털 7번 핀 | 5V / GND | 워터 펌프 전원 스위칭 |
2. 스마트 가든 완성 스케치 소스 코드
/*
프로젝트: 스마트 식물 물주기 자동화 시스템
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int moisturePin = A0;
const int relayPin = 7;
const int dryThreshold = 500; // 건조 기준 임계값
void setup() {
Serial.begin(9600);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, HIGH); // 릴레이 OFF (Active Low 모듈)
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Smart Garden OS");
delay(1500);
lcd.clear();
}
void loop() {
int moistureVal = analogRead(moisturePin);
Serial.print("Soil Moisture: ");
Serial.println(moistureVal);
// LCD 1행: 수분 수치 표시
lcd.setCursor(0, 0);
lcd.print("Moisture: ");
lcd.print(moistureVal);
lcd.print(" ");
// 수분 판단 로직
if (moistureVal > dryThreshold) {
// 흙이 말라있음 -> 3초간 펌프 동작
lcd.setCursor(0, 1);
lcd.print("Status: WATERING!");
digitalWrite(relayPin, LOW); // 릴레이 ON (펌프 가동)
delay(3000);
digitalWrite(relayPin, HIGH); // 릴레이 OFF
lcd.setCursor(0, 1);
lcd.print("Status: DONE ");
} else {
lcd.setCursor(0, 1);
lcd.print("Status: HEALTHY ");
}
delay(1000);
}
3. 임베디드 프로젝트 문제 해결 패턴
- 단계별 모듈 테스트: 한 번에 모든 부품을 다 꽂지 말고, LCD $ ightarrow$ 센서 $ ightarrow$ 릴레이순으로 개별 작동을 먼저 검증합니다.
- 공통 그라운드(GND) 확인: 여러 외부 전원을 사용할 경우 모든 GND는 반드시 하나로 이어서 전위 기준을 맞춰야 합니다.
- 노이즈 및 예외 처리: 센서 수치가 순간 튈 수 있으므로 3회 평균값을 내거나 임계값 판단에 지연 시간을 둡니다.
4. 자주 묻는 질문 (Q&A)
Q. 독립형 하우징 및 배터리 전원 구성 팁은? A. 외부 전원으로 $9\text{V}$ 건전지나 $12\text{V}$ DC 어댑터를 사용할 때는 아두이노의 VIN 핀이나 **DC 배럴 자크(Jack)**로 연결해야 보드 내부 온보드 레귤레이터(5V 변환 칩)가 안전하게 동작합니다.