Skip to content

Instantly share code, notes, and snippets.

@beayeric
Created June 11, 2020 19:05
Show Gist options
  • Save beayeric/578148c643d78d334279f16d0b67d86d to your computer and use it in GitHub Desktop.
Save beayeric/578148c643d78d334279f16d0b67d86d to your computer and use it in GitHub Desktop.
if (text == "/estado") {
teclapower(); /// esta es la función de Pablo .
bot.sendMessage(chat_id, "El estado es:");
--------
if (text == "/estado") {
float h = dht.readHumidity();
float t = dht.readTemperature();
bot.sendMessage(chat_id, "El estado es:");
@moisesfa
Copy link

moisesfa commented Jul 4, 2020

Pues creo que es porque ya no estas leyendo el sensor en este if ( mira a ver que ha pasado ahí dentro, antes no estaba así ):

// Cada tiempo definido en dht_mtbs leemos el sensor de temperatura/humedad
  if (millis() > hBdt_lasttime + dht_mtbs)  { 
...................
}

Para hacer que h y t sean globales debes declararlas de otra manera.

Yo la comparación con valores máximos y mínimos, la pondría después de leer el sensor, no antes. Es decir:

// Cada tiempo definido en dht_mtbs leemos el sensor de temperatura/humedad
if (millis() > hBdt_lasttime + dht_mtbs)  { 
..................
}

//--funcion de alarma humedad--//
if (Alar_Hum){
...............
}

Saludos

@beayeric
Copy link
Author

beayeric commented Jul 4, 2020

Actualizado :)

@moisesfa
Copy link

moisesfa commented Jul 5, 2020

Esta declaración de las variables no es correcta

String str_tem = ""; // Declarar variables string globales para almacenar los valores de temperatura y humedad
String str_hum = "";
float h = dht.readHumidity(); // Variable para la lecutra de la humedad
float t = dht.readTemperature(); // Varíable para la lectura de la temperatura
bool Alar_Hum = ""; // Variables para la humedad actual
bool Alar_Tem = ""; // Variables para la temperatura actural

h y t no tiene ningún sentido asignarlos a una función cuando ni siquiera se ha iniciado el sensor. Las variables bool Alar_Hum y Alar_Tem deberían de ser true o false y no un String vacío.

Yo declararía las variables globales y las inicializaría así:

float h = 0.0;      // Variable para la lectura de la humedad
float t = 0.0;      // Variable para la lectura de la temperatura
bool Alar_Hum = true;     // Variable para controlar la alarma de humedad true on/ false off
bool Alar_Tem = true;      // Variable para controlar la alarma de temperatura true on/ false off

En cuanto a la comparación de valores hay un error que he provocado yo jejeje. Cuando Alar_Hum es true automáticamente se pone a false y no vuelve a entrar en las comparaciones de las humedades.

if (Alar_Hum){
  if (h>=HumMax) {
    String Alar_HumMax = "Superada la humedad MÁXIMA" "\n";
    bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMax, "");
  }
  else if (h<=HumMin) { 
    String Alar_HumMin = "Superada la humedad MINIMA" "\n";
    bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMin, "");
  }
 Alar_Hum = false;
}

Alar_Hum = false; debería hacerse cuando se envía al bot el mensaje ¿no?
Algo así:

if (Alar_Hum){
  if (h>=HumMax) {
    String Alar_HumMax = "Superada la humedad MÁXIMA" "\n";
    bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMax, "");
    Alar_Hum = false;
  }
  else if (h<=HumMin) { 
    String Alar_HumMin = "Superada la humedad MINIMA" "\n";
    bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMin, "");
    Alar_Hum = false;
  }
}

@moisesfa
Copy link

moisesfa commented Jul 5, 2020

Esta prueba a mi me funciona:

/*
  Autor:   makers bierzo
  Fecha:     06/2020
  
  Version:  V0.0.2
 
  Descripcion:
  Lectura de humedad y temperatura con dht22 y wemos d1 mini. Consulta mediante bot de telegram
 
  Pinde de conexión del dht22:
  D4
*/

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h> //Incluimos la librería para  Telegram  - https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
#include <ArduinoJson.h> // Incluimos la librería Json para el uso de la API de Telegram ATENCIÓN : Utilizar la versión 5.x.x porque las siguientes no funcioncionan -  https://github.com/bblanchon/ArduinoJson
#include "DHT.h" // Librería para el sensor  V1.3.4
#include <Adafruit_Sensor.h> //Librería para la lectura del sensor V1.0.3

//------- DATOS PARA LA CONEXIÓN AL WIFI Y BOT DE TELEGRAM ------//

char ssid[] = "xxxxx";              // el nombre de su red SSID
char password[] = "xxxx";       // la contraseña de su red

#define TELEGRAM_BOT_TOKEN "xxxxx"  // TOKEN proporcionado por BOTFATHER
#define CHAT_ID_PROPIO "xxxxx"

//------- ---------------------- ------//

WiFiClientSecure client;
UniversalTelegramBot bot(TELEGRAM_BOT_TOKEN, client);


int Bot_mtbs = 1000;    // tiempo medio entre escaneo de mensajes
long Bot_lasttime;      // la última vez que se realizó la exploración de mensajes
int dht_mtbs = 5000;    // tiempo entre lecturas 5 segundos
long hBdt_lasttime;     // la última vez que se realizó la exploración de mensajes
bool Start = false;


// ----------- Funciones de temperatura -----------//

#define DHTTYPE DHT22   // TIPO DE SENSOR
const int DHTPin = D4;  // Pin donde esta conectado ( por defecto en nuestro proyecto esta conectado en el pin 4)
DHT dht(DHTPin, DHTTYPE);

String str_tem = ""; // Declarar variables string globales para almacenar los valores de temperatura y humedad
String str_hum = "";

float h;
float HumL = 55.0;        // humedad límite
bool actAlHum = true;   // bool para activar o no la alarma de humedad

 
//------------Configurar estados y respuestas del bot de telegram-----------------//


 // -- parte fija , no necesita modificaciones -- //
void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));

  for (int i=0; i<numNewMessages; i++) {
    String chat_id = String(bot.messages[i].chat_id);
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "") from_name = "Guest";

// --- comienza la parte que se puede personalizar -- //
// Respuesta a los mensajes del bot

    if (text == "/estado") { 
      String resultado = str_hum +"\n";
      resultado += str_tem +"\n";
      bot.sendMessage(chat_id, resultado, "");
    }

    if (text == "/temperatura") {
      bot.sendMessage(chat_id, str_tem , "");
    }

    if (text == "/humedad") {
      bot.sendMessage(chat_id, str_hum , "");
    }

    if (text == "/inicio") {
      String welcome = "Hola " + from_name + " esta es tu sala de control" ".\n";
      welcome += "Esta es una prueba de medidor de humedad y temperatura con bot de telegram.\n\n";
      welcome += "/humedad : para saber el nivel de humedad relativa\n";
      welcome += "/temperatura : para saber el estado de la temperatura\n";
      welcome += "/estado : para saber estado de la humedad y la temperatura al mismo tiempo\n";
      bot.sendMessage(chat_id, welcome, "Markdown");
    }
  }
}

void setup() {
  Serial.begin(115200);
  dht.begin();

  // Establezca WiFi en modo estación y desconéctese de un AP si era anteriormente estaba conectado
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  // Intenta conectarse a la red Wifi
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  
  // -- valores que se muestran en el monitor serie --//
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // Comunicación de manera no segura
  //client.setInsecure();
  //bot._debug = true; // para ver el funcionamiento del bot

  // Comunicación de manera segura
  bot._debug = true; // para ver el funcionamiento del bot
  const uint8_t fingerprint[20] = { 0xF2, 0xAD, 0x29, 0x9C, 0x34, 0x48, 0xDD, 0x8D, 0xF4, 0xCF, 0x52, 0x32, 0xF6, 0x57, 0x33, 0x68, 0x2E, 0x81, 0xC1, 0x90 };
  client.setFingerprint(fingerprint);

}

void loop() {

  // Cada tiempo definido en Bot_mtbs vemos si se recibe algún mensaje
  if (millis() > Bot_lasttime + Bot_mtbs)  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while(numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    Bot_lasttime = millis();
  }

  // Cada tiempo definido en dht_mtbs leemos el sensor de temperatura/humedad
  if (millis() > hBdt_lasttime + dht_mtbs)  {
    
    h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
        Serial.println("¡Error al leer del sensor DHT!");
        return;
    }

    str_tem = "Temperatura : " + String(t, 2);   
    Serial.println(str_tem);
    str_hum = "Humedad : " + String(h, 2);
    Serial.println(str_hum);
    
    hBdt_lasttime = millis();
  }

  // Comprobar alarma de humedad
  if (actAlHum){
    // Si se ha alcanzado el valor envio un mensaje al bot 
    if (h>HumL){
      bot.sendMessage(CHAT_ID_PROPIO, "Se ha alcanzado la humedad límite", "");
      actAlHum = false;   // Una sola vez 
    }
  }

}

@beayeric
Copy link
Author

beayeric commented Jul 6, 2020

Buenas,

he estado viendo lo de las alarmas. He creado una para la hum maxima y otra para la min.

`if (Alar_Hum_Max){

if (h>=HumMax) {
String Alar_HumMax = "Superada la humedad MÁXIMA" "\n";
bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMax, "");
Alar_Hum_Max = false;
}
}

if (Alar_Hum_Min){

if (h<=HumMin) {
String Alar_HumMin = "Superada la humedad MINIMA" "\n";
bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMin, "");
Alar_Hum_Min = false;
}
`

Después he estado haciendo la conversión. He buscado por google algunas cosas, ( convertir float to string ) y he visto que han puesto un montón de soluciones, pero viendo un poco el código, me parece que eso ya lo has resuelto tu:

Lo digo porque float h ya se convierto también a String para mostrarlo no ?

str_tem = "Temperatura : " + String(t, 2); Serial.println(str_tem); str_hum = "Humedad : " + String(h, 2); Serial.println(str_hum);

Lo he adaptado :

Alarma_Hum_Maxima = "La Humedad Maxima es :" + String (HumMax, 2); Serial.println(Alar_Tem_Max); Alarma_Hum_Minima = "La Humedad minima es :" + String (HumMin, 2); Serial.println(Alar_Tem_Min);

Anteriormente cree :

String Alarma_Hum_Maxima = "" ;
String Alarma_Hum_Minima = "" ;

Como lo ves?

saludos

@moisesfa
Copy link

moisesfa commented Jul 6, 2020

Yo lo veo bien, efectivamente en el código ya lo habíamos hecho.
Luego mandas ese String con el bot como respuesta del comando ¿no?.
Una vez que esto funcione damos por finalizar la versión 0.0.2 con su tag ¿no?

@beayeric
Copy link
Author

para reactivar las alarmas, había pensado en algo así . Que te parece?

`if (Alar_Hum_Max = false && h < HumMax) {

Alar_Hum_Max = true;

} `

@beayeric
Copy link
Author

lo he intentado con esto, pero parece que no funciona. que opinas?
`}
if (Alar_Tem_Max = false && t < TemMax) {
Alar_Tem_Max = true;
String Alar_Hum_Max_Reset = "Valores normales" "\n";
Alar_Hum_Max_Reset+= Temp_Actual + String (t,2);
bot.sendMessage(CHAT_ID_PROPIO, Alar_Hum_Max_Reset, "");

}

@moisesfa
Copy link

Hay un error muy común dentro del if:
= asignación
== comparación

Prueba esto, a ver que pasa:

if (Alar_Tem_Max == false && t < TemMax) {
Alar_Tem_Max = true;
String Alar_Hum_Max_Reset = "Valores normales" "\n";
Alar_Hum_Max_Reset+= Temp_Actual + String (t,2);
bot.sendMessage(CHAT_ID_PROPIO, Alar_Hum_Max_Reset, "");
}

@beayeric
Copy link
Author

Buenas,

Le estoy dando vueltas, pero no consigo ver cual es el error.

Lo tengo así :

`
// TEMPERATURA //

if (Alar_Tem_Max){

if (t>=TemMax) {
String Alar_TemMax = "Superada la temperatura Máxima" "\n";
Alar_TemMax += Temp_Actual + String(t,2);
bot.sendMessage(CHAT_ID_PROPIO, Alar_TemMax, "");
Alar_Tem_Max = false;
}
if (Alar_Tem_Max == false && t< TemMax) {
Alar_Tem_Max = true;
String Alar_Tem_Max_Reset = "Valores normales" "\n";
Alar_Tem_Max_Reset+= Temp_Actual + String (t,2);
bot.sendMessage(CHAT_ID_PROPIO, Alar_Tem_Max_Reset, "");

}
} `

@moisesfa
Copy link

Este if :

if (Alar_Tem_Max == false && t< TemMax) {
Alar_Tem_Max = true;
String Alar_Tem_Max_Reset = "Valores normales" "\n";
Alar_Tem_Max_Reset+= Temp_Actual + String (t,2);
bot.sendMessage(CHAT_ID_PROPIO, Alar_Tem_Max_Reset, "");
}

¿No debería estar fuera del otro if?

@beayeric
Copy link
Author

Vale, entiendo lo que dices, en un momento pensé que dentro del mismo if podría hacer conflicto y entrar en bucle.

He estado cambiando cosas y ahora si que estoy perdido.

https://github.com/beayeric/medidor-humedad-telegram/blob/master/src/main.cpp

no entiendo :(

@moisesfa
Copy link

Esta es mi solución para evitar mensajes no deseados del bot cuando los valores de humedad fluctúan por encima y por debajo del valor límite.

Cuando el valor de humedad alcanza un valor límite (máximo o mínimo), deben repetirse 10 valores normales consecutivos, para que se vuelva a restablecer la alarma automáticamente.

Lo primero que he hecho ha sido meter las funciones de alarma dentro del if temporizado cada 5 segundos, así sólo comparamos los valores cuando se ha leído el sensor dht.

 if (millis() > hBdt_lasttime + dht_mtbs)  {

    h = dht.readHumidity(); // Variable para la lectura de la humedad
    t = dht.readTemperature(); // Variable para la lectura de la temperatura

    if (isnan(h) || isnan(t)) {
        Serial.println("¡Error al leer del sensor DHT!");
        return;
    }
    // -- Conversión a String para mostrar los valores -- //
    str_tem = "Temperatura : " + String(t, 2);   
    Serial.println(str_tem);
    str_hum = "Humedad : " + String(h, 2);
    Serial.println(str_hum);
    
    // --- Mostrar el estado de la activación o no de las alarmas --//
    //--Funcion de alarma --//
    // HUMEDAD //
    .........................................................
    .........................................................
    .........................................................
    .........................................................

    hBdt_lasttime = millis();

}

Luego he creado unas variables nuevas globales:

int8 tempo_RestAlHumMax = 0;  // Variable para temporizar el restablecimiento de la alarma automáticamente
int8 tempo_RestAlHumMin = 0;  // Variable para temporizar el restablecimiento de la alarma automáticamente

Y he cambiado las comparaciones de este modo:

//--Funcion de alarma --//
    // HUMEDAD //

    if (Alar_Hum_Max){
      if (h >= HumMax) {
        String Alar_HumMax = "Estoy por encima de la humedad MÁXIMA" "\n";
        Alar_HumMax += Hum_Actual + String(h,2);  // Al saltar la alarma, tambíen mostrara la humedad o temperatura actual.
        bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMax, "");
        Alar_Hum_Max = false;
      }
    } else {
      if (h >= HumMax) {
        tempo_RestAlHumMax = 0; // Para que la temporización sea con lecturas seguidas
      }
    }

    if (Alar_Hum_Min){
      if (h <= HumMin) { 
        String Alar_HumMin = "Estoy por debajo de la humedad MíNIMA" "\n";
        Alar_HumMin += Hum_Actual + String(h,2);
        bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMin, "");
        Alar_Hum_Min = false;
      } 
    } else {
      if (h <= HumMin){
        tempo_RestAlHumMin = 0; 
      }
    }

    // reactivación alarma humedad // 

    if (Alar_Hum_Max == false && h < HumMax) {
      tempo_RestAlHumMax++;
      if (tempo_RestAlHumMax == 10){
        String Alar_Hum_Max_Reset = "Alarma Humedad MÁXIMA restablecida" "\n";
        Alar_Hum_Max_Reset += Hum_Actual + String (h,2);
        bot.sendMessage(CHAT_ID_PROPIO, Alar_Hum_Max_Reset, "");
        Alar_Hum_Max = true;
        tempo_RestAlHumMax = 0;
      }
    }

    if (Alar_Hum_Min == false && h > HumMin) {
      tempo_RestAlHumMin++;
      if (tempo_RestAlHumMin == 10){
        String Alar_Hum_Min_Reset = "Alarma Humedad MíNIMA restablecida" "\n";
        Alar_Hum_Min_Reset += Hum_Actual + String (h,2);
        bot.sendMessage(CHAT_ID_PROPIO, Alar_Hum_Min_Reset, "");
        Alar_Hum_Min = true;
        tempo_RestAlHumMin =0;
      }        
    }

Con la salida del puerto serie podremos ver el correcto funcionamiento.

Serial.println("Temporizador Restablecer Humedad Máxima : "+ String(tempo_RestAlHumMax));
Serial.println("Temporizador Restablecer Humedad Mínima : "+ String(tempo_RestAlHumMin));

Espero, haberme explicado. Saludos.

@beayeric
Copy link
Author

Buenos días Moises, me parece una solución buenísima y que puedo aplicar a toras cosas ( más adelante)

Estoy sorprendido, porque creo que entiendo todos los pasos que hiciste. ( Al final va a ser verdad que practicando se aprende )

He dejado el código actualizado, pero me esta dando errores al compilar con las variables.

Captura de pantalla 2020-07-18 a las 11 16 52

@moisesfa
Copy link

Estoy probando este código, la idea es eliminar avisos del bot por valores puntuales superiores e inferiores a los valores límites.

/*
  Autor:     Makers Bierzo
  Fecha:     09/07/2020
  
  Version:    V0.0.1 
  Version:    V0.0.2 
    -- Configuración de una alarma al alcanzar valores predefinidos
    -- Aviso de la alarma mediante bot de telegram
    -- Consulta de los valores predefinidos mediante el bot de telegram. 
    -- Aviso del estado acutal de temperatura y humedad, cuando salta la alarma. 
 
  Descripcion HARDWARE :
  Lectura de humedad y temperatura con dht22 y wemos d1 mini. Consulta mediante bot de telegram
 
  Pin de de conexión del dht22:
  D4
 
*/

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h> //Incluimos la librería para  Telegram  - https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
#include <ArduinoJson.h>          // Incluimos la librería Json para el uso de la API de Telegram ATENCIÓN : Utilizar la versión 5.x.x porque las siguientes no funcioncionan -  https://github.com/bblanchon/ArduinoJson
#include "DHT.h"                  // Librería para el sensor  V1.3.4
#include <Adafruit_Sensor.h>      //Librería para la lectura del sensor V1.0.3

//------- DATOS PARA LA CONEXIÓN AL WIFI Y BOT DE TELEGRAM Y LA ID DE TU USUARIO DE TELEGRAM ------//

char ssid[] = "xxxxxxxxxxx";         // el nombre de su red SSID
char password[] = "xxxxxxxxxxx";       // la contraseña de su red

#define TELEGRAM_BOT_TOKEN "xxxxxxxxxxxxxxxxxxx"
#define CHAT_ID_PROPIO "xxxxxxxxxxx"

//------- ---------------------- ------//

WiFiClientSecure client;
UniversalTelegramBot bot(TELEGRAM_BOT_TOKEN, client);

int Bot_mtbs = 1000;    // tiempo medio entre escaneo de mensajes
long Bot_lasttime;      // la última vez que se realizó la exploración de mensajes
int dht_mtbs = 5000;    // tiempo entre lecturas 5 segundos
long hBdt_lasttime;     // la última vez que se realizó la exploración de mensajes
bool Start = false;

// ----------- Variables globales de temperatura y humedad -----------//

#define DHTTYPE DHT22   // TIPO DE SENSOR
const int DHTPin = D4;  // Pin donde esta conectado ( por defecto en nuestro proyecto esta conectado en el pin 4)
DHT dht(DHTPin, DHTTYPE);

// Strings globales para almacenar los valores de temperatura y humedad
String str_tem = "";               
String str_hum = "";

// Strings globales para almacenar los valores de temperatura y humedad actuales 
String Hum_Actual = "La humedad actual es: ";  
String Temp_Actual = "La temperatura actual es: ";

// Strings globales para almacenar los valores máximos y mínimos de humedad y la temperatura
String Alarma_Hum_Maxima = "La humedad máxima es: "; 
String Alarma_Hum_Minima = "La humedad mínima es: ";
String Alarma_Tem_Maxima = "La temperatura máxima es: ";
String Alarma_Tem_Minima = "La temperatura mínima es: ";


float h=0.0;  // Variable para la lecutra de la humedad del dht
float t=0.0;  // Variable para la lectura de la temperatura del dht

// Variables para temporizar los avisos y el restablecimiento de los avisos automáticamente

// Variable para contar lecturas consecutivas con valor superior al limite máximo
int8 ConLecSupHumMax = 0; // Aviso        
// Variable para contar lecturas consecutivas con valor inferior al limite máximo
int8 ConLecInfHumMax = 0; // Restablece el aviso

// Variable para contar lecturas consecutivas con valor inferior al limite mínimo
int8 ConLecInfHumMin = 0; // Aviso
// Variable para contar lecturas consecutivas con valor superior al limite mínimo
int8 ConLecSupHumMin = 0; // Restablece el aviso

int8 tempo_RestAlTemMax = 0;  
int8 tempo_RestAlTemMin = 0;
int8 LecConsecutivas = 20;        // Numero de lecturas consecutivas 

// Variables bool para activar o desactivar los avisos
bool Alar_Hum_Max = true; 
bool Alar_Hum_Min = true;
bool Alar_Tem_Max = true; 
bool Alar_Tem_Min = true;

// Variables para los Limites máximos y minimos de temperatura y humedad --// 
float HumMax = 60.0;
float HumMin = 40.0;
float TemMax = 35.0;
float TemMin = 25.0;
 
//------------Configurar estados y respuestas del bot de telegram-----------------//

 // -- Parte fija , no necesita modificaciones -- //
void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));

  for (int i=0; i<numNewMessages; i++) {
    String chat_id = String(bot.messages[i].chat_id);
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "") from_name = "Guest";

    // --- Comienza la parte que se puede personalizar -- //
    // Respuesta a los mensajes del bot

    if (text == "/control") { 
      String resultado = str_hum +"\n";
      resultado += str_tem +"\n";
      bot.sendMessage(chat_id, resultado, "");
    }

    if (text == "/temperatura") {
      bot.sendMessage(chat_id, str_tem , "");
    }

    if (text == "/humedad") {
      bot.sendMessage(chat_id, str_hum , "");
    
    }

    if (text == "/estado") { 
      String alarma = Alarma_Hum_Maxima + String(HumMax, 2) + "\n";
      alarma += Alarma_Hum_Minima + String(HumMin, 2) + "\n";
      alarma += String ("--------------") + "\n";
      alarma += Alarma_Tem_Maxima + String(TemMax, 2) + "\n";
      alarma += Alarma_Tem_Minima + String(TemMin, 2) + "\n";
      alarma += String ("--------------") + "\n";
      alarma += Hum_Actual +  String (h,2)+ "\n";
      alarma += Temp_Actual + String(t,2)+ "\n";
      alarma += String ("--------------") + "\n";
      alarma += String ("Estado alarma") + "\n";
      alarma += String ("Estado Alarma Mum Max: ") + String(Alar_Hum_Max)+ "\n";
      alarma += String ("Estado Alarma Hum Min: ") + String(Alar_Hum_Min)+ "\n";
      alarma += String ("") + "\n";
      alarma += String ("Estado Alarma Tem Max: ")+  String(Alar_Tem_Max)+ "\n";
      alarma += String ("Estado Alarma Tem Min: ")+  String(Alar_Tem_Min)+ "\n";
      alarma += String ("--------------") + "\n";
      alarma += String ("Contadores ") + "\n";
      alarma += String ("Contador Superior Hum Máx : " )+ String(ConLecSupHumMax)+ "\n";
      alarma += String ("Contador Inferior Hum Máx : " )+ String(ConLecInfHumMax)+ "\n";
      alarma += String ("Contador Superior Hum Mín : " )+ String(ConLecSupHumMin)+ "\n";
      alarma += String ("Contador Inferior Hum Mín : " )+ String(ConLecInfHumMin)+ "\n";
      alarma += String ("") + "\n";
      alarma += String ("Restablecer Temp Máx : " )+ String(tempo_RestAlTemMax)+ "\n";
      alarma += String ("Restablecer Temp Mín : " )+ String(tempo_RestAlTemMin)+ "\n";
      bot.sendMessage(chat_id, alarma, "");
    }
    
    /// ---- Parte donde puedes añadir las descripciones de las funciones del bot --- //
    if (text == "/start") {
      String welcome = "Hola " + from_name + " esta es tu sala de control" ".\n";
      welcome += "Esta es una prueba de medidor de humedad y temperatura con bot de telegram.\n\n";
      welcome += "/humedad : para saber el nivel de humedad relativa\n";
      welcome += "/temperatura : para saber el estado de la temperatura\n";
      welcome += "/control : para saber estado de la humedad y la temperatura al mismo tiempo\n";
      welcome += "/estado : para saber el estado actual de todos los parametros.\n";

      bot.sendMessage(chat_id, welcome, "Markdown");
    }
  }
}

//------- SETUP ------//

void setup() {
  
  // Inicializamos el puerto serie y el sensor dht
  Serial.begin(115200);
  dht.begin();

  // Establecer WiFi en modo estación y desconectarse de un AP, si estaba conectado.
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  // Intenta conectarse a la red Wifi
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  
  // -- Valores que se muestran en el monitor serie --//
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // Comunicación de manera no segura
  //client.setInsecure();
  //bot._debug = true; // para ver el funcionamiento del bot

  // Comunicación de manera segura
  bot._debug = true; // para ver el funcionamiento del bot
  const uint8_t fingerprint[20] = { 0xF2, 0xAD, 0x29, 0x9C, 0x34, 0x48, 0xDD, 0x8D, 0xF4, 0xCF, 0x52, 0x32, 0xF6, 0x57, 0x33, 0x68, 0x2E, 0x81, 0xC1, 0x90 };
  client.setFingerprint(fingerprint);

}

void loop() {

  // Cada tiempo definido en Bot_mtbs vemos si se recibe algún mensaje
  if (millis() > Bot_lasttime + Bot_mtbs)  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while(numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    Bot_lasttime = millis();
  }

  // Cada tiempo definido en dht_mtbs leemos el sensor de temperatura/humedad
  if (millis() > hBdt_lasttime + dht_mtbs)  {
    
    h = dht.readHumidity();     // lecutra de la humedad
    t = dht.readTemperature();  // lectura de la temperatura

    if (isnan(h) || isnan(t)) {
        Serial.println("¡Error al leer del sensor DHT!");
        return;
    }
    
    // -- Conversión de valores t y h a String para poder mostrarlos con el Bot -- //
    str_tem = "Temperatura : " + String(t, 2);   
    Serial.println(str_tem);      // Mostrar Temperatura por el puerto serie
    str_hum = "Humedad : " + String(h, 2);
    Serial.println(str_hum);      // Mostrar Humedad por el puerto serie 
    
    //-- FUNCIONES DE AVISOS --//
    
    // HUMEDAD //
    // AVISO cuando la humedad es igual o superior al valor límite máximo durante un tiempo
    if (Alar_Hum_Max){    
      if (h >= HumMax) {
        ConLecSupHumMax++;
        if (ConLecSupHumMax == LecConsecutivas){
          String Alar_HumMax = "Aviso por HUMEDAD MÁXIMA \n";
          Alar_HumMax += Hum_Actual + String(h,2);  // Al saltar la alarma, tambíen mostrara la humedad o temperatura actual.
          bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMax, "");
          Alar_Hum_Max = false;
          ConLecSupHumMax = 0;
        }
      } else {
        ConLecSupHumMax = 0;
      }
    } else {
      if (h >= HumMax) {
        ConLecInfHumMax = 0; // Para que la temporización sea con lecturas consecutivas
      }
    }

    // AVISO cuando la humedad es igual o inferior al valor límite mínimo
    if (Alar_Hum_Min){
      if (h <= HumMin) { 
        ConLecInfHumMin++;
        if (ConLecInfHumMin == LecConsecutivas){
          String Alar_HumMin = "Aviso por HUMEDAD MíNIMA \n";
          Alar_HumMin += Hum_Actual + String(h,2);
          bot.sendMessage(CHAT_ID_PROPIO, Alar_HumMin, "");
          Alar_Hum_Min = false;
          ConLecInfHumMin = 0;
        }
      } else {
        ConLecInfHumMin = 0;
      }
    } else {
      if (h <= HumMin){
        ConLecSupHumMin = 0; // Para que la temporización sea con lecturas consecutivas
      }
    }

    // Reactivación de avisos de humeadad temporizados, después de 10 lecturaras consecutivas entre los valores límite // 
    // Si el aviso está desactivado y la humedad es inferior al valor máximo 
    // podemos restablecer el aviso si esto sucede LecConsecutivas veces seguidas 
    if (Alar_Hum_Max == false && h < HumMax) {
      ConLecInfHumMax++;
      if (ConLecInfHumMax == LecConsecutivas){
        String Alar_Hum_Max_Reset = "Restablecido el aviso HUMEDAD MÁXIMA \n";
        Alar_Hum_Max_Reset += Hum_Actual + String (h,2);
        bot.sendMessage(CHAT_ID_PROPIO, Alar_Hum_Max_Reset, "");
        Alar_Hum_Max = true;
        ConLecInfHumMax = 0;
      }
    }
    // Si el aviso está desactivado y la humedad es superior al valor mínimo
    // podemos restablecer el aviso si esto sucede LecConsecutivas veces seguidas 
    if (Alar_Hum_Min == false && h > HumMin) {
      ConLecSupHumMin++;
      if (ConLecSupHumMin == LecConsecutivas){
        String Alar_Hum_Min_Reset = "Restablecido el aviso HUMEDAD MíNIMA \n";
        Alar_Hum_Min_Reset += Hum_Actual + String (h,2);
        bot.sendMessage(CHAT_ID_PROPIO, Alar_Hum_Min_Reset, "");
        Alar_Hum_Min = true;
        ConLecSupHumMin = 0;
      }        
    }
  
    /*
    // TEMPERATURA // 
    // AVISO cuando la temperatura es igual o superior al valor límite máximo
    if (Alar_Tem_Max){
      if (t >= TemMax) {
        String Alar_TemMax = "Aviso por TEMPERATURA MÁXIMA \n";
        Alar_TemMax += Temp_Actual + String(t,2);
        bot.sendMessage(CHAT_ID_PROPIO, Alar_TemMax, "");
        Alar_Tem_Max = false;
      }    
    } else {
      if (t >= TemMax) {
        tempo_RestAlTemMax  = 0; // Para que la temporización sea con lecturas consecutivas
      }
    }
  
    // AVISO cuando la temperatura es igual o inferior al valor límite mínimo
    if (Alar_Tem_Min){
      if (t <= TemMin) { 
       String Alar_TemMin = "Aviso por TEMPERATURA MíNIMA \n";
       Alar_TemMin += Temp_Actual + String(t,2);
       bot.sendMessage(CHAT_ID_PROPIO, Alar_TemMin, "");
       Alar_Tem_Min = false;     
      }
    } else {
      if (t <= TemMin){
        tempo_RestAlTemMin = 0; // Para que la temporización sea con lecturas consecutivas
      }
    }
  
    // Reactivación de avisos de temperatura temporizados, después de 10 lecturaras consecutivas entre los valores límite // 
    // Si el aviso está desactivado y la temperatura es inferior al valor máximo 
    // podemos restablecer el aviso si esto sucede LecConsecutivas veces seguidas 
    if (Alar_Tem_Max == false && t < TemMax) {
      tempo_RestAlTemMax++;
      if (tempo_RestAlTemMax == LecConsecutivas) {
       String Alar_Tem_Max_Reset = "Restablecido el aviso TEMPERATURA MÁXIMA \n";
       Alar_Tem_Max_Reset += Temp_Actual + String (t,2);
       bot.sendMessage(CHAT_ID_PROPIO, Alar_Tem_Max_Reset, "");
       Alar_Tem_Max = true;
       tempo_RestAlTemMax  = 0;

      }
    }
    
    // Si el aviso está desactivado y la temperatura es superior al valor mínimo
    // podemos restablecer el aviso si esto sucede LecConsecutivas veces seguidas 
    if (Alar_Tem_Min == false && t > TemMin) {
     tempo_RestAlTemMin++;
      if (tempo_RestAlTemMin == LecConsecutivas) {
       String Alar_Tem_Min_Reset = "Restablecido el aviso TEMPERATURA MíNIMA \n";
       Alar_Tem_Min_Reset += Temp_Actual + String (t,2); 
       bot.sendMessage(CHAT_ID_PROPIO, Alar_Tem_Min_Reset, "");
       Alar_Tem_Min = true;
       tempo_RestAlTemMin = 0;
      }
    }

    */

    // --- Mostrar el estado de la activación o no de las alarmas --//

    // 1 activada 0 desactivada 
    // Mostramos por el puerto serie el estado de las alarmas
    Serial.println("Estado Alarma Hum Max: "+ String(Alar_Hum_Max));
    Serial.println("Estado Alarma Hum Min: "+ String(Alar_Hum_Min));

    Serial.println("Estado Alarma Tem Max: "+ String(Alar_Tem_Max));
    Serial.println("Estado Alarma Tem Max: "+ String(Alar_Tem_Min));

    Serial.println("Contador Superior Hum Max : "+ String(ConLecSupHumMax));
    Serial.println("Contador Inferior Hum Max : "+ String(ConLecInfHumMax));
    
    Serial.println("Contador Superior Hum Min : "+ String(ConLecSupHumMin));
    Serial.println("Contador Inferior Hum Min : "+ String(ConLecInfHumMin));

    Serial.println("Temporizador Restablecer Temp Max : "+ String(tempo_RestAlTemMax));
    Serial.println("Temporizador Restablecer Temp Min : "+ String(tempo_RestAlTemMin));

    hBdt_lasttime = millis();

  }

} 

@beayeric
Copy link
Author

Gracias Moises, lo cargo y veo.

He estado revisando lo que has puesto. Eres un crack

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment