Olá, sou novo no fórum e gostaria de uma ajuda.
Tenho um projeto pessoal onde, “ao mudar o estado de um botão liga/desliga, são enviadas apenas 2 mensagens SMS (estou usando o SIM800L) para um determinado número, sem repetir essas mensagens e quando o estado do botão muda, enviar outros 2 SMS para este mesmo número. A porta onde está a chave, será monitorada para verificar a mudança de estado, então quero limitar a quantidade de SMS para não ficar enviando várias mensagens enquanto a chave permanecer no atual estado”. Obrigado pela ajuda.
Eu uso uma placa ESP32 WROOM e uma placa SIM800L.
Aqui está o código em que estou trabalhando; não conheço muito bem a linguagem C e talvez contenha erros.
Obrigado pela ajuda.
#define TINY_GSM_MODEM_SIM800
#define TINY_GSM_DEBUG Serial
//====================================================================
// Configura os numeros de telefone que receberão a notificação padrão.
#define SMS_CONTATO_1 “+55XXXXXXXXXXX” //Anton
#define SMS_CONTATO_2 “+55XXXXXXXXXXX” //Anton1
#define SMS_CONTATO_3 “+55XXXXXXXXXXX” //Anton2
#define SMS_CONTATO_4 “+55XXXXXXXXXXX” //Anton3
//#define SMS_CONTATO_5 “+55XXXXXXXXXXX” //Substitua o XXXXXXXXXXXX pelo número que receberá a notificação
//====================================================================
// Credenciais de acesso a rede GPRS - Deixe vazio caso não precise de usuário e senha para conectar à rede GPRS
const char apn = “xxxxxxxxxx”; //Substitua xxxxxxxx pelo nome/endereço da operadora
const char user = “xxx”; //Se não houver user, deixar em branco
const char pass = “xxx”; //Se não houver pass, deixar em branco
//====================================================================
// Pino que receberá estado da rede de entrada (falha ou normalização)
const int PinFalha = 15;
//====================================================================
int LED_BUILTIN = 2; //Define ledPin interno no Pino 2
int MonitorLed = 4; //Define pino de monitoramento no Pino 4
//====================================================================
boolean botaoAtual = false; //Estado atual do botao conectado ao PinFalha (15)
boolean botaoAnt = false; //Estado anterior do botao conectado ao PinFalha (15)
//====================================================================
// Inclusão da biblioteca com os comandos para funcionamento do Modem SIM800L
#include <TinyGsmClient.h>
//====================================================================
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(Serial, Serial2);
TinyGsm modem(debugger);
#else
TinyGsm modem(Serial2);
#endif
//====================================================================
// Variáveis usadas para contar o tempo sem travar a função loop millis de referencia
long int millisRefCon, millisUserResp;
// Flag que indica a contagem de tempo (usadas pela função ‘timeout’)
bool flagCon = false, flagUserResp = false;
//====================================================================
String sendAT(String command)
{
String response = “”;
Serial2.println(command);
// Aguardamos até que haja resposta do SIM800L
while(!Serial2.available());
response = Serial2.readString();
return response;
}
//====================================================================
void setup() {
Serial.begin(9600);
Serial2.begin(9600);
pinMode(PinFalha, INPUT);
//====================================================================
pinMode(LED_BUILTIN , OUTPUT);//Define ledPin (pino 10) como saída
pinMode(MonitorLed, OUTPUT);
//====================================================================
delay(3000);
// Atribui para as variáveis de contagem de tempo o tempo atual antes de entrar no loop
millisRefCon = millisUserResp = millis();
setupGSM(); //Inicializa o Modem SIM800L
Serial.println(“||GPRS: Conectado||”); //Mensagem de confirmação de conexao
}
//====================================================================
void setupGSM() {
// A reinicialização levará algum tempo; basta aguardar por volta de 10 segundos
DBG(“Inicializando modem…”);
if (!modem.restart()) {
delay(10000);
return;
}
// Retorna com informações do Modem
String modemInfo = modem.getModemInfo();
DBG(“||Modem:”, modemInfo);
//====================================================================
bool res;
// Retorna a identificação do cartão SIM.
String ccid = modem.getSimCCID();
DBG(“CCID:”, ccid);// Retorna com IMEI do Modem
String imei = modem.getIMEI();
DBG(“IMEI:”, imei);
//====================================================================
// Retorna a qualidade/intensidade do Sinal do Modem
// (10-14:OK | 15-19:BOM | 20-30 : Excelente
int csq = modem.getSignalQuality();
DBG(“Qualidade de sinal:”, csq);// Retorna com o nível da bateria em %
int battLevel = modem.getBattPercent();
DBG(“Nivel de bateria:”, battLevel);// Retorna com a voltagem da bateria/alimentação (Modem precisa de 3,7V a 4,1V)
float battVoltage = modem.getBattVoltage() / 1000.0F;
DBG(“Voltagem de bateria:”, battVoltage);
}
//====================================================================
// Função que compara se o tempo foi atingido, sem que ‘congele’ a execução do loop
bool timeout(const int DELAY, long *previousMillis, bool *flag)
{
if(*flag)
{
*previousMillis = millis();
*flag = false;
}
if((*previousMillis + DELAY) < millis())
{
*flag = true;
return true;
}
return false;
}
//====================================================================
void loop() {
while (botaoAtual==1) botaoAtual = digitalRead(PinFalha); //espera botao mudar de estado
if (botaoAtual && !botaoAnt == HIGH) { //Se estadoButton for igual a HIGH ou 1
digitalWrite(LED_BUILTIN , HIGH); //Define ledPin como HIGH, ligando o LED
digitalWrite(MonitorLed, HIGH); //Define Led sinalizador para HIGH, ligando o LED
smsNormal(); //Chama função “smsNormal” para enviar mensagem padrão para os numeros habilitados
}
else
while (botaoAtual==0) botaoAtual = digitalRead(PinFalha); //espera botao mudar de estado
{
digitalWrite(LED_BUILTIN, LOW); //Se estadoButton for igual a LOW, apaga Led
digitalWrite(MonitorLed, LOW); //Define Led sinalizador para LOW, desligando o LED
smsFalha(); //Chama função “smsFalha” para enviar mensagem padrão para os numeros habilitados
}
}
//====================================================================
//Função de envio de SMS em caso de retorno de energia ao estado normal
void smsFalha(){
bool res;
res = modem.sendSMS(SMS_CONTATO_1, String(“FALHA DE ENERGIA - MAQ.2”));
DBG(“SMS:”, res ? “OK” : “fail”);
res = modem.sendSMS_UTF16(SMS_CONTATO_1, u".:::Energy:::…", 21);
DBG(“UTF16 SMS:”, res ? “OK” : “fail”);res = modem.sendSMS(SMS_CONTATO_2, String(“FALHA DE ENERGIA - MAQ.2”));
DBG(“SMS:”, res ? “OK” : “fail”);
res = modem.sendSMS_UTF16(SMS_CONTATO_2, u".:::Energy:::…", 21);
DBG(“UTF16 SMS:”, res ? “OK” : “fail”);
}//Função de envio de SMS em caso de falha de energia
void smsNormal(){
bool res;
res = modem.sendSMS(SMS_CONTATO_1, String(“.::RETORNO DE ENERGIA - MAQ.2::.”));
DBG(“SMS:”, res ? “OK” : “fail”);
res = modem.sendSMS_UTF16(SMS_CONTATO_1, u".:::Energy:::…", 21);
DBG(“UTF16 SMS:”, res ? “OK” : “fail”);res = modem.sendSMS(SMS_CONTATO_2, String(“.:RETORNO DE ENERGIA - MAQ.2:.”));
DBG(“SMS:”, res ? “OK” : “fail”);
res = modem.sendSMS_UTF16(SMS_CONTATO_2, u".:::Energy:::…", 21);
DBG(“UTF16 SMS:”, res ? “OK” : “fail”);}
//====================================================================