5.10 Sistema di auto-irrigazione
5.10.1 Sistema di pompaggio dell’acqua
In questo esperimento, useremo la scheda di sviluppo ESP32 per accendere/spegnere la pompa dell’acqua tramite un modulo relè. Una pompa solleva l’acqua e trasporta liquidi, e di solito è combinata con un modulo relè nell’uso.
Modulo Relè:
Nell’uso, è spesso impiegato nella gestione di alta tensione e corrente di carico, ad esempio, motori, sensori ad alta corrente e luci ad alta potenza.

Normalmente Aperto (NO): Questo pin è normalmente aperto, a meno che non venga ricevuto un segnale dal pin di segnale del relè. Pertanto, i pin comuni sono disconnessi tramite il pin NC e connessi tramite il pin NO.
Contatto Comune (COM): Questo pin si collega ad altri moduli, ad esempio, la pompa dell’acqua.
Normalmente Chiuso (NC): Il pin NC è collegato al pin COM per formare un circuito chiuso. Utilizza la scheda ESP32 per controllare la chiusura e la disconnessione del modulo relè.

Pompa dell’acqua:

Parametri:
Tensione di alimentazione: 5V
Corrente statica: 2mA
Tensione massima di contatto: 250VAC/30VDC
Corrente massima: 10A
Aprire il codice 5.10.1Water-Pump con Arduino IDE.
#define RelayPin 25
char content; //Define a character string as the received value from serial port
void setup() {
Serial.begin(9600);
pinMode(RelayPin,OUTPUT);
}
void loop() {
//Serial.read() receives one byte once. For example, when input "aaa", it receives one "a" at a time for three times in total.
if(Serial.available() > 0) {
if (Serial.read() == 'a') //When the input value equals to "a", irrigation begins.
{
digitalWrite(RelayPin,HIGH);
delay(400);//irrigation delay
digitalWrite(RelayPin,LOW);
delay(700);
}
}
}
Scegliere la scheda ESP32 Dev Module e la porta COM, e caricare il codice.

Risultato del Test:
Aprire il monitor seriale e digitare “a”, pomperà l’acqua una volta.
Attenzione: Non far traboccare l’acqua dalle vasche di plastica negli esperimenti. L’acqua che si riversa su altri sensori può causare non solo un cortocircuito o il malfunzionamento dei moduli, ma anche la generazione di calore e persino esplosioni. Fate molta attenzione! Soprattutto per gli utenti più giovani, si prega di operare con i propri genitori.
5.10.2 Sistema di Auto-Irrigazione
In questo esperimento, colleghiamo i due sensori alla scheda di sviluppo ESP32 e programmiamo per leggere i loro valori di output per controllare il relè e la pompa dell’acqua.
Se il terreno è molto secco, il relè si accenderà per controllare la pompa dell’acqua per irrigare le piante; e se il livello dell’acqua è troppo basso, la pompa dell’acqua non sarà in grado di funzionare, e il cicalino suonerà.
Aprire il codice 5.10.2Auto-irrigation con Arduino IDE.
#include <LiquidCrystal_I2C.h>
#define BuzzerPin 16
#define SoilHumidityPin 32
#define WaterLevelPin 33
#define RelayPin 25
#define ButtonPin 5 //Define a button pin
int value = 0; //Set an initial button value
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
//Set the pins mode
pinMode(SoilHumidityPin, INPUT);
pinMode(WaterLevelPin, INPUT);
pinMode(RelayPin, OUTPUT);
pinMode(ButtonPin, INPUT);
//Initialize LCD
lcd.init();
//Turn on LCD backlight
lcd.backlight();
//Clear LCD displays
lcd.clear();
ledcAttachChannel(BuzzerPin, 1000, 8, 4);
}
void loop() {
//define variables as the read values of water level, humidity and button state
int shvalue = analogRead(SoilHumidityPin);
int wlvalue = analogRead(WaterLevelPin);
int ReadValue = digitalRead(ButtonPin);
//Set the display position of cursor
lcd.setCursor(0, 0);
//Set the display position of character strings
lcd.print("SoilHum:");
lcd.setCursor(9, 0);
lcd.print(shvalue);
lcd.setCursor(0, 1);
lcd.print("WaterLevel:");
lcd.setCursor(11, 1);
lcd.print(wlvalue);
//Determine whether the button is pressed
if (ReadValue == 0) {
//Eliminate the button shake
delay(10);
if (ReadValue == 0) {
value = !value;
Serial.print("The current status of the button is : ");
Serial.println(value);
}
//Again, determine whether the button is still pressed
//Pressed: execute the loop; Released: exit the loop to next execution
while (digitalRead(ButtonPin) == 0)
;
}
//When the detected humidity is lower than the set threshold, the buzzer starts to alarm. Press button to stop alarming.
if (500 >= shvalue && value == 0) {
ledcWriteTone(BuzzerPin, 532);
delay(100);
ledcWriteTone(BuzzerPin, 532);
delay(100);
ledcWriteTone(BuzzerPin, 659);
delay(100);
ledcWriteTone(BuzzerPin, 0); //Stop alarming
}
//When the detected water level is lower than the set threshold, the buzzer starts to alarm. Press button to stop alarming.
if (500 >= wlvalue && value == 0) {
ledcWriteTone(BuzzerPin, 411);
delay(100);
ledcWriteTone(BuzzerPin, 639);
delay(100);
ledcWriteTone(BuzzerPin, 411);
delay(100);
ledcWriteTone(BuzzerPin, 0); //Stop alarming
}
//When the detected humidity is lower than the set threshold, and the water is sufficient in the pool, irrigation starts automatically.
if (500 >= shvalue && wlvalue >= 1000) {
digitalWrite(RelayPin, HIGH);
delay(400); //Irrigation delay.
digitalWrite(RelayPin, LOW);
delay(700);
}
delay(500);
//Clear displays
lcd.clear();
}
Scegliere la scheda ESP32 Dev Module e la porta COM, e caricare il codice.

Risultato del Test:
L’LCD 1602 visualizzerà il valore attuale dell’umidità del suolo e del livello dell’acqua.

Quando il valore rilevato dell’umidità del suolo è inferiore a 500, il cicalino suona per segnalare che il suolo è arido. Se il valore del livello dell’acqua è maggiore di 1000, l’irrigazione inizia automaticamente.
Quando il livello dell’acqua rilevato è inferiore a 500, il sistema di pompaggio dell’acqua non funziona e il cicalino suona per segnalare che l’acqua è insufficiente. Premere il pulsante per interrompere l’allarme.
