5.12 Granja Inteligente con Control por APP
Atención: No desborde agua de las piscinas de plástico en los experimentos. Derramar agua sobre otros sensores puede causar un cortocircuito o que los módulos dejen de funcionar. Si las baterías se mojan, incluso puede ocurrir una explosión. ¡Tenga mucho cuidado! Para usuarios más jóvenes, opere con sus padres. Use baterías para la alimentación en lugar de solo USB.
Abra el código 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>
//Para mostrar
#define DHT11PIN 17 //Pin del sensor de temperatura y humedad
#define RAINWATERPIN 35 //Pin del sensor de vapor
#define LIGHTPIN 34 //Pin del fotorresistor
#define WATERLEVELPIN 33 //Pin del sensor de nivel de agua
#define SOILHUMIDITYPIN 32 //Pin del sensor de humedad del suelo
//Para controlar
#define LEDPIN 27 //Pin del LED
#define RELAYPIN 25 //Pin del relé (para controlar la bomba de agua)
#define SERVOPIN 26 //Pin del servo
#define FANPIN1 19 //Pin IN+ del ventilador
#define FANPIN2 18 //Pin IN- del ventilador
#define BUZZERPIN 16 //Pin del zumbador
const char* ssid = "your_SSID";
const char* pwd = "your_PASSWORD";
//Inicializar LCD1602, 0x27 es la dirección I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiServer server(80); //Inicializar servidor wifi
dht11 DHT11; //Inicializar sensor de temperatura y humedad
Servo myservo; // crear objeto servo para controlar un servo
// Se pueden crear 16 objetos servo en el ESP32
//Definir variable como valores detectados
String request;
String dataBuffer;
int Temperature; //Temperatura
int Humidity; //Humedad
int SoilHumidity; //Humedad del suelo
int Light; //Brillo
int WaterLevel; //Nivel de agua
int Rainwater; //Lluvia
void setup() {
Serial.begin(9600);
//Conectar a wifi
WiFi.begin(ssid, pwd);
//Determinar si está conectado
Serial.println("Conectando a WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
delay(1000);
//El monitor serie imprime el nombre del wifi y la dirección IP
Serial.println("Conectado a WiFi");
Serial.print("NOMBRE WiFi:");
Serial.println(ssid);
Serial.print("IP:");
Serial.println(WiFi.localIP());
//Inicializar LCD
lcd.init();
// Apagar/encender la retroiluminación (opcional)
lcd.backlight();
//lcd.noBacklight();
lcd.clear();
//Establecer la posición del cursor
lcd.setCursor(0, 0);
//El LCD imprime
lcd.print("IP:");
//Establecer la posición del cursor
lcd.setCursor(0, 1);
//El LCD imprime
lcd.print(WiFi.localIP());
//establecer modo de pines
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);
// conecta el servo en el pin 26 al objeto servo
myservo.attach(SERVOPIN);
myservo.write(160);
//Iniciar servidor
server.begin();
// Configurar canal LEDC
ledcAttachChannel(BUZZERPIN, 1000, 8, 4);
}
cpp
void loop() {
//Comprobar si un cliente está conectado al servidor web
//Cuando el cliente está conectado al servidor, "server.available()" devuelve un objeto WiFiClient para la comunicación del lado del cliente.
WiFiClient client = server.available();
if (client) {
Serial.println("Nuevo cliente conectado");
while (client.connected()) {
//Determinar si el servidor envía datos
if (client.available()) {
request = client.readStringUntil('s');
Serial.print("Mensaje recibido: ");
Serial.println(request);
}
//Adquirir todos los datos del sensor
getSensorsData();
//Poner todos los datos en "dataBuffer"
dataBuffer = "";
dataBuffer += String(Temperature, HEX);
dataBuffer += String(Humidity, HEX);
dataBuffer += dataHandle(SoilHumidity);
dataBuffer += dataHandle(Light);
dataBuffer += dataHandle(WaterLevel);
dataBuffer += dataHandle(Rainwater);
//Enviar datos al servidor, transmitir a la APP
client.print(dataBuffer);
delay(500);
//LED
if (request == "a") {
digitalWrite(LEDPIN, HIGH);
} else if (request == "A") {
digitalWrite(LEDPIN, LOW);
}
//Riego
else if (request == "b") {
digitalWrite(RELAYPIN, HIGH);
delay(400); //Retraso de riego
digitalWrite(RELAYPIN, LOW);
delay(650);
}
//Ventilador
else if (request == "c") {
delay(800);
digitalWrite(FANPIN1, HIGH);
digitalWrite(FANPIN2, LOW);
delay(200);
} else if (request == "C") {
digitalWrite(FANPIN1, LOW);
digitalWrite(FANPIN2, LOW);
}
//Caja de alimentación
else if (request == "d") {
//El servo gira a 80°, abre la caja de alimentación
myservo.write(80);
delay(500);
} else if (request == "D") {
//El servo gira a 160°, cierra la caja de alimentación
myservo.write(160);
}
//Zumbador
else if (request == "e") {
ledcWriteTone(BUZZERPIN, 262);
delay(800);
ledcWriteTone(BUZZERPIN, 0);
delay(100);
}
request = "";
}
Serial.println("Cliente desconectado");
}
}
void getSensorsData() {
//Adquirir datos
int chk = DHT11.read(DHT11PIN);
//Sensor de vapor
Rainwater = analogRead(RAINWATERPIN);
//Fotorresistor
Light = analogRead(LIGHTPIN);
//Sensor de humedad del suelo
SoilHumidity = analogRead(SOILHUMIDITYPIN) * 1.8;
//Sensor de nivel de agua
WaterLevel = analogRead(WATERLEVELPIN) * 1.8;
//Temperatura
Temperature = DHT11.temperature;
//Humedad
Humidity = DHT11.humidity;
}
//Convertir datos a porcentaje
String dataHandle(int data) {
// Convertir valores analógicos a porcentaje
int percentage = (data / 4095.0) * 100;
// Si el porcentaje convertido es mayor que 100, se muestra 100.
percentage = percentage > 100 ? 100 : percentage;
// Seis caracteres almacenan cadenas hexadecimales, un carácter es como terminador
char hexString[3];
// Convertir valores hexadecimales a cadenas hexadecimales de 6 dígitos, añadir ceros iniciales: 0 es 00, 1 es 01...
sprintf(hexString, "%02X", percentage);
return hexString;
}
Cambia your_SSID en el código por el nombre de tu wifi, y your_PASSWORD por la contraseña del wifi. Luego sube el código.
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
Elige la placa ESP32 Dev Module y el puerto COM, y sube el código.

Descargar APP
Para Android:
Método 1: Busca “IOT Farm” en Google Play y descárgala.

Para iOS:
Busca IOT farm en la App Store y toca para descargar.

La página de inicio de la APP

Descripción de las funciones de la APP
Después de subir el código, conecta el teléfono a la misma WIFI que el ESP32, solo necesitas introducir la dirección IP en la esquina superior derecha para conectar. Nota: Requiere WIFI de 2.4 GHz, no 5G.

Muestra el valor de la temperatura de la granja en tiempo real.

Muestra el valor de la humedad del aire de la granja en tiempo real.

Muestra el valor de la humedad del suelo de la granja en tiempo real.

Muestra el valor de la luminosidad solar de la granja en tiempo real.

Muestra el nivel de agua de la granja en tiempo real.

Muestra el valor analógico de la lluvia de la granja en tiempo real.

Controla el LED.

Controla el riego mediante la bomba de agua.

Controla el ventilador para ajustar la temperatura.

Controla el servo para abrir o cerrar la caja de alimentación.

Controla el zumbador para que suene.
