Send limited SMS - SIM800L - ESP32

User avatar
alckjac
Posts: 1
Joined: Sun Feb 12, 2023 4:59 pm

Send limited SMS - SIM800L - ESP32

Postby alckjac » Sun Feb 12, 2023 5:13 pm

Hi, I'm new to the forum and would like some help.
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]

MicroController
Posts: 1708
Joined: Mon Oct 17, 2022 7:38 pm
Location: Europe, Germany

Re: Send limited SMS - SIM800L - ESP32

Postby MicroController » Thu Feb 16, 2023 1:39 pm

Generally, you use a (global) variable to hold the last state (on or off) your code reacted to. In the loop, you then read the current state from IO and compare it to the state held in the variable. Only if the variable (previous state) and the current state are NOT equal, you detected a change and react e.g. by sending a text message, then you update the variable to store the current state you just read and go on looping.

bidrohini
Posts: 202
Joined: Thu Oct 27, 2022 12:55 pm

Re: Send limited SMS - SIM800L - ESP32

Postby bidrohini » Sun Feb 26, 2023 9:54 am

You can try something like this:

Code: Select all

   #include <TinyGsmClient.h>

#define TINY_GSM_MODEM_SIM800
#define TINY_GSM_DEBUG Serial

// Configures the phone numbers that will receive the notification
#define SMS_NUMBER "+55XXXXXXXXXXX" // replace with the phone number to receive notifications

// GSM credentials - leave empty if not needed
const char apn[] = "xxxxxxxxxx"; // replace with the name/address of your carrier
const char user[] = "xxx"; // if there is no user, leave it blank
const char pass[] = "xxx"; // if there is no password, leave it blank

// Pin that will receive input network state (failure or normalization)
const int PinFalha = 15;

// LED Pin
int LED_BUILTIN = 2;

// previous and current state of the switch
bool previousState = LOW;
bool currentState = LOW;

// number of SMS messages sent
int messageCount = 0;

// GSM client instance
TinyGsm modem(Serial2);

void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  pinMode(PinFalha, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  delay(3000);
  setupGSM(); // initialize GSM modem
  Serial.println("GPRS: Connected");
}

void loop() {
  previousState = currentState;
  currentState = digitalRead(PinFalha);

  if (currentState != previousState) {
    // the state of the switch changed
    messageCount = (messageCount + 1) % 3;
    if (messageCount < 2) {
      // send SMS message
      String message = "The state of the switch changed to " + String(currentState);
      sendSMS(SMS_NUMBER, message);
    }
  }

  delay(500);
}

void setupGSM() {
  // Restart GSM module
  if (!modem.restart()) {
    Serial.println("Failed to restart modem");
    while (1) delay(1000);
  }

  // Set GSM module parameters
  modem.setApn(apn, user, pass);

  // Wait for GSM registration
  while (modem.waitForNetwork() != GSM_READY) {
    Serial.println("Waiting for network...");
    delay(1000);
  }

  Serial.println("GSM registered");
}

void sendSMS(String number, String message) {
  Serial.print("Sending message to ");
  Serial.println(number);

  // Set message format to ASCII
  modem.setSmsFormat(SMS_FORMAT_ASCII);

  // Send SMS message
  if (modem.sendSms(number, message)) {
    Serial.println("SMS message sent");
  } else {
    Serial.println("Failed to send SMS message");
  }
}
  
If you want to make your Project more compact, you can try to design your PCB with ESP-01:

https://www.pcbway.com/project/sharepro ... INOUT.html

Who is online

Users browsing this forum: No registered users and 91 guests