Menu
CoddyTech

Monitor rośliny: raport

Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 20 z 24.

Ostatni krok zapisuje raport raz na sekundę: wilgotność i słowo określające stan: DRY, OK lub WET. Raport trafia na ekran LCD, aby mógł go odczytać każdy przy roślinie, oraz do monitora portu szeregowego, aby mógł go odczytać komputer.

Ekran LCD jest podłączony w standardowy sposób: LiquidCrystal lcd(12, 11, 5, 4, 3, 2); oraz lcd.begin(16, 2) w setup(). W górnym wierszu wyświetla się Moisture: 42%, a w dolnym — słowo.

W monitorze portu szeregowego słowo znajduje się w tym samym wierszu co wilgotność, więc wyświetl wilgotność za pomocą Serial.print(), a nie println(). Następnie wybierz słowo na podstawie trzech zakresów światełka stanu i wyświetl je w obu miejscach:

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");
}

Zwróć uwagę na poprzednie znaki. OK jest krótsze niż DRY, więc wyświetl "OK " ze spacją, w przeciwnym razie na ekranie pojawi się OKY. To samo dotyczy zmiany 100% na 5%: wyświetl kilka spacji po %.

challenge icon

Wyzwanie

Średni

Wyświetlaj raport raz na sekundę:

  • skonfiguruj LCD (piny 12, 11, 5, 4, 3, 2) w setup()
  • górny wiersz: Moisture: 42%, ze spacjami na końcu
  • dolny wiersz: DRY poniżej 30%, OK od 30% do 70%, WET powyżej 70%, dopełniony spacjami
  • monitor portu szeregowego: jeden wiersz, np. Moisture: 42% OK

Zachowaj kontrolkę statusu i alarm. Naciśnij Run, a następnie Check.

Spróbuj swoich sił

// Pokrętło zastępuje czujnik wilgotności gleby
const int sensorPin = A0;
// Kontrolka stanu: dioda LED RGB
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;
// Alarm
const int buzzerPin = 8;

bool wasDry = false;         // czy gleba była sucha przy ostatnim odczycie?
unsigned long dryStart = 0;  // kiedy gleba stała się sucha

// Wilgotność w procentach: 0 oznacza całkowicie suchą glebę, 100 — całkowicie mokrą.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Czerwony, gdy gleba jest sucha, zielony, gdy wilgotność jest odpowiednia, niebieski, gdy gleba jest mokra.
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);
  }
}

// Włączaj sygnał dźwiękowy raz na sekundę, gdy gleba jest sucha przez ponad 5 sekund.
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Projekty

Poćwicz samodzielnie: Edytor online Arduino