-
-
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:"); | |
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, "");
}
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, "");
}
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, "");
}
} `
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?
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 :(
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.
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.
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();
}
}
Gracias Moises, lo cargo y veo.
He estado revisando lo que has puesto. Eres un crack
para reactivar las alarmas, había pensado en algo así . Que te parece?
`if (Alar_Hum_Max = false && h < HumMax) {
} `