Menu
CoddyTech

식물 모니터: 건조 경보

Coddy Arduino 여정의 프로젝트 섹션에 포함된 레슨. 24개 중 19번째.

흙이 계속 마르면 모니터는 8번 핀의 버저를 울려 도움을 요청합니다. 하지만 즉시 울리지는 않습니다. 측정값이 잠깐 떨어질 수도 있고, 아무 이유 없이 울리는 경보는 곧 무시되기 때문입니다. 기준은 5초 넘게 마른 상태를 유지하는 것입니다(실제 식물이라면 몇 시간 기다립니다).

흙이 얼마나 오래 말라 있었는지 알려면 흙이 마른 상태가 된 순간을 기록해야 합니다. 그러려면 기억할 정보가 하나 더 필요합니다. 마지막 측정 때 흙이 말라 있었는지 여부입니다.

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // 방금 건조해졌다
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

else도 중요합니다. 흙에 물을 주면 wasDry가 다시 false가 되므로, 다음에 흙이 마를 때는 그때부터 시간을 잽니다.

loop()는 초당 한 번 읽으므로, 흙이 계속 마른 상태인 동안 200 ms 경고음이 초당 한 번 울립니다.

challenge icon

챌린지

중급

건조 경보를 추가하세요:

  • 흙이 건조했는지(bool wasDry)와 건조해진 시점(unsigned long dryStart)을 기억하세요
  • 5000 ms 넘게 건조한 상태이면, 판독할 때마다 tone(buzzerPin, 880, 200)을 재생하세요
  • 수분이 30% 이상이면 wasDry를 다시 false로 설정하세요

Run을 누르고 손잡이를 낮춘 다음 기다린 후 Check를 누르세요.

직접 해보기

// 노브가 토양 수분 센서 역할을 합니다
const int sensorPin = A0;
// 상태 표시등: RGB LED
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;

// 수분을 백분율로 나타냅니다: 0은 완전히 건조한 상태, 100은 흠뻑 젖은 상태입니다.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// 건조하면 빨간색, 적당하면 초록색, 젖어 있으면 파란색입니다.
void showStatus(int moisture) {
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, LOW);
  if (moisture < 30) {
    digitalWrite(redPin, HIGH);
  } else if (moisture <= 70) {
    digitalWrite(greenPin, HIGH);
  } else {
    digitalWrite(bluePin, HIGH);
  }
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int moisture = readMoisture();
  Serial.print("Moisture: ");
  Serial.print(moisture);
  Serial.println("%");
  showStatus(moisture);
  delay(1000);
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

프로젝트의 모든 레슨

직접 연습해 보세요: Arduino 플레이그라운드