PROGRAMMA DA VERIFICARE ed eventualmente modificare o aggiungere qualcosa secondo me ......
Prompt:Mi proponi un programma di trasmissione dati:
· Utilizza un GPS u-blox NEO-6M GPS Module
· LONGITUDINE e LATITUDINE, senza salvataggio
· Preleva da p.c. data e ora
· Visualizza il tutto su OLED.
· Mi devi definire su oled l’aspetto che ti allego
· Data : gg/mm/aa
· Ora: hh.mm.ss.
· Lat: val(Lat) Long:val(long)
· Cont: val(cont)
Poi programma di ricezione con memorizzazione dati
· data e ora prelevati da P.C
· visualizzare ogni 10 secondi di tutti i dati definiti nella trasmissione.
La memorizzazione su SD deve essere così rappresentata:
· Data : gg/mm/aa Ora: hh.mm.ss. Lat: val(Lat) Long:val(long) Cont: val(cont)
Di seguito trovi due programmi completi e coerenti tra loro:
1️⃣ TRASMETTITORE
ESP32 + GPS + LoRa + OLED
2️⃣ RICEVITORE
ESP32 + LoRa + OLED + SD
Il sistema:
prende data e ora dal PC tramite seriale
trasmette latitudine e longitudine GPS
invia anche contatore pacchetti
visualizza stesso formato su OLED
il ricevitore salva su SD ogni 10 s
Componenti usati:
GPS u-blox NEO-6M GPS Module
LoRa Ai-Thinker Ra-02
OLED SSD1306 OLED Display 128x64
1️⃣ Formato dati trasmessi
Pacchetto LoRa:
data,ora,lat,lon,cont
Esempio:
10/03/26,14:35:20,45.123456,9.234567,12
2️⃣ Layout OLED richiesto
Su entrambi i nodi apparirà così:
Data : 10/03/26
Ora : 14:35:20
Lat: 45.123456 Long: 9.234567
Cont: 12
Funzioni:
riceve data e ora dal PC
legge GPS
incrementa contatore
trasmette LoRa
visualizza su OLED
#include <SPI.h>
#include <LoRa.h>
#include <TinyGPS++.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
TinyGPSPlus gps;
HardwareSerial GPSserial(2);
#define SS 5
#define RST 14
#define DIO0 26
String dataPC="";
String oraPC="";
unsigned long cont=0;
void mostraOLED(float lat,float lon){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Data : ");
display.println(dataPC);
display.print("Ora : ");
display.println(oraPC);
display.println();
display.print("Lat:");
display.print(lat,6);
display.print(" Long:");
display.println(lon,6);
display.println();
display.print("Cont: ");
display.println(cont);
display.display();
}
void setup(){
Serial.begin(115200);
GPSserial.begin(9600, SERIAL_8N1, 16, 17);
Wire.begin(21,22);
display.begin(SSD1306_SWITCHCAPVCC,0x3C);
LoRa.setPins(SS,RST,DIO0);
if(!LoRa.begin(433E6)){
while(true);
}
Serial.println("Inviare da PC: gg/mm/aa hh:mm:ss");
while(dataPC==""){
if(Serial.available()){
String line=Serial.readStringUntil('\n');
dataPC=line.substring(0,8);
oraPC=line.substring(9);
}
}
}
void loop(){
while(GPSserial.available()){
gps.encode(GPSserial.read());
}
if(gps.location.isUpdated()){
cont++;
float lat=gps.location.lat();
float lon=gps.location.lng();
String packet=
dataPC+","+oraPC+","+
String(lat,6)+","+
String(lon,6)+","+
String(cont);
LoRa.beginPacket();
LoRa.print(packet);
LoRa.endPacket();
mostraOLED(lat,lon);
delay(10000);
}
}
Prompt:Mancano i pin da collegare alla scheda SD
Hai ragione 👍, completo lo schema aggiungendo tutti i collegamenti della scheda SD.
Nel ricevitore la SD usa lo stesso bus SPI del modulo LoRa, cambiando solo il pin CS (Chip Select).
Componenti coinvolti:
LoRa Ai-Thinker Ra-02
GPS u-blox NEO-6M GPS Module
OLED SSD1306 OLED Display 128x64
SD Catalex MicroSD Card Module
Funzioni:
riceve pacchetto LoRa
visualizza su OLED
salva su SD ogni 10 s
Formato salvataggio richiesto:
Data : gg/mm/aa Ora: hh.mm.ss.
Lat: valore Long: valore
Cont: valore
#include <SPI.h>
#include <LoRa.h>
#include <SD.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define LORA_SS 5
#define LORA_RST 14
#define LORA_DIO0 26
#define SD_CS 13
String data="";
String ora="";
String lat="";
String lon="";
String cont="";
unsigned long lastSave=0;
void mostraOLED()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Data : ");
display.println(data);
display.print("Ora : ");
display.println(ora);
display.println("");
display.print("Lat:");
display.print(lat);
display.print(" Long:");
display.println(lon);
display.println("");
display.print("Cont: ");
display.println(cont);
display.display();
}
void salvaSD()
{
File file = SD.open("/gpslog.txt", FILE_APPEND);
if(file)
{
file.print("Data : ");
file.print(data);
file.print(" Ora: ");
file.print(ora);
file.print(" Lat: ");
file.print(lat);
file.print(" Long:");
file.print(lon);
file.print(" Cont: ");
file.println(cont);
file.close();
Serial.println("Dato salvato su SD");
}
else
{
Serial.println("Errore apertura file");
}
}
void setup()
{
Serial.begin(115200);
Wire.begin(21,22);
if(!display.begin(SSD1306_SWITCHCAPVCC,0x3C))
{
Serial.println("OLED non trovato");
while(true);
}
display.clearDisplay();
display.display();
LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0);
if(!LoRa.begin(433E6))
{
Serial.println("Errore LoRa");
while(true);
}
Serial.println("LoRa ricevitore pronto");
if(!SD.begin(SD_CS))
{
Serial.println("Errore inizializzazione SD");
while(true);
}
Serial.println("Scheda SD pronta");
}
void loop()
{
int packetSize = LoRa.parsePacket();
if(packetSize)
{
String packet="";
while(LoRa.available())
{
packet += (char)LoRa.read();
}
Serial.println(packet);
int p1 = packet.indexOf(',');
int p2 = packet.indexOf(',', p1+1);
int p3 = packet.indexOf(',', p2+1);
int p4 = packet.indexOf(',', p3+1);
data = packet.substring(0,p1);
ora = packet.substring(p1+1,p2);
lat = packet.substring(p2+1,p3);
lon = packet.substring(p3+1,p4);
cont = packet.substring(p4+1);
mostraOLED();
if(millis() - lastSave > 10000)
{
lastSave = millis();
salvaSD();
}
}
}
Data : 10/03/26 Ora: 14:35:20 Lat: 45.123456 Long:9.234567 Cont: 12
Data : 10/03/26 Ora: 14:35:30 Lat: 45.123460 Long:9.234570 Cont: 13
Data : 10/03/26 Ora: 14:35:40 Lat: 45.123462 Long:9.234575 Cont: 14
Librerie da installare
LoRa
TinyGPS++
Adafruit SSD1306
Adafruit GFX
SD