#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#include <Firebase_ESP_Client.h>
#include <addons/TokenHelper.h>
// Configurações de WiFi e Telegram
#define WIFI_SSID "LabTI_34"
#define WIFI_PASSWORD "c1b3r$r3d3s"
//#define WIFI_SSID "Galaxy Godoi"
//#define WIFI_PASSWORD "vxrb2437"
#define BOT_TOKEN "8070922547:AAGXrpOU99AcVXLaXiyCbCebmjF3KFwDVKs"
#define CHAT_ID "-4535419965"
// Configurações de Firebase
#define API_KEY "AIzaSyCwDredu0Gxn0VVJGAYFxiVMwTKm8ZZR7s"
#define FIREBASE_PROJECT_ID "projetos-senai-2024"
#define USER_EMAIL "[email protected]"
#define USER_PASSWORD "S@n@i2024"
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
String text = "";
String message;
// Variável para armazenar dados lidos do Firebase
struct DadosFirebase {
float temperatura_bombeamento;
int rotacao_bombeamento;
float pressao_bombeamento;
int vibracao_bombeamento;
float temperatura_fresadora;
float temperatura_fresadora02;
int vibracao_fresadora;
float temperatura_compressor;
float pressao_compressor;
int vibracao_compressor;
float temperatura_cnc;
float pressao_cnc;
int vibracao_cnc;
float temperatura_torno;
int rotacao_torno;
int vibracao_torno;
} dados;
unsigned long ultimoAlarme = 0;
const unsigned long intervaloAlarme = 20000; // 20 segundos em milissegundos
SemaphoreHandle_t mutexDados; // Semáforo para proteger os dados compartilhados
void setupWiFi() {
Serial.print("Connecting to Wi-Fi");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println("\nWiFi connected.");
}
void setupFirebase() {
config.api_key = API_KEY;
auth.user.email = USER_EMAIL;
auth.user.password = USER_PASSWORD;
config.token_status_callback = tokenStatusCallback;
Firebase.begin(&config, &auth);
Firebase.reconnectNetwork(true);
}
void setup() {
Serial.begin(115200);
setupWiFi();
setupFirebase();
// Configuração do cliente seguro para o Telegram
secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
// Cria o semáforo para proteger o acesso aos dados
mutexDados = xSemaphoreCreateMutex();
// Cria a tarefa para leitura do Firebase no núcleo 0
xTaskCreatePinnedToCore(tarefaFirebase, "tarefaFirebase", 10000, NULL, 1, NULL, 0);
// Cria a tarefa para atendimento do Telegram no núcleo 1
xTaskCreatePinnedToCore(tarefaTelegram, "tarefaTelegram", 10000, NULL, 1, NULL, 1);
}
// Tarefa para ler dados do Firebase a cada 20 segundos
void tarefaFirebase(void *parameter) {
while (true) {
String documentPath = "Equipamentos/Bombeamento";
if (Firebase.Firestore.getDocument(&fbdo, FIREBASE_PROJECT_ID, "", documentPath.c_str())) {
FirebaseJson json;
json.setJsonData(fbdo.payload().c_str());
FirebaseJsonData tempData, rotData, pressData, vibData;
json.get(tempData, "fields/Temperatura/floatValue");
json.get(rotData, "fields/Rotacao/integerValue");
json.get(pressData, "fields/Pressao/floatValue");
json.get(vibData, "fields/Vibracao/integerValue");
// Protege o acesso aos dados com o semáforo
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
dados.temperatura_bombeamento = tempData.floatValue;
dados.rotacao_bombeamento = rotData.intValue;
dados.pressao_bombeamento = pressData.floatValue;
dados.vibracao_bombeamento = vibData.intValue;
xSemaphoreGive(mutexDados); // Libera o semáforo
}
} else {
Serial.print("Erro ao obter documento do bombeamento: ");
Serial.println(fbdo.errorReason());
}
vTaskDelay(20000 / portTICK_PERIOD_MS); // Espera 20 segundos antes da próxima leitura
}
while (true) {
String documentPath = "Equipamentos/Fresadora";
if (Firebase.Firestore.getDocument(&fbdo, FIREBASE_PROJECT_ID, "", documentPath.c_str())) {
FirebaseJson json;
json.setJsonData(fbdo.payload().c_str());
FirebaseJsonData tempData, rotData, pressData, vibData;
json.get(tempData, "fields/Temperatura/floatValue");
json.get(rotData, "fields/Temperatura02/floatValue");
json.get(vibData, "fields/Vibracao/integerValue");
// Protege o acesso aos dados com o semáforo
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
dados.temperatura_fresadora = tempData.floatValue;
dados.temperatura_fresadora02 = tempData.floatValue;
dados.vibracao_fresadora = vibData.intValue;
xSemaphoreGive(mutexDados); // Libera o semáforo
}
} else {
Serial.print("Erro ao obter documento da fresa: ");
Serial.println(fbdo.errorReason());
}
vTaskDelay(20000 / portTICK_PERIOD_MS); // Espera 20 segundos antes da próxima leitura
}
while (true) {
String documentPath = "Equipamentos/Compressor";
if (Firebase.Firestore.getDocument(&fbdo, FIREBASE_PROJECT_ID, "", documentPath.c_str())) {
FirebaseJson json;
json.setJsonData(fbdo.payload().c_str());
FirebaseJsonData tempData, rotData, pressData, vibData;
json.get(tempData, "fields/Temperatura/floatValue");
json.get(pressData, "fields/Pressao/floatValue");
json.get(vibData, "fields/Vibracao/integerValue");
// Protege o acesso aos dados com o semáforo
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
dados.temperatura_compressor = tempData.floatValue;
dados.pressao_compressor = pressData.floatValue;
dados.vibracao_compressor = vibData.intValue;
xSemaphoreGive(mutexDados); // Libera o semáforo
}
} else {
Serial.print("Erro ao obter documento do compressor: ");
Serial.println(fbdo.errorReason());
}
vTaskDelay(20000 / portTICK_PERIOD_MS); // Espera 20 segundos antes da próxima leitura
}
while (true) {
String documentPath = "Equipamentos/CNC";
if (Firebase.Firestore.getDocument(&fbdo, FIREBASE_PROJECT_ID, "", documentPath.c_str())) {
FirebaseJson json;
json.setJsonData(fbdo.payload().c_str());
FirebaseJsonData tempData, rotData, pressData, vibData;
json.get(tempData, "fields/Temperatura/floatValue");
json.get(pressData, "fields/Pressao/floatValue");
json.get(vibData, "fields/Vibracao/integerValue");
// Protege o acesso aos dados com o semáforo
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
dados.temperatura_cnc = tempData.floatValue;
dados.pressao_cnc = pressData.floatValue;
dados.vibracao_cnc = vibData.intValue;
xSemaphoreGive(mutexDados); // Libera o semáforo
}
} else {
Serial.print("Erro ao obter documento do torno CNC: ");
Serial.println(fbdo.errorReason());
}
vTaskDelay(20000 / portTICK_PERIOD_MS); // Espera 20 segundos antes da próxima leitura
}
while (true) {
String documentPath = "Equipamentos/Torno";
if (Firebase.Firestore.getDocument(&fbdo, FIREBASE_PROJECT_ID, "", documentPath.c_str())) {
FirebaseJson json;
json.setJsonData(fbdo.payload().c_str());
FirebaseJsonData tempData, rotData, pressData, vibData;
json.get(tempData, "fields/Temperatura/floatValue");
json.get(pressData, "fields/Rotacao/floatValue");
json.get(vibData, "fields/Vibracao/integerValue");
// Protege o acesso aos dados com o semáforo
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
dados.temperatura_torno = tempData.floatValue;
dados.rotacao_torno = rotData.intValue;
dados.vibracao_torno = vibData.intValue;
xSemaphoreGive(mutexDados); // Libera o semáforo
}
} else {
Serial.print("Erro ao obter documento do torno CNC: ");
Serial.println(fbdo.errorReason());
}
vTaskDelay(20000 / portTICK_PERIOD_MS); // Espera 20 segundos antes da próxima leitura
}
}
// Tarefa para atendimento do Telegram
void tarefaTelegram(void *parameter) {
while (true) {
int newmsg = bot.getUpdates(bot.last_message_received + 1);
Serial.print("Número de novas mensagens: ");
Serial.println(newmsg);
for (int i = 0; i < newmsg; i++) {
text = bot.messages[i].text;
text.toUpperCase();
Serial.println(text);
if (text == "/BOMBEAMENTO") {
bot.sendMessage(CHAT_ID, "Buscando dados..", "");
// Protege o acesso aos dados com o semáforo
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
message = "Dados do Sistema de Bombeamento:\n";
message += "Temperatura: " + String(dados.temperatura_bombeamento) + " °C\n";
message += "Rotação: " + String(dados.rotacao_bombeamento) + " RPM\n";
message += "Pressão: " + String(dados.pressao_bombeamento) + " Pa\n";
message += "Vibração: " + String(dados.vibracao_bombeamento) + " mm/s²\n";
xSemaphoreGive(mutexDados); // Libera o semáforo
}
bot.sendMessage(CHAT_ID, message, "");
}
if (text == "/FRESADORA") {
bot.sendMessage(CHAT_ID, "Buscando dados..", "");
// Protege o acesso aos dados com o semáforo
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
message = "Dados do Sistema da fresadora:\n";
message += "Temperatura 01: " + String(dados.temperatura_fresadora) + " °C\n";
message += "Temperatura 02: " + String(dados.temperatura_fresadora02) + " °C\n";
message += "Vibração: " + String(dados.vibracao_fresadora) + " mm/s²\n";
xSemaphoreGive(mutexDados); // Libera o semáforo
}
bot.sendMessage(CHAT_ID, message, "");
}
if (text == "/COMPRESSOR") {
bot.sendMessage(CHAT_ID, "Buscando dados..", "");
// Protege o acesso aos dados com o semafóro
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
message = "Dados do Sistema do compressor: \n";
message += "Temperatura: " + String(dados.temperatura_compressor) + " °C\n";
message += "Pressão: " + String(dados.pressao_compressor) + " Pa\n";
message += "Vibração: " + String(dados.vibracao_compressor) + " mm/s²\n";
xSemaphoreGive (mutexDados); // Libera o semafóro
}
bot.sendMessage(CHAT_ID, message, "")
}
if (text == "/CNC") {
bot.sendMessage(CHAT_ID, "Buscando dados..", "");
// Protege o acesso aos dados com o semafóro
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
message = "Dados do Sistema do CNC: \n";
message += "Temperatura: " + String(dados.temperatura_cnc) + " °C\n";
message += "Pressão: " + String(dados.pressao_cnc) + " Pa\n";
message += "Vibração: " + String(dados.vibracao_cnc) + " mm/s²\n";
xSemaphoreGive (mutexDados); // Libera o semafóro
}
bot.sendMessage(CHAT_ID, message, "")
}
if (text == "/TORNO") {
bot.sendMessage(CHAT_ID, "Buscando dados..", "");
// Protege o acesso aos dados com o semafóro
if (xSemaphoreTake(mutexDados, portMAX_DELAY)) {
message = "Dados do Sistema do torno: \n";
message += "Temperatura: " + String(dados.temperatura_torno) + " °C\n";
message += "Rotação: " + String(dados.rotacao_torno) + " RPM\n";
message += "Vibração: " + String(dados.vibracao_torno) + " mm/s²\n";
xSemaphoreGive (mutexDados); // Libera o semafóro
}
bot.sendMessage(CHAT_ID, message, "")
}
}
// Alarme para Bombeamento
if (dados.temperatura_bombeamento >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Temperatura Elevada no Bombeamento!! ";
message += "Temperatura: " + String(dados.temperatura_bombeamento) + " °C\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.rotacao_bombeamento >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Rotação Elevada no Bombeamento!! ";
message += "Rotação: " + String(dados.rotacao_bombeamento) + " RPM\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.vibracao_bombeamento >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Vibração Elevada no Bombeamento!! ";
message += "Vibração: " + String(dados.vibracao_bombeamento) + " mm/s²\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
// Alarme para Fresadora
if (dados.temperatura_fresadora >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Temperatura Elevada na Fresadora!! ";
message += "Temperatura: " + String(dados.temperatura_fresadora) + " °C\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.temperatura_fresadora02 >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Temperatura02 Elevada na Fresadora!! ";
message += "Temperatura02: " + String(dados.temperatura_fresadora02) + " °C\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.vibracao_fresadora >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Vibração Elevada na Fresadora!! ";
message += "Vibração: " + String(dados.vibracao_fresadora) + " mm/s²\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
// Alarme para Compressor
if (dados.temperatura_compressor >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Temperatura Elevada no Compressor!! ";
message += "Temperatura: " + String(dados.temperatura_compressor) + " °C\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.pressao_compressor >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Pressão Elevada no Compressor!! ";
message += "Pressão: " + String(dados.pressao_compressor) + " Pa\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.vibracao_compressor >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Vibração Elevada no Compressor!! ";
message += "Vibração: " + String(dados.vibracao_compressor) + " mm/s²\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
// Alarme para CNC
if (dados.temperatura_cnc >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Temperatura Elevada no CNC!! ";
message += "Temperatura: " + String(dados.temperatura_cnc) + " °C\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.pressao_cnc >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Pressão Elevada no CNC!! ";
message += "Pressão: " + String(dados.pressao_cnc) + " Pa\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.vibracao_cnc >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Vibração Elevada no CNC!! ";
message += "Vibração: " + String(dados.vibracao_cnc) + " mm/s²\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
// Alarme para Torno
if (dados.temperatura_torno >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Temperatura Elevada no Torno!! ";
message += "Temperatura: " + String(dados.temperatura_torno) + " °C\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.rotacao_torno >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Rotação Elevada no Torno!! ";
message += "Rotação: " + String(dados.rotacao_torno) + " RPM\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
if (dados.vibracao_torno >= 70 && (millis() - ultimoAlarme >= intervaloAlarme)) {
message = "Alarme !!\n";
message += "Vibração Elevada no Torno!! ";
message += "Vibração: " + String(dados.vibracao_torno) + " mm/s²\n";
bot.sendMessage(CHAT_ID, message, "");
// Atualiza o tempo da última mensagem de alarme
ultimoAlarme = millis();
}
vTaskDelay(3000 / portTICK_PERIOD_MS); // Espera 3 segundos antes de verificar novas mensagens
}
}
void loop() {
// loop vazio, pois estamos usando FreeRTOS para gerenciar as tarefas
}