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)); }
8 Comentários
Qual é o vídeo que ensina a fazer a correção de temperatura no DHT22? Procurei mas não encontrei...
ResponderExcluirObrigado!
ResponderExcluirSou novo no canal.
Gosto de eletrônica.
Gosto muito dos seus posts.
Continue assim.
Um grande abraço!
Bom dia Fernando!
ResponderExcluirParabé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
Boa noite o meu esta dando o mesmo problema ??
Excluirnão estou conseguindo resolver , alguém pode nos ajudar ?
Espero que o Fernando consiga nos ajudar,
ResponderExcluirEstou 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'"
Olá
ResponderExcluirEu 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)
Resolvido.
ExcluirColoquei outros chips da vivo e a tim e funcionou.
Pretendo usar esse projeto como base para transmitir as leituras de um espectrômetro de infra vermelho próximo (NIR) que desenvolvemos e fabricamos. Esse aparelho é utilizado em usinas de cana de açúcar para leitura das propriedades da cana (pré análises) no campo e no laboratório de PCTS.
ResponderExcluirBrix, Pol, Manitol, umidade, cinzas, etc.
Geralmente, não é impossivel e quase inviável criar uma infra estrutura de cabos para todos os equipamentos até o laboratório.
Esse projeto será uma base muito útil.