// education

나의 첫 번째 아두이노 종합 프로젝트

배운 모든 기술(입출력, 센서, 모터 릴레이, 디스플레이)을 종합하여 **"스마트 가든 (자동 식물 물주기) 시스템"**을 완성합니다.


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. 임베디드 프로젝트 문제 해결 패턴

  1. 단계별 모듈 테스트: 한 번에 모든 부품을 다 꽂지 말고, LCD $ ightarrow$ 센서 $ ightarrow$ 릴레이순으로 개별 작동을 먼저 검증합니다.
  2. 공통 그라운드(GND) 확인: 여러 외부 전원을 사용할 경우 모든 GND는 반드시 하나로 이어서 전위 기준을 맞춰야 합니다.
  3. 노이즈 및 예외 처리: 센서 수치가 순간 튈 수 있으므로 3회 평균값을 내거나 임계값 판단에 지연 시간을 둡니다.

4. 자주 묻는 질문 (Q&A)

Q. 독립형 하우징 및 배터리 전원 구성 팁은? A. 외부 전원으로 $9\text{V}$ 건전지나 $12\text{V}$ DC 어댑터를 사용할 때는 아두이노의 VIN 핀이나 **DC 배럴 자크(Jack)**로 연결해야 보드 내부 온보드 레귤레이터(5V 변환 칩)가 안전하게 동작합니다.

← 이전인터럽트(Interrupt)와 타이머 활용 다음 →