Automação com Esp32 (ERRO)

Projetos de ESP32
Victor Vinicios
Novato
Mensagens: 2
Registrado em: 26/Abr/2020, 02:24

Automação com Esp32 (ERRO)

Mensagem por Victor Vinicios » 04/Jun/2020, 17:08

Estou tentando fazer uma automação residencial usando o telegram com o esp32, 4 relé e o mq-2, mas está dando esse erros, como resolvo?

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

Responder