식물 모니터: 건조 경보
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 경고음이 초당 한 번 울립니다.
챌린지
중급건조 경보를 추가하세요:
- 흙이 건조했는지(
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);
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
프로젝트의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드