### 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. ![cou101](../media/551.png) **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è. ![couy101](../media/couy101.png) **Pompa dell'acqua:** ![cou1011](../media/1561.png) **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. ```c #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. ![5458448](../media/5458448.png) **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. ```c #include #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. ![5458448](../media/5458448.png) **Risultato del Test:** L'LCD 1602 visualizzerà il valore attuale dell'umidità del suolo e del livello dell'acqua. ![cou102](../media/cou102.png) 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. ![flo10](../media/flo10.png)