Menu
CoddyTech

Мониторинг растений: отчёт

Часть раздела Проекты путешествия по Arduino на Coddy. Урок 20 из 24.

Последний шаг записывает отчет раз в секунду: влажность и слово состояния — DRY, OK или WET. Он выводится на LCD для всех, кто находится рядом с растением, и на монитор Serial для компьютера.

LCD подключен обычным способом: LiquidCrystal lcd(12, 11, 5, 4, 3, 2); и lcd.begin(16, 2) в setup(). В верхней строке отображается Moisture: 42%, а в нижней — слово.

На мониторе Serial слово должно завершать ту же строку, что и значение влажности, поэтому выведите влажность с помощью Serial.print(), а не println(). Затем выберите слово по трем диапазонам индикатора состояния и выведите его в оба места:

if (moisture < 30) {
  lcd.print("DRY");
  Serial.println("DRY");
} else if (moisture <= 70) {
  lcd.print("OK ");
  Serial.println("OK");
} else {
  lcd.print("WET");
  Serial.println("WET");
}

Следите за старыми символами. OK короче, чем DRY, поэтому выведите "OK " с пробелом, иначе на экране появится OKY. То же самое происходит, когда 100% сменяется на 5%: выведите пару пробелов после %.

challenge icon

Задание

Средне

Выводите отчет раз в секунду:

  • настройте LCD (контакты 12, 11, 5, 4, 3, 2) в setup()
  • верхняя строка: Moisture: 42%, с пробелами после неё
  • нижняя строка: DRY при значении ниже 30%, OK от 30% до 70%, WET выше 70%, дополненная пробелами
  • монитор Serial: одна строка, например Moisture: 42% OK

Оставьте индикатор состояния и сигнализацию. Нажмите Run, затем Check.

Попробуйте сами

// Ручка регулятора заменяет датчик влажности почвы
const int sensorPin = A0;
// Индикатор состояния: RGB-светодиод
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;
// Звуковой сигнал
const int buzzerPin = 8;

bool wasDry = false;         // была ли почва сухой при предыдущем измерении?
unsigned long dryStart = 0;  // когда почва стала сухой

// Влажность в процентах: 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);
  }
}

// Подаёт звуковой сигнал раз в секунду, если почва остаётся сухой более 5 секунд.
void checkAlarm(int moisture) {
  if (moisture < 30) {
    if (wasDry == false) {
      wasDry = true;
      dryStart = millis();
    }
    if (millis() - dryStart > 5000) {
      tone(buzzerPin, 880, 200);
    }
  } else {
    wasDry = false;
  }
}

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);
  checkAlarm(moisture);
  delay(1000);
}
quiz iconПроверьте себя

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

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

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