Menu
CoddyTech

Мониторинг растений: сигнал о сухости

Часть раздела Проекты путешествия по 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 мс звучит раз в секунду, пока почва остаётся сухой.

challenge icon

Задание

Средне

Добавь сигнал тревоги при сухой почве:

  • запоминай, была ли почва сухой (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);
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Проекты

Потренируйтесь самостоятельно: Песочница Arduino