Posso ovviare alla mancanza di Internet mediante l'utilizzo iniziale di ESP32 forniti di moduli LoRa (Trasmissioni/Ricezioni a lungo raggio) e poi ESP32 WiFi e Smartphone con App. Telegram
diagramma di collegamento completo
TRASMISSIONE - RICEZIONE
Primo STEP Trasmissione dati dall'ESP32 LoRa (1) all'ESP32 LoRa (2)
Applicazioni personali nel campo naturalistico:
Trasmissione/Ricezione di una distanza.
N.B. E' necessario sempre inserire un contatore per verificare il corretto invio dei dati.
ECCO IL SUPPORTO DI CHATGPT PER MIGLIORARE LE MIE COMPETENZE DI TRASMISSIONE DATI tramite sistema LoRa e WiFi e App. TELEGRAM.
Buongiorno, Mi generi uno sketch di trasmissione dati LoRa di:
• una distanza
• e di un contatore
con un ESP32 modulo LoRa e di un lcd
//PIN UTILIZZATI PER LA RICEZIONE LORA
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
#define BAND 433E6
//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
// FILE: TRASMISSIONE_CONTATORE_CON_SCHEDA_HELTEC_NO_SUE-FUNZIONI_31_8_2025
// SX1276 V2 Lora ESP32 LX6 Dual-Core
// Impostata SCHEDA TTGO LoRa32-OLED v2.1.6
// SCHEDA UTILIZZATA HELTEC LORA V2
// PROGRAMMA FUNZIONANTE, NECESSITA DI QUALCHE AGGIUSTAMENTO
// IDE:Arduino 1.8.14
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include "SSD1306.h"
#define SCK 5 // GPIO5 -- SX1278's SCK
#define MISO 19 // GPIO19 -- SX1278's MISO
#define MOSI 27 // GPIO27 -- SX1278's MOSI
#define SS 18 // GPIO18 -- SX1278's CS
#define RST 14 // GPIO14 -- SX1278's RESET
#define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define BAND 433E6
unsigned int counter = 0;
SSD1306 display(0x3c, 4, 15);
String rssi = "RSSI --";
String packSize = "--";
String packet ;
void setup() {
pinMode(16,OUTPUT);
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
Serial.begin(115200);
while (!Serial);
Serial.println();
Serial.println("LoRa Sender Test");
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI0);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
//LoRa.onReceive(cbk);
// LoRa.receive();
Serial.println("init ok");
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
delay(1500);
}
void loop() {
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_10);
display.drawString(0, 0, "Sending packet: ");
display.drawString(90, 0, String(counter));
Serial.println(String(counter));
display.display();
// send packet
LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();
counter++;
digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Ti preparo uno sketch Arduino per ESP32 con modulo LoRa (433 MHz) e display OLED, che riceve i dati via LoRa, mostra la distanza ricevuta e un contatore dei pacchetti sul display.
Useremo le librerie LoRa e Adafruit_SSD1306 (OLED 128x64).
// Le prime quattro righe di programma sono state inserite personalmente
// Necessita di qualche "aggiustamento" del programma inserito nell'ESP32
// La ricezione funziona correttamente
//FILE:RICEZIONE_CON_CHATGPT_31_8_2025_TTGO
// SCHEDA Impostata TTGO LoRa32-OLED
// IDE: Arduino 1.8.14
// FUNZIONANTE IL 1 9 2025
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// PIN per LoRa
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
// OLED pins
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
#define BAND 433E6 // Frequenza LoRa
// Dimensioni OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
// Variabili
String distanza = "";
int contatore = 0;
void setup() {
// Serial Monitor
Serial.begin(115200);
while (!Serial);
// OLED reset
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
// Inizializzazione OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED non trovato!"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Avvio...");
display.display();
// Config SPI per LoRa
SPI.begin(SCK, MISO, MOSI, SS);
LoRa.setPins(SS, RST, DIO0);
// Avvio LoRa
if (!LoRa.begin(BAND)) {
Serial.println("LoRa non avviato!");
while (1);
}
Serial.println("LoRa avviato OK!");
display.println("LoRa avviato OK!");
display.display();
delay(1000);
display.clearDisplay();
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) {
// Ricezione dati
String data = "";
while (LoRa.available()) {
data += (char)LoRa.read();
}
// Supponiamo che il pacchetto contenga la distanza come stringa
distanza = data;
contatore++;
// Stampa su Serial
Serial.print("Pacchetto ricevuto: ");
Serial.println(data);
// Mostra su OLED
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.print("Distanza: ");
display.println(distanza);
display.print("Pacchetti: ");
display.println(contatore);
display.display();
}
}
PROSSIMO STEP: Modifica del file di Ricezione con inserimento trasmissione PIN to PIN ad un ESP32 munito di WIFI per completare la fase del punto 2 ...... da testare
#include <SPI.h>
#include <LoRa.h>
#define LORA_SCK 5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_CS 18
#define LORA_RST 14
#define LORA_IRQ 26
// UART verso l'altro ESP32
#define TX_PIN 17
#define RX_PIN 16
HardwareSerial SerialLoRa(1);
void setup() {
Serial.begin(115200);
// Inizializzo UART verso l'ESP32 WiFi
SerialLoRa.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);
// Inizializzo SPI e LoRa
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);
if (!LoRa.begin(433E6)) { // Frequenza LoRa, es. 433 MHz
Serial.println("Errore inizializzazione LoRa!");
while (1);
}
Serial.println("LoRa inizializzato!");
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) {
String ricevuto = "";
while (LoRa.available()) {
ricevuto += (char)LoRa.read();
}
Serial.print("Ricevuto via LoRa: ");
Serial.println(ricevuto);
// Invio al secondo ESP32 via UART
SerialLoRa.println(ricevuto);
}
}
Modifica del file di Ricezione con inserimento trasmissione PIN to PIN ad un ESP32 munito di WIFI per completare la fase del punto 2 ...... da testare
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// ---- Pin SX127x LoRa ----
#define LORA_SCK 5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_CS 18
#define LORA_RST 14
#define LORA_IRQ 26
// ---- UART verso l'altro ESP32 ----
#define TX_PIN 17
#define RX_PIN 16
HardwareSerial SerialLoRa(1);
// ---- OLED SSD1306 I2C ----
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 23 // Usa un GPIO libero (NON 11). Oppure -1 se collegato a 3.3V
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
void oledPrintSplash(const char* line2) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("ESP32 LoRa RX"));
display.println(line2);
display.display();
}
void setup() {
Serial.begin(115200);
// UART verso ESP32 WiFi
SerialLoRa.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);
// I2C per OLED
Wire.begin(OLED_SDA, OLED_SCL);
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("Errore OLED SSD1306"));
while (1) delay(1);
}
oledPrintSplash("Init...");
// SPI + LoRa
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);
// *** Qui imposti la frequenza LoRa ***
if (!LoRa.begin(433E6)) { // 433E6 = 433 MHz
Serial.println("Errore inizializzazione LoRa!");
oledPrintSplash("LoRa FAIL");
while (1) delay(1);
}
Serial.println("LoRa inizializzato @433MHz!");
oledPrintSplash("LoRa OK 433MHz");
delay(800);
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) {
String ricevuto;
while (LoRa.available()) {
ricevuto += (char)LoRa.read();
}
int rssi = LoRa.packetRssi();
float snr = LoRa.packetSnr();
Serial.print("Ricevuto via LoRa: ");
Serial.println(ricevuto);
// Mostra su OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("RX LoRa:"));
display.setCursor(0, 10);
display.println(ricevuto);
display.setCursor(0, 46);
display.print(F("RSSI: "));
display.print(rssi);
display.print(F(" SNR: "));
display.println(snr, 1);
display.display();
// Invio al secondo ESP32 via UART
SerialLoRa.println(ricevuto);
}
}
in questo modo: 433E6 è chiaramente visibile nel LoRa.begin(433E6).
Puoi cambiare la frequenza a 868E6 o 915E6 se usi altre bande.
Preparami anche la versione con LoRa + OLED + WIFI + APP. TELEGRAM
Perfetto, ora ti preparo una versione aggiornata con:
LoRa @ 433 MHz per ricezione dati
OLED I²C per mostrare pacchetti e stato connessioni
WiFi per la connessione di rete
Telegram Bot per inviare messaggi al tuo canale/utente Telegram ogni volta che arriva un pacchetto LoRa
Librerie Arduino da installare:
LoRa (Sandeep Mistry)
Adafruit SSD1306
Adafruit GFX
WiFi (già inclusa in ESP32 Core)
UniversalTelegramBot (per Telegram)
ArduinoJson (versione 6.x)
Token e ChatID Telegram:
Crea un bot con BotFather su Telegram e prendi il BOTtoken.
Trova il tuo CHAT_ID usando il bot @userinfobot o simili.
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <WiFi.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// ---- Pin SX127x LoRa ----
#define LORA_SCK 5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_CS 18
#define LORA_RST 14
#define LORA_IRQ 26
// ---- OLED SSD1306 I2C ----
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 23 // -1 se RST collegato a 3.3V
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
// ---- WiFi ----
const char* ssid = "TUA_SSID";
const char* password = "TUA_PASSWORD";
// ---- Telegram ----
String BOTtoken = "INSERISCI_IL_TUO_BOT_TOKEN";
String CHAT_ID = "INSERISCI_CHAT_ID";
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// ---- UART ----
#define RX_PIN 16
#define TX_PIN 17
HardwareSerial SerialExt(1); // UART esterna
// ---- Funzione OLED ----
void oledPrint(const String &line1, const String &line2 = "", const String &line3 = "") {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(line1);
if (line2 != "") display.println(line2);
if (line3 != "") display.println(line3);
display.display();
}
void setup() {
Serial.begin(115200); // Serial di debug
SerialExt.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN); // Serial esterna RX/TX
// OLED
Wire.begin(OLED_SDA, OLED_SCL);
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println("Errore OLED!");
while (1);
}
oledPrint("ESP32 LoRa", "Init...");
// WiFi
WiFi.begin(ssid, password);
oledPrint("WiFi", "Connessione...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
oledPrint("WiFi", "Connesso!");
Serial.println("WiFi connesso!");
client.setInsecure(); // HTTPS senza certificato per Telegram
// LoRa
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);
if (!LoRa.begin(433E6)) {
oledPrint("LoRa", "Errore!");
Serial.println("Errore LoRa!");
while (1);
}
oledPrint("LoRa", "OK 433MHz");
Serial.println("LoRa inizializzato!");
delay(1000);
}
void inviaTelegram(const String &msg) {
bot.sendMessage(CHAT_ID, msg, "Markdown");
}
void processaMessaggio(const String &dato, const String &source, int rssi = 0, float snr = 0) {
// Mostra su OLED
oledPrint(source, dato, "RSSI: " + String(rssi));
// Messaggio Telegram
String messaggio = "📡 *Nuovo pacchetto " + source + ":*\n\n";
messaggio += "📥 Dato: " + dato + "\n";
if (source == "LoRa") {
messaggio += "📶 RSSI: " + String(rssi) + " dBm\n";
messaggio += "🔊 SNR: " + String(snr, 1) + " dB\n";
}
inviaTelegram(messaggio);
}
void loop() {
// --- Ricezione LoRa ---
int packetSize = LoRa.parsePacket();
if (packetSize) {
String data;
while (LoRa.available()) {
data += (char)LoRa.read();
}
int rssi = LoRa.packetRssi();
float snr = LoRa.packetSnr();
Serial.print("Ricevuto LoRa: ");
Serial.println(data);
processaMessaggio(data, "LoRa", rssi, snr);
}
// --- Ricezione UART ---
if (SerialExt.available()) {
String data = SerialExt.readStringUntil('\n');
data.trim();
if (data.length() > 0) {
Serial.print("Ricevuto UART: ");
Serial.println(data);
processaMessaggio(data, "UART");
}
}
}
Riceve dati LoRa
Riceve dati UART su RX_PIN = 16, TX_PIN = 17
Mostra su OLED il tipo di pacchetto e l’RSSI
Invia ogni messaggio ricevuto via Telegram
sperem....