Aqui está um código para o LoRa Mestre que se comunica com três LoRas Escravos via um mesmo canal,
mas com endereços diferentes.
---
Configuração do Projeto
Mestre envia comandos para os escravos baseados nos endereços.
Escravos respondem confirmando a recepção do comando.
Utiliza LoRa SX1278/SX1276 com a biblioteca RadioHead (RH_RF95).
---
Código para o LoRa Mestre (Arduino)
Este código permite o mestre se comunicar individualmente com cada escravo.
#include <SPI.h>
#include <RH_RF95.h>
// Definição do módulo LoRa
#define RFM95_CS 10 // Pino Chip Select
#define RFM95_RST 9 // Pino Reset
#define RFM95_INT 2 // Pino de interrupção
RH_RF95 rf95(RFM95_CS, RFM95_INT);
#define FREQUENCIA 915.0 // Frequência LoRa
#define CANAL 1 // Canal fixo para todos os dispositivos
// Endereços dos LoRas escravos
#define LORA1 1
#define LORA2 2
#define LORA3 3
void setup() {
Serial.begin(9600);
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
if (!rf95.init()) {
Serial.println("LoRa Mestre: Falha ao inicializar LoRa");
while (1);
rf95.setFrequency(FREQUENCIA);
rf95.setTxPower(23, false);
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128); // Config padrão LoRa
Serial.println("LoRa Mestre Pronto!");
void loop() {
// Exemplo de envio de comando
enviarComando(LORA1, "LIGAR");
delay(2000);
enviarComando(LORA2, "DESLIGAR");
delay(2000);
enviarComando(LORA3, "STATUS");
delay(2000);
void enviarComando(uint8_t endereco, String comando) {
Serial.print("Enviando para LoRa ");
Serial.print(endereco);
Serial.print(": ");
Serial.println(comando);
uint8_t mensagem[RH_RF95_MAX_MESSAGE_LEN];
comando.getBytes(mensagem, RH_RF95_MAX_MESSAGE_LEN);
rf95.send(mensagem, comando.length());
rf95.waitPacketSent();
// Aguardar resposta do escravo
if (rf95.waitAvailableTimeout(2000)) {
uint8_t resposta[RH_RF95_MAX_MESSAGE_LEN];
uint8_t tamanho = sizeof(resposta);
if (rf95.recv(resposta, &tamanho)) {
Serial.print("Resposta do LoRa ");
Serial.print(endereco);
Serial.print(": ");
Serial.println((char*)resposta);
} else {
Serial.println("Sem resposta!");
---
Código para os LoRas Escravos
Os três LoRas escravos usam o mesmo código, mas cada um tem um endereço diferente (definido na
variável MEU_ENDERECO).
#include <SPI.h>
#include <RH_RF95.h>
#define RFM95_CS 10
#define RFM95_RST 9
#define RFM95_INT 2
RH_RF95 rf95(RFM95_CS, RFM95_INT);
#define FREQUENCIA 915.0
#define CANAL 1
// Defina o endereço do escravo manualmente (Mude para 2 ou 3 nos outros módulos)
#define MEU_ENDERECO 1
void setup() {
Serial.begin(9600);
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
if (!rf95.init()) {
Serial.println("Falha ao inicializar LoRa Escravo");
while (1);
rf95.setFrequency(FREQUENCIA);
rf95.setTxPower(23, false);
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
Serial.print("LoRa Escravo ");
Serial.print(MEU_ENDERECO);
Serial.println(" Pronto!");
void loop() {
if (rf95.available()) {
uint8_t mensagem[RH_RF95_MAX_MESSAGE_LEN];
uint8_t tamanho = sizeof(mensagem);
if (rf95.recv(mensagem, &tamanho)) {
String comando = String((char*)mensagem);
Serial.print("Comando recebido: ");
Serial.println(comando);
String resposta;
if (comando == "LIGAR") {
resposta = "Lâmpada Ligada";
} else if (comando == "DESLIGAR") {
resposta = "Lâmpada Desligada";
} else if (comando == "STATUS") {
resposta = "Status: OK";
} else {
resposta = "Comando Desconhecido";
uint8_t respostaBuffer[RH_RF95_MAX_MESSAGE_LEN];
resposta.getBytes(respostaBuffer, RH_RF95_MAX_MESSAGE_LEN);
rf95.send(respostaBuffer, resposta.length());
rf95.waitPacketSent();
---
Explicação
1. Mestre:
Define o canal e frequência.
Envia comandos para cada LoRa escravo baseado no endereço.
Aguarda a resposta de cada escravo.
2. Escravos:
Esperam por um comando.
Executam a ação correspondente (ligar, desligar ou enviar status).
Respondem ao mestre.
---
Próximos Passos
✅ Testar a comunicação entre o mestre e os escravos.
✅ Integrar com sua interface gráfica em C# para enviar comandos e exibir status.
Precisa de algo mais?