I have a personal project where, "when changing the state of an on/off switch, only 2 SMS messages are sent (I am using the SIM800L) to a certain number, without repeating these messages and when the state of the switch changes, send others 2 SMS to this same number. The port where the key is, will be monitored to verify the change of state, so I want to limit the amount of SMS so as not to keep sending several messages while the key remains in the current state". Thanks for the help.
I use a ESP32 WROOM board and one SIM800L board.
I already configured loops, instances but the logic doesn't work.
Here's of the code I'm working on; i don't know the language C very well and maybe conain errors.
Thanks for the help.
Code: Select all
[Codebox=c file=Untitled.c] #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");
}
//====================================================================[/Codebox]