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.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!