//Incluimos las librerias
#include "DHTesp.h"
#include <WiFi.h>
#include <PubSubClient.h>
#include <stdio.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
//Decaramos el variable que almacena el pin a conectar el DHT11
int pinDHT = 15;
int interructor = 4; // desactiva el relay que da energia valvula selenoide
int sensor = 34; //lectura del sensor de gas
float gas = 0; //conversion de analogo a digital
int BuzzerPin = 5; // alarma
//#define TOKEN "BBFF-OVdMNwNY3ABCuDOo5sfiiXIvebu5lk" // Put your Ubidots' TOKEN
#define TOKEN "BBUS-wfM3kgaKKz1jwSWZrsWtqAoLM7YbpA"
//define Telegram BOT Token
const String botToken = "6972379326:AAHGQtzuB80BwTcOQMDPNXR9vWGLWWaMNpM";
const unsigned long botMTBS = 500; //mean time between scan messages
unsigned long botLastScan;
#define VARIABLE_LABEL "temperatura" // Assing the variable label
#define VARIABLE_LABEL2 "gas" // Assing the variable label
#define DEVICE_LABEL "iot_actividad2" // Assig the device label
#define MQTT_CLIENT_NAME "0001" // MQTT client Name, put a Random ASCII
const char* WIFISSID = "Wokwi-GUEST";
const char* PASSWORD = "";
char mqttBroker[] = "industrial.api.ubidots.com";
char payload[700];
char topic[150];
// Space to store values to send
char str_val[6];
char str_val2[6];
//Wifi
WiFiClientSecure secured_client;
//Bot
UniversalTelegramBot bot(botToken, secured_client);
/****************************************
* Initializate constructors for objects
****************************************/
//ESP8266WiFiMulti WiFiMulti;
WiFiClient ubidots;
PubSubClient client(ubidots);
//Instanciamos el DHT
DHTesp dht;
/****************************************
* Auxiliar Functions
****************************************/
void callback(char* topic, byte* payload, unsigned int length) {}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(MQTT_CLIENT_NAME, TOKEN,"")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 2 seconds");
// Wait 2 seconds before retrying
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
//Inicializamos el dht
dht.setup(pinDHT, DHTesp::DHT22);
pinMode(interructor, OUTPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(sensor, INPUT);
WiFi.begin(WIFISSID, PASSWORD,6);
secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
Serial.println();
Serial.println();
Serial.print("Wait for WiFi... ");
while(WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
client.setServer(mqttBroker, 1883);
client.setCallback(callback);
}
String floatToString( float n, int l, int d, boolean z){
char c[l+1];
String s;
dtostrf(n,l,d,c);
s=String(c);
if(z){
s.replace(" ","0");
}
return s;
}
// Funciones de ayuda
void handleNewMessages(int numNewMessages, TempAndHumidity data, int gas){
//Obtenemos el arreglo de datos (humedad y temperatura)
//TempAndHumidity data = dht.getTempAndHumidity();
//Serial.println("Nuevos mensajes");
for (int i = 0; i < numNewMessages; i++){
String chat_id = 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";
}
if (text == "/gas"){
//digitalWrite(interructor, LOW); // turn the LED off (LOW is the voltage level )
float g = gas;
String gstr = floatToString(g,2,2,false);
bot.sendMessage(chat_id, "Gas:"+ gstr+ "%");
}
if (text == "/temperatura"){
float t = data.temperature;
String tstr = floatToString(t,2,2,false);
bot.sendMessage(chat_id, "Temperatura: " + tstr + " grados");
}
if (text == "/humedad"){
float h = data.humidity;
String hstr = floatToString(h,2,2,false);
bot.sendMessage(chat_id, "Humedad: " + hstr + "%");
}
if (text == "/start"){
String welcome = "Bienvenido al bot para controlar el ESP32!! \n\n" ;
//welcome += "/ledVon : Enciende el led verde\n";
//welcome += "/ledVoff : Apaga el led verde\n";
welcome += "/gas : Retorna el porcentaje de gas en el ambiente\n";
welcome += "/temperatura : Retorna la temperatura ambiente\n";
welcome += "/humedad : Retorna la humedad en el ambiente\n";
bot.sendMessage(chat_id, welcome, "Markdown");
}
}
}
void MensajesTelegram(int numNewMessages, TempAndHumidity data, int gas){
if (millis() - botLastScan > botMTBS){
//int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages){
Serial.println("Respuesta obtenida");
handleNewMessages(numNewMessages, data, gas);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
botLastScan = millis();
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
gas = analogRead(sensor);
gas = 5; //41*100/1023;
//Serial.println("Gas: " + String(gas) + "%");
//Obtenemos el arreglo de datos (humedad y temperatura)
TempAndHumidity data = dht.getTempAndHumidity();
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
MensajesTelegram(numNewMessages, data, gas);
if (data.temperature > 40)
{
digitalWrite(interructor, LOW); // apaga la valvula selenoide
digitalWrite(BuzzerPin, HIGH);
//Mensaje a Telegram
float t = data.temperature;
String tstr = floatToString(t,2,2,false);
bot.sendMessage("1064582690", "Alerta exite un aumento de temperatura de: "+ tstr+
" grados, se procedio a cerrar la válvula de gas.");
/*Datos hacia Ubidots*/
//cabecera
sprintf(topic, "%s", ""); // Cleans the topic content
sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);
//inicio
sprintf(payload, "%s", ""); // Cleans the payload content
sprintf(payload, "{\"%s\":", VARIABLE_LABEL); // Adds the variable label
sprintf(payload, "%s {\"value\": %s", payload, String(data.temperature, 2)); // Adds the value
//intermedio
sprintf(payload, "%s },\"%s\":", payload, VARIABLE_LABEL2); // Adds the variable label2
sprintf(payload, "%s {\"value\": %s", payload, String(gas)); // Adds the value2
//cierre
sprintf(payload, "%s } }", payload); // Closes the dictionary brackets
client.publish(topic, payload);
client.loop();
delay(3000);
//Mostramos los datos de la temperatura y Gas
Serial.println("Temperatura: " + String(data.temperature, 2) + "°C");
Serial.println("Gas: " + String(gas) + "%");
Serial.println("---");
}
else if(gas > 50) {
digitalWrite(interructor, LOW); // apaga la valvula selenoide
digitalWrite(BuzzerPin, HIGH);
float g = gas;
String gstr = floatToString(g,2,2,false);
bot.sendMessage("1064582690", "Alerta exite un aumento del gas del: "+ gstr +
" %, se procedio a cerrar la válvula de gas.");
/*Datos hacia Ubidots*/
//cabecera
sprintf(topic, "%s", ""); // Cleans the topic content
sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);
//inicio
sprintf(payload, "%s", ""); // Cleans the payload content
sprintf(payload, "{\"%s\":", VARIABLE_LABEL); // Adds the variable label
sprintf(payload, "%s {\"value\": %s", payload, String(data.temperature, 2)); // Adds the value
//intermedio
sprintf(payload, "%s },\"%s\":", payload, VARIABLE_LABEL2); // Adds the variable label2
sprintf(payload, "%s {\"value\": %s", payload, String(gas)); // Adds the value2
//cierre
sprintf(payload, "%s } }", payload); // Closes the dictionary brackets
client.publish(topic, payload);
client.loop();
delay(3000);
//Mostramos los datos de la temperatura y Gas
Serial.println("Temperatura: " + String(data.temperature, 2) + "°C");
Serial.println("Gas: " + String(gas) + "%");
Serial.println("---");
}
else
{
digitalWrite(interructor, HIGH);
digitalWrite(BuzzerPin, LOW);
}
delay(1000);
}