//Practica ESP32 +DHT22 para wokwi
//hecha por OAP
#include <WiFi.h>
#include "DHTesp.h"
#include "ThingSpeak.h"
#include <HTTPClient.h>
const int DHT_PIN = 13; // Número del pin al que está conectado el sensor DHT22
const int LED_PIN = 23;
const char* WIFI_NAME = "Wokwi-GUEST"; // Nombre de la red WiFi
const char* WIFI_PASSWORD = ""; // Contraseña de la red WiFi
const int myChannelNumber =3269157; // Número de canal de ThingSpeak
const char* myApiKey ="0416JDF44H168QSD"; // Clave de API de ThingSpeak
const char* server = "api.thingspeak.com"; // Dirección del servidor de ThingSpeak
////////
// -------- PINES LED--------
byte segmentos[7] = { 2, 4, 5, 18, 19, 21, 22 }; // a b c d e f g
byte dispDecenas = 26; // decenas
byte dispUnidades = 25; // unidades
#define DHTPIN 13 // Digital pin connected to the DHT sensor
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Tabla para display de 7 segmentos ÁNODO COMÚN
// LOW = encendido, HIGH = apagado
byte numeros[10][7] = {
{ 0, 0, 0, 0, 0, 0, 1 }, // 0
{ 1, 0, 0, 1, 1, 1, 1 }, // 1
{ 0, 0, 1, 0, 0, 1, 0 }, // 2
{ 0, 0, 0, 0, 1, 1, 0 }, // 3
{ 1, 0, 0, 1, 1, 0, 0 }, // 4
{ 0, 1, 0, 0, 1, 0, 0 }, // 5
{ 0, 1, 0, 0, 0, 0, 0 }, // 6
{ 0, 0, 0, 1, 1, 1, 1 }, // 7
{ 0, 0, 0, 0, 0, 0, 0 }, // 8
{ 0, 0, 0, 0, 1, 0, 0 } // 9
};
DHTesp dhtSensor; // Crear una instancia de la biblioteca DHTesp
WiFiClient client; // Crear un objeto cliente WiFi
/*
DHTesp dhtSensor; // Crear una instancia de la biblioteca DHTesp ***********
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Inicializar el sensor DHT22
*/
void setup() {
Serial.begin(115200); // Inicializar la comunicación serial a una velocidad de 115200 baudios
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Inicializar el sensor DHT22
WiFi.begin(WIFI_NAME, WIFI_PASSWORD); // Conectarse a la red WiFi
while (WiFi.status() != WL_CONNECTED){
delay(1000);
Serial.println("WiFi no conectado"); // Imprimir un mensaje si no se ha conectado al WiFi
}
Serial.println("¡WiFi conectado!"); // Imprimir un mensaje si se ha conectado al WiFi
Serial.println("IP local: " + String(WiFi.localIP())); // Imprimir la dirección IP local
//WiFiClient client; // Crear un objeto cliente WiFi
WiFi.mode(WIFI_STA); // Establecer el modo WiFi en modo estación
ThingSpeak.begin(client); // Inicializar la biblioteca ThingSpeak
Serial.begin(9600);
Serial.println(F("DHT11/21/22+LCD DISPLAY por Oscar!"));
// Segmentos
for (int i = 0; i < 7; i++) {
pinMode(segmentos[i], OUTPUT);
digitalWrite(segmentos[i], HIGH); // apagados
}
// Displays (NPN)
pinMode(dispDecenas, OUTPUT);
pinMode(dispUnidades, OUTPUT);
digitalWrite(dispDecenas, LOW); // apagados
digitalWrite(dispUnidades, LOW);
pinMode(LED_PIN, OUTPUT);
}
void mostrarNumero(int num) {
for (int i = 0; i < 7; i++) {
digitalWrite(segmentos[i], numeros[num][i]);
}
}
int segmentoUnidadAMostrar;
int segmentoDecenaMostrar;
long contador;
////// Siempre disponiblwes para TS y display
float t;
float h;
////// Siempre disponibles para display
int temperaturaUni; //; = temperatura % 10; // ->4 / 0
int temperaturaDec; //= (int)(temperatura / 10); // ->3
int humedadUni;// = humedad % 10;
int humedadDec;// = (int)(humedad / 10);
unsigned long tiempoAnteriorDht = 0;
unsigned long tiempoAnteriorTs = 0;
unsigned long tiempoAnteriorDisplay = 0;
unsigned long tiempoAnteriorTalkback = 0;
void loop() {
//Muestra la unidad y decena (cambia cada 10 segundos, pero muestra cada 5ms)
imprimirSegmentos(segmentoUnidadAMostrar, segmentoDecenaMostrar);
// ---------- TIMER ---------- Display
//Que hace: Guarda la unidad y decena q quiero mostrar
if (millis() - tiempoAnteriorDisplay >= 10000) {
tiempoAnteriorDisplay = millis();
contador++;
if (contador % 2) { //Cada 10 segundos hace una de las dos
temperaturaUni = ((int) t) % 10;
temperaturaDec =((int) t) / 10;
segmentoUnidadAMostrar = temperaturaUni;//Muestra temperatura
segmentoDecenaMostrar = temperaturaDec;
}
else{
humedadUni = ((int) h) % 10;
humedadDec =((int) h) / 10;
segmentoUnidadAMostrar = humedadUni; //Muestra humedad
segmentoDecenaMostrar = humedadDec;
}
}
// ---------- TIMER ---------- Medir temperatura cada 5 segundos
if (millis() - tiempoAnteriorDht >= 5000) {
tiempoAnteriorDht = millis();
TempAndHumidity data = dhtSensor.getTempAndHumidity(); // Leer la temperatura y humedad del sensor DHT22
t=data.temperature;
h=data.humidity;
}
// ---------- TIMER ---------- Envia a Thingspeak
if (millis() - tiempoAnteriorTs >= 20000) {
tiempoAnteriorTs = millis();
ThingSpeak.setField(2,t); // Establecer el valor del campo 1 en el canal de ThingSpeak como la temperatura
ThingSpeak.setField(3,h); // Establecer el valor del campo 2 en el canal de ThingSpeak como la humedad
int x = ThingSpeak.writeFields(myChannelNumber,myApiKey); // Escribir los datos en el canal de ThingSpeak
Serial.println("Temp: " + String(t, 2) + "°C"); // Imprimir el valor de la temperatura con 2 decimales
Serial.println("Humedad: " + String(h, 1) + "%"); // Imprimir el valor de la humedad con 1 decimal
if(x == 200){
Serial.println("Datos enviados correctamente"); // Imprimir un mensaje si los datos se enviaron correctamente a ThingSpeak
}else{
Serial.println("Error al enviar los datos" + String(x)); // Imprimir un mensaje de error con el código de estado HTTP si hubo un error al enviar los datos
}
// ---------- TIMER ---------- TALKBACK (Cada 3 segundos)
if (millis() - tiempoAnteriorTalkback >= 3000) {
tiempoAnteriorTalkback = millis();
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// La URL exacta para ejecutar (consumir) el comando de tu TalkBack
String url = "http://api.thingspeak.com/talkbacks/56425/commands/execute?api_key=EED3SGAH5MS95CKL";
http.begin(url);
int httpCode = http.GET(); // Esto BLOQUEA tu procesador hasta recibir respuesta
if (httpCode > 0) {
String comando = http.getString();
comando.trim(); // Limpiar basura o saltos de línea
if (comando.length() > 0) {
Serial.println("Comando desde TalkBack: " + comando);
if (comando.equalsIgnoreCase("Encender") || comando.equalsIgnoreCase("on")) {
digitalWrite(LED_PIN, HIGH);
}
else if (comando.equalsIgnoreCase("Apagar") || comando.equalsIgnoreCase("off")) {
digitalWrite(LED_PIN, LOW);
}
}
// Si comando.length() es 0, significa que la cola está vacía, no hacemos nada.
} else {
Serial.println("Error en la petición HTTP TalkBack: " + String(httpCode));
}
http.end(); // Liberar recursos vitales
}
}
}
}
void imprimirSegmentos(int unidad, int decena) {
// ---------- UNIDADES ----------
digitalWrite(dispDecenas, LOW); // apaga ambos
digitalWrite(dispUnidades, LOW);
mostrarNumero(unidad); // carga segmentos
digitalWrite(dispUnidades, HIGH); // enciende unidades
delay(5);
// ---------- DECENAS ----------
digitalWrite(dispDecenas, LOW); // apaga ambos
digitalWrite(dispUnidades, LOW);
mostrarNumero(decena); // carga segmentos
digitalWrite(dispDecenas, HIGH); // enciende decenas
delay(5);
}