Nesse post eu mostro uma opção de acionamento remoto de cargas usando uma conexão LoRa, combinada a uma rede WiFi.
Funcionamento: Acionamento de cargas distantes
O objetivo deste exemplo é apresentar um circuito capaz de acionar cargas elevadas, distantes e de forma cômoda. Para isso vamos supor que desejamos acionar o motor de uma bomba, um aquecedor e um holofote.
Acessaremos o ESP WiFi LoRa 32 através do WiFi, usando o como um servidor HTTP. Através de uma página simples, servida por ele, selecionaremos os comandos que serão enviados via LoRa para o ESP WiFi LoRa 32 receptor. Este por sua vez, será encarregado de realizar a atuação sobre as cargas.
Ao clicar no botão “Bomba”, da página servida pelo ESP WiFi LoRa 32 transmissor, uma requisição é enviada para este que por sua vez a retransmite para o ESP WiFi LoRa 32 receptor. Podemos ver o mensagem enviada via LoRa no registro espectral do software SDR. Abaixo, a saída COM4 do ESP WiFi LoRa 32 receptor mostra os sinais recebidos.
Usando o navegador do celular, é possível ser servido pela página fornecida pelo ESP WiFi LoRa 32 transmissor e controlar as cargas.
Detalhe do processo de iniciação do transmissor. Cada etapa de ajuste é informada e o IP para acesso é disponibilizado.
Depois de uma primeira conexão, somente o IP fica disponível no display.
Recursos usados
- 2x ESP WiFi LoRa 32 da Heltec.
- 1x módulo de relés.
- 1x contator trifásico.
- 1x motor 220V (representa o motor da bomba).
- 1x lâmpada 127V
- Fios e conexões variadas.
- SDR para visualização do sinal LoRa.
Circuito receptor
Circuito receptor – Módulo de relés
O circuito do transmissor é formado simplesmente pelo ESP WiFi LoRa 32. Já o circuito do receptor possui, além do ESP WiFi LoRa 32, uma interface para o acionamento das cargas de potência elevada. A primeira é um módulo de relés.
Estes relés podem acionar cargas de 250Vac x 10A no máximo, mas devemos ficar atentos a cargas indutivas e capacitivas, que podem gerar tensões e correntes, respectivamente, muito elevadas durante transientes.
É recomendável também que sejam alimentados por uma fonte independente, principalmente se o número de relés for elevado. No exemplo utilizamos o pino de 5V disponível no módulo da Heltec, já que a corrente absorvida não ultrapassou os limites do módulo.
Circuito receptor – Contador
Para aumentar a capacidade de acionamento de carga, vamos utilizar um contator. Os contatores são como relés, mas podem precisar de correntes mais elevadas para seu acionamento. Utilizaremos então o relé para acionar o contator.
Para mais detalhes sobre os tipos e aplicações de contatores, acesse a norma IEC 60497-4.
Circuito Elétrico
Abaixo temos o circuito elétrico com as três cargas de exemplo: Um motor conectado a duas fases através do contator, um aquecedor monofásico ligado a um relé e um holofote conectado a um terceiro relé.
Configuração do rádio LoRa
Para configurar o rádio LoRa, utilizamos a calculadora disponibilizada pela Semtech no link abaixo:
Usando esta calculadora, podemos obter informações muito importantes sobre a transmissão LoRa que será efetua e ajuda na melhor escolha dos parâmetros, permitindo o equilíbrio mais adequando entre alcance e velocidade de transmissão.
Abaixo vemos as configurações usadas nos testes. A calculadora fornece algumas estimativas como: consumo, tempo no ar, orçamento do link, chip compatível entre outros.
//COM 8 #include "Arduino.h" //inclui a biblioeca padrão Arduino.h #include "heltec.h" //inclui a biblioteca da Heltec #include "WiFi.h" //inclui a biblioteca WiFi // Definições do rádio LoRa #define DisplayEstado true //define se o display estará ou não ativo #define LoRaEstado true //define se o rádio LoRa estará ou não ativo #define SerialEstado true //define se a Serial do módulo estará ou não disponível (Baud Rate padrão 115200) #define AmplificadorDePotencia true // define se o amplificador de potência PABOOST estará ou não ativo #define BandaDeTransmissao 433E6 //define a frequência média de transmissão: 868E6, 915E6 // Definições do WiFi #define SSid "Seu_SSID" //Identificador do serviço de rede WiFi #define Senha "Sua senha" //Senha de acesso ao serviço WiFi //Variáveis de estado dos controlados bool EstadoBomba = 0; bool EstadoAquecedor = 0; bool EstadoHolofote = 0; bool Atuar = false; //inicia o servidor na porta 80 WiFiServer servidor(80);Código – Fonte: setup()
void setup()
{
//inicia os dispositivos do devKit da Heltec (DEVE SER INICIADO ANTES DE TUDO)
Heltec.begin(DisplayEstado, LoRaEstado, SerialEstado, AmplificadorDePotencia, BandaDeTransmissao);
Heltec.display->clear(); //Limpa qualquer mensagem inicial do display
SetupWiFi(); //Configura a conexão Wifi
SetupLoRa(); //Configura o rádio LoRa
//Sinaliza o fim dos ajustes
Heltec.display -> drawString(0, 40, "Setup concluído!");
Heltec.display -> display();
servidor.begin();// inicia o servidor
//informa ip no display
Heltec.display -> drawString(0, 50, "Servidor: " + WiFi.localIP().toString());
Heltec.display -> display();
delay(1000);
}
Código – Fonte: loop()
void loop()
{
TrataRequisicao();//trata as requisições HTTP
enviarPacote();//Envia as mensagens LoRa
}
Código – Fonte: SetupWiFi()
void SetupWiFi()
{
//inicio dos ajustes do conexão WiFi
WiFi.disconnect(true); //Desconecta de uma possível conexão prévia
delay(100);
IPAddress ip(192, 168, 0, 119); // Definição de um IP fixo
IPAddress gateway(192, 168, 0, 1); //Gateway da rede
IPAddress subnet(255, 255, 255, 0); //Máscara de rede
WiFi.mode(WIFI_STA); //Ajusta para o modo STATION
WiFi.setAutoConnect(true); //Ativa a auto reconexão
WiFi.config(ip, gateway, subnet); //Configura os endereços fixos
WiFi.begin(SSid, Senha); //Informa o id do Serviço WiFi e a senha
delay(100);
byte count = 0; // Contador das tentativas de conexão
while (WiFi.status() != WL_CONNECTED && count < 10)
{
count ++;
delay(500);
Heltec.display -> drawString(0, 0, "Conectando WiFi...");
Heltec.display -> display();
}
if (WiFi.status() == WL_CONNECTED) //Se conseguiu conectar...
{
Heltec.display -> drawString(0, 10, "Conexão WiFi ok!");
Heltec.display -> display();
delay(100);
}
else // ... caso falhe a conexão
{
Heltec.display -> drawString(0, 10, "Falha na conexão!");
Heltec.display -> display();
delay(100);
//pode aplicar um loop infinito ou reset AQUI;
}
}
void SetupLoRa()
{
//Sinaliza o início dos ajustes
Heltec.display -> drawString(0, 20, "Configurando LoRa...");
Heltec.display -> display();
delay(100);
LoRa.setSpreadingFactor(12); //define o fator de espalhamento
LoRa.setSignalBandwidth(250E3); //define a largura de banda
LoRa.setCodingRate4(5); //define o Codding Rate
LoRa.setPreambleLength(6); //define o comprimento do preâmbulo
LoRa.setSyncWord(0x12); //define a palavra de sincronização
//LoRa.disableCrc(); //desabilita o CRC
LoRa.crc(); //ativa o CRC
//Sinaliza o fim dos ajustes do rádio LoRa
Heltec.display -> drawString(0, 30, "LoRa configurado!");
Heltec.display -> display();
delay(100);
}
Código – Fonte: TrataRequisicao()
void TrataRequisicao()
{
//cria um objeto "cliente" se há uma conexão disponível
WiFiClient cliente = servidor.available();
if (!cliente) return; //se não há cliente, retorna
// se há um cliente, sinaliza no display
Heltec.display -> clear();
Heltec.display -> drawString(0, 0, "Servidor: " + WiFi.localIP().toString());
Heltec.display -> drawString(0, 10, "Cliente conectado!");
Heltec.display -> display();
while (cliente.connected()) //executa enquanto houver conexão
{
if (cliente.available()) //se há uma requisição disponível
{
String req = cliente.readStringUntil('\r'); //Lê a requisição
//A partir daqui, verificamos se a requisição possui
//algum comando de ajuste de sinal
if (req.indexOf("acao=0") != -1) //para o motor da bomba
{
Atuar = true; //enviar os dados para atuar
EstadoBomba = !EstadoBomba;
}
else if (req.indexOf("acao=1") != -1)//para o aquecedor
{
Atuar = true; //enviar os dados para atuar
EstadoAquecedor = !EstadoAquecedor;
}
else if (req.indexOf("acao=2") != -1)//para o holofote
{
Atuar = true; //enviar os dados para atuar
EstadoHolofote = !EstadoHolofote;
}
else if (req.indexOf("acao=3") != -1)//desligar tudo
{
Atuar = true; //enviar os dados para atuar
EstadoBomba = 0;
EstadoAquecedor = 0;
EstadoHolofote = 0;
}
else if (req.indexOf("acao=-1") != -1) //somente atualizar os dados
{
Atuar = true; //enviar os dados para atuar
Serial.println("Atualizar estado");
}
else //nenhuma opção válida
{
Atuar = false; //sinaliza que não é para atuar
}
//Este é o html que iremos retornar para o cliente
String html =
String html =
"<html>"
"<head>"
"<meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'/>"
"<title>Controle WiFi / LoRa</title>"
"<style>"
"body{"
"text-align: center;"
"font-family: sans-serif;"
"font-size:15px;"
"padding: 25px;"
"}"
"p{"
"color:#444;"
"}"
"button{"
"font-size:15px;"
"outline: none;"
"border: 2px solid #1fa3ec;"
"border-radius:18px;"
"background-color:#FFF;"
"color: #000;"
"padding: 5px 25px;"
"}"
"button:active{"
"color: #fff;"
"background-color:#1fa3ec;"
"}"
"button:hover{"
"border-color:#0000ff;"
"}"
"</style>"
"</head>"
"<body>"
"<H1>Controle WiFi / LoRa</H1>"
"<H2>Selecione um comando:</H2>"
"<p><a href='?acao=0'><button>Bomba</button></a>"
"<a href='?acao=1'><button>Aquecedor</button></a>"
"<a href='?acao=2'><button>Holofote</button></a>"
"<a href='?acao=3'><button>Desligar tudo.</button></a></p>"
"<p></p>"
"<p></p>"
"<p><a href='?acao=-1'><button>Atualizar estados.</button></a></p>"
"<p></p>"
"<H3>Bomba: " + String(EstadoBomba) + "</H3>"
"<H3>Aquecedor: " + String(EstadoAquecedor) + "</H3>"
"<H3>Holofote: " + String(EstadoHolofote) + "</H3>"
"</body>"
"</html>\r";
//Escreve o html no buffer que será enviado para o cliente
cliente.print(html);
//Envia os dados do buffer para o cliente
cliente.flush();
}
//aguarda para que o trafego das informações seja concluído
delay(20);
//força a desconexão do cliente
cliente.stop();
}
//sinaliza o IP do servidor no display
Heltec.display -> clear();
Heltec.display -> drawString(0, 0, "Servidor em:");
Heltec.display -> drawString(0, 10, WiFi.localIP().toString());
Heltec.display -> display();
}
Código – Fonte: EnviarPacote()
void enviarPacote()
{
if (!Atuar) return; //se não é para atuar, retorna
//envia para a serialos dados que serão enviados pelo LoRo
Serial.println("Enviando: " + String(EstadoBomba) + String(EstadoAquecedor) + String(EstadoHolofote));
//Enviar pacote
//inicia a montagem do pacote (parâmetro FALSE desativa o Header);
LoRa.beginPacket();
//enviando os estado um a um
LoRa.write(EstadoBomba);
LoRa.write(EstadoAquecedor);
LoRa.write(EstadoHolofote);
LoRa.endPacket(); // finaliza o pacote
Atuar = false; //Sinaliza que já houve a atuação
}
Código Fonte (receptor)
// COM 4 #include "heltec.h" //inclui a biblioteca da Heltec #define DisplayEstado true //define se o display estará ou não ativo #define LoRaEstado true //define se o rádio LoRa estará ou não ativo #define SerialEstado true //define se a Serial do módulo estará ou não disponível // (Baud Rate padrão 115200) #define AmplificadorDePotencia true // define se o amplificador de potência PABOOST estará ou não ativo #define BandaDeTransmissao 433E6 //define a frequência média de transmissão: 868E6, 915E6 #define pinBomba 22 //pino usado para acionar o motor da bomba #define pinAquecedor 23 //pino usado para acionar o aquecedor #define pinHolofote 17 //pino usado para acionar o holofoteCódigo – Fonte: setup()
void setup()
{
//define os pino como saída
pinMode(pinBomba, OUTPUT);
pinMode(pinAquecedor, OUTPUT);
pinMode(pinHolofote, OUTPUT);
//os pinos são ajustados para nível alto logo no início
//porque o módulo de relés tem lógica invertida
digitalWrite(pinBomba, HIGH);
digitalWrite(pinAquecedor, HIGH);
digitalWrite(pinHolofote, HIGH);
//inicia o ESP WiFi LoRa 32 da Heltec
Heltec.begin(DisplayEstado, LoRaEstado, SerialEstado, AmplificadorDePotencia, BandaDeTransmissao);
SetupLoRa(); //faz os ajustes do rádio LoRa
delay(100);
//Sinaliza o fim dos ajustes
Heltec.display -> clear();
Heltec.display -> drawString(0, 0, "Setup concluído!");
Heltec.display -> drawString(0, 10, "Aguardando dados...");
Heltec.display -> display();
}
Código – Fonte: loop()
void loop()
{
//verifica a chegada dos dados
RecebeDados();
}
Código – Fonte: SetupLoRa()
void SetupLoRa()
{
LoRa.setSpreadingFactor(12); //define o fator de espalhamento
LoRa.setSignalBandwidth(250E3); //define a largura de banda
LoRa.setCodingRate4(5); //define o Codding Rate
LoRa.setPreambleLength(6); //define o comprimento do preâmbulo
LoRa.setSyncWord(0x12); //define a palavra de sincronização
//LoRa.disableCrc(); //desabilita o CRC
LoRa.crc(); //ativa o CRC
}
Código – Fonte: RecebeDados()
void RecebeDados()
{
// tenta analisar o pacote
int packetSize = LoRa.parsePacket();
if (packetSize) // se o pacote não tiver tamanho zero
{
//matriz para armazenamento dos estados
byte Dados[3];
// Lê o pacote
while (LoRa.available())
{
Dados[0] = LoRa.read(); //estado do motor da bomba
Dados[1] = LoRa.read(); //estado do aquecedor
Dados[2] = LoRa.read(); //estado do holofote
}
//os dados são convertidos para booleanos e invertidos
digitalWrite(pinBomba, !bool(Dados[0]));
digitalWrite(pinAquecedor, !bool(Dados[1]));
digitalWrite(pinHolofote, !bool(Dados[2]))
//Sinaliza os dados recebidos e o RSSI no display
Heltec.display -> clear();
Heltec.display -> drawString(0, 0, "Bomba: " + String(Dados[0]));
Heltec.display -> drawString(0, 10, "Aquecedor: " + String(Dados[1]));
Heltec.display -> drawString(0, 20, "Holofote: " + String(Dados[2]));
Heltec.display -> drawString(0, 30, "RSSI: " + String(LoRa.packetRssi()));
Heltec.display -> display();
//Sinaliza os dados recebidos e o RSSI na serial
Serial.println("Bomba: " + String(Dados[0]));
Serial.println("Aquecedor: " + String(Dados[1]));
Serial.println("Holofote: " + String(Dados[2]));
Serial.println("RSSI: " + String(LoRa.packetRssi()));
}
}
Sempre me perguntam se eu uso Esp32 da Heltec ou da TTGO, bem como o software e a lib é toda da Heltec então eu compro deles, porque eles deixam o software open.
Eu uso dois Esp32 Lora da Heltec de 433Mhz mas lembre-se que a frequência aqui no Brasil é de 915Mhz. Se você está em Portugal ou um outro país diferente tem que verificar qual a frequência permitida.
Nesse link você encontra esse maravilhoso componente. bit.ly/3j15hFv
O primeiro Esp32 Lora é também um WEB server e na demonstração eu mostro o analisador de espectro que se trata de um SDR que é um Rádio Defini por Software, que eu aconselho você a possuir um se quiser progredir no mundo da internet das coisas IoT.
Veja qual se encaixa no seu bolso:
HackRF One 1MHz a 6GHz USB Open Source Software Plataforma de rádio SDR RTL
Placa de desenvolvimento de recepção de sinais
RTL-SDR V3 RTL2832 1PPM TCXO HF até 1GHz // Serve para todos os Loras
Imaginei uma aplicação comum para uma área rural onde acionamentos de motores a longa distância são comuns. Contudo o rádio Lora é muito bom para ambientes industriais por ser praticamente imune a ruídos eletromagnéticos e ter uma boa relação de distância x potência.
Você pode realmente mandar por muitos KMs um sinal wifi Lora .
Como sempre eu uso um programa bem simples que você pode alterar para seu uso profissional.
O sinal LoRa só consegue chegar realmente longe se você tiver uma antena profissional.
A antena profissional da Steelbras voçê encontra em bit.ly/3tcV91k
Suporte magnético da antena : bit.ly/3pBZj0y
Veja aqui a linha de contatores de WEG



















2 Comentários
boa noite fernando. acompanho seu canal há bastante tempo. teria como implementar duas funcionalidades a este projeto?
ResponderExcluirprimeiro, inserir a opção de botoeiras, dispensando assim o uso do smartphone.
segundo. supondo que meu receptor esteja ha mais de 3 km de distancia. inserir leds no transmissor indicando o estado dos relés do receptor. ON ou OFF. mas tais informações deveriam ser confiáveis. O receptor deveria enviar informações para o transmissor
Boa tarde Fernando K : é a primeira veis que escrevo,dizendo obrigado pelas Aulas ,fico Feliz de aprender muito gratuitamente e tudo é perfeito ... Obrigado mesmo e: copilei este programa do Lora só falta montar tudo e e e texta.
ResponderExcluir