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.

#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif

#include <dht11.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>

//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.

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

Scarica l’APP

Per Android:

Metodo 1: Cerca “IOT Farm” su Google Play e scaricala.

couapp2

Per iOS:

Cerca IOT farm nell’APP Store e tocca per scaricare.

image-20250417162032912

La home page dell’APP

cou124

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

  1. Visualizza il valore della temperatura della fattoria in tempo reale.

img

  1. Visualizza il valore dell’umidità dell’aria della fattoria in tempo reale.

img

  1. Visualizza il valore dell’umidità del suolo della fattoria in tempo reale.

img

  1. Visualizza il valore della luminosità solare della fattoria in tempo reale.

img

  1. Visualizza il livello dell’acqua della fattoria in tempo reale.

img

  1. Visualizza il valore analogico delle precipitazioni della fattoria in tempo reale.

img

  1. Controlla il LED.

img

  1. Controlla l’irrigazione tramite pompa dell’acqua.

img

  1. Controlla la ventola per regolare la temperatura.

img

  1. Controlla il servo per aprire o chiudere la scatola di alimentazione.

img

  1. Controlla il buzzer per farlo suonare.

img