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.

5458448

Descargar APP

Para Android:

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

couapp2

Para iOS:

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

image-20250417162032912

La página de inicio de la APP

cou124

Descripción de las funciones de la APP

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

img

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

img

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

img

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

img

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

img

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

img

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

img

  1. Controla el LED.

img

  1. Controla el riego mediante la bomba de agua.

img

  1. Controla el ventilador para ajustar la temperatura.

img

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

img

  1. Controla el zumbador para que suene.

img