banner

Ir para o Forum

E se o seu link cair?


Neste vídeo vamos criar um sensor de queda de link com um ESP32 e um SIM800. Isso significa que, com este projeto, poderemos verificar a conexão com a internet e, em caso de falha na conexão, chamar um número de telefone para avisar que a rede está com problema.




Essa é apenas uma das inúmeras maneiras que existem hoje para fazer esse tipo de monitoramento e, apesar de ser simples, ele te possibilita testar vários equipamentos que possam existir dentro do seu CPD. Seu poder de checagem fica muito maior ao utilizarmos o ESP32. Apesar de eu utilizar WiFi neste nosso exemplo, você pode usar internet cabeada, se preferir.



Montagem





Montagem – Tabela





Biblioteca TFT_eSPI

Na IDE do Arduino vá em Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale TFT_eSPI


Vá na pasta da biblioteca e altere as linhas do arquivo User_Setup.h para deixar como na imagem.





ESP32_Check_Internet_Connection.ino

Includes e defines

#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>
#include <WiFi.h>
#include <TFT_eSPI.h>
#include <SPI.h>

//Mude para o nome e senha da sua rede WiFi que quer testar
#define SSID "SSID"
#define PASSWORD "12345678"

//+55 DDD Número do celular
#define USER_PHONE_NUMBER "+5518912345678"

//Tempo que deve esperar para considerar como desconectado
#define MAX_DISCONNECTED_TIME 10000 //10 seg

//Tempo que deve esperar para cada ligação
#define MAX_CALL_TIME_INTERVAL 1800000 //30 min

//Usar serial 1 para o módulo gsm
HardwareSerial SerialGSM(1);
TinyGsm modemGSM(SerialGSM);

//Tempo em que conectou à internet pela última vez
uint32_t lastTimeConnected = 0;

//Tempo em que fez a última ligação. Colocamos como -MAX_CALL_TIME_INTERVAL para ligar imediatamente
//da primeira vez que cair
uint32_t lastTimeCalledPhone = -MAX_CALL_TIME_INTERVAL;

//Pinagem em User_Setup.h na pasta da biblioteca
TFT_eSPI display = TFT_eSPI();



Setup

void setup()
{
  Serial.begin(115200);
  setupDisplay(); //Inicializa e configura o display
  setupGSM(); //Inicializa o módulo GSM
  
  xTaskCreatePinnedToCore(
        checkWiFiConnection,    //Função que será executada
        "checkWiFiConnection",  //Nome da tarefa
        10000,                  //Tamanho da pilha
        NULL,                   //Parâmetro da tarefa (no caso não usamos)
        2,                      //Prioridade da tarefa
        NULL,                   //Caso queria manter uma referência para a tarefa que vai ser criada (no caso não precisamos)
        0);                     //Número do core que será executada a tarefa (usamos o core 0 para o loop ficar livre com o core 1)

  xTaskCreatePinnedToCore(
        checkInternet,    //Função que será executada
        "checkInternet",  //Nome da tarefa
        10000,            //Tamanho da pilha
        NULL,             //Parâmetro da tarefa (no caso não usamos)
        2,                //Prioridade da tarefa
        NULL,             //Caso queria manter uma referência para a tarefa que vai ser criada (no caso não precisamos)
        0);               //Número do core que será executada a tarefa (usamos o core 0 para o loop ficar livre com o core 1)
}


SetupDisplay

void setupDisplay()
{
  display.init(); //Inicializa o display
  display.setRotation(1); //Rotaciona
  display.fillScreen(TFT_BLUE); //Limpa o display com a cor azul
  display.setTextColor(TFT_WHITE, TFT_BLUE); //Coloca o texto como branco com fundo azul
  display.setTextWrap(false, false);//Desativa a quebra de linha
  display.setTextSize(1); //Muda o tamanho do texto
  display.setCursor(0, 0, 2); //Posição x, y e fonte do texto
}


SetupGSM

void setupGSM()
{
  showDisplay("Setup GSM");

  //O Módulo GSM está nos GPIOs 4 e 2
  SerialGSM.begin(9600, SERIAL_8N1, 4, 2, false);
  delay(1000);

  //Restart o módulo
  if (!modemGSM.restart())
  {
    ESP.restart();
    return;
  }

  //Espera pela rede celular
  if (!modemGSM.waitForNetwork()) 
  {
    display.setCursor(0, 0);
    showDisplay("GSM Network Error");
    delay(3000);
    ESP.restart();
    return;
  }
}


checkWiFiConnection

void checkWiFiConnection(void* p)
{
  while(true)
  {
    //Se não estiver conectado ao roteador
    if(WiFi.status() != WL_CONNECTED)
    {
      //Manda conectar
      connectWiFi();
    }

    //Delay de 1s da tarefa. É feita em ticks. Para executar em millis dividimos pela constante portTICK_PERIOD_MS
    TickType_t taskDelay = 1000 / portTICK_PERIOD_MS;
    vTaskDelay(taskDelay);
  }
}


connectWiFi

void connectWiFi()
{
  //Manda conectar ao roteador com o nome e senha
  WiFi.begin(SSID, PASSWORD);
  Serial.println("Connecting");

  //Espera no while até conectar
  while(WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  
  //Se chegou aqui está conectado
  Serial.println();
  Serial.println("Connected");
}


checkInternet

void checkInternet(void* p)
{
  //Delay de 5 segundos da tarefa. É feita em ticks. Para executar em millis dividimos pela constante portTICK_PERIOD_MS
  TickType_t taskDelay = 5000 / portTICK_PERIOD_MS;

  while(true)
  {
    //Se tem internet
    if(hasInternet())
    {
      //Atualiza o tempo em que aconteceu a útlima conexão
      lastTimeConnected = millis();
    }
    
    //Aplica o delay
    vTaskDelay(taskDelay);
  }
}


hasInternet

bool hasInternet()
{
  WiFiClient client;
  //Endreço IP do Google 172.217.3.110
  IPAddress adr = IPAddress(172, 217, 3, 110);
  //Tempo limite para conexão
  client.setTimeout(5);
  //Tenta conectar
  bool connected = client.connect(adr, 80);
  //Fecha a conexão
  client.stop();
  //Retorna true se está conectado ou false se está desconectado
  return connected;
}


Loop

void loop() 
{
  //Se está desconectado por mais tempo que definimos
  if(isDisconnectedForTooLong())
  {
    //Mostra no display que está desconectado
    showDisplay("Disconnected");

    //Se faz tempo que não liga para o telefone definido
    if(hasNotCalledPhoneInAWhile())
    {
      //Liga para o telefone definido
      callPhone();
    }
  }
  else
  {
    //Mostra no display que está conectado
    showDisplay("Connected");
  }

  //Espera 1 segundo para a próxima iteração do loop
  delay(1000);
}


isDisconnectedForTooLong

bool isDisconnectedForTooLong()
{
  //Retorna true se o tempo desde a última conexão for maior que o definido
  return millis() - lastTimeConnected  > MAX_DISCONNECTED_TIME;
}

bool hasNotCalledPhoneInAWhile()
{
  //Retorna true se o tempo desde a última ligacão para o telefone for maior que o definido
  return millis() - lastTimeCalledPhone > MAX_CALL_TIME_INTERVAL;
}


callPhone

void callPhone()
{
  //Faz a ligação para o telefone definido
  if(modemGSM.callNumber(USER_PHONE_NUMBER))
  {
    //Se entrou aqui é porque conseguiu realizar a ligação
    Serial.println("callphone ok");
    //Atualiza o tempo em que foi feita a última ligação
    lastTimeCalledPhone = millis();
  }
  else
  {
    //Se entrou aqui é porque não conseguiu fazer a ligação
    Serial.println("callphone failed");
  }

  //Termina a ligação
  modemGSM.callHangup();
}


showDisplay

void showDisplay(String message)
{
  //Mostra a mensagem na primeira linha do display, limpando os eventuais caracteres extras
  display.setCursor(0, 0);
  display.println(message + "            ");
}





Faça o download dos arquivos

PDF

INO




4 comentários:

  1. Boa noite!
    Parabéns pelo seu trabalho...
    Estou acompanhando todos....
    Vc pode me dizer a especificação do display que vc usa nesse seu projeto?
    Obrigado, Arnaldo

    ResponderExcluir
  2. Prezado professor Fernando, utilizando a mesma intenção de monitorar o link, teria como o SIM800L enviar um SMS?

    ResponderExcluir
    Respostas
    1. Olá, você pode se cadastrar gratuitamente no blog http://forum.fernandok.com e publicar sua dúvida!

      Abs

      Excluir
  3. Olá
    Eu tenho dois módulos: A6 e SIM800L ( https://www.filipeflop.com/produto/modulo-gsm-gprs-sim800l-antena-sma ) este que chegou na minha casa na última terça-feira mas eu não estou conseguindo conectividade com a rede, mesmo usando meu chip Claro que uso no meu celular atual.

    O led NET (que indica conexão com a rede) pisca a cada 1 segundo (ou menos).

    Estou usando a biblioteca TinyGsmClient.h (recentemente baiaxda) e ESP32.

    A conexão com microcontrolador está ok pois envio e recebo dados do módulo a 115200 e 9600 sem problemas:

    > modemGSM.getModemInfo() retorna SIM800 R14.18
    > !modemGSM.restart() retorna true (ok)

    só aqui que falha:
    > modemGSM.waitForNetwork()

    Veja no vídeo que estou alimentando o módulo com uma fonte exclusiva para ele e a antena está ligada, mas o led pisca na mesma frequência por horas.
    https://photos.app.goo.gl/dLcPgHxju7Bw5rR17

    - Alguma dica sobre outras formas de verificar isso?

    - Tem algum procedimento no SIM card que preciso fazer?

    - Será que foi bloqueado pela ANATEL?

    (desculpa o spam. estou precisando mesmo que isso funcione)

    ResponderExcluir

Tecnologia do Blogger.