#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <UniversalTelegramBot.h>
#include "DHT.h"
// Definir os dados do sensor DHT
#define DHTPIN 2
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
// Dados do WiFi
#define WIFI_SSID "LabTI_34"
#define WIFI_PASSWORD "c1b3r$r3d3s"
// Dados do Telegram
#define BOT_TOKEN "7061326486:AAGu4jrqbl-hfPOgl__ucaaJHXWfsDtjQpc"
#define CHAT_ID "-1002493561972"
// Configurações MQTT
#define MQTT_ID "" // Device ID
#define MQTT_PUB_TOPIC "wnology/66fe8914d518ea268c612e13/state"
#define MQTT_SUB_TOPIC "wnology/66fe8914d518ea268c612e13/command"
#define MQTT_USERNAME "e5bc6de5099e204838dea69a3229c6f7000c8450bbd82844a06252174ba674b0"
#define MQTT_PASSWORD "54e5cee7e487c8bff06fe6e8602bd4fc6860781efdc82a401c1e72220dc8ef00"
const char* broker_mqtt = "broker.app.wnology.io"; // MQTT broker URL
int broker_port = 1883; // MQTT broker port
WiFiClientSecure secured_client;
WiFiClient espClient;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
PubSubClient MQTT(espClient);
StaticJsonDocument<1024> doc;
const int botDelay = 1000; // Tempo entre verificações do bot (1 segundo)
unsigned long lastTimeBotRan;
// Função para inicializar Wi-Fi
void connect_wifi() {
Serial.print("Conectando ao WiFi SSID: ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.print("\nWiFi conectado. Endereço IP: ");
Serial.println(WiFi.localIP());
}
// Função para conectar ao broker MQTT
void connect_MQTT() {
while (!MQTT.connected()) {
Serial.print("* Tentando se conectar ao broker MQTT: ");
Serial.println(broker_mqtt);
if (MQTT.connect(MQTT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
Serial.println("Conectado ao broker MQTT com sucesso!");
} else {
Serial.println("Falha na tentativa de conexão. Tentando novamente em 2 segundos.");
delay(2000);
}
MQTT.subscribe(MQTT_SUB_TOPIC);
}
}
// Função para enviar leituras de temperatura e umidade para a plataforma IoT via MQTT
void send_data_mqtt(float temperatura, float umidade) {
String cjson = "{\"data\": {\"Temperatura\": " + String(temperatura) + ", \"Umidade\": " + String(umidade) + "} }";
char json[100];
cjson.toCharArray(json, 100);
MQTT.publish(MQTT_PUB_TOPIC, json); // Publica as leituras no tópico MQTT
}
// Função para enviar leituras de temperatura e umidade via Telegram
void send_data_telegram(float temperatura, float umidade) {
String message = "Leitura de sensores:\n";
message += "Temperatura: " + String(temperatura) + "°C\n";
message += "Umidade: " + String(umidade) + "%";
bot.sendMessage(CHAT_ID, message, ""); // Envia a mensagem para o bot no Telegram
}
void setup() {
// Configuração da serial e do DHT
Serial.begin(115200);
dht.begin();
// Conectar ao Wi-Fi
connect_wifi();
// Conectar ao broker MQTT
MQTT.setServer(broker_mqtt, broker_port);
connect_MQTT();
// Sincronização de tempo via NTP (necessário para a comunicação com o bot)
configTime(0, 0, "pool.ntp.org");
time_t now = time(nullptr);
while (now < 24 * 3600) {
delay(100);
now = time(nullptr);
}
// Enviar mensagem de início ao bot
bot.sendMessage(CHAT_ID, "Bot iniciou. Monitorando temperatura e umidade.", "");
lastTimeBotRan = millis();
}
void loop() {
// Verificar conexão Wi-Fi e MQTT
if (WiFi.status() != WL_CONNECTED) {
connect_wifi();
}
if (!MQTT.connected()) {
connect_MQTT();
}
MQTT.loop(); // Mantém a conexão MQTT ativa
// Leitura dos sensores
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
if (isnan(temperatura) || isnan(umidade)) {
Serial.println("Falha ao ler os dados do sensor DHT22");
return;
}
// Enviar dados para o broker MQTT
send_data_mqtt(temperatura, umidade);
// Enviar dados para o bot do Telegram
if (millis() - lastTimeBotRan > botDelay) {
send_data_telegram(temperatura, umidade);
lastTimeBotRan = millis();
}
delay(5000); // Aguarda 5 segundos até a próxima leitura
}