IoT

Monitoramento de Temperatura com Heltec ESP32 LoRa

Eletrogate 22 de dezembro de 2021

Introdução

Com o avanço da tecnologia hoje temos cada vez mais dispositivos conectados na internet, com isso a IoT (internet of Things) é uma das áreas que mais cresce na atualidade, algumas situações impõem desafios à tecnologias de transmissão de dados mais populares como WiFi e Ethernet. Um exemplo disso seria conectar sensores em áreas remotas e sem acesso à rede elétrica. A tecnologia LoRa é uma solução para situações assim. Neste artigo, iremos explorar os princípios básicos do protocolo LoRa (Long Range) e como ele pode ser usado com a Placa LoRa Wifi 433MHz SX1276 – ESP32 Display OLED 0.96 para projetos em IoT usando o IDE do Arduino.


LoRa

O LoRa é uma tecnologia de radiotransmissão de longo alcance e baixo consumo criada pela Semtech™, ou seja, com essa tecnologia podemos criar projetos para aplicações de longa distancia, como por exemplo um termômetro em uma plantação distante alimentado por uma bateria ou painel solar. A tecnologia usa bandas de radiofrequência em sub-gigahertz sem licença, como 433 MHz, 868 MHz. Aqui no Brasil usamos a 915MHz regulada pela a Anatel. Com ela podemos criar links de transmissão entre dispositivos na escala de quilômetros (3-4 Km para regiões urbanas e em zonas rurais 15 Km ou mais).

Frequências LoRa no Brasil

Frequências LoRa no Brasil

A resolução da Anatel que trata dessas faixas de frequência está disponível no site neste link.


Projeto e Componentes

O projeto que vamos criar é um termômetro remoto. Vamos criar uma rede Peer-to-Peer (ponto a ponto) com um sensor de temperatura DHT11 conectado a um transmissor, e um receptor mostrando os dados no display.

Materiais necessários para o projeto Monitoramento de Temperatura com Heltec ESP32 LoRa

A placa Heltec Wi-Fi ESP32 LoRa possui um módulo LoRa SX1276, um microprocessador Xtensa 32-Bits LX6 com uma tela OLED de 0,96” com resolução de 128×64. Também conta com um conector para bateria para alimentação remota.  Demais características podem ser encontradas em ESP32 LoRa WiFi.

Placa LoRa Wifi 915MHz SX1276 - ESP32 Display OLED 0.96

Placa LoRa Wifi 915MHz SX1276 – ESP32 Display OLED 0.96

WiFi-LORA-32-V2-pinout

O sensor DHT11 é um sensor de temperatura e umidade de saída de sinal digital garantindo alta confiabilidade e estabilidade a longo prazo. O elemento sensor de temperatura é um termistor do tipo NTC e o sensor de umidade é do tipo HR202, o circuito interno faz a leitura dos sensores e se comunica a um microcontrolador através de um sinal serial de uma via. Demais características podem ser encontradas em DHT11. Nesse projeto pode ser usado o DHT22 com as devidas adaptações.

DHT11-Pinout

Sensor de Umidade e Temperatura DHT11

Sensor de Umidade e Temperatura DHT11


Esquema de Ligação

As ligações no transmissor:

DHT11 – Heltec

  • VCC    >   VCC
  • GND   >   GND
  • Data    >   17

O receptor não tem ligações.

Heltec_Lora_esquema


Configurações e Instalação das Bibliotecas

Para utilizar a placa Heltec precisamos instalar e configurar as bibliotecas.

Clique em Arquivos > Preferências, vá até a opção URLs Adicionais de Gerenciamento de Placas e adicione: https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series/releases/download/0.0.5/package_heltec_esp32_index.json

Em seguida entre em Ferramentas > Placas > Gerenciador de Placas: Na busca, digite Heltec ESP32, e instale o pacote Heltec ESP32 Series Dev-boards

Opção URLs Adicionais

Download da biblioteca da Heltec ESP32.

Cliquem em  Sketch > Incluir Biblioteca > Gerenciador de Biblioteca. Na busca, digite Heltec ESP32, e instale o pacote Heltec ESP32 Series Dev-boards

Para mais informações acesse: https://heltec-automation-docs.readthedocs.io/en/latest/esp32/quick_start.html


Programação

Após a conexão entre a placa Heltec ESP32 e o Arduino IDE, basta copiar e colar o código deste post.

Na IDE clique em Ferramentas > Placas > Heltec ESP32 Arduino e escolha a placa Heltec LoRa 32 V2

escolher a placa

Após os passos anteriores, deve-se carregar na placa o programa.

Código do Transmissor

O transmissor lê o sensor, envia os dados via LoRa e, em seguida, imprime no display OLED e pisca o LED.

Cabeçalhos utilizados

//inclusão de bibliotecas
#include "heltec.h"
#include "DHTesp.h"

#define BAND    915E6  //Escolha a frequência

DHTesp dht;

String packet ;
float currentTemp;
float currentHumidity;

/* Protótipo da função */
void getTemp();
void sendPacket();

/*
  Nome da função: getTemp
  objetivo: ler a temperatura e atibiu a variável currentTemp.
*/
void getTemp()
{
  float temperature = dht.getTemperature();
 
  if (temperature != currentTemp) { //Verifica se houve mudança na temperatura
    currentTemp = temperature;
    digitalWrite(LED, HIGH);   // Liga o LED
    delay(500);                // Espera 500 milissegundos
    digitalWrite(LED, LOW);    // Desliiga o LED
    delay(500);                // Espera 500 milissegundos
  }
  delay(1000);
}

/*
  Nome da função: sendPacket
  objetivo: envia a temperatura via LoRa armazenada na variável currentTemp.
*/
void sendPacket()
{
  LoRa.beginPacket();
  LoRa.print("Temperatura: ");
  LoRa.print(currentTemp);
  LoRa.endPacket();
}

/******************* função principal (setup) *********************/
void setup()
{
  pinMode(LED,OUTPUT); //inicializa o LED
  
  Heltec.begin(true /*Habilita o Display*/, true /*Heltec.Heltec.Heltec.LoRa Disable*/, true /*Habilita debug Serial*/, true /*Habilita o PABOOST*/, BAND /*Frequência BAND*/);
 
  Heltec.display->init();
  Heltec.display->flipScreenVertically();  
  Heltec.display->setFont(ArialMT_Plain_16);
  Heltec.display->clear();
  Heltec.display->drawString(33, 5, "Iniciado");
  Heltec.display->drawString(10, 30, "com Sucesso!");
  Heltec.display->display();
  delay(1000);
  
  dht.setup(17, DHTesp::DHT11); //inicializa o DHT no pino 17
   
  currentTemp = dht.getTemperature();
}

/******************* função em loop (loop) *********************/
void loop()
{
  getTemp(); //Ler temperatura
  
  Heltec.display->clear();
  Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
  Heltec.display->setFont(ArialMT_Plain_16);
  
  Heltec.display->drawString(30, 5, "Enviando");
  Heltec.display->drawString(33, 30, (String)currentTemp);
  Heltec.display->drawString(78, 30, "°C");
  Heltec.display->display();

  sendPacket(); //Envia temperatura
}

Código do Receptor

O receptor aguarda a chegada de pacotes. Ao receber algum dado, imprime o valor no display OLED e pisca o LED.

Cabeçalhos utilizados

#include "heltec.h"

#define BAND    915E6  //Escolha a frequência

String packSize = "--";
String packet ;

/* Protótipo da função */
void LoRaDataPrint();
void cbk(int packetSize);

/*
  Nome da função: LoRaDataPrint
  objetivo: imprime a temperatura e tamanho do pacote recebido no display.
*/
void LoRaDataPrint(){
  Heltec.display->clear();
  Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
  Heltec.display->setFont(ArialMT_Plain_10);
  Heltec.display->drawString(0 , 1 , "Recebendo "+ packSize + " bytes");
  Heltec.display->setFont(ArialMT_Plain_16);
  Heltec.display->drawString(15, 16, "Temperatura");
  Heltec.display->drawString(33, 38, packet);
  Heltec.display->drawString(78, 38, "°C");
  Heltec.display->display();
}

/*
  Nome da função: cbk
  recebe como parâmetos um inteiros (packetSize)
  objetivo: recebe a temperatura via LoRa e armazena na variável packet.
*/
void cbk(int packetSize) {
  packet ="";
  packSize = String(packetSize,DEC);
  for (int i = 0; i < packetSize; i++) {
    packet += (char) LoRa.read(); //Atribui um caractere por vez a váriavel packet 
  }
  LoRaDataPrint();
}

/******************* função principal (setup) *********************/
void setup()
{
  pinMode(LED,OUTPUT); //inicializa o LED
  
  Serial.begin(9600);
  Heltec.begin(true /*Habilita o Display*/, true /*Heltec.Heltec.Heltec.LoRa Disable*/, true /*Habilita debug Serial*/, true /*Habilita o PABOOST*/, BAND /*Frequência BAND*/);
 
  Heltec.display->init();
  Heltec.display->flipScreenVertically();  
  Heltec.display->setFont(ArialMT_Plain_10);
  Heltec.display->clear();
  Heltec.display->drawString(10, 5, "Iniciado com Sucesso!");
  Heltec.display->drawString(10, 30, "Aguardando os dados...");
  Heltec.display->display();
  Serial.println("Iniciado com Sucesso!");
  Serial.println("Aguardando os dados...");
  delay(1000);
  
  LoRa.receive(); // Habilita o rádio LoRa para receber dados
}

/******************* função em loop (loop) *********************/
void loop()
{
  int packetSize = LoRa.parsePacket();
  if (packetSize) { //Verifica se há dados chegando via LoRa
    cbk(packetSize);
    digitalWrite(LED, HIGH);   // Liga o LED
    delay(500);                // Espera 500 milissegundos
    digitalWrite(LED, LOW);    // Desliiga o LED
    delay(500);                // Espera 500 milissegundos
    Serial.print("Recebendo a temperatura: ");
    Serial.print(packet); //Imprime no monitor serial a temperatura
    Serial.println("°C");
  }
  delay(10);
}

Resultado Final

O resultado final do projeto você pode conferir no vídeo abaixo. No vídeo é mostrado o transmissor conectado a um Power Bank de 4.7V, transmitindo os dados e o receptor mostrando os dado recebidos. Em um dado momento, utilizei um soprador térmico para mudar a temperatura.


Conclusão

Com este projeto é possível obter êxito em diversas aplicações onde é necessário coletar dados remotos e transmiti-los para um receptor e dele salvar em algum lugar ou enviar para a internet. LoRa é uma tecnologia que veio para solucionar problemas de comunicação de longas distancia, além de resolver esse problema ela também e de baixo consumo, baixo custo de implementação e manutenção e de implementação simples em alguns casos.

Para mais materiais como esse, continue acompanhando as postagens semanais do blog e não deixe de visitar nossa loja. Lá você encontra todos os componentes necessários para desenvolver esse e muitos outros projetos!

Que a força estejam com vocês!

NÃO ENTREM EM PÂNICO!

Até mais!

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


Sobre o Autor


Saulo Aislan

Graduando em Tecnologia em Telemática pelo IFPB – Campus de Campina Grande – PB. Tenho experiência com os microcontroladores da família Arduino, ESP8266, ESP32, STM32 e microprocessador Raspberry Pi. Tenho projetos na áreas de IoTs voltada para a indústria 4.0, agroindústria e indústria aeroespacial civil utilizando LoRa, Bluetooth, ZigBee e Wi-Fi. Atualmente estudando e desenvolvendo em FreeRTOS para sistemas em tempo real com ESP32 e LoRaWan para Smart City e compartilhando alguns projetos no blog da Eletrogate.


Materiais utilizados

Eletrogate

22 de dezembro de 2021

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!