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.

Scarica l’APP
Per Android:
Metodo 1: Cerca “IOT Farm” su Google Play e scaricala.

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

La home page dell’APP

Descrizione delle funzioni dell’APP
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.

Visualizza il valore della temperatura della fattoria in tempo reale.

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

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

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

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

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

Controlla il LED.

Controlla l’irrigazione tramite pompa dell’acqua.

Controlla la ventola per regolare la temperatura.

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

Controlla il buzzer per farlo suonare.
