banner

IOT com rede de telefonia celular e ESP32



Hoje nós vamos falar sobre o modem GPRS, ou melhor, do ESP32 e seu uso com a rede de telefonia de celular, que é uma coisa que funciona muito bem. Usando, então, o protocolo MQTT vamos enviar dados para o dashboard do Ubidots. Uso nesta montagem um display para feedback do circuito, além do SIM800L e um chip de celular. Com este projeto, portanto, vamos enviar dados de temperatura e umidade através de GPRS e MQTT e visualizar os dados em um gráfico de linhas.






Demonstração





Montagem





Montagem – Tabela





Ubidots






Biblioteca SimpleDHT

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





Biblioteca PubSubClient

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






Biblioteca TinyGSM

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






Biblioteca TFT_eSPI

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






Biblioteca TFT_eSPI

Altere os pinos do display na pasta da lib.
A pinagem fica no arquivo User_Setup.h em
C:\Users\<SEU_USUARIO>\Documents\Arduino\libraries\TFT_eSPI

Altere esses defines para os seguintes valores:




Ubidots

Entre no Ubidots com a sua conta e clique em Devices



Clique no botão “+” que fica no canto superior direito


Clique em blank



Digite o nome do dispositivo. Anote o “device label” pois este será usado no “topic” que iremos usar no .ino



Na lista de dispositivos irá aparecer o dispositivo que você acabou de criar. Clique nele.



Na tela que aparecer clique em “Add Variable”. Um popup irá aprecer, clique em “Raw”



Clique na caixa de texto e digite o nome da propriedade.
Tem que ser exatamente o que iremos enviar no json do .ino. Repita para a outra propriedade.



Volte para o dashboard clicando no logo do Ubidots.



No dashboard clique em “Add new Widget”


Na lista de Widgets escolha “Double axis”










Alterando os dados no .ino






GPRS_ESP32_DHT.ino

Declarações e variáveis


#define TINY_GSM_MODEM_SIM800 //Tipo de modem que estamos usando
#include <TinyGsmClient.h>
#include <PubSubClient.h>
#include <SimpleDHT.h>
#include <TFT_eSPI.h>
#include <SPI.h>

//Token de usuário que pegamos no Ubidots
#define TOKEN "BBFF-abcdefghijklmnopqrstuvwxyz0123" 

//Tópico onde vamos postar os dados de temperatura e umidade (esp32_gprs é o nome do dispositivo no Ubidots)
#define TOPIC "/v1.6/devices/esp32_gprs" 

//id do dispositivo que pegamos no painel do Ubidots
#define DEVICE_ID "5c01234567890abc12345678" 

//URL do MQTT Server
#define MQTT_SERVER "mqtt://things.ubidots.com"

//Porta padrão do MQTT
#define MQTT_PORT 1883 

//Pino onde está o DHT22
#define DHT_PIN 27


Pinagem


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

//Intervalo entre os envios e refresh da tela
#define INTERVAL 10000

//Canal serial que vamos usar para comunicarmos com o modem. Utilize sempre 1
HardwareSerial SerialGSM(1);
TinyGsm modemGSM(SerialGSM);
TinyGsmClient gsmClient(modemGSM);

//Cliente MQTT, passamos a url do server, a porta
//e o cliente GSM
PubSubClient client(MQTT_SERVER, MQTT_PORT, gsmClient);

//Tempo em que o último envio/refresh foi feito
uint32_t lastTime = 0;

float humidity; //Variável onde iremos armazenar o valor da umidade
float temperature; //Variável onde iremos armazenar o valor da temperatura

SimpleDHT22 dht; //Objeto que realizará a leitura da umidade e temperatura



Setup

void setup() 
{
  Serial.begin(115200);
  setupDisplay(); //Inicializa e configura o display
  setupGSM(); //Inicializa e configura o modem GSM
  connectMQTTServer(); //Conectamos ao mqtt server

  //Espera 2 segundos e limpamos o display
  delay(2000);
  display.fillScreen(TFT_BLUE);
  display.setCursor(0, 0);
}


SetupDisplay

void setupDisplay()
{
  display.init();
  display.setRotation(1);
  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(true, true);//Ativa quebra de linha
  display.setTextSize(1);
  display.setCursor(0, 0, 2); //Posicção x, y e fonte do texto
  display.println("Setup Display Complete");
}


SetupGSM

void setupGSM()
{
  display.println("Setup GSM...");
  //Inicializamos a serial onde está o modem
  SerialGSM.begin(9600, SERIAL_8N1, 4, 2, false);
  delay(3000);

  //Mostra informação sobre o modem
  Serial.println(modemGSM.getModemInfo());

  //Inicializa o modem
  if (!modemGSM.restart())
  {
    display.println("Restarting GSM Modem failed");
    delay(10000);
    ESP.restart();
    return;
  }

  //Espera pela rede
  if (!modemGSM.waitForNetwork()) 
  {
    display.println("Failed to connect to network");
    delay(10000);
    ESP.restart();
    return;
  }

  //Conecta à rede gprs (APN, usuário, senha)
  if (!modemGSM.gprsConnect("", "", "")) {
    display.println("GPRS Connection Failed");
    delay(10000);
    ESP.restart();
    return;
  }

  display.println("Setup GSM Success");
}


ConnectMQTTServer

void connectMQTTServer() {
  display.println("Connecting to MQTT Server...");
  //Se conecta ao device que definimos
  if (client.connect(DEVICE_ID, TOKEN, "")) {
    //Se a conexão foi bem sucedida
    display.println("Connected");
  } else {
    //Se ocorreu algum erro
    display.print("error = ");
    display.println(client.state());
    delay(10000);
    ESP.restart();
  }
}


Loop

void loop() 
{
  //Faz a leitura da umidade e temperatura
  readDHT(); 

  //Se desconectou do server MQTT
  if(!client.connected())
  {
    //Mandamos conectar
    connectMQTTServer();
  }

   //Tempo decorrido desde o boot em milissegundos
  unsigned long now = millis();

  //Se passou o intervalo de envio
  if(now - lastTime > INTERVAL)
  {
    //Publicamos para o server mqtt
    publishMQTT();
    //Mostramos os dados no display
    showDataOnDisplay();
    //Atualizamos o tempo em que foi feito o último envio
    lastTime = now;
  }
}


ReadDHT

void readDHT()
{
  float t, h;
  //Faz a leitura da umidade e temperatura e apenas atualiza as variáveis se foi bem sucedido
  if (dht.read2(DHT_PIN, &t, &h, NULL) == SimpleDHTErrSuccess)
  {
    temperature = t;
    humidity = h;
  }
}


PublishMQTT

void publishMQTT()
{
  //Cria o json que iremos enviar para o server MQTT
  String msg = createJsonString();
  Serial.print("Publish message: ");
  Serial.println(msg);
  //Publicamos no tópico
  int status = client.publish(TOPIC, msg.c_str());
  Serial.println("Status: " + String(status));//Status 1 se sucesso ou 0 se deu erro
}


CreateJsonString


String createJsonString() 
{  
  String data = "{";
    if(!isnan(humidity) && !isnan(temperature))
    {
      data+="\"humidity\":";
      data+=String(humidity, 2);
      data+=",";
      data+="\"temperature\":";
      data+=String(temperature, 2);
    }
  data+="}";
  return data;
}


ShowDataOnDisplay

void showDataOnDisplay()
{
  //Reseta a posição do cursor e mostra umidade e temperatura lidas
  display.setCursor(0, 0, 2);
  display.println("Humidity: " + String(humidity, 2));
  display.println("Temperature: " + String(temperature, 2));
}




Faça o download dos arquivos

INO

PDF





7 comentários:

  1. Qual é o vídeo que ensina a fazer a correção de temperatura no DHT22? Procurei mas não encontrei...

    ResponderExcluir
  2. Obrigado!
    Sou novo no canal.
    Gosto de eletrônica.

    Gosto muito dos seus posts.
    Continue assim.


    Um grande abraço!

    ResponderExcluir
  3. Bom dia Fernando!
    Parabéns pela trabalho!!
    Estou tentando rodar seu sketch... mas ele apresenta o seguinte erro na linha 35:
    "cannot declare variable 'gsmClient' to be of abstract type 'TinyGsmSim800::GsmClient'"
    Como posso resolver?
    Obrigado

    ResponderExcluir
    Respostas
    1. Boa noite o meu esta dando o mesmo problema ??
      não estou conseguindo resolver , alguém pode nos ajudar ?

      Excluir
  4. Espero que o Fernando consiga nos ajudar,

    Estou tentando rodar mas apresenta o mesmo problema , eu acredito que seja algum problema com versão de biblioteca

    erro - ""cannot declare variable 'gsmClient' to be of abstract type 'TinyGsmSim800::GsmClient'"

    ResponderExcluir
  5. 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
    Respostas
    1. Resolvido.
      Coloquei outros chips da vivo e a tim e funcionou.

      Excluir

Tecnologia do Blogger.