Zone di controllo con la tecnologia LoRa :trasmissione e ricezione a disposizione
La maggior parte delle aree rurali e boschive, in molti casi, sono sprovviste di internet "libero".
La trasmissione dati, in parte, può essere risolta con l'uso della tecnologia LoRa.
Utilizzo dei moduli per la Trasmissione/ Ricezione LoRa a mia disposizione
L'uso di due antenne permettono di raggiungere un range di circa 10 km.(senza ostacoli):
una GROUND PLANE omnidirezionale per il trasmettitore
una YAGI direttiva per il ricevitore
permettono di raggiungere un range di circa 10 km.(senza ostacoli)
Antenna omnidirezionale ground plane 433MHz Antenna direzionale YAGI 433MHz
Modulo HELTEC SX1276 V2 Lora ESP32 LX6 Dual-Core 0.96 Pollici Blue OLED CP2012 868MHZ-915MHz oppure 433 MHz
Il modulo GPS a 50 canali UBLOX NEO-6M: il campo di alimentazione è compreso tra 3 volt e 5volt
Modulo TRASMETTITORE e/o RICEVITORE.
Considerazioni personali sull'utilizzo del modulo HELTEC WIFI LoRa 32(V2) che utilizzo per la trasmissione e ricezione dati.
ESP32 ha 3 interfacce hardware seriali.
Per collegare es. : un GPS ad una seriale hardware del modulo WIFI LoRa 32(V2) devo definire una seriale personale,ecco perchè.
L'interfaccia seriale standard 0,collegata ai Pin GPIO3 (RX) e GPIO1 (TX),
viene utilizzata per la comunicazione con l'IDE Arduino ed è permanentemente cablata al CP2102.
L'interfaccia seriale 1 dell'ESP 32 normale è collegata ai pin GPIO9 (RX) e GPIO10 (TX).
I pin GPIO9 (RX) e GPIO10 (TX) non sono presenti sul modulo WIFI LoRa 32(V2).
Sul modulo WIFI LoRa 32(V2) i Pin 9 e 10 vengono utilizzati per controllare la memoria flash e pertanto non sono accessibili.
L'interfaccia seriale 2 è normalmente collegata ai pin GPIO16 (RX) e GPIO17 (TX).
Il pin GPIO16 è collegato al ripristino del display OLED, se utilizzato in un programma il display rimane scuro Si constata dalla figura del Pinout Diagram del modulo WIFI LoRa 32(V2) che:
I pin 4 -15 - 16 sono utilizzati per l'OLED
Non bisogna utilizzare il controller SSD1306.
N.B. La libreria #include "heltec.h" gestisce il buon funzionamento e collegamenti :
• dei PIN della scheda LoRa
• dei Pin dell'OLED.
Cambiano i comandi per gestire l'OLED rispetto ai comandi del controller SSD1306. es.
....................
Heltec. display- >clear();
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
Heltec. display- >setFont(ArialMT_Plain_ 10);
Heltec. displa y- >drawString(96,48, String(tempra ture));
Heltec.display->drawString(0,54, "Umidità’%: ");
Heltec.display->drawString(96,54, String(h));
Heltec. displa y- >displa y();
I pin da 32 a 39 sono attivi solo come INPUT (possono essere utilizzati anche come RX)
I pin 22 - 23 - 2 - 17 - 25 - 12 - 13 sono disponibili come INPUT/OUTPUT
Bene, la soluzione al mio problema è molto semplice (momentaneamente prendo a prestito i pin 2 e 17).
In seguito utilizzerò un pin arbitrario come RX dal blocco 32-39 per avere a disposizione 7 pin come OUTPUT.
#define SERIAL1_RX 2 // TX del GPS -> al PIN 2 dell'ESP32
#define SERIAL1_TX 17// RXdel GPS_-> al PIN 17del'ESP32
void setup () {
Serial1.begin(9600, SERIAL_8N1, SERIAL1_RX, SERIAL1_TX);
//Definisco l'interfaccia la Serial1 con 9600 baud e 8 bit senza parità(N) più 1 bit di stop sui pin GPIO 2 (RX) e GPIO 17 (TX)
Heltec.begin(1,1,1,1, BAND);
LoRa.setTxPower(20,RF_PACONFIG_PASELECT_PABOOST);
.........................
N.B.: Il modulo HELTEC WIFI LoRa 32(V2) può essere utilizzato come un comunissimo ESP32 con modulo LoRa e Oled senza utilizzare le librerie dell'HELTEC.
Il chip ESP32 è in grado di collegare le interfacce hardware seriali (UARTS) a quasi tutti i pin IO.
La trasmissione dal GPS è costituita da:
• blocchi di stringhe contraddistinte dal simbolo $
• ogni intestazione es.. GPMRC - GPGGA- ecc.. ha la sua peculiarità
• una stringa $GPMRC è simile alla stringa $GPMRA
• la stringa $GPMRA non comprende la data
$GPRMC,090112.00,A,4537.78411,N,00901.30136,E,0.022,,160516,,,A*7F
$GPVTG,, T,,H,0.022,11,0.041,K,A*26
$GPGGA,090112.00,4537.78411,N,00901.30136,E,1,06,1.39,230.4,M,47.2,H,,*54
$GPGSA,A,3,28,15,18,30,17,13,,,,,,,2.55,1.89,1.71*07
$GPGSV,3,1,09,05,17,196,26,10,00,335,,12,01,213,,13,76,127,32*7E
$GPGSV,3,2,09,15,63,294,35,17,24,113,29,18,20,311,37,28,49,055,47*79
$GPGSV,3,3,09,30,16,075,33*46
$GPGLL,4537.78411,N,00901.30136,E,090112.00,A,A*63
$GPRMC,090113.00,A,4537.78425,N,00901.30138,E,0.054,,160516,,,A*76
$GPVTG,,T,,H,0.054,W,0.100,K,A*23
$GPGGA,090113.00,4537.78425,N,00901.30138,E,1,06,1.90,230.6,M,47.2,H,,*56
$GPGSA,A,3,28,15,18,30,17,13,,,,,,,2.55,1.90,1.71*0F
$GPGSV,3,1,09,05,17,196,26,10,00,335,,12,01,213,,13,76,127,32*7E
$GPGSV,3,2,09,15,63,294,36,17,25,113,29,18,20,311,37,28,49,055,47*7E
$GPGSV,3,3,09,30,16,075,33*46
$GPGLL,4537.78425,N,00901.30138,E,090113.00,A,A*6B
$GPRMC,090429.00,A,4537.77772,N,00901.30238,E,0.051,,160516,,,A*75
$GPVTG,,T,,M,0.051,N,0.094,K,A*2A
$GPGGA,090114.00,4537.78434,N,00901.30139,E,1,06,1.90,230.8,M,47.2,H,,*5E
Una stringa è costituita da alcuni blocchi alfabetici separati dal simbolo virgola.
DESIDERO ESTRAPOLARE SOLO LA STRINGA DEL $GPRMC :
$GPRMC,090429.00,A,4537.77772,N,00901.30238,E,0.051,,160516,,,A*75
Attenzione all'ORA DI RICEZIONE:
E' riferita all'ora di GREENWICH - Aggiungere 1 ora + 1 ora (ora legale)
Interpretazione dei valori da assegnare alla latitudine e longitudine desunti dalla stringa:
La LATITUDINE (Altezza) varia da 0° a 90° pertanto occorre selezionare i primi due caratteri per i gradi
La LONGITUDINE(Orizzontale) varia da 0 a 180° pertanto occorre selezionare i primi tre caratteri per i gradi
TEST di visualizzazione dati GPS sulla Serial Monitor e OLED
SCHEDA:ESP32 LoRa V2 433 Mhz WIFI OLED a 0,96"
TX del GPS = = > PIN 2 del'ESP32
RX del GPS = = > PIN 17 del'ESP32
TEST DI LETTURA:
//FILE:HELTEC_V2_GPS_13_FEBBRAIO_2023_FUNZIONANTE_CON_heltec_oled
//SCHEDA da impostare Heltec WiFi Lora 32
// anche se è la scheda ver.2
// IDE arduino 1.8.12
#include "heltec.h"
#define BAND 433E6
#define SERIAL1_RX 2 // TX del GPS -> al PIN 2 dell'ESP32
#define SERIAL1_TX 17// RXdel GPS_-> al PIN 17del'ESP32
String read_sentence;
void setup() {
Serial.begin(115200);
Serial.println("TTGO GPS TEST");
delay(2000);
Serial1.begin(9600, SERIAL 8N1, SERIAL1 RX, SERIAL1_TX);
Heltec.begin(1,1,1,1, BAND);
LoRa.setTxPower(20,RF_PACONFIG_PASELECT_PABOOST);
}
void loop() {
Get_Gps_data();
//****INizio VOID GET_GPS_DATA // Dati da visualizzare vedere la numerazione dei campi della tabella soprastante
void Get_Gps_data(){
read_sentence = Serial1.readStringUntil(13); //13 = return (ASCII)
read_sentence.trim();
if (read_sentence.startsWith("$GPRMC")) {
String gps_ora = sentence_sep(read_sentence, 1); //Orario
String gps_lat = sentence_sep(read_sentence, 3); //Latitudine
String gps_lat_o = sentence_sep(read_sentence, 4); //Orientamento (N or S)
String gps_lon = sentence_sep(read_sentence, 5); //Longitudine
String gps_lon_o = sentence_sep(read_sentence, 6); //Orientamento (E or W)
String gps_dat = sentence_sep(read_sentence, 9); //DATA
Heltec. display->clear();
Heltec. display- >setTextAlignment(TEXT_ALIGN_LEFT);
Heltec. display- >setFont(ArialMT_Plain_10);
Heltec.display->drawString(0, 0, "Giardino Flora Appenninica");
//Heltec.display->drawString(0, 12, " C A P R A C O T TA ");
Heltec.display->drawString(0, 12, "ORA ");
Heltec. display->drawString(24, 12,gps_ora );
Heltec. display- >drawString(0,24, "LAT");
Heltec.display->drawString(24,24, gps_lat);
Heltec.display->drawString(0, 32, "LON ");
Heltec. display- >drawString(24,32, gps_lon);
Heltec.display->drawString(0,40, "DATA: ");
Heltec.display->drawString(32,40, gps_dat);
Heltec. display- > display();
Serial.print("ORA: ");
Serial.print(gps_ora);
Serial.print(" ");
Serial.print("LAT: ");
Serial.print(gps_lat);
Serial.print("LON: ");
Serial.print(gps_lon);
Serial.print("DATA ");
Serial.println(gps_dat);
delay(2000);
}
}
String sentence_sep(String input, int index) {
int finder = 0;
int strIndex[] = { 0, -1 };
int maxindex = input.length() -1;
for (int i = 0; i < = maxindex && finder < = index; i++) {
if (input.charAt(i) == ',' || i == maxindex) {//',' = separator finder+ +;
strindex[0] = strindex[1] + 1;
strindex[1] = (i == maxindex) ? i + 1 : i;
}
}
return finder > index ? input.substring(strindex[0], strindex[1]) : ""; }
Questo è il risultato: