Cómo construir una sencilla red de sensores IoT con el ThinkNode M1 & M2 Meshtastic dispositivos por Elecrow.
El M1 y M2 son pequeños transceptores LoRa que te permiten enviar mensajes de texto a través de una Meshtastic red mallada. Las aplicaciones comunes son la comunicación en áreas remotas sin cobertura Wi-Fi, situaciones de emergencia cuando la infraestructura de comunicación está caída o redes de sensores IoT.
En este tutorial te muestro cómo enviar datos ambientales como temperatura, humedad y presión desde un ThinkNode M2 a un ThinkNode M1, construyendo esencialmente una pequeña red de sensores IoT.
¿Qué es Meshtastic?
Meshtastic es un proyecto de código abierto que utiliza radios LoRa para formar redes malladas descentralizadas con el objetivo de transportar mensajes de texto. Los mensajes se retransmiten automáticamente de un nodo a otro, haciendo posible comunicarse a larga distancia sin infraestructura central como Wi-Fi.

Como Meshtastic se basa en LoRa, una banda de frecuencia libre, no necesitas licencia para usarlo y los dispositivos Meshtastic suelen ser económicos. Consulta el Long range communication with LoRa SX1276 and ESP32 tutorial para aprender más sobre LoRa.
La principal desventaja de LoRa es que solo puedes transmitir pequeñas cantidades de datos (mensajes de texto). Además, las largas distancias solo se logran si el área está cubierta con un número suficiente de nodos Meshtastic lo suficientemente cercanos que puedan retransmitir mensajes.
Meshtastic versus LoRaWAN
Si conoces LoRa, quizás también hayas oído hablar de LoRaWAN. Meshtastic y LoRaWAN son tecnologías que utilizan radios LoRa, pero tienen arquitecturas y propósitos diferentes.
LoRaWAN es un protocolo de red de área amplia y bajo consumo diseñado para comunicación de largo alcance y bajo ancho de banda, conectando típicamente dispositivos a internet vía gateways. Consulta nuestro LoRaWAN with Thinknode G1 Gateway tutorial. Meshtastic, en cambio, crea redes malladas descentralizadas y ad-hoc, permitiendo que los dispositivos se comuniquen directamente entre sí sin depender de infraestructura como gateways.
LoRaWAN usa una topología estrella-de-estrellas con dispositivos finales comunicándose a través de gateways hacia un servidor central. Meshtastic forma una red mallada donde los dispositivos retransmiten mensajes entre sí, creando una red descentralizada y autorreparable.
LoRaWAN es adecuado para aplicaciones IoT a gran escala como ciudades inteligentes y monitoreo ambiental, donde los dispositivos necesitan transmitir datos a un servidor central. Meshtastic es mejor para comunicación fuera de red, situaciones de emergencia o donde la infraestructura es limitada, como en áreas remotas o durante desastres.
¿Qué son ThinkNode M1 & M2?
Los ThinkNode M1 & M2 y dispositivos Meshtastic similares son esencialmente como walkie-talkies pero para texto. Contienen un transceptor LoRa y usan el protocolo Meshtastic para transportar datos entre dispositivos/nodos. La imagen abajo muestra el ThinkNode M1:

Notarás que el dispositivo solo tiene pantalla pero no teclado. Para enviar mensajes necesitas instalar la app Meshtastic en tu móvil y conectarla vía Bluetooth al ThinkNode. Entonces puedes escribir mensajes en tu teléfono y enviarlos a través del ThinkNode por la red LoRa/Meshtastic a otros dispositivos Meshtastic.
Ten en cuenta que hay otros dispositivos Meshtastic devices con teclado integrado o pantalla táctil que ejecutan el Meshtastic UI directamente en el dispositivo. En ese caso no necesitas un móvil adicional conectado para enviar mensajes.
Comparación de ThinkNode M1 & M2
Los dispositivos Meshtastic se basan en microcontroladores nRF52 o ESP32. Los basados en nRF52 consumen menos energía y son mejores para aplicaciones con energía solar o de mano. Los basados en ESP32 ofrecen más potencia, conectividad Wi-Fi y son más baratos.
Esta es también la principal diferencia entre ThinkNode M1 & M2. El M1 usa el procesador nRF52840 y está diseñado para mayor duración gracias a una batería más grande y pantalla E-Ink. El M2 usa el más potente ESP32-S3 y es más fácil de programar/personalizar si vienes del mundo Arduino. La siguiente tabla compara las características principales de ambos dispositivos:

En las siguientes dos secciones echamos un vistazo rápido al M1 y M2 por separado. Para una comparación más detallada, consulta la comparación de M1 & M2 en la web de Elecrow.
ThinkNode M1
Como se mencionó, el ThinkNode M1 usa el nRF52840 como procesador principal. Tiene un chip SX1262 para comunicación LoRa, batería recargable de 1200mAh , pantalla EPD de 1.54 pulgadas con retroiluminación, un pequeño zumbador y módulo GPS integrado. La imagen abajo muestra el dispositivo:

La carga es vía puerto USB Tipo-C y el dispositivo se configura con la app Meshtastic, que se comunica vía Bluetooth. La app también permite compartir mapas y ubicación, monitorear estado de red, exportar datos y más. Para más info consulta el Radio Configuration Website.
Todos los detalles técnicos del ThinkNode M1 están en el ThinkNode M1 Datasheet y para información general de uso consulta el ThinkNode M1 Manual.
ThinkNode M2
El ThinkNode M2 usa el ESP32-S3 como procesador principal, que es más potente que el nRF52840. Debido al procesador y la batería más pequeña de 1000mAh, la duración es menor. Además, el M2 usa una pantalla OLED de 1.3 pulgadas, que consume más energía. La foto abajo muestra el ThinkNode M2:

Ten en cuenta que el M2 no tiene módulo GPS como el M1 pero ejecuta el mismo software y también se configura con la app Meshtastic.
Todos los detalles técnicos del ThinkNode M2 están en el ThinkNode M2 Datasheet y para información general de uso consulta el ThinkNode M2 Manual.
Conectando sensores a un nodo Meshtastic
El firmware Meshtastic soporta sensores simples, llamados Detection Sensors conectados a pines GPIO específicos o una selección de sensores Complex sensors conectados vía I2C y configurados en el Telemetry Module. Esta selección incluye el sensor ambiental BM680 que quiero usar en este tutorial.
Desafortunadamente, aunque el módulo ThinkNode M2 expone algunos pines GPIO, no expone los pines para I2C, al menos que yo haya visto. Según el Datasheet deberían ser IO15_SCL y IO16_SDA, pero no aparecen en la tabla de pines GPIO disponibles:

Ten en cuenta que los pines GPIO no son accesibles desde el exterior. Debes abrir la carcasa del ThinkNode M2 o conseguir el módulo sin carcasa. La imagen abajo muestra el frente y reverso del módulo ThinkNode M2 sin carcasa:

Entonces, ¿cómo conectar un sensor ambiental BM680 a un ThinkNode M2? Podríamos modificar el firmware Meshtastic para configurar pines I2C adicionales u otros, pero no sería fácil.
Alternativamente, si pudiéramos programar el ESP32-lite para enviar mensajes usando el protocolo Meshtastic, no necesitaríamos el ThinkNode M2. Pero no he encontrado una librería que me permita hacer esto.
Eso nos deja con la tercera opción, que parece ser la forma común de resolver este problema. Configuramos el ThinkNode M2 para reenviar mensajes de texto enviados vía interfaz serial (UART).
Esto significa, sin embargo, que necesitamos un microcontrolador adicional, aquí un ESP32-lite. El ESP32-lite está conectado al BME680 para procesar sus datos y los envía como mensaje de texto por la interfaz serial al ThinkNode M2. Este es el método que usaremos para construir una red IoT simple como se describe en la siguiente sección.
Construyendo una red IoT con ThinkNodes
Nuestra pequeña red de sensores IoT está compuesta por un ESP32-lite con un sensor BME680, un ThinkNode M2 que envía datos ambientales y un ThinkNode M1 que recibe y muestra los datos. La siguiente imagen muestra la arquitectura del sistema:

El sensor BME680 conectado a un ESP32-lite mide temperatura, humedad y presión. El ESP32-lite se comunica con un ThinkNode M2 vía interfaz serial (UART).
Los datos ambientales del BME680 se envían como mensajes de texto desde el ESP32-lite al ThinkNode M2. El ThinkNode M2 luego transmite estos datos inalámbricamente vía LoRa al ThinkNode M1, que los muestra en su pantalla.
Conectando ESP32-lite con ThinkNode M2 vía UART
Tengo el ThinkNode M2 con la carcasa y aunque es fácil abrirla (solo quitar los cuatro tornillos traseros), la placa parece estar pegada. No pude retirar el módulo sin riesgo de romperlo.
Esto significa que no pude soldar un header a los agujeros GPIO en la placa como planeado. En su lugar conecté cables con clips a IO18, IO19 y GND como se muestra en la foto abajo:

Estos cables los conecté al ESP32-lite como muestra el diagrama de conexiones abajo:

IO17 del ESP32 está conectado a IO18 del M2, e IO16 del ESP32 está conectado a IO19 del M2. Con este cableado podemos establecer comunicación serial (UART) entre el ESP32-lite y el ThinkNode M2.
Conectando ESP32-lite con BME680 al ThinkNode M2
Luego, necesitamos conectar el BME680 al ESP32-lite. La imagen abajo muestra el cableado completo del BME680 con el ESP32-lite y el ThinkNode M2:

El BME680 soporta I2C y por eso está conectado a los pines I2C por defecto (SDA=19, SCL=23) del ESP32-lite. También necesitamos conectar la alimentación (3.3V y tierra). Si necesitas más información sobre el BME680, consulta el BME680 Environmental Sensor with Arduino, el Measure Air Quality with BME680 y el Send Environmental Data with LoRa tutoriales.
La siguiente foto muestra el cableado completo en una protoboard incluyendo ThinkNode M2 y ThinkNode M1:

Configurando ThinkNode M1 y M2
Antes de enviar datos entre los dos ThinkNodes, debemos configurarlos. Específicamente, establecer la frecuencia LoRa y asegurarnos que sea la misma para ambos nodos.
Para configurar un ThinkNode, abre la app Meshtastic en tu móvil, conéctala vía Bluetooth al ThinkNode (te dará un código) y luego haz clic en los tres puntos en la esquina superior izquierda para abrir el menú. Consulta el Wiki for the ThinkNode M1 y el Wiki for the ThinkNode M2 si necesitas información más detallada.
Configurando la frecuencia LoRa
En el menú selecciona «Radio configuration» y luego «LoRa», lo que abrirá la página «LoRa Config»:

Ahí puedes establecer la Región con la frecuencia asociada. Debes seleccionar tu región/país y hacer lo mismo para ambos ThinkNodes M1 y M2, ¡de lo contrario no podrán comunicarse!
Ten en cuenta que las frecuencias LoRa permitidas dependen del país (frequencies). Es 868MHz para Europa, 915MHz para Norteamérica y 433MHz para Asia. Como vivo en Europa, seleccioné «European Union 868MHz» como región/frecuencia en la captura de pantalla arriba.
Si tienes problemas con la configuración, hay muchos tutoriales que ayudan con la instalación. Por ejemplo, consulta el ThinkNode M1/M2 Review – Getting started with Meshtastic tutorial. O el Meshtastic Configuration info.
Una vez configurados, deberías verificar que puedes enviar mensajes de texto del ThinkNode M2 al ThinkNode M1. Si funciona, podemos configurar la interfaz serial del ThinkNode M2.
Configurando la interfaz serial
Queremos conectar el ESP32-lite vía interfaz serial al ThinkNode M2. Esto requiere configuración adicional del ThinkNode M2.
Abre el menú haciendo clic en los tres puntos (como antes). Selecciona «Radio Configuration» y luego «Serial». Esto abrirá la página «Serial Config» como se muestra abajo:

Activa «Serial enabled» y establece los pines GPIO para comunicación serial (RX y TX). Elegí RX=18 y TX=19. Configura la velocidad en baudios a 115200 y el modo a «TEXTMSG». Este modo indica al ThinkNode que reenvíe/transmita cualquier texto que reciba por la interfaz serial.
Y con eso finalmente estamos listos para escribir algo de código que nos permita transmitir datos.
Enviar datos vía ThinkNode M2 a M1
Comenzamos con un código de prueba simple que crea un contador en el ESP32-lite, que se envía vía comunicación serial al ThinkNode M2, que luego lo transmite vía LoRa al ThinkNode M1. Abajo está el código para el 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);
}
Sube este código al ESP32-lite, enciende los ThinkNode M1 y M2 y deberías recibir cada minuto un mensaje de texto «counter=…» en el ThinkNode M1.
Veamos el código más de cerca. Empezamos definiendo los pines para la interfaz serial y constantes para la velocidad en baudios y el tiempo entre transmisiones (60 segundos):
#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)
Debes elegir pines para comunicación serial que soporte tu microcontrolador. En el caso del ESP32-lite hay tres interfaces seriales hardware (0,1,2) y estoy usando la tercera:
HardwareSerial serial2(2);
En la función setup iniciamos la comunicación serial al Monitor Serial para depuración y la comunicación serial al ThinkNode M2, con los pines y velocidad definidos:
void setup() {
Serial.begin(115200);
serial2.begin(BAUD_RATE, SERIAL_8N1, RX_PIN, TX_PIN);
}
En la función loop incrementamos un contador, creamos un mensaje de texto con el valor del contador, lo imprimimos en el Monitor Serial y también lo enviamos vía interfaz serial al ThinkNode M2. El delay al final asegura que esto ocurra cada 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);
}
En la pantalla del ThinkNode M1 deberías ver el contador:

Ten en cuenta que puede que tengas que presionar el botón Función para que la pantalla se actualice. Si esto funciona, podemos proceder a enviar datos reales.
Código para enviar datos ambientales
El siguiente código lee datos ambientales como temperatura, humedad y presión del sensor BME680 y los envía al ThinkNode M2, que a su vez los reenvía 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);
}
}
El código es una simple extensión del anterior. Solo añadimos la inicialización del BME680 en la función 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
}
y creamos el mensaje de texto con las mediciones del BME680 en la función loop cuando hay mediciones disponibles:
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
...
}
}
Ten en cuenta que necesitarás tener instalada la librería Adafruit BME680. Esta provee todas las funciones esenciales para controlar el sensor BME680.

Si quieres aprender más sobre el BME680 y el código correspondiente, consulta los tutoriales BME680 Environmental Sensor with Arduino, Measure Air Quality with BME680 y Send Environmental Data with LoRa.
En la pantalla del ThinkNode M1 deberías ahora recibir los siguientes datos ambientales:

Y eso es todo. Ahora tienes una pequeña red de sensores IoT Meshtastic con un sensor BME680 y los ThinkNodes M1 y M2 como nodos Meshtastic. Podrías ampliar fácilmente el rango y la función de esta red añadiendo más nodos o sensores Meshtastic.
Conclusiones y comentarios
En este artículo aprendiste cómo construir una pequeña red de sensores IoT con un sensor BME680 y los ThinkNodes M1 y M2 Meshtastic.
La red mallada Meshtastic te permite enviar datos de sensores a mayores distancias que LoRa solo y no requiere Wi-Fi ni infraestructura similar. Sin embargo, necesita otros nodos Meshtastic cercanos que retransmitan datos. A julio de 2025, el número de nodos Meshtastic en la mayoría de áreas no es suficiente para cobertura completa. Consulta el Meshmap.
Entre el M1 y M2, alcancé una distancia de unos 200 a 300 metros antes de que los dispositivos perdieran conexión. Para una prueba de rango detallada y comparación, lee el post ThinkNode M1/M2 Review – Getting started with Meshtastic de Jean-Luc Aufranc.
Si quieres transmitir datos de sensores a unos pocos cientos de metros, es mejor usar LoRa puro. Será más simple y te dará más flexibilidad. Consulta el tutorial Send Environmental Data with LoRa sobre cómo hacerlo.
Para un rango mayor o configuraciones con muchos sensores que necesiten enviar mediciones a internet, LoRaWAN es otra opción. Consulta el tutorial LoRaWAN with Thinknode G1 Gateway para más información. Y si solo quieres transmitir información por internet, el tutorial ESP32 send Telegram Message puede ser útil.
A pesar de sus limitaciones actuales y cobertura comparativamente pequeña, Meshtastic es una tecnología divertida para experimentar y la comunidad está creciendo. Te recomiendo leer más About Meshtastic.
Si tienes preguntas, no dudes en dejarlas en la sección de comentarios.
¡Feliz bricolaje ; )

