Código: Selecionar todos
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <SimpleDHT.h>
//Pino onde está o Relê
#define RELAY_1 23
#define RELAY_2 22
#define RELAY_3 21
#define MQ_analog 12//pino analógico do sensor de gás
#define MQ_dig 13 //pino digital do sensor de gás
//Intervalo entre as checagens de novas mensagens
#define INTERVAL 1000
//Token do seu bot. Troque pela que o BotFather te mostrar
#define BOT_TOKEN "000000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
//Troque pelo ssid e senha da sua rede WiFi
#define SSID "SSID"
#define PASSWORD "12345678"
//Comandos aceitos
const String LIGHT_ON = "ligar a luz";
const String LIGHT_OFF = "desligar a luz";
const String COOLER_ON = "ligar o ventilador";
const String COOLER_OFF = "desligar o ventilador";
const String DOOR_OPEN = "abrir o portão";
const String DOOR_CLOSE = "fechar o portão";
const String STATS = "status";
const String START = "/start";
//Estado do relê
int relayStatus = HIGH;
//Cliente para conexões seguras
WiFiClientSecure client;
//Objeto com os métodos para comunicarmos pelo Telegram
UniversalTelegramBot bot(BOT_TOKEN, client);
//Tempo em que foi feita a última checagem
uint32_t lastCheckTime = 0;
//Quantidade de usuários que podem interagir com o bot
#define SENDER_ID_COUNT 2
//Ids dos usuários que podem interagir com o bot.
//É possível verificar seu id pelo monitor serial ao enviar uma mensagem para o bot
String validSenderIds[SENDER_ID_COUNT] = {"012345678", "123456789"};
/////////
void setup()
{
Serial.begin(115200);
//Inicializa o WiFi e se conecta à rede
setupWiFi();
//Coloca o pino do relê como saída e enviamos o estado atual
pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
pinMode(RELAY_3, OUTPUT);
pinMode(MQ_dig, OUTPUT);
pinMode(MQ_analog, OUTPUT);
}
void setupWiFi()
{
Serial.print("Connecting to SSID: ");
Serial.println(SSID);
//Inicia em modo station e se conecta à rede WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWORD);
//Enquanto não estiver conectado à rede
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
//Se chegou aqui está conectado
Serial.println();
Serial.println("Connected");
}
void loop()
{
//Tempo agora desde o boot
uint32_t now = millis();
//Se o tempo passado desde a última checagem for maior que o intervalo determinado
if (now - lastCheckTime > INTERVAL)
{
//Coloca o tempo de útlima checagem como agora e checa por mensagens
lastCheckTime = now;
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
handleNewMessages(numNewMessages);
}
if(gasDetected())
{
//atribui à variável o texto ALARM
packet = "ALARM";
//concatena com o pacote os valores, separados por pipe
packet+=values;
//envia pacote por LoRa
sendPacket();
//chama função para exibir no display com flag true, indicando gás detectado
showDisplay(true);
}
}
void handleNewMessages(int numNewMessages)
{
for (int i=0; i<numNewMessages; i++) //para cada mensagem nova
{
String chatId = String(bot.messages[i].chat_id); //id do chat
String senderId = String(bot.messages[i].from_id); //id do contato
Serial.println("senderId: " + senderId); //mostra no monitor serial o id de quem mandou a mensagem
boolean validSender = validateSender(senderId); //verifica se é o id de um remetente da lista de remetentes válidos
if(!validSender) //se não for um remetente válido
{
bot.sendMessage(chatId, "Desculpe mas você não tem permissão", "HTML"); //envia mensagem que não possui permissão e retorna sem fazer mais nada
continue; //continua para a próxima iteração do for (vai para próxima mensgem, não executa o código abaixo)
}
String text = bot.messages[i].text; //texto que chegou
if (text.equalsIgnoreCase(START))
{
handleStart(chatId, bot.messages[i].from_name); //mostra as opções
}
else if (text.equalsIgnoreCase(LIGHT_ON))
{
handleLightOn(chatId); //liga o relê 1
}
else if(text.equalsIgnoreCase(LIGHT_OFF))
{
handleLightOff(chatId); //desliga o relê 1
}
else if(text.equalsIgnoreCase(COOLER_ON))
{
handleCoolerOn(chatId); //desliga o relê 2
}
else if(text.equalsIgnoreCase(COOLER_OFF))
{
handleCoolerOff(chatId); //desliga o relê 2
}
else if(text.equalsIgnoreCase(DOOR_OPEN))
{
handleDoorOpen(chatId); //desliga o relê 3
}
else if(text.equalsIgnoreCase(DOOR_CLOSE))
{
handleDoorClose(chatId); //desliga o relê 3
}
else if (text.equalsIgnoreCase(STATS))
{
handleStatus(chatId); //envia mensagem com o estado do relê, e status do gás
}
else
{
handleNotFound(chatId); //mostra mensagem que a opção não é válida e mostra as opções
}
}//for
}
boolean validateSender(String senderId)
{
//Para cada id de usuário que pode interagir com este bot
for(int i=0; i<SENDER_ID_COUNT; i++)
{
//Se o id do remetente faz parte do array retornamos que é válido
if(senderId == validSenderIds[i])
{
return true;
}
}
//Se chegou aqui significa que verificou todos os ids e não encontrou no array
return false;
}
void handleStart(String chatId, String fromName)
{
//Mostra Olá e o nome do contato seguido das mensagens válidas
String message = "<b>Olá " + fromName + ".</b>\n";
message += getCommands();
bot.sendMessage(chatId, message, "HTML");
}
String getCommands()
{
//String com a lista de mensagens que são válidas e explicação sobre o que faz
String message = "Os comandos disponíveis são:\n\n";
message += "<b>" + LIGHT_ON + "</b>: Para LIGAR a luz\n";
message += "<b>" + LIGHT_OFF + "</b>: Para DESLIGAR a luz\n";
message += "<b>" + COOLER_ON + "</b>: Para LIGAR o ventilador\n";
message += "<b>" + COOLER_OFF + "</b>: Para DESLIGAR o ventilador\n";
message += "<b>" + DOOR_OPEN + "</b>: Para ABRIR o portão\n";
message += "<b>" + DOOR_CLOSE + "</b>: Para FECHAR o portão\n";
message += "<b>" + STATS + "</b>: Para verificar o status";
return message;
}
void handleLightOn(String chatId)
{
//Liga o relê e envia mensagem confirmando a operação
relayStatus = LOW; //A lógica do nosso relê é invertida
digitalWrite(RELAY_1, relayStatus);
bot.sendMessage(chatId, "A luz está <b>acesa</b>", "HTML");
}
void handleLightOff(String chatId)
{
//Desliga o relê e envia mensagem confirmando a operação
relayStatus = HIGH; //A lógica do nosso relê é invertida
digitalWrite(RELAY_1, relayStatus);
bot.sendMessage(chatId, "A luz está <b>apagada</b>", "HTML");
}
void handleCoolerOn(String chatId)
{
//Desliga o relê e envia mensagem confirmando a operação
relayStatus = HIGH; //A lógica do nosso relê é invertida
digitalWrite(RELAY_2, relayStatus);
bot.sendMessage(chatId, "O ventilador está <b>ligado</b>", "HTML");
}
void handleCoolerOff(String chatId)
{
//Desliga o relê e envia mensagem confirmando a operação
relayStatus = HIGH; //A lógica do nosso relê é invertida
digitalWrite(RELAY_2, relayStatus);
bot.sendMessage(chatId, "O ventilador está <b>desligado</b>", "HTML");
}
void handleDoorOpen(String chatId)
{
//Desliga o relê e envia mensagem confirmando a operação
relayStatus = HIGH; //A lógica do nosso relê é invertida
digitalWrite(RELAY_3, relayStatus);
bot.sendMessage(chatId, "O portão está <b>aberto</b>", "HTML");
}
void handleDoorClose(String chatId)
{
//Desliga o relê e envia mensagem confirmando a operação
relayStatus = HIGH; //A lógica do nosso relê é invertida
digitalWrite(RELAY_3, relayStatus);
bot.sendMessage(chatId, "O portão está <b>fechado</b>", "HTML");
}
void handleGas(String chatId)
{
//Envia mensagem com o valor da temperatura e da umidade
bot.sendMessage(chatId, gasDetected(), "");
}
//função responsável por disparar mensagem caso o sensor detectar gás
bool gasDetected()
{
//lê o valor analógico do sensor (servirá apenas como informativo pela serial)
analog_value = analogRead(MQ_analog);
//lê o valor digital do sensor, caso sinal baixo o gás foi detectado
dig_value = digitalRead(MQ_dig);
//obs: as exibições pela serial neste código não influenciam o funcionamento do protótipo
//exibe valor pela serial
Serial.print(analog_value);
//exibe separador "||" pela serial
Serial.print(" || ");
//lógica inversa, se "0" então foi detectado gás
if(dig_value == 0)
{
//define o valor analógico mínimo (servirá apenas como informativo pela serial)
if(gas_limit == 0 || gas_limit > analog_value)
gas_limit = analog_value;
//exibe na serial "Gas detectado"
Serial.println("GAS DETECTADO!!!");
//exibe o limite mínimo de gás captado para o evento ocorrer
Serial.println("Gas limit: "+String(gas_limit));
//retorna verdadeiro
return true;
}
else
{
//exibe na serial "Gas ausente"
Serial.println("Gás não detectado...");
//exibe o limite mínimo default "X" caso não foi acionado pela primeira vez
if(gas_limit == 0)
Serial.println("Gas limit: X");
else //exibe o limite mínimo de gás captado para o evento ocorrer
Serial.println("Gas limit: "+String(gas_limit));
//retorna falso
return false;
}
void handleStatus(String chatId)
{
String message = "";
//Verifica se o relê está ligado ou desligado e gera a mensagem de acordo
if(relayStatus == LOW) //A lógica do nosso relê é invertida
{
message += "A luz está acesa\n";
}
else if
{
message += "A luz está apagada\n";
}
else if
{
message += "O ventilador está ligado\n"
}
else if
{
message += "O ventilador está desligado\n"
}
else if
{
message += "O portão está aberto\n"
}
else if
{
message += "O portão está fechado\n"
}
//Adiciona à mensagem o valor da temperatura e umidade
message += gasDetected();
//Envia a mensagem para o contato
bot.sendMessage(chatId, message, "");
}
}
void handleNotFound(String chatId)
{
//Envia mensagem dizendo que o comando não foi encontrado e mostra opções de comando válidos
String message = "Comando não encontrado\n";
message += getCommands();
bot.sendMessage(chatId, message, "HTML");
}
Arduino: 1.8.13 Hourly Build 2020/05/25 05:33 (Windows 10), Placa:"ESP32 Dev Module, Enabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"
C:\Users\Downloads\TelegramBot\TelegramBot\TelegramBot.ino: In function 'void loop()':
TelegramBot:107:5: error: 'packet' was not declared in this scope
packet = "ALARM";
^
TelegramBot:109:13: error: 'values' was not declared in this scope
packet+=values;
^
TelegramBot:111:16: error: 'sendPacket' was not declared in this scope
sendPacket();
^
TelegramBot:113:21: error: 'showDisplay' was not declared in this scope
showDisplay(true);
Foram encontradas múltiplas bibliotecas para "WiFi.h"
^
Usado: C:\Users\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFi
Não usado: C:\Users\victo\Downloads\arduino-nightly-windows\arduino-nightly\libraries\WiFi
C:\Users\Downloads\TelegramBot\TelegramBot\TelegramBot.ino: In function 'void handleNewMessages(int)':
TelegramBot:166:26: error: 'handleStatus' was not declared in this scope
handleStatus(chatId); //envia mensagem com o estado do relê, e status do gás
^
C:\Users\Downloads\TelegramBot\TelegramBot\TelegramBot.ino: In function 'void handleGas(String)':
TelegramBot:264:44: error: no matching function for call to 'UniversalTelegramBot::sendMessage(String&, bool, const char [1])'
bot.sendMessage(chatId, gasDetected(), "");
^
In file included from C:\Users\Downloads\TelegramBot\TelegramBot\TelegramBot.ino:7:0:
C:\Users\OneDrive\Documentos\Arduino\libraries\UniversalTelegramBot\src/UniversalTelegramBot.h:61:10: note: candidate: bool UniversalTelegramBot::sendMessage(String, String, String)
bool sendMessage(String chat_id, String text, String parse_mode = "");
^
C:\Users\OneDrive\Documentos\Arduino\libraries\UniversalTelegramBot\src/UniversalTelegramBot.h:61:10: note: no known conversion for argument 2 from 'bool' to 'String'
C:\Users\Downloads\TelegramBot\TelegramBot\TelegramBot.ino: In function 'bool gasDetected()':
TelegramBot:271:3: error: 'analog_value' was not declared in this scope
analog_value = analogRead(MQ_analog);
^
TelegramBot:273:3: error: 'dig_value' was not declared in this scope
dig_value = digitalRead(MQ_dig);
^
TelegramBot:285:8: error: 'gas_limit' was not declared in this scope
if(gas_limit == 0 || gas_limit > analog_value)
^
TelegramBot:291:41: error: 'gas_limit' was not declared in this scope
Serial.println("Gas limit: "+String(gas_limit));
^
TelegramBot:303:8: error: 'gas_limit' was not declared in this scope
if(gas_limit == 0)
^
TelegramBot:313:1: error: a function-definition is not allowed here before '{' token
{
^
TelegramBot:356:1: error: expected '}' at end of input
}
^
exit status 1
'packet' was not declared in this scope