Receptor transmissor ESP32 e LoRa SX1278/76 com OLED

Tempo de leitura: 8 minutes

Neste tutorial, faremos Lora Transmitter & Receiver usando Lora Module SX1278 e ESP32 Wifi Module. O tipo de comunicação é um ponto a ponto e os dados serão transferidos sem fio de uma extremidade (transmissor) para outra (receptor).

 

Visão geral

Nos últimos anos, várias tecnologias de comunicação estão disponíveis para interação entre dispositivos IoT. Os mais populares são a Tecnologia Wi-Fi e o Módulo Bluetooth. Mas eles têm poucas limitações, como alcance limitado, pontos de acesso limitados e alto consumo de energia. Portanto, a tecnologia LoRa é introduzida pela Semtech para corrigir todos esses problemas. Usando uma única bateria, o dispositivo funciona durante um ano.

Neste tutorial, faremos a interface do Módulo LoRa SX1278 / 76 com a placa ESP32. Faremos um circuito transmissor e receptor. Exibiremos os parâmetros recebidos no display I2C OLED de 0,96 ″. Vamos dar dois exemplos para aprender a comunicação Lora SX1278 / 76 e ESP32. Primeiro, vamos transmitir um pacote simples e verificar se os dados são recebidos ou não no receptor. Em seguida, adicionaremos o sensor de temperatura à prova d’água DS18B20 ao circuito do transmissor e enviaremos o valor da temperatura sem fio para a extremidade do receptor. O valor pode ser visto no display OLED

 

Lista de Materiais

A seguir estão os componentes necessários para fazer este projeto. Todos os componentes podem ser facilmente adquiridos no Brasil.

S.N.ComponentsDescriçãoQuantidade
1Placa ESP32Placa de desenvolvimento ESP32 ESP-32S (ESP-WROOM-32)2
2Módulo LoRaMódulo SX1278/76 Lora2
3Display OLEDTela I2C OLED de 0,96″1
4FiosFios para Ligação20
5ProtoBoard1
6DS18B20 SensorDS18B20 Sensor de temperatura à prova d’água de um fio1
7Resistor4.7K1

 

Módulo Semtech SX1278 LoRa

Módulo SX1278

Os transceptores SX1276/77/78/79 apresentam o modem de longo alcance LoRa®, que fornece comunicação de espectro alargado de alcance ultralongo e alta imunidade a interferências, minimizando o consumo de corrente.

SX1278 pode atingir uma sensibilidade de mais de -148dBm usando um cristal de baixo custo. A alta sensibilidade combinada com o amplificador de potência de +20dBm integrado resulta em um orçamento de link líder da indústria, tornando-o ideal para qualquer aplicação que requeira alcance ou robustez. Lora SX1278 também oferece vantagens significativas tanto no bloqueio quanto na seletividade em relação às técnicas de modulação convencionais, resolvendo o compromisso de design tradicional entre alcance, imunidade à interferência e consumo de energia. Saiba mais em: Semtech SX1278 Datasheet.

Pinagem Semtech SX1278

Existem diferentes versões e tipos de placa breakout SX1278 disponíveis no mercado. Mas basicamente todos eles têm a mesma pinagem, já que LoRa SX1278 é um módulo SPI. Estou usando esta placa conforme mostrado nas fotos abaixo.

Esta versão do módulo do SX1278 tem 12 pinos para interface com o microcontrolador e dois pinos adicionais para antena

 

DS18B20 Sensor de temperatura digital à prova d’água:

Esta é uma versão pré-cabeada e à prova d’água do sensor DS18B20. Útil para quando você precisa medir algo longe ou em condições úmidas. O sensor pode medir a temperatura entre -55 a 125 ° C (-67°F a + 257°F). O cabo é revestido em PVC.

Por ser digital, não há degradação do sinal mesmo em longas distâncias. Esses sensores de temperatura digitais de 1 fio são bastante precisos, ou seja, ± 0,5°C em grande parte da faixa. Ele pode fornecer até 12 bits de precisão do conversor digital para analógico integrado. Eles funcionam muito bem com qualquer microcontrolador usando um único pino digital.

A única desvantagem é que eles usam o protocolo Dallas 1-Wire, que é um tanto complexo e requer muitos códigos para analisar a comunicação. Lançamos um resistor de 4,7k, que é necessário como um pullup de DATA para a linha VCC ao usar o sensor.

 

 

Tela OLED de 0,96″

Este é um módulo de display OLED azul de 0,96 polegadas. O módulo de exibição pode ser conectado a qualquer microcontrolador usando protocolos SPI/IIC. Ele está tendo uma resolução de 128×64. O pacote inclui placa de display, display, cabeçote macho de 4 pinos pré-soldado à placa.

OLED (Organic Light-Emitting Diode) é uma tecnologia de emissão de luz própria composta por um filme orgânico fino e multicamadas colocado entre um ânodo e um cátodo. Em contraste com a tecnologia LCD, o OLED não requer luz de fundo. O OLED possui alto potencial de aplicação para praticamente todos os tipos de monitores e é considerado a tecnologia mais recente para a próxima geração de monitores de tela plana.

Bibliotecas necessárias

Primeiro, adicione as seguintes bibliotecas ao IDE do Arduino. Sem essas bibliotecas, o código não compila.

1. Adafruit_SSD1306: https://github.com/adafruit/Adafruit_SSD1306
2. Adafruit_GFX: https://github.com/adafruit/Adafruit-GFX-Library
3. Biblioteca LoRa: https://github.com/sandeepmistry/arduino-LoRa
4. Biblioteca One Wire: https://github.com/PaulStoffregen/OneWire
5. Biblioteca de temperatura de Dallas: https://github.com/milesburton/Arduino-Temperature-Control-Library

 

Receptor transmissor ESP32 e LoRa SX1278/76 simples

Vamos fazer um esboço simples e verificar se o módulo LoRa é capaz de se comunicar ou não. O circuito transmissor e receptor é o mesmo. Você pode montar o circuito em uma placa de ensaio. Monte um par de circuitos de forma que um seja o transmissor e o outro o receptor.

 

 

Fig: Circuito Transmissor e Receptor ESP32 LoRa SX1278

A conexão é bastante simples. Conecte o Lora SX1278 e ESP32 da seguinte maneira.

ESP32 PinosSX1278 Pinos
GNDGND
3.3VVCC
D5NSS
D23MOSI
D19MISO
D18SCK
D14RST
D2DIO0

 

 

Código fonte para receptor transmissor simples ESP32 LoRa SX1278/76

O código do transmissor e do receptor é fornecido abaixo. Faça upload do código do transmissor e do receptor para a placa ESP32.

 

Código do Transmissor

#include <LoRa.h>
#include <SPI.h>
 
#define ss 5
#define rst 14
#define dio0 2
 
int counter = 0;
 
void setup() 
{
  Serial.begin(115200); 
  while (!Serial);
  Serial.println("LoRa Sender");
 
  LoRa.setPins(ss, rst, dio0);    //configuração do módulo transceptor LoRa
  
  while (!LoRa.begin(433E6))     //433E6 - Ásia, 866E6 - Europa, 915E6 - América do Norte
  {
    Serial.println(".");
    delay(500);
  }
  LoRa.setSyncWord(0xA5);
  Serial.println("LoRa inicializando OK!");
}
 
void loop() 
{
  Serial.print("Enviando pacote: ");
  Serial.println(counter);
 
  LoRa.beginPacket();   // Envie o pacote LoRa para o receptor
  LoRa.print("hello ");
  LoRa.print(counter);
  LoRa.endPacket();
 
  counter++;
 
  delay(10000);
}

 

Código do receptor

#include <LoRa.h>
#include <SPI.h>
 
#define ss 5
#define rst 14
#define dio0 2
 
void setup() 
{
  Serial.begin(115200);
  while (!Serial);
  Serial.println("LoRa Receiver");
 
  LoRa.setPins(ss, rst, dio0);    //configuração do módulo transceptor LoRa
 
  while (!LoRa.begin(433E6))     //433E6 - Asia, 866E6 - Europe, 915E6 - North America
  {
    Serial.println(".");
    delay(500);
  }
  LoRa.setSyncWord(0xA5);
  Serial.println("Inicializando LoRa OK!");
}
 
void loop() 
{
  int packetSize = LoRa.parsePacket();    // tente analisar o pacote
  if (packetSize) 
  {
    
    Serial.print("Pacote recebido '");
 
    while (LoRa.available())              // ler o pacote
    {
      String LoRaData = LoRa.readString();
      Serial.print(LoRaData); 
    }
    Serial.print("' com RSSI ");         // imprime RSSI do pacote
    Serial.println(LoRa.packetRssi());
  }
}

 

Assim que o código for carregado, você pode agora abrir o monitor serial na porta e verificar se os dados foram transmitidos ou recebidos com sucesso.

 

 

ESP32 LoRa SX1278 Transmitter Receiver com OLED e DS18B20 Sensor

Agora vamos fazer um circuito transmissor e receptor Lora ESP32 avançado. Agora enviaremos o valor da Temperatura do Sensor DS18B20 sem fio. Na extremidade do transmissor, adicionaremos um sensor de temperatura DS18B20 extra com Lora SX1278 e ESP32. Na extremidade do receptor, adicionaremos um display I2C OLED de 0,96″ para ESP32 com LoRa SX1278.

Fig: LoRa SX1278 ESP32 Transmissor Circuito com DS18B20 Sensor

 

Fig: Circuito receptor LoRa SX1278 ESP32 com display OLED

A conexão entre Lora SX1278 e ESP32 ainda permanece a mesma. Mas no final do transmissor, adicionamos o Sensor DS18B20. Portanto, conecte seu pino de entrada ao GPIO4 do ESP32. Forneça-o com 3,3 V VCC. Da mesma forma, use um resistor de 4,7K como um resistor pull-up e conecte-o entre o VCC e o pino de entrada digital.

No lado do receptor, adicionei um display I2C OLED ao ESP32 junto com LoRa SX1278. Conecte o pino SDA e SCL do display OLED ao GPIO21 e GPIO22 do ESP32.

 

Código-fonte para ESP32 LoRa SX1278 Transmissor Receptor com OLED e DS18B20

Código do Transmissor

#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 
#define ss 5
#define rst 14
#define dio0 2
 
int counter = 0;
 
// GPIO onde o DS18B20 está conectado
const int oneWireBus = 4;     
 
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
 
// Passe nossa referência oneWire para o sensor de temperatura Dallas
DallasTemperature sensors(&oneWire);
 
void setup() 
{
  Serial.begin(115200); 
  sensors.begin();
  while (!Serial);
  Serial.println("LoRa Sender");
 
  LoRa.setPins(ss, rst, dio0);    //configuração do módulo transceptor LoRa
  
  while (!LoRa.begin(433E6))     //433E6 - Asia, 866E6 - Europe, 915E6 - North America
  {
    Serial.println(".");
    delay(500);
  }
  LoRa.setSyncWord(0xA5);
  Serial.println("Inicializando LoRa OK!");
}
 
void loop() 
{
  sensors.requestTemperatures(); 
  float temperatureC = sensors.getTempCByIndex(0);
  Serial.print("Sending packet: ");
  Serial.println(counter);
  Serial.print("Temperature: ");
  Serial.print(temperatureC);
  Serial.println("ยบC");
  Serial.println("");
 
  LoRa.beginPacket();   // Envie o pacote LoRa para o receptor
  LoRa.print("Pckt: ");
  LoRa.println(counter);
  LoRa.print("Temp: ");
  LoRa.print(temperatureC);
  LoRa.println(" C");
  LoRa.endPacket();
 
  counter++;
 
  delay(4000);
}

 

Código do receptor

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
#define SCREEN_WIDTH 128    // Largura da tela OLED, em pixels
#define SCREEN_HEIGHT 64    // Altura do display OLED, em pixels
#define OLED_RESET -1       // Redefina o pino # (ou -1 se estiver compartilhando o pino de redefinição do Arduino)
 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 
#define ss 5
#define rst 14
#define dio0 2
String LoRaData;
 
void setup() 
{
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) 
  { 
    Serial.println(F("Falha na alocação de SSD1306"));
    for(;;);
  }
  delay(2000);
  display.clearDisplay();
 
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  
  display.println("LoRa Receiver");
  display.display(); 
  
  while (!Serial);
  Serial.println("Receptor LoRa");
 
  LoRa.setPins(ss, rst, dio0);    //configuração do módulo transceptor LoRa
 
  while (!LoRa.begin(433E6))     //433E6 - Asia, 866E6 - Europe, 915E6 - North America
  {
    Serial.println(".");
    delay(500);
  }
  LoRa.setSyncWord(0xA5);
  Serial.println("Inicializando LoRa OK!");
}
 
void loop() 
{
  int packetSize = LoRa.parsePacket();    // tente analisar o pacote
  if (packetSize) 
  {
    
    Serial.println("Pacote recebido");
 
    while (LoRa.available())         // ler o pacote
    {
      LoRaData = LoRa.readString();
      Serial.print(LoRaData); 
      
    }
    Serial.print("RSSI: ");         // imprime RSSI do pacote
    Serial.println(LoRa.packetRssi());
    Serial.println("");
    
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20, 0);
    display.println("Receptor LoRa");
  
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 20);
    display.println(LoRaData);
    display.print("RSSI: ");
    display.println(LoRa.packetRssi());
    display.display();
  }
}

Assim que o código for carregado, o transmissor iniciará e lerá os dados de temperatura. Os dados de temperatura são enviados sem fio usando LoRa. No lado do receptor, a leitura da temperatura é recebida sem fio usando LoRa. Os dados recebidos são exibidos no display OLED.

 

Conclusão

Neste artigo, mostrei como usar um Módulo Lora SX1278/76 com Modulo Esp32. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esses Módulos. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.