/************************************************************************************************************************
Sketch Sistema de Control de Temperatura/Humedad con NodeMCU32S v1.1 - DHT22 - Blynk
Para acceder al Panel de control en Blynk:
ingresar en: https://blynk.cloud/dashboard/login
Logearse con las credenciales:
Email: [email protected]
Pass: ******** // se los paso por Whatsapp
En el menu lateral izquierdo seleccionar la lupa (Search) y ubicarse en My Devices.
Una vez ahi, el divace SisEmbebidos. Y ya estamos dentro del panel de control del sistema.
Datos tecnicos utilizados para la configuracion del panel del dispositivo SisEmbebidos:
Nota 1: En el template ( SistemaEmbebido )=> Datastream, los pines virtuales se configuraron de la siguiente manera:
name: temperatura pin:V2 dataType: Double unit:°C min:-40 max:80
name: humedad pin:V1 datatype: Double unit:% min:0 max:100
name: text pin:V0 datatype: String
name: tiempo conexión pin:V3 datatype: Double unit:s min:0 max: 100000
name: alarma1 pin:V4 datatype: integer min:0 max:1
Nota 2 : Las credenciales obtenidas una vez configurado el Dashboard fueron:
- BLYNK_TEMPLATE_ID: "TMPL2CKnqeVVm"
- BLYNK_TEMPLATE_NAME: "SistemaEmbebido"
- BLYNK_AUTH_TOKEN: "mSoklzARh91hzRsRAbJWf1WCIBqFTQSF"
*************************************************************************************************************************/
// =================================== Defino etiquetas a utilizar ============================
//Credenciales para utilizar como parameros en el objeto Blynk
#define BLYNK_TEMPLATE_ID "TMPL2CKnqeVVm"
#define BLYNK_TEMPLATE_NAME "SistemaEmbebido"
#define BLYNK_AUTH_TOKEN "mSoklzARh91hzRsRAbJWf1WCIBqFTQSF"
#define BLYNK_PRINT Serial
// Etiquetas utilizadas para configurar el objeto DHT
#define DHTPIN 32 // gpio del ESP32 donde va conectado el pin data del sensor DHT
#define DHTTYPE DHT22 // defino el modelo del sensor a utilizar (DHT22)
#define cooler 2 // gpio donde esta conectado el cooler
#define buzzer 0 // gpio donde esta conectado el Buzzer de alarma
#define resistensia 15 // gpio donde esta conectada la Resistensia Calentadora
// ===================================== Incluyo librerias ===================================
#include <DHT.h> // DHT sensor Librery by Adafruit version 1.4.6 (ref. https://www.arduino.cc/reference/en/libraries/dht-sensor-library/)
#include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C by Lucas Maziero (ref. https://github.com/lucasmaziero/LiquidCrystal_I2C)
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h> // libreria especifica para la plataforma Blynk by Volodymyr Shymanaskyy (ref. https://docs.blynk.io/en/blynk-library-firmware-api/installation/install-blynk-library-in-arduino-ide )
// ===================================== Instancio los objetos que voy a utilizar =============
DHT dht (DHTPIN,DHTTYPE); // instancio sensor con nombre dht que esta conectado al pin DHTPIN y del tipo DHT22.
BlynkTimer timer; // instancio un objeto llamado timer del tipo BlynkTimer utilizada para enviar datos a la plataforma Blynk.
LiquidCrystal_I2C lcd = LiquidCrystal_I2C (0x27,16,2); // instancio pantalla LCD con nombre lcd y le paso como parametros la cantidad de caracteres y numero de lineas.
// ===================================== Especificaciones de la red wifi a la que se va a conectar
char ssid[] = "Wokwi-GUEST"; // declaro un arreglo con el nombre de la red. En este caso, como es una simulacion Wokwi, simula una red virtual con las mismas caracteristicas que la red fisica pero con nombre Wokwi Guest
char pass[] = ""; // declaro un arreglo con la contraseña.
// ===================================== Declaro variables Globales ===========================
float temperature = NAN;
float humidity = NAN;
String text = "Sistemas Ebebidos ESP32 - DHT 22";
int alarma1 = 0; // en 1=> sobretemperatura activa Cooler
int alarma2 = 0; // en 1=> subtemperatura activa resistencia Calentadora
int alarma = 0;
// ==================================== Implementacion de funciones ============================
// Esta funcion se llama a cada segundo para modificar el valor del pin virtual V3 (tiempo de conexion) en el panel de control de Blynk.
void myTimerEvent(){
Blynk.virtualWrite(V3, millis() / 1000);
}
// Esta funcion envia los datos recolectados para actualizar los pines virtuales en el panel de control de Blynk
void enviarBlynk(){
Blynk.virtualWrite(V1,humidity); // instruccion que actualiza el valor del pin virtual V1 con el valor que toma la variable humidity
Blynk.virtualWrite(V2,temperature); // se actualiza V2 con el valor temperature
Blynk.virtualWrite(V0,text); // se actualiza V0 con la cadena de texto almacenada en text
Blynk.virtualWrite(V4,alarma); // se actualiza V4 deacuerdo si se supero los limites de temperatura
}
// Esta funcion determina la animacion que se muestra en el LCD para el tiempo de espera
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
lcd.setCursor(15, 1);
lcd.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
// esta funcion es para verificar rango de temperatura y si corresponde lanzar alarmas
void verificacionTemperatura(){
if (temperature >= 50){
alarma1 = 1;
tone(buzzer,262,250); //activo el buzzer
digitalWrite(cooler, HIGH);
}
else
{
alarma1 = 0;
digitalWrite(cooler, LOW);
}
if (temperature <= -18){
alarma2 = 1;
tone(buzzer,262,250);
digitalWrite(resistensia, HIGH);
}
else{
alarma2 = 0;
digitalWrite(resistensia, LOW);
}
}
// =================================== Setup =============================
void setup() {
pinMode(cooler, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(resistensia, OUTPUT);
digitalWrite(cooler, LOW);
digitalWrite(resistensia,LOW);
Serial.begin(115200); //inicializo puerto serial
dht.begin(); //inicializo DHT
lcd.init(); //inicializo el LCD, y configuro el mensaje de bienvenida
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Conectando a ");
lcd.setCursor(0,1);
lcd.print("WIFI");
WiFi.begin("Wokwi-GUEST", "", 6); // inicializo la conexion a internet con las credenciales de red y canal 6
// espero que se establezca la conexión
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.println("Online");
lcd.setCursor(0, 1);
lcd.println("transmitiendo...");
// establecida la conexion, conecto con la plataforma Blynk
// inicializo Blynk (token del dispositivo al que se conecta, nombre de la red a utilizar, contraseña de la red)
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(1000L, myTimerEvent);
}
void loop() {
Blynk.run(); // rutina especifica de Blynk para mantenimiento del servicio
timer.run();
// leo el valor del sensor DHT22
humidity = dht.readHumidity();
temperature = dht.readTemperature();
// verifico si los datos son veraces
if (isnan(humidity)||isnan(temperature))
{
// este codigo se ejecuta si el sensor se desconecto o no funciona
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Falla de sensor");
return;
}
else
{
// este codigo se ejecuta si las lecturas del sensor son correctas
if ((alarma1 == 0) & (alarma2 == 0))
{
alarma = 0;
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Humedad: "+ String(humidity) +" %");
lcd.setCursor(1,1);
lcd.print("Temp: "+String(temperature)+" *C");
}
// verifico la condicion de temperatura para lanzar o no la alarma
verificacionTemperatura();
if (alarma1 == 1)
{
alarma = 1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Alerta alta temp");
lcd.setCursor(1,1);
lcd.print(String(temperature)+" *C");
}
if (alarma2 == 1)
{
alarma = 1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Alerta baja temp");
lcd.setCursor(1,1);
lcd.print(String(temperature)+" *C");
}
enviarBlynk(); // llamo a la funcion enviarBlynk para actualizar los datos recolectados por el sistema.
delay(10);
}
}