Мониторинг растений: сигнал о сухости
Часть раздела Проекты путешествия по Arduino на Coddy. Урок 19 из 24.
Когда почва остаётся сухой, монитор подаёт сигнал тревоги зуммером на выводе 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 мс звучит раз в секунду, пока почва остаётся сухой.
Задание
СреднеДобавь сигнал тревоги при сухой почве:
- запоминай, была ли почва сухой (
bool wasDry) и когда она стала сухой (unsigned long dryStart) - если почва остаётся сухой более 5000 ms, подавай звуковой сигнал
tone(buzzerPin, 880, 200)после каждого считывания - если влажность составляет 30% или больше, снова присвой
wasDryзначениеfalse
Нажми Run, поверни ручку вниз и подожди, затем нажми Check.
Попробуйте сами
// Поворотный регулятор заменяет датчик влажности почвы
const int sensorPin = A0;
// Индикатор состояния: RGB-светодиод
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);
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Проекты
2Игра на реакцию
Игра на реакцию: случайное ожиданиеИгра на реакцию: таймерИгра на реакцию: фальстартИгра на реакцию: лучшее время5Мониторинг растений
Мониторинг растений: влажностьМониторинг растений: индикатор состоянияМониторинг растений: сигнал о сухостиМониторинг растений: отчётПотренируйтесь самостоятельно: Песочница Arduino