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.
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
A resolução da Anatel que trata dessas faixas de frequência está disponível no site neste link.
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

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.


Sensor de Umidade e Temperatura DHT11
As ligações no transmissor:
DHT11 – Heltec
O receptor não tem ligações.

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

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
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

Após os passos anteriores, deve-se carregar na placa o programa.
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
}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);
}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.
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!
|
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.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!