#include <Timers.h>//informacje o użyciu biblioteki https://github.com/nettigo/Timers
#define pump 8//sterowanie zasilaniem pompy
#define buzz 9//buzzer
#define butt 10//przycisk
#define zasilCzujnik 11//pin wykorzystywany do chwilowego zasilanie czujnika wilgotności (zamiast podłączenia do pinu 5V)
#define gleba A0//pin analogowy czujnika wilgotnosci
Timer klepsydra;//nowy obiekt timera
int cyklMonitorowania = 24;//wartość cyklu monitorowania wyrażona w godzinach
int poziomWilgotnosci = 500;//granica wilgotności (z zakresu 0-1024) poniżej której uruchamiane jest podlewanie
void setup() {
pinMode(gleba, INPUT);//analogowy pin czujnika wilgotnosci jako wejscie
pinMode(zasilCzujnik, OUTPUT);//pin zasilGleba jako wyjście
pinMode(pump, OUTPUT);//pompa jako wyjście
pinMode(buzz, OUTPUT);//buzzer jako wyjście
pinMode(butt, INPUT_PULLUP);//przycisk jako wejście
Serial.begin(9600);//komunikacja UART uruchomiona
klepsydra.begin(HOURS(cyklMonitorowania));//definicja czasu klepsydry - cyklu monitorowania wilgotności gleby
monitoring();//sprawdź czy potrzebne jest podlewanie
}
void loop() {
Serial.println("Stan zegara: " + String(klepsydra.time()));
if (klepsydra.available()) {//jesli zdefinowany czas obiektu klepsydra upłynął wykonaj zawartosc if'a
klepsydra.restart();//restart cyklu nawadniania
monitoring();//sprawdź czy potrzebne jest podlewanie
}
if (digitalRead(butt) == LOW) {//jeśli wciśnięto przycisk
Serial.println("Stan zegara: " + String(klepsydra.time()) + " zresetowano");
klepsydra.restart();//zrestartowanie zegara
Serial.println("Nowy stan zegara: " + String(klepsydra.time()));
pozytywka1();//sygnalizacja dźwiękowa potwierdzająca, że system "zauważył" wciśnięcie przycisku restartu
monitoring();//sprawdzenie czy potrzebne jest podlewanie
}
}
void monitoring() {//Sprawdzanie potrzeby uruchomienia pompy
digitalWrite(zasilCzujnik, HIGH);//chwilowe podanie napięcia (oszczędza energię) na pin zasilCzujnik
delay(10);//odczekanie na zadziałanie
int nawodnienie = 1023 - analogRead(gleba);
digitalWrite(zasilCzujnik, LOW);//wyłączenie zasilania czujnika (jest zbędne aż do kolejnego pomiaru)
Serial.println("Poziom wilgotnosci gleby wynosi " + String(nawodnienie));//odczyt analogowego czujnika wilgotnosci
if (nawodnienie >= poziomWilgotnosci) {//jeśli wysoka wilgotność
pozytywka2();//sygnalizacja dźwiękowa potwierdzająca, że system działa pomimo braku uruchomienia pompy (jest mokro w doniczce)
Serial.println("Mokro w doniczce");
} else if (nawodnienie < poziomWilgotnosci) {//jeśli doniczka wymaga podlania - włącz pompę
Serial.println("Uruchamiam podlewanie");
digitalWrite(pump, HIGH);//włączenie pompy
delay(3000);
digitalWrite(pump, LOW);//wyłączenie pompy
}
nawodnienie = 0;//reset stanu czujnika
}
void pozytywka1() {//sygnalizacja dźwiękowa potwierdzająca, że system "zauważył" wciśnięcie przycisku restartu
tone(buzz, 3000);
delay(200);
tone(buzz, 5000);
delay(200);
tone(buzz, 3000);
delay(200);
noTone(buzz);
}
void pozytywka2() {//sygnalizacja dźwiękowa potwierdzająca, że system działa pomimo braku uruchomienia pompy (jest mokro w doniczce)
tone(buzz, 4300);
delay(200);
tone(buzz, 3500);
delay(200);
tone(buzz, 3000);
delay(200);
noTone(buzz);
}