#include <WiFi.h>
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h> //Cargamos la librería DHT
#define LDR_PIN 2
#define LUZ_PIN 4
#define RIEGO_PIN 18
#define DHTTYPE DHT22 //Definimos el modelo del sensor DHT22
#define DHTPIN 5 // Se define el pin D4 del ESP32 para conectar el sensor DHT22
LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE, 22);
float h;
float t;
/*
Servidor de prueba para enviar la informacion a internet
La idea es usar un cliente http
http://httpbin.org/anything
A este servidor envia la data por ahora. Despues se puede hacer con node-red un servidor que reciba
la data y la guarde en una base de datos
*/
const char* serverName = "http://httpbin.org/anything";
HTTPClient http;
void setup() {
Serial.begin(115200); //Se inicia la comunicación serial
dht.begin();
pinMode(LDR_PIN, INPUT);
pinMode(LUZ_PIN, OUTPUT);
pinMode(RIEGO_PIN, OUTPUT);
digitalWrite(LUZ_PIN, LOW);
lcd.init();
lcd.backlight();
//____________ Parte WIFI ___________
const char* ssid = "Wokwi-GUEST";
const char* password = "";
Serial.println("Desconectamos antes de conectar el WiFi");
WiFi.disconnect();
Serial.print("Conectando a ");
Serial.println(ssid);
//Conectamos el ESP32 a la red wifi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
//Intentamos conectarnos a la red
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//Si logramos conectarnos mostramos la ip a la que nos conectamos
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
//____________ Fin Wifi ________________
}
void loop() {
lcd.setCursor(2, 0);
/*
Para que es esto?
Sirve para algo decirle a un usuario que ya oscurecio si el lo esta viendo con los ojos?
*/
lcd.print("OSCURIDAD?:");
if (digitalRead(LDR_PIN) == LOW) {
lcd.print("falso!");
digitalWrite(LUZ_PIN, LOW);
} else {
lcd.print("Verdad! ");
digitalWrite(LUZ_PIN, HIGH);
}
delay(2000);
lcd.clear();
h = dht.readHumidity(); //Se lee la humedad y se asigna el valor a "h"
t = dht.readTemperature(); //Se lee la temperatura y se asigna el valor a "t"
//Se imprimen las variables
Serial.println("Humedad: ");
Serial.println(h);
Serial.println("Temperatura: ");
Serial.println(t);
delay(2000);
//lcd.clear();
lcd.setCursor(0,0);
lcd.print("Humedad="); lcd.print(h); //Imprime en el LCD la humedad del ambiente
lcd.setCursor(0,1);
lcd.print("Temperatura="); lcd.print(t); ////Imprime en el LCD la Temperatura del ambiente
if(t>25 || h<5){
digitalWrite(RIEGO_PIN, HIGH); //Riega abre la electrovalvula durante un minuto para riego de plantas
delay(60000);
digitalWrite(RIEGO_PIN, LOW); //Cierra la electrovalvula
}else {
digitalWrite(RIEGO_PIN, LOW); //Se asegura que este cerrada la electrovalvula
}
/*
Aqui envia temperetura y humedad al servidor
*/
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
http.begin(client, serverName);
// Para un servidor nuestro tendria que haber un usuario y contraseña
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
http.addHeader("Content-Type", "application/json");
//Aqui enviar en un POST request la informacion al servidor
int httpResponseCode = http.POST("{\"temperatura\":" + String(t) + "\"humedad\":" + String(h) + "}");
Serial.print("Respuesta del servidor: ");
Serial.println(httpResponseCode);
//Imprime en la consola serial la respuesta del servidor. En este servidor de prueba respondera lo mismo que recibio
Serial.println(http.getString());
http.end();
}else{
Serial.println("Error enviando datos al servidor por que no hay conexion Wifi");
}
delay(5000);
lcd.clear();
}