Come costruire una semplice rete di sensori IoT con il ThinkNode M1 & M2 Meshtastic dispositivi di Elecrow.
Gli M1 e M2 sono piccoli transceiver LoRa che permettono di inviare messaggi di testo su una Meshtastic rete mesh. Le applicazioni comuni includono la comunicazione in aree remote senza copertura Wi-Fi, situazioni di emergenza quando l’infrastruttura di comunicazione è fuori uso o reti di sensori IoT.
In questo tutorial ti mostro come inviare dati ambientali come temperatura, umidità e pressione da un ThinkNode M2 a un ThinkNode M1, costruendo essenzialmente una piccola rete di sensori IoT.
Cos’è Meshtastic?
Meshtastic è un progetto open-source che utilizza radio LoRa per formare reti mesh decentralizzate con l’obiettivo di trasportare messaggi di testo. I messaggi vengono automaticamente rilanciati da un nodo all’altro, rendendo possibile comunicare su lunghe distanze senza infrastrutture centrali come il Wi-Fi.

Poiché Meshtastic si basa su LoRa, una banda di frequenza libera, non è necessaria una licenza per usarlo e i dispositivi Meshtastic tendono a essere economici. Vedi il Long range communication with LoRa SX1276 and ESP32 tutorial per saperne di più su LoRa.
Il principale svantaggio di LoRa è che si possono trasmettere solo piccole quantità di dati (messaggi di testo). Inoltre, le lunghe distanze si raggiungono solo se l’area è coperta da un numero sufficiente di nodi Meshtastic abbastanza vicini che possono rilanciare i messaggi.
Meshtastic vs LoRaWAN
Se conosci LoRa, potresti aver sentito parlare anche di LoRaWAN. Meshtastic e LoRaWAN sono entrambe tecnologie che utilizzano radio LoRa, ma hanno architetture e scopi diversi.
LoRaWAN è un protocollo di rete a bassa potenza e ampia copertura, progettato per comunicazioni a lunga distanza e bassa larghezza di banda, tipicamente per collegare dispositivi a internet tramite gateway. Vedi il nostro LoRaWAN with Thinknode G1 Gateway tutorial. Meshtastic, invece, crea reti mesh decentralizzate e ad-hoc, permettendo ai dispositivi di comunicare direttamente tra loro senza dipendere da infrastrutture come i gateway.
LoRaWAN usa una topologia a stella-di-stelle con dispositivi finali che comunicano tramite gateway a un server centrale. Meshtastic forma una rete mesh dove i dispositivi rilanciano i messaggi tra loro, creando una rete decentralizzata e auto-riparante.
LoRaWAN è adatto per applicazioni IoT su larga scala come smart city e monitoraggio ambientale, dove i dispositivi devono trasmettere dati a un server centrale. Meshtastic è più indicato per comunicazioni off-grid, situazioni di emergenza o dove l’infrastruttura è limitata, come in aree remote o durante disastri.
Cosa sono ThinkNode M1 & M2
I ThinkNode M1 & M2 e dispositivi Meshtastic simili sono essenzialmente come Walkie-Talkie ma per testo. Contengono un transceiver LoRa e usano il protocollo Meshtastic per trasportare dati tra dispositivi/nodi. L’immagine sotto mostra il ThinkNode M1:

Noterai che il dispositivo ha solo uno schermo ma nessuna tastiera. Per inviare messaggi devi installare l’app Meshtastic sul tuo telefono e collegarla via Bluetooth al ThinkNode. Puoi quindi digitare messaggi sul telefono e farli trasmettere dal ThinkNode sulla rete LoRa/Meshtastic ad altri dispositivi Meshtastic.
Nota che esistono altri dispositivi Meshtastic devices con tastiera integrata o touchscreen che eseguono il Meshtastic UI direttamente sul dispositivo. In questo caso non serve un telefono aggiuntivo collegato per inviare messaggi.
Confronto tra ThinkNode M1 & M2
I dispositivi Meshtastic si basano su microcontrollori nRF52 o ESP32. I dispositivi basati su nRF52 consumano meno energia e sono più adatti per applicazioni alimentate a energia solare o portatili. Quelli basati su ESP32 offrono più potenza di calcolo, connettività Wi-Fi e sono più economici.
Questa è anche la principale differenza tra ThinkNode M1 & M2. L’M1 usa il processore nRF52840 ed è progettato per una maggiore autonomia grazie a una batteria più grande e uno schermo E-Ink. L’M2 usa il più potente ESP32-S3 come microcontrollore ed è generalmente più facile da programmare/personalizzare se vieni dal mondo Arduino. La tabella seguente confronta le caratteristiche principali dei due dispositivi:

Nelle prossime due sezioni diamo un’occhiata veloce all’M1 e all’M2, singolarmente. Per un confronto più dettagliato vedi il confronto di M1 & M2 sul sito Elecrow.
ThinkNode M1
Come detto sopra, il ThinkNode M1 usa il nRF52840 come processore principale. Ha un chip SX1262 per la comunicazione LoRa, una batteria ricaricabile da 1200mAh , un display EPD da 1,54 pollici con retroilluminazione, un piccolo buzzer e un modulo GPS integrato. L’immagine sotto mostra il dispositivo:

La ricarica avviene tramite porta USB Type-C e il dispositivo può essere configurato con l’app Meshtastic, che comunica con il dispositivo via Bluetooth. L’app permette anche la condivisione di mappe e posizioni, il monitoraggio dello stato della rete, l’esportazione dei dati e altro. Per maggiori informazioni guarda il Radio Configuration Website.
Tutti i dettagli tecnici del ThinkNode M1 si trovano nel ThinkNode M1 Datasheet e per informazioni generali sull’uso vedi il ThinkNode M1 Manual.
ThinkNode M2
Il ThinkNode M2 usa l’ESP32-S3 come processore principale, più potente del nRF52840. Tuttavia, a causa del processore e della batteria più piccola da 1000mAh, l’autonomia è inferiore. Inoltre, l’M2 usa un display OLED da 1,3 pollici, che consuma più energia. La foto sotto mostra il ThinkNode M2:

Nota che l’M2 non ha il modulo GPS dell’M1 ma esegue lo stesso software ed è configurato con l’app Meshtastic.
Tutti i dettagli tecnici del ThinkNode M2 si trovano nel ThinkNode M2 Datasheet e per informazioni generali sull’uso vedi il ThinkNode M2 Manual.
Collegare sensori a un nodo Meshtastic
Il firmware Meshtastic supporta sensori semplici, detti Detection Sensors collegati a pin GPIO specifici o una selezione di sensori Complex sensors collegati via I2C e configurati nel Telemetry Module. Questa selezione include il sensore ambientale BM680 che voglio usare in questo tutorial.
Purtroppo, mentre il modulo ThinkNode M2 espone alcuni pin GPIO, non espone i pin per I2C – almeno per quanto ho potuto vedere. Secondo il Datasheet dovrebbero essere IO15_SCL e IO16_SDA ma non compaiono nella tabella dei pin GPIO disponibili:

Nota che i pin GPIO non sono accessibili dall’esterno. Devi aprire il case del ThinkNode M2 o procurarti il modulo nudo (senza case). L’immagine sotto mostra il fronte e il retro del modulo ThinkNode M2 nudo:

Come collegare un sensore ambientale BM680 a un ThinkNode M2? Potremmo modificare il firmware Meshtastic per configurare pin I2C aggiuntivi o diversi, ma non sarebbe semplice.
In alternativa, se potessimo programmare l’ESP32-lite per inviare messaggi usando il protocollo Meshtastic, non avremmo bisogno del ThinkNode M2. Ma non ho trovato una libreria che lo permetta.
Rimane quindi la terza opzione, che sembra essere la soluzione comune a questo problema. Configuriamo il ThinkNode M2 per inoltrare messaggi di testo inviati tramite l’interfaccia seriale (UART).
Questo significa però che serve un microcontrollore aggiuntivo, qui un ESP32-lite. L’ESP32-lite è collegato al BME680 per elaborare i dati e li invia come messaggi di testo via seriale al ThinkNode M2. Questo è il metodo che useremo per costruire una semplice rete IoT come descritto nella sezione successiva.
Costruire una rete IoT con ThinkNodes
La nostra piccola rete di sensori IoT è composta da un ESP32-lite con sensore BME680 collegato, un ThinkNode M2 che invia dati ambientali e un ThinkNode M1 che riceve e visualizza i dati. L’immagine seguente mostra l’architettura del sistema:

Il sensore BME680 collegato all’ESP32-lite misura temperatura, umidità e pressione. L’ESP32-lite comunica con un ThinkNode M2 tramite interfaccia seriale (UART).
I dati ambientali dal BME680 vengono inviati come messaggi di testo dall’ESP32-lite al ThinkNode M2. Il ThinkNode M2 poi trasmette questi dati wireless via LoRa al ThinkNode M1, che li visualizza sullo schermo.
Collegare ESP32-lite con ThinkNode M2 via UART
Ho il ThinkNode M2 con il case e, sebbene sia facile aprirlo (basta rimuovere le quattro viti sul retro), la scheda sembra incollata. Non sono riuscito a rimuovere il modulo senza rischiare di romperlo.
Quindi non ho potuto saldare un header ai fori GPIO sulla scheda come previsto. Ho invece collegato fili con clip a IO18, IO19 e GND come mostrato nella foto sotto:

Questi fili li ho poi collegati all’ESP32-lite come mostrato nello schema elettrico sotto:

IO17 dell’ESP32 è collegato a IO18 del M2, e IO16 dell’ESP32 è collegato a IO19 del M2. Con questo cablaggio possiamo stabilire una comunicazione seriale (UART) tra ESP32-lite e ThinkNode M2.
Collegare ESP32-lite con BME680 a ThinkNode M2
Ora dobbiamo collegare il BME680 all’ESP32-lite. L’immagine sotto mostra il cablaggio completo del BME680 con ESP32-lite e ThinkNode M2:

Il BME680 supporta I2C ed è quindi collegato ai pin I2C di default (SDA=19, SCL=23) dell’ESP32-lite. Serve anche collegare l’alimentazione (3.3V e massa). Se vuoi più informazioni sul BME680 guarda il BME680 Environmental Sensor with Arduino, il Measure Air Quality with BME680 e il Send Environmental Data with LoRa tutorial.
La foto seguente mostra il cablaggio completo su breadboard includendo ThinkNode M2 e ThinkNode M1:

Configurare ThinkNode M1 e M2
Prima di poter inviare dati tra i due ThinkNode dobbiamo configurarli. In particolare, dobbiamo impostare la frequenza LoRa e assicurarci che sia la stessa per entrambi i nodi.
Per configurare un ThinkNode, apri l’app Meshtastic sul tuo telefono, connettila via Bluetooth al ThinkNode (riceverai un codice) e poi clicca sui tre puntini in alto a sinistra per aprire il menu. Vedi il Wiki for the ThinkNode M1 e il Wiki for the ThinkNode M2 se ti servono informazioni più dettagliate.
Configurare la frequenza LoRa
Nel menu seleziona “Radio configuration” e poi “LoRa”, che aprirà la pagina “LoRa Config”:

Qui puoi impostare la Regione con la frequenza associata. Devi selezionare la tua regione/paese e devi fare lo stesso per entrambi i ThinkNode M1 e M2, altrimenti non possono comunicare!
Nota che le frequenze LoRa consentite dipendono dal paese (frequencies). Sono 868MHz per l’Europa, 915MHz per il Nord America e 433MHz per l’Asia. Poiché vivo in Europa, ho selezionato “European Union 868MHz” come regione/frequenza nello screenshot sopra.
Se hai problemi con la configurazione ci sono molti tutorial che aiutano con l’installazione. Per esempio, vedi il ThinkNode M1/M2 Review – Getting started with Meshtastic tutorial. O il Meshtastic Configuration info.
Una volta configurati, verifica di poter inviare messaggi di testo dal ThinkNode M2 al ThinkNode M1. Se funziona, possiamo configurare l’interfaccia seriale del ThinkNode M2.
Configurare l’interfaccia seriale
Vogliamo collegare l’ESP32-lite via interfaccia seriale al ThinkNode M2. Questo richiede una configurazione aggiuntiva del ThinkNode M2.
Apri il menu cliccando sui tre puntini (come prima). Seleziona “Radio Configuration” e poi “Serial”. Si aprirà la pagina “Serial Config” come mostrato sotto:

Attiva “Serial enabled” e imposta i pin GPIO per la comunicazione seriale (RX e TX). Ho scelto RX=18 e TX=19. Imposta la velocità di trasmissione a 115200 e la modalità su “TEXTMSG”. Questa modalità dice al ThinkNode di inoltrare/trasmettere qualsiasi testo ricevuto via interfaccia seriale.
E con questo siamo finalmente pronti a scrivere un po’ di codice che ci permetta di trasmettere dati.
Inviare dati via ThinkNode M2 a M1
Iniziamo con un codice di test semplice che crea un contatore in esecuzione sull’ESP32-lite, che viene inviato via comunicazione seriale al ThinkNode M2, che poi lo trasmette via LoRa al ThinkNode M1. Qui sotto il codice per l’ESP32-lite:
#define TX_PIN 17 // ESP32 TX -> M2 RX 18
#define RX_PIN 16 // ESP32 RX <- M2 TX 19
#define BAUD_RATE 115200
#define SEND_PERIOD (60 * 1000)
HardwareSerial serial2(2);
void setup() {
Serial.begin(115200);
serial2.begin(BAUD_RATE, SERIAL_8N1, RX_PIN, TX_PIN);
}
void loop() {
static int cnt = 0;
static char msg[128];
sprintf(msg, "counter=%d", cnt++);
serial2.println(msg); // Sending to ThinkNode M2
Serial.println(msg);
delay(SEND_PERIOD);
}
Carica questo codice sull’ESP32-lite, accendi i ThinkNode M1 e M2 e dovresti ricevere ogni minuto un messaggio di testo “counter=…” sul ThinkNode M1.
Analizziamo il codice. Iniziamo definendo i pin per l’interfaccia seriale e le costanti per la velocità di trasmissione e il tempo tra le trasmissioni (60 secondi):
#define TX_PIN 17 // ESP32 TX -> M2 RX 18 #define RX_PIN 16 // ESP32 RX <- M2 TX 19 #define BAUD_RATE 115200 #define SEND_PERIOD (60 * 1000)
Devi scegliere pin per la comunicazione seriale supportati dal tuo microcontrollore. Nel caso dell’ESP32-lite ci sono tre interfacce seriali hardware (0,1,2) e io uso la terza:
HardwareSerial serial2(2);
Nella funzione setup avviamo la comunicazione seriale con il Serial Monitor per il debug e la comunicazione seriale con il ThinkNode M2, con i pin e la velocità definiti:
void setup() {
Serial.begin(115200);
serial2.begin(BAUD_RATE, SERIAL_8N1, RX_PIN, TX_PIN);
}
Per la funzione loop: incrementiamo un contatore, creiamo un messaggio di testo con il valore del contatore, lo stampiamo sul Serial Monitor e lo inviamo anche via seriale al ThinkNode M2. Il delay alla fine assicura che questo avvenga ogni minuto:
void loop() {
static int cnt = 0;
static char msg[128];
sprintf(msg, "counter=%d", cnt++);
serial2.println(msg); // Sending to M2
Serial.println(msg);
delay(SEND_PERIOD);
}
Sul display del ThinkNode M1 dovresti vedere il contatore:

Nota che potresti dover premere il pulsante Function per aggiornare il display. Se funziona possiamo procedere a inviare dati reali.
Codice per inviare dati ambientali
Il codice seguente legge dati ambientali come temperatura, umidità e pressione dal sensore BME680 e li invia al ThinkNode M2, che a sua volta li inoltra al ThinkNode M1:
#include "Adafruit_BME680.h"
#define SEALEVELPRESSURE_HPA (1013.25)
#define TX_PIN 17 // ESP32 TX -> M2 RX 18
#define RX_PIN 16 // ESP32 RX <- M2 TX 19
#define BAUD_RATE 115200
#define SEND_PERIOD (60 * 1000)
HardwareSerial serial2(2);
Adafruit_BME680 bme;
void setup() {
Serial.begin(115200);
serial2.begin(BAUD_RATE, SERIAL_8N1, RX_PIN, TX_PIN);
bme.begin();
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop() {
static char msg[128];
if (bme.performReading()) {
sprintf(msg, "temperature: %.0f C\nhumidity: %.1f %%\npressure: %.0f hPa\n",
bme.temperature, bme.humidity, bme.pressure/100.0);
serial2.println(msg); // Sending to ThinkNode M2
Serial.println(msg);
delay(SEND_PERIOD);
}
}
Il codice è una semplice estensione del precedente. Aggiungiamo solo l’inizializzazione del BME680 nella funzione setup :
void setup() {
...
bme.begin();
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
e creiamo il messaggio di testo dalle misurazioni del BME680 nella funzione loop quando i dati sono disponibili:
void loop() {
...
if (bme.performReading()) {
sprintf(msg, "temperature: %.0f C\nhumidity: %.1f %%\npressure: %.0f hPa\n",
bme.temperature, bme.humidity, bme.pressure/100.0);
serial2.println(msg); // Sending to ThinkNode M2
...
}
}
Nota che devi avere installata la libreria Adafruit BME680. Essa fornisce tutte le funzioni essenziali per controllare il sensore BME680.

Se vuoi saperne di più sul BME680 e sul codice corrispondente guarda i tutorial BME680 Environmental Sensor with Arduino, Measure Air Quality with BME680 e Send Environmental Data with LoRa.
Sul display del ThinkNode M1 dovresti ora ricevere i seguenti dati ambientali:

E questo è tutto. Ora hai una piccola rete di sensori IoT Meshtastic con un sensore BME680 e i ThinkNode M1 e M2 come nodi Meshtastic. Puoi facilmente estendere la portata e le funzionalità di questa rete aggiungendo altri nodi Meshtastic o sensori.
Conclusioni e commenti
In questo articolo hai imparato come costruire una piccola rete di sensori IoT con un sensore BME680 e i ThinkNode M1 e M2 Meshtastic.
La rete mesh Meshtastic ti permette di inviare dati di sensori su distanze maggiori rispetto al solo LoRa e non richiede Wi-Fi o strutture di comunicazione simili. Tuttavia, richiede altri nodi Meshtastic nelle vicinanze che possano inoltrare i dati. A luglio 2025 il numero di nodi Meshtastic nella maggior parte delle aree non è ancora sufficiente per una copertura completa. Vedi il Meshmap.
Tra M1 e M2 ho raggiunto una distanza di circa 200-300 metri prima che i dispositivi perdessero la connessione. Per un test di portata dettagliato e un confronto leggi il post ThinkNode M1/M2 Review – Getting started with Meshtastic di Jean-Luc Aufranc.
Se vuoi trasmettere dati di sensori su qualche centinaio di metri è meglio usare solo LoRa puro. Sarà più semplice e ti darà più flessibilità. Vedi il tutorial Send Environmental Data with LoRa su come fare.
Per una portata maggiore o configurazioni con molti sensori che devono inviare misurazioni a internet, LoRaWAN è un’altra opzione. Vedi il tutorial LoRaWAN with Thinknode G1 Gateway per maggiori informazioni su questo argomento. E se vuoi solo trasmettere informazioni via internet, il tutorial ESP32 send Telegram Message potrebbe esserti utile.
Nonostante le limitazioni attuali e la copertura relativamente piccola, Meshtastic è una tecnologia divertente con cui sperimentare e la comunità sta crescendo. Ti consiglio vivamente di leggere altro About Meshtastic.
Se hai domande sentiti libero di lasciarle nella sezione commenti.
Buon divertimento con il tinkering ; )

