059_토양수분센서_스마트화분 🌱🪴

도로시와 지니의 토양 수분 센서 탐구

도로시와 지니가 함께하는 토양 유전율 및 저항 측정 원리, LM393 비교기 모듈 및 스마트 화분 자동 급수기 제작

  • 👧 도로시: “교수님! 지니야! 내 반려 식물 화분의 흙이 바짝 말라 시들어가고 있는지, 아니면 뿌리가 썩을 정도로 물이 흥건한지 어떻게 알 수 있어?”
  • 👨‍🏫 이호진 교수님: “흙 속에 쏙 꽂아두면 토양 속 수분과 미네랄이 전도하는 미세 전류를 측정하는 포크 모양의 토양 습도 센서(Soil Moisture Sensor) 덕분이란다!”
  • 🐶 토토: “바우! 흙이 마르면 목마르다고 빨간 불을 깜빡이고 스스로 물을 뿜어주자 멍!”

  • 🖥️ 강의 슬라이드: slides.md

1. 토양 수분 센서의 구조와 2개 금속 탐침(Probe)

토양 수분 센서 프로브와 신호 처리 보드

🍴 포크 모양 탐침과 LM393 비교기 드라이버

  • 포크형 탐침 프로브 (Fork-style Probe):
    • 흙 속에 직접 꽂는 두 갈래의 길쭉한 금속 다리입니다.
    • 표면에 주석이나 금 도금 처리가 되어 있어 부식을 방지하고 흙 속의 전도도를 감지합니다.
  • 신호 처리 모듈 (LM393 Comparator):
    • 프로브에서 측정한 미세 신호를 아날로그 전압(AO)으로 정밀하게 증폭하고,
    • 파란색 가변저항(트리머)을 돌려 기준점을 설정하면 임계치에 따라 0V/5V 디지털 신호(DO)를 생성해 줍니다.

2. 작동 메커니즘: 토양 내 수분량과 전기 전도도

토양 속 수분 함량에 따른 통전 원리

🔬 흙 알갱이 사이의 물 분자가 만드는 전도 통로

  1. 바짝 마른 흙 (Dry Soil):
    • 흙 알갱이들 사이의 틈(공극)에 전기가 통하지 않는 건조한 공기만 가득합니다.
    • 탐침 사이의 전기 저항이 매우 높아 전기가 거의 흐르지 못합니다 (아날로그 측정값: 약 800 ~ 1023 건조).
  2. 물을 듬뿍 준 촉촉한 흙 (Moist Soil):
    • 흙 속의 공극에 물이 가득 차오르고, 토양에 포함된 미네랄 염분이 전해질 역할을 합니다.
    • 두 전극 사이에 풍부한 전류가 흐르며 저항이 급격히 낮아집니다 (아날로그 측정값: 약 300 ~ 600 적정 습도).
  3. 물속에 완전히 담갔을 때 (In Water):
    • 전기 전도가 극대화되어 저항이 최저점으로 떨어집니다 (아날로그 측정값: 약 200 ~ 300).

3. 센서 모듈의 핀 구성과 하드웨어 배선

아두이노와 토양 습도 센서 브레드보드 결선도

🔌 4핀 커넥터 인터페이스 규격

모듈 핀 기능 설명 아두이노 연결 핀 역할
VCC 전원 입력 (3.3V ~ 5V) 아두이노 5V 센서 구동 전원 공급
GND 전원 접지 (0V) 아두이노 GND 공통 기준 전위 결선
AO 아날로그 습도 출력 아두이노 A0 핀 0 ~ 1023 연속 수치 전압 출력
DO 디지털 임계값 출력 디지털 핀 (선택사항) 가변저항 기준값 초과 시 LOW/HIGH 출력

4. 실습 전체 코드: 스마트 화분 자동 수분 감시 (Arduino C++)

💻 흙의 상태를 실시간 진단하고 물 부족 경보를 울리는 펌웨어

// 핀 번호 상수 정의
const int SOIL_PIN   = A0; // 토양 습도 센서 아날로그 출력 핀
const int PUMP_LED   = 9;  // 워터 펌프 또는 급수 알림 LED 핀
const int BUZZER_PIN = 8;  // 물 부족 경보용 부저 핀

// 토양 습도 상태 임계값 (실제 화분 흙 환경에 맞게 보정)
const int DRY_THRESHOLD  = 750; // 750 초과 시 바짝 마름 (물 공급 필요)
const int WET_THRESHOLD  = 450; // 450 미만 시 수분 과다/충분

void setup() {
  // PC 시리얼 모니터 통신 시작 (9600 bps)
  Serial.begin(9600);

  // 출력 핀 설정
  pinMode(PUMP_LED, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  digitalWrite(PUMP_LED, LOW);
  digitalWrite(BUZZER_PIN, LOW);

  Serial.println("==========================================");
  Serial.println("   Smart Plant Moisture Monitor Ready!    ");
  Serial.println("==========================================");
}

void loop() {
  // 1. 토양 습도 아날로그 ADC 값 읽기 (저항형 센서: 마를수록 값이 커짐)
  int soilRaw = analogRead(SOIL_PIN);

  // 2. 센서값을 직관적인 0 ~ 100% 수분 백분율로 환산 (1023->0%, 300->100%)
  int moisturePercent = map(soilRaw, 1023, 300, 0, 100);
  moisturePercent = constrain(moisturePercent, 0, 100);

  // 3. 시리얼 모니터 출력
  Serial.print("Soil ADC: ");
  Serial.print(soilRaw);
  Serial.print(" | Moisture: ");
  Serial.print(moisturePercent);
  Serial.print("% -> ");

  // 4. 수분 상태에 따른 조건 분기 및 자동 급수 제어
  if (soilRaw > DRY_THRESHOLD) {
    // 흙이 바짝 마른 상태: 빨간 LED 점등 및 물 공급 알림
    digitalWrite(PUMP_LED, HIGH);
    tone(BUZZER_PIN, 500, 200); // 삐- 짧은 비프음
    Serial.println("🚨 [THIRSTY] Soil is too dry! Please water the plant!");
  } 
  else if (soilRaw < WET_THRESHOLD) {
    // 흙이 충분히 촉촉한 상태: 펌프 정지
    digitalWrite(PUMP_LED, LOW);
    noTone(BUZZER_PIN);
    Serial.println("💧 [SOAKED] Moisture is very high.");
  } 
  else {
    // 완벽한 적정 수분 상태
    digitalWrite(PUMP_LED, LOW);
    noTone(BUZZER_PIN);
    Serial.println("🌿 [OPTIMAL] Plant is happy and healthy!");
  }

  // 1초 대기
  delay(1000);
}

5. 코드 상세 해설 및 저항형 센서의 반비례 매핑

int soilPin = A1;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int value = analogRead(soilPin);
  Serial.print("Soil Moisture: ");
  Serial.println(value);
  delay(500);
}

🔍 왜 값이 커질수록 흙이 마른 것일까요?

  1. 저항형 전압 분배 구조:
    • 토양 센서 모듈의 AO 핀은 흙의 저항이 커질수록 5V에 가까운 전압을 출력하도록 회로가 설계되어 있습니다.
    • 따라서 공기 중(완전 건조) 에서는 약 1023, 물속(완전 젖음) 에서는 약 250 ~ 300의 역방향 수치가 나옵니다.
  2. map(soilRaw, 1023, 300, 0, 100)의 반전 기법:
    • 인간이 이해하기 쉽게 1023을 0%, 300을 100%로 거꾸로 매핑하여 직관적인 “토양 습도 65%” 같은 백분율로 손쉽게 환산할 수 있습니다.

6. 스마트 팜(Smart Farm) 워터 펌프 자동 급수 확장

워터 펌프 릴레이 연동 자동 급수기

  • 워터 펌프 릴레이 모듈 연동:
    • 흙이 마르면 디지털 9번 핀으로 5V 릴레이를 ON 시켜 미니 잠수 펌프를 3초간 가동하여 자동으로 물을 급수합니다.
  • 과급수 방지 안전 타이머:
    • 물이 흙 속으로 스며들어 프로브에 도달하기까지 1~2분의 지연 시간이 걸리므로, 1회 급수 후 최소 5분간 급수를 멈추는 딜레이 로직을 넣어 과습으로 인한 뿌리 썩음을 방지합니다.
void loop() {
  int value = analogRead(soilPin);
  delay(100);
  if (value > 450) {
    mylcd.clear();
    mylcd.setCursor(0, 0);
    mylcd.print("Soil: DRY! Water");
  } else {
    mylcd.clear();
    mylcd.setCursor(0, 0);
    mylcd.print("Soil: MOIST OK");
  }
}

🌟 도로시와 지니의 핵심 요약 노트!

토양 상태 수분량 탐침 저항 AO 아날로그 값 환산 습도 시스템 동작
바짝 마름 (Dry) 공기 가득 매우 높음 800 ~ 1023 0 ~ 20% 급수 펌프 가동 / 알림 🚨
적정 습도 (Good) 촉촉함 중간 저항 450 ~ 750 30 ~ 70% 최적 생장 상태 (대기)
수분 과다 (Wet) 물 흥건 매우 낮음 200 ~ 450 70 ~ 100% 급수 차단
  • 👧 도로시: “흙이 마르면 저항이 커져서 ADC 값이 올라간다는 원리를 알고, map()으로 0~100%로 뒤집어 계산하니 화분의 목마름을 한눈에 알 수 있어!”
  • 👨‍🏫 이호진 교수님: “맞아! 여기에 릴레이 펌프까지 더하면 여행을 떠나도 식물이 혼자 무럭무럭 자라는 스마트 팜이 된단다.”
  • 🐶 토토: “바우! 다음 시간엔 하늘에서 떨어지는 비를 감지하는 빗물 센서다 멍!”
서브목차