### 5.12 Fattoria Intelligente con Controllo APP **Attenzione: Non far traboccare l'acqua dalle vasche di plastica negli esperimenti. Versare acqua su altri sensori potrebbe causare un cortocircuito o il malfunzionamento dei moduli. Se le batterie si bagnano, potrebbe verificarsi persino un'esplosione. Prestare la massima attenzione! Per gli utenti più giovani, si prega di operare con i genitori. Utilizzare le batterie per l'alimentazione invece del solo USB.** Aprire il codice **5.12.1APP-Smart-Farm** con Arduino IDE. ```c #include #ifdef ESP32 #include #elif defined(ESP8266) #include #endif #include #include #include //Da visualizzare #define DHT11PIN 17 //Pin sensore temperatura e umidità #define RAINWATERPIN 35 //Pin sensore vapore #define LIGHTPIN 34 //Pin fotoresistore #define WATERLEVELPIN 33 //Pin sensore livello acqua #define SOILHUMIDITYPIN 32 //Pin sensore umidità del suolo //Da controllare #define LEDPIN 27 //Pin LED #define RELAYPIN 25 //Pin relè (per controllare la pompa dell'acqua) #define SERVOPIN 26 //Pin servo #define FANPIN1 19 //Pin IN+ ventola #define FANPIN2 18 //Pin IN- ventola #define BUZZERPIN 16 //Pin buzzer const char* ssid = "your_SSID"; const char* pwd = "your_PASSWORD"; //Inizializza LCD1602, 0x27 è l'indirizzo I2C LiquidCrystal_I2C lcd(0x27, 16, 2); WiFiServer server(80); //Inizializza server wifi dht11 DHT11; //Inizializza sensore temperatura e umidità Servo myservo; // crea oggetto servo per controllare un servo // 16 oggetti servo possono essere creati sull'ESP32 //Definisci variabile come valori rilevati String request; String dataBuffer; int Temperature; //Temperatura int Humidity; //Umidità int SoilHumidity; //Umidità del suolo int Light; //Luminosità int WaterLevel; //Livello dell'acqua int Rainwater; //Pioggia void setup() { Serial.begin(9600); //Connettiti al wifi WiFi.begin(ssid, pwd); //Determina se connesso Serial.println("Connessione al WiFi..."); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } delay(1000); //Il monitor seriale stampa il nome del wifi e l'indirizzo IP Serial.println("Connesso al WiFi"); Serial.print("NOME WiFi:"); Serial.println(ssid); Serial.print("IP:"); Serial.println(WiFi.localIP()); //Inizializza LCD lcd.init(); // Accendi/spegni la retroilluminazione (opzionale) lcd.backlight(); //lcd.noBacklight(); lcd.clear(); //Imposta la posizione del cursore lcd.setCursor(0, 0); //Stampa LCD lcd.print("IP:"); //Imposta la posizione del cursore lcd.setCursor(0, 1); //Stampa LCD lcd.print(WiFi.localIP()); //imposta la modalità dei pin pinMode(LEDPIN, OUTPUT); pinMode(RAINWATERPIN, INPUT); pinMode(LIGHTPIN, INPUT); pinMode(SOILHUMIDITYPIN, INPUT); pinMode(WATERLEVELPIN, INPUT); pinMode(RELAYPIN, OUTPUT); pinMode(FANPIN1, OUTPUT); pinMode(FANPIN2, OUTPUT); pinMode(BUZZERPIN, OUTPUT); delay(1000); // collega il servo sul pin 26 all'oggetto servo myservo.attach(SERVOPIN); myservo.write(160); //Avvia server server.begin(); // Configura il canale LEDC ledcAttachChannel(BUZZERPIN, 1000, 8, 4); } void loop() { //Verifica se un client è connesso al server web //Quando il client è connesso al server, "server.available()" restituisce un oggetto WiFiClient per la comunicazione lato client. WiFiClient client = server.available(); if (client) { Serial.println("Nuovo client connesso"); while (client.connected()) { //Determina se il server invia dati if (client.available()) { request = client.readStringUntil('s'); Serial.print("Messaggio ricevuto: "); Serial.println(request); } //Acquisisci tutti i dati del sensore getSensorsData(); //inserisci tutti i dati in "dataBuffer" dataBuffer = ""; dataBuffer += String(Temperature, HEX); dataBuffer += String(Humidity, HEX); dataBuffer += dataHandle(SoilHumidity); dataBuffer += dataHandle(Light); dataBuffer += dataHandle(WaterLevel); dataBuffer += dataHandle(Rainwater); //Invia dati al server, trasmetti all'APP client.print(dataBuffer); delay(500); //LED if (request == "a") { digitalWrite(LEDPIN, HIGH); } else if (request == "A") { digitalWrite(LEDPIN, LOW); } //Irrigazione else if (request == "b") { digitalWrite(RELAYPIN, HIGH); delay(400); //Ritardo irrigazione digitalWrite(RELAYPIN, LOW); delay(650); } //Ventola else if (request == "c") { delay(800); digitalWrite(FANPIN1, HIGH); digitalWrite(FANPIN2, LOW); delay(200); } else if (request == "C") { digitalWrite(FANPIN1, LOW); digitalWrite(FANPIN2, LOW); } //Scatola di alimentazione else if (request == "d") { //Il servo ruota a 80°, apre la scatola di alimentazione myservo.write(80); delay(500); } else if (request == "D") { //Il servo ruota a 160°, chiude la scatola di alimentazione myservo.write(160); } //Buzzer else if (request == "e") { ledcWriteTone(BUZZERPIN, 262); delay(800); ledcWriteTone(BUZZERPIN, 0); delay(100); } request = ""; } Serial.println("Client disconnesso"); } } void getSensorsData() { //Acquisisci dati int chk = DHT11.read(DHT11PIN); //Sensore di vapore Rainwater = analogRead(RAINWATERPIN); //Fotoresistore Light = analogRead(LIGHTPIN); //Sensore di umidità del suolo SoilHumidity = analogRead(SOILHUMIDITYPIN) * 1.8; //Sensore di livello dell'acqua WaterLevel = analogRead(WATERLEVELPIN) * 1.8; //Temperatura Temperature = DHT11.temperature; //Umidità Humidity = DHT11.humidity; } //Converte i dati in percentuale String dataHandle(int data) { // Converte i valori analogici in percentuale int percentage = (data / 4095.0) * 100; // Se la percentuale convertita è maggiore di 100, restituisce 100. percentage = percentage > 100 ? 100 : percentage; // Sei caratteri memorizzano stringhe esadecimali, un carattere è come terminatore char hexString[3]; // Converte i valori esadecimali in stringhe esadecimali a 6 cifre, aggiunge zeri iniziali: 0 è 00, 1 è 01... sprintf(hexString, "%02X", percentage); return hexString; } ``` Modifica `your_SSID` nel codice con il nome del tuo wifi e `your_PASSWORD` con la password del wifi. Quindi carica il codice. ```c const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; ``` Scegli la scheda **ESP32 Dev Module** e la porta **COM**, quindi carica il codice. ![5458448](../media/5458448.png) **Scarica l'APP** **Per Android:** Metodo 1: Cerca "**IOT Farm**" su Google Play e scaricala. ![couapp2](../media/couapp2.png) **Per iOS:** Cerca **IOT farm** nell'APP Store e tocca per scaricare. ![image-20250417162032912](../media/image-20250417162032912.png) **La home page dell'APP** ![cou124](../media/cou124.png) **Descrizione delle funzioni dell'APP** 1. Dopo aver caricato il codice, collega il telefono alla stessa rete WIFI dell'ESP32; devi solo inserire l'indirizzo IP nell'angolo in alto a destra per connetterti. **Nota:** Richiede WIFI a **2.4 GHz**, non 5G. ![img](../media/cou126.png) 2. Visualizza il valore della temperatura della fattoria in tempo reale. ![img](../media/cou127.png) 3. Visualizza il valore dell'umidità dell'aria della fattoria in tempo reale. ![img](../media/cou128.png) 4. Visualizza il valore dell'umidità del suolo della fattoria in tempo reale. ![img](../media/cou129.png) 5. Visualizza il valore della luminosità solare della fattoria in tempo reale. ![img](../media/cou1210.png) 6. Visualizza il livello dell'acqua della fattoria in tempo reale. ![img](../media/cou1211.png) 7. Visualizza il valore analogico delle precipitazioni della fattoria in tempo reale. ![img](../media/cou1212.png) 8. Controlla il LED. ![img](../media/cou1213.png) 9. Controlla l'irrigazione tramite pompa dell'acqua. ![img](../media/cou1214.png) 10. Controlla la ventola per regolare la temperatura. ![img](../media/cou1215.png) 11. Controlla il servo per aprire o chiudere la scatola di alimentazione. ![img](../media/cou1216.png) 12. Controlla il buzzer per farlo suonare. ![img](../media/cou1217.png)