geek.sonde.uk updated:
ESP32 LoRa IoT

Programmare il TTGO LoRa32 433MHz

Guida completa alla scheda TTGO LoRa32 433MHz: configurazione dell'ambiente di sviluppo, programmazione del modulo radio SX1276 e del display OLED, fino ai progetti pratici come reti mesh e gateway LoRaWAN.

~15 min read Windows / macOS / Linux Difficulty: Beginner
01

Panoramica Hardware

Il TTGO LoRa32 è una scheda di sviluppo compatta prodotta da LilyGO che integra su un unico PCB:

  • ESP32 dual-core a 240MHz, 520KB SRAM, 4MB Flash, Wi-Fi 802.11 b/g/n e Bluetooth 4.2
  • Semtech SX1276 — modulo LoRa/FSK che opera a 433, 868 o 915 MHz (in base alla variante)
  • Display OLED 0.96" da 128×64 pixel, controller SSD1306 via I2C (presente nella maggior parte dei modelli)
  • Connettore per batteria LiPo 3.7V con circuito di ricarica integrato via USB
  • Connettore antenna SMA o IPEX per antenna esterna
  • Slot MicroSD via SPI (alcuni modelli)
⚠️
Attenzione ai pin — versioni diverse

LilyGO ha prodotto diverse revisioni (v1, v1.6, v2, v2.1). Il pin mapping del modulo LoRa e dell'OLED cambia tra versioni. Verifica sempre lo schema della tua scheda sul repository GitHub di LilyGO prima di caricare il codice.

I pin più comuni per la versione v2.1 (la più diffusa attualmente) sono:

cpp pinout_v2.1.h
// LoRa SX1276 — TTGO LoRa32 v2.1
#define LORA_SCK   5
#define LORA_MISO  19
#define LORA_MOSI  27
#define LORA_SS    18
#define LORA_RST   23
#define LORA_DI0   26

// Display OLED SSD1306 via I2C
#define OLED_SDA   21
#define OLED_SCL   22
#define OLED_RST   16

// Frequenza LoRa (433 MHz per uso europeo/asiatico)
#define BAND       433E6
02

Setup Arduino IDE

Arduino IDE è il punto di partenza più semplice. Occorre aggiungere il supporto per la piattaforma ESP32 tramite il board manager.

Apri File → Preferences e incolla questo URL nel campo "Additional boards manager URLs":

url
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

Poi vai su Tools → Board → Boards Manager, cerca "esp32" e installa il pacchetto di Espressif. Seleziona la scheda TTGO LoRa32-OLED (o ESP32 Dev Module come fallback).

Installa le librerie necessarie da Tools → Manage Libraries:

  • LoRa di Sandeep Mistry — driver base per il SX1276
  • RadioLib di jgromes — alternativa più potente, supporta LoRaWAN nativo
  • Adafruit SSD1306 + Adafruit GFX Library — per il display OLED
ℹ️
Driver USB necessario

Il TTGO LoRa32 usa il chip USB-to-serial CP2104 o CH340 a seconda del modello. Se la porta COM/tty non appare, installa il driver corrispondente dal sito Silicon Labs o WCH prima di proseguire.

03

Setup PlatformIO (consigliato)

PlatformIO è l'ambiente professionale per progetti embedded. Installa l'estensione PlatformIO IDE su VS Code, poi crea un nuovo progetto. Configura il file platformio.ini come segue:

ini platformio.ini
[env:ttgo-lora32-v1]
platform = espressif32
board    = ttgo-lora32-v1
framework = arduino

lib_deps =
    sandeepmistry/LoRa
    adafruit/Adafruit SSD1306
    adafruit/Adafruit GFX Library

# Opzionale: velocità monitor seriale
monitor_speed = 115200

PlatformIO scarica automaticamente tutte le dipendenze al primo build. Usa pio run -t upload da terminale oppure il tasto Upload nell'interfaccia di VS Code.

ℹ️
MicroPython come alternativa

È possibile flashare MicroPython sull'ESP32 e usare la libreria ulora per il modulo radio. Ottimo per prototipi rapidi ma le prestazioni in tempo reale sono inferiori rispetto all'approccio Arduino/C++.

04

Primo sketch — trasmissione LoRa e OLED

Questo sketch invia un pacchetto LoRa ogni 2 secondi e mostra un messaggio sul display OLED. È il punto di partenza ideale per verificare che tutto funzioni correttamente.

cpp src/main.cpp
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Pin mapping TTGO LoRa32 v2.1
#define LORA_SCK   5
#define LORA_MISO  19
#define LORA_MOSI  27
#define LORA_SS    18
#define LORA_RST   23
#define LORA_DI0   26
#define BAND       433E6

#define OLED_SDA   21
#define OLED_SCL   22
#define OLED_RST   16

Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
int counter = 0;

void setup() {
    Serial.begin(115200);

    // Init OLED
    Wire.begin(OLED_SDA, OLED_SCL);
    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
        Serial.println("OLED non trovato");
        while (true);
    }
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.println("Avvio LoRa...");
    display.display();

    // Init LoRa
    SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_SS);
    LoRa.setPins(LORA_SS, LORA_RST, LORA_DI0);

    if (!LoRa.begin(BAND)) {
        display.println("LoRa fallito!");
        display.display();
        while (true);
    }

    display.println("LoRa OK!");
    display.display();
    Serial.println("LoRa inizializzato");
}

void loop() {
    Serial.print("Invio pacchetto #");
    Serial.println(counter);

    LoRa.beginPacket();
    LoRa.print("Ciao #");
    LoRa.print(counter);
    LoRa.endPacket();

    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("TX LoRa 433MHz");
    display.print("Pacchetto: #");
    display.println(counter);
    display.display();

    counter++;
    delay(2000);
}

Per ricevere invece di trasmettere, sostituisci il contenuto del loop() con un handler basato su LoRa.parsePacket() e leggi i dati con LoRa.readString().

05

Connessione a LoRaWAN (The Things Network)

Con la libreria RadioLib puoi connettere il TTGO LoRa32 a The Things Network (TTN) e inviare dati a un cloud IoT globale. Prima crea un account su thethingsnetwork.org e registra un nuovo device per ottenere le credenziali OTAA.

cpp src/lorawan_ttn.cpp
#include <RadioLib.h>

// Credenziali OTAA dal pannello TTN
#define JOINUI  "0000000000000000"  // JoinEUI / AppEUI
#define DEVUI   "0000000000000000"  // DevEUI
#define APPKEY  "00000000000000000000000000000000"

SX1276 radio = new Module(18, 26, 23, 33);
LoRaWANNode node(&radio, &EU433);

void setup() {
    Serial.begin(115200);
    radio.begin(433.175);

    node.beginOTAA(JOINUI, DEVUI, nullptr, APPKEY);
    node.activateOTAA();
}

void loop() {
    // Invia payload (max 51 byte su SF12)
    uint8_t payload[] = { 0x01, 0xAB };
    node.sendReceive(payload, sizeof(payload), 1);
    delay(60000);  // rispetta il duty cycle
}
⚠️
Rispetta il duty cycle

In Europa la banda 433 MHz ha un duty cycle massimo dell'1%. Con Spreading Factor 12 ogni trasmissione dura circa 2 secondi: non inviare più di un pacchetto ogni 3-4 minuti per non violare le normative ETSI.

06

Rete mesh off-grid con Meshtastic

Meshtastic è un firmware open-source che trasforma il TTGO LoRa32 in un nodo di una rete mesh cifrata, senza bisogno di infrastruttura. È molto usato da escursionisti, radioamatori e team SAR per comunicare in zone senza copertura cellulare.

Flash del firmware via web (senza installare nulla):

  1. Collegare il TTGO al PC via USB
  2. Aprire flasher.meshtastic.org con Chrome o Edge
  3. Selezionare la scheda TTGO LoRa32 v2.1 e la frequenza 433 MHz
  4. Cliccare Flash e attendere il completamento
  5. Configurare il nodo con l'app Meshtastic (Android/iOS) via Bluetooth
Funziona subito

Con due TTGO LoRa32 flashati con Meshtastic puoi avere una chat cifrata punto-punto con portata fino a 20 km in line-of-sight, consumando pochissima energia. Con la batteria LiPo da 2000mAh il dispositivo dura diversi giorni in modalità mesh attiva.

07

Verifica e troubleshooting

Apri il monitor seriale a 115200 baud e carica il primo sketch. Dovresti vedere l'output di inizializzazione:

output Serial Monitor
LoRa inizializzato
Invio pacchetto #0
Invio pacchetto #1
Invio pacchetto #2

Se il modulo LoRa non si inizializza, verifica questi punti:

  • Pin errati — il problema più comune. Confronta il pinout con la versione hardware esatta della tua scheda
  • Antenna mancante — il SX1276 non si inizializza correttamente senza antenna collegata; anche una semplice filo da 16.4 cm funziona per i test
  • Alimentazione insufficiente — alcune porte USB non erogano abbastanza corrente; prova una porta USB 3.0 o un hub alimentato
  • Libreria errata — assicurati di usare la libreria LoRa di Sandeep Mistry e non un'altra con lo stesso nome
Tutto funziona

Se vedi i pacchetti inviati sul monitor seriale e il display OLED mostra il contatore aggiornato, la scheda è configurata correttamente e pronta per i tuoi progetti.