Como Usar o WIFI e LORA na mesma aplicação?

Projetos com LoRa
thiagog
Novato
Mensagens: 2
Registrado em: 15/Mar/2019, 12:34

Como Usar o WIFI e LORA na mesma aplicação?

Mensagem por thiagog » 15/Mar/2019, 12:41

Bom dia Fernando, bom dia amigos do fórum.

Gostaria de saber se alguém tem a informação de como usar o WiFi para transferir dados de um ESP32 para um WiFi de uma placa TTGO Lora, e logo em seguida pegar os dados recebidos e os enviar para outro lora, atravéz do radio lora. É possível realizar essa operação?

eduardomoraes
Membro
Mensagens: 9
Registrado em: 16/Abr/2019, 13:14

Re: Como Usar o WIFI e LORA na mesma aplicação?

Mensagem por eduardomoraes » 27/Jun/2019, 22:22

Boa noite ThiagoG,
sim, estou inclusive realizando um teste aqui, parecido com esse.
Eu acesso a Rede Wifi, conecto a um servidor SNTP, atualizo o horário e depois inicio uma conexão simples via rede LoRa.
No site do FernandoK, tem outro exemplo onde ele faz isso em um ambiente Cliente Servidor, dá uma olhada lá.

https://www.fernandok.com/2018/11/ardui ... trole.html
https://www.fernandok.com/2018/04/esp32 ... end-e.html
https://www.fernandok.com/2018/03/esp32 ... ranca.html

Estou estudando estes exemplos para meu projeto.
Vou fazer diversos clientes que irão monitorar várias câmaras frias e um servidor que vai concentrar os dados destes clientes, fazer um datalog e enviar dados via rede, e-mail, e etc.

Por enquanto eu fiz somente um sistema que comunica em 2 vias. Vou implementar um sistema de botão de pânico múltiplo.
Dá uma olhada no código que alterei a partir dos exemplos da Heltec:

/*
* Programa de Monitoramento de Camara Fria - SMCF
* O sistema irá monitorar as fases de alimentação, as fases dos contactores, a abertura da porta e a temperatura da câmara,
* e, de acordo com a situação, emitir um sinal sonoro de alerta
* Todo o Status da câmara será enviado no mínimo a cada 5 minutos (ou menos em caso de eventos) para um servidor, que irá fazer um DataLog
*/
#include "Arduino.h"
#include "heltec.h"
#include "WiFi.h"
#include "images.h"
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <Wire.h>



String ID = String(int(random(9))); // ID do rádio
String rssi = "RSSI --"; // String que será enviada
String packSize = "--"; // Tamanho da String
String packet; // Pacote

// Configurações do WiFi
const char* ssid = "REDE"; // Nome da rede WiFi
const char* password = "SENHA"; // Senha da rede WiFi

unsigned int counter = 0; // Contador de pacotes

bool receiveflag = false; // software flag for LoRa receiver, received data makes it true.

long lastSendTime = 0; // last send time
int INTERVAL = 1000; // interval between sends

// Configurações do Servidor NTP
const char* servidorNTP = "a.st1.ntp.br"; // Servidor NTP para pesquisar a hora
const int fusoHorario = -10800; // Fuso horário em segundos (-03h = -10800 seg)
const int taxaDeAtualizacao = 1800000; // Taxa de atualização do servidor NTP em milisegundos
WiFiUDP ntpUDP; // Declaração do Protocolo UDP
NTPClient timeClient(ntpUDP, servidorNTP, fusoHorario, 60000);

/*
* Exibe o logo Heltec no display
*/
void logo(){
Heltec.display -> clear();
Heltec.display -> drawXbm(0,5,logo_width,logo_height,(const unsigned char *)logo_bits);
Heltec.display -> display();
}

/*
* Configura o Wifi
* Modos de Wifi - STA -> Modo Estação
* AP -> Accesss Point
* DHCP -> Servidor de IP
*/
void WIFISetUp(void) {
// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.disconnect(true); // Desconecta a Wifi por segurança
delay(1000); // Aguarda 1s
WiFi.mode(WIFI_STA); // Configura o modo STA (Station Mode)
WiFi.setAutoConnect(true); // Seta a conecção automatica
WiFi.begin(ssid,password); // Passa os dados de SSID e PASSWORD
delay(100); // Aguarda 1/10s
byte count = 0;
Heltec.display -> clear(); // Limpa o display
while(WiFi.status() != WL_CONNECTED && count < 10) { // Testa a conecção por até 10 vezes
count ++;
delay(500);
Heltec.display -> drawString(0, 0, "Connecting...");
Heltec.display -> display();
}
if(WiFi.status() == WL_CONNECTED) { // Se conectou, OK
Heltec.display -> clear();
Heltec.display -> drawString(0, 0, "Connecting...OK.");
Heltec.display -> display();
}
else { // Senão, apresenta mensagem de erro
Heltec.display -> clear();
Heltec.display -> drawString(0, 0, "Connecting...Failed");
Heltec.display -> display();
//while(1);
}
Heltec.display -> drawString(0, 10, "WIFI Setup done"); // Encerra o WifiSetup
Heltec.display -> display();
delay(500);
}

/*
* Programa para ver as redes disponíveis
*/
void WIFIScan(unsigned int value) {
unsigned int i;
for(i=0;i<value;i++)
{
Heltec.display -> drawString(0, 20, "Scan start...");
Heltec.display -> display();
int n = WiFi.scanNetworks();
Heltec.display -> drawString(0, 30, "Scan done");
Heltec.display -> display();
delay(500);
Heltec.display -> clear();

if (n == 0) {
Heltec.display -> clear();
Heltec.display -> drawString(0, 0, "no network found");
Heltec.display -> display();
while(1);
}
else {
Heltec.display -> drawString(0, 0, (String)n);
Heltec.display -> drawString(14, 0, "networks found:");
Heltec.display -> display();
delay(500);

for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
Heltec.display -> drawString(0, (i+1)*9,(String)(i + 1));
Heltec.display -> drawString(6, (i+1)*9, ":");
Heltec.display -> drawString(12,(i+1)*9, (String)(WiFi.SSID(i)));
Heltec.display -> drawString(90,(i+1)*9, " (");
Heltec.display -> drawString(98,(i+1)*9, (String)(WiFi.RSSI(i)));
Heltec.display -> drawString(114,(i+1)*9, ")");
// display.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
delay(10);
}
}
Heltec.display -> display();
delay(800);
Heltec.display -> clear();
}
}

/*
* Inicializa o ambiente de trabalho
*/
void setup() {
// Inicializa o Lora
Heltec.begin(true /*DisplayEnable Enable*/, true /*LoRa Enable*/, true /*Serial Enable*/, true /*LoRa use PABOOST*/, 433E6 /*LoRa RF working band*/);
logo(); // Exibe o logo
delay(300);
Heltec.display -> clear(); // Limpa a tela
WIFISetUp(); // Setup Wifi
WIFIScan(1); // Procura as redes disponíveis

LoRa.onReceive(onReceive); // Coloca o rádio Lora em modo de recepção
LoRa.receive(); // Escuta a porta Lora

configureWatchdog(); // "Liga" o WatchDog

}


/*
* Pacote principal
*/
void loop() {
//reseta o temporizador do WatchDog
timerWrite(timer, 0);

// roda o envio de pacotes a cada intervalo definido em INTERVAL
if(millis() - lastSendTime > INTERVAL)//waiting LoRa interrupt
{
LoRa.beginPacket(); // Abre a comunicação LORA
// Criei um "pacote" de dados similar ao que irei utilizar no sistema real
packet = ID+"|";
packet += String(random(200))+"|";
packet += String(millis())+"|";
packet += String(counter++);
LoRa.print(packet); // envia o pacote de dados
LoRa.endPacket(); // Fecha a comunicação LORA

LoRa.receive(); // Escuta a porta LORA

// LED é uma palavra reservada pelo ESP32 Lora?
digitalWrite(LED,HIGH); // Pisca o LED
Heltec.display -> clear();
Heltec.display -> drawString(0, 50, "Packet " + (String)(counter-1) + " sent done");
Heltec.display -> display();

INTERVAL = random(2000) + 1000; //Define o novo intervalo entre 1~3 seconds
lastSendTime = millis(); // Salva o tempo atual

timeClient.update(); // Atualiza o horario
Serial.println(timeClient.getFormattedTime()); // Exibe o horário na serial

String horario = timeClient.getFormattedTime(); // Formata o horário

Heltec.display -> drawString(0, 39, horario); // Adiciona o texto à lista de escrita do display
// Heltec.display -> drawLine(10, 52, 117, 52); // Adiciona uma linha à lista de escrita do display
Heltec.display -> display(); // Escreve as informações da lista de escrita no display
}

// Se foi recebido algum dado (variavel atualizada pela onReceive()
if(receiveflag) {
// Exibe as informações recebidas
Heltec.display -> drawString(0, 0, "Received Size" + packSize + " packages:");
Heltec.display -> drawString(0, 10, packet);
Heltec.display -> drawString(0, 20, "With " + rssi);
Heltec.display -> display();


// LED é uma palavra reservada pelo ESP32 Lora?
digitalWrite(LED,LOW); // Pisca o LED
//digitalWrite(25,LOW);

receiveflag = false; // Altera o semaforo de controle para DESLIGADO
}
}

void onReceive(int packetSize)//LoRa receiver interrupt service
{
// if (packetSize == 0){
// return;
// }
packet = "";
packSize = String(packetSize,DEC);

while (LoRa.available()) {
packet += (char) LoRa.read();
}

Serial.println(packet);
rssi = "RSSI: " + String(LoRa.packetRssi(), DEC);

receiveflag = true; // Altera o semaforo de controle para LIGADO
}

BeJimmieDrilk
Membro
Mensagens: 6
Registrado em: 21/Ago/2019, 11:58

Como Usar o WIFI e LORA na mesma aplicação

Mensagem por BeJimmieDrilk » 23/Set/2019, 15:49

Olá Pessoal,

Alguém sabe como usar essa função?:

ACopy <aSource>, <aTarget>, <nSourceStart>, <nCount>, <nTargetStart> --> aTarget

Function Main
Local x, aDados:=, aDadosPrint:=, nElementos:=100

For x = 1 To nElementos
AaDd aDados, "Elemento " Hb_NToS x
Next

Clear Screen

?
? Len aDados

//ACopy aDados, aDadosPrint, 1, Len aDados - 4, 1 // não funciona,
aDadosPrint := ACopy aDados, aDadosPrint, 1, Len aDados - 4, 1 // e não funciona

?
? Len aDadosPrint

Return Nil

A solução foi usar ASize, mas não entendo porque ACopy não funciona.

Responder