Primeros pasos con Meshtastic


Compramos un módulo compatible con Meshtastic, como el popular Heltec LoRa v3, instalamos la app y… ¡sorpresa!
En lugar de la interfaz normal con opciones de radio, usuario y red, solo aparece el botón «Cerrar».
Aunque la app detecta el dispositivo por Bluetooth, algo falla: hay un problema de comunicación o configuración que impide acceder al menú habitual y, por tanto, no podemos usar el nodo.

No te preocupes, este error es muy común y tiene solución. A continuación te explico cómo resolverlo paso a paso.

1. Verifica el firmware

En el 99,9% de los casos, el problema se debe a que el módulo no tiene instalado el firmware oficial de Meshtastic o está desactualizado.
Para solucionarlo, simplemente flashea el firmware correcto desde la web oficial:
👉 https://flasher.meshtastic.org/

Más abajo te explicamos cómo hacerlo detalladamente.

2. Reinicia ambos dispositivos

Apaga y enciende el módulo Heltec y reinicia también la app en tu móvil.
A veces, un simple reinicio soluciona los errores de conexión entre Bluetooth y el microcontrolador.

3. Elimina emparejamientos Bluetooth previos

En los ajustes Bluetooth del teléfono, olvida o elimina la conexión anterior con tu módulo Heltec.
Esto evita conflictos con configuraciones antiguas o perfiles corruptos.

4. Prueba otra versión de la app

Algunas versiones de la app Meshtastic (Android o iOS) pueden tener errores específicos según el modelo.
Si el fallo persiste, prueba con una versión más reciente o incluso con una versión anterior estable.

5. Reinstala la app

Desinstala y vuelve a instalar la aplicación Meshtastic desde tu tienda oficial.
Esto corrige posibles problemas en la instalación o permisos del sistema.

6. Flashea el firmware Meshtastic oficial

Si tu módulo es nuevo, debes flashear el firmware oficial de Meshtastic antes de intentar conectarlo.
Una vez instalado, sigue estos pasos:

  1. Conecta el módulo al ordenador.
  2. Abre Meshtastic Web Flasher.
  3. Selecciona el puerto correspondiente y tu modelo (por ejemplo, Heltec LoRa 32 V3).
  4. Pulsa Flash y espera a que finalice el proceso.
  5. Desconecta y reinicia el módulo.

Después de esto, el dispositivo estará listo para emparejarse con la app.

7. Conecta y configura el nodo

Con el firmware correcto instalado:

  1. Enciende el módulo Heltec.
  2. Abre la app Meshtastic y activa Bluetooth en tu móvil.
  3. Busca el dispositivo (aparecerá como Heltec LoRa 32 Automation o similar).
  4. Conéctalo usando el PIN 123456 (por defecto).
  5. Configura la región (frecuencia para Europa, América, etc.) y el canal Mesh.
  6. Guarda los cambios y ¡listo! Tu nodo ya forma parte de la red Mesh.

Si aún aparece el botón “Cerrar”

Si la app sigue mostrando solo la opción Cerrar, revisa lo siguiente:

  • Asegúrate de que el firmware es la versión oficial y actualizada.
  • Comprueba que el módulo no esté conectado por WiFi, ya que Meshtastic solo usa Bluetooth en este modo.
  • Prueba con otro teléfono o app para descartar problemas de compatibilidad.

Ayuda de la comunidad

En los foros y grupos de Reddit o Facebook de Meshtastic hay muchos usuarios con experiencias similares.
Allí puedes encontrar soluciones específicas según tu modelo y versión de firmware.

Resumen

En la mayoría de los casos, el error del botón «Cerrar» se soluciona flasheando el firmware oficial Meshtastic y conectando el módulo desde cero. Después de eso, podrás configurar región, canal y comenzar a usar tu dispositivo en la red Mesh sin problemas.

Configuracion paso a paso

Veamos ahora como preparar el módulo es el Heltec LoRa 32 de la serie Automation, para conectarte con la app Meshtastic y usar Bluetooth para crear el nodo mesh. Para ello debemos considerar estos pasos:

    1. Nos vamos a https://flasher.meshtastic.org/ y seleccionamos el modulo correcto.

    Ahora seleccionamos el firmware. Recomiendo usar la ultima versión Beta.

    Ahora llega la hora de las advertencias previas al flasheo.

    Y haremos scroll hasta que finalmente podamos pulsar en el botón «Continuar»

    Ahora, si esta conectado por USB al ordenador el módulo , y el driver de éste esta instalado, debería aparecer en la lista de puertos serie ( sino apareciese en la pagina oficial se pueden descargar https://meshtastic.org/docs/getting-started/serial-drivers/)

    Seleccionamos la tercera opción (COM8 en nuestro caso, es decir en la opción que ponga USB to UART Bridge Controller)

    Es interesante seccionar la màxima velocidad y no nos olvidemos de desplazar el interruptor de flashear firmware hacia la derecha.

    Pulsamos borrar memoria e instalar y comenzara el proceso de flasheo el modulo

    Como el modulo esta basado en un ESP32 observes que va escribiendo en diferentes zonas de memoria como se haría desde el interfaz de un Arduino

    Una vez terminado el proceso se reiniciara y ya tendremos el modulo disponible para sincronizarlo desde la app por bluetooth a un telefono y desde este crear el nodo Mesh

    Cómo conectar y configurar tu módulo Heltec LoRa 32 con la app Meshtastic para crear un nodo mesh

    Si has adquirido un módulo Heltec LoRa 32 y quieres usarlo con la app Meshtastic para crear tu propia red mesh, este tutorial te guiará paso a paso para establecer la conexión vía Bluetooth y configurar el nodo para enviar y recibir mensajes.

    Primeros pasos: encender y conectar tu módulo Heltec LoRa 32

    1. Alimenta y enciende tu módulo Heltec LoRa 32, ya sea mediante USB o batería. Asegúrate de tener instalado el último firmware compatible con Meshtastic, tal como vimos en la guía anterior.
    2. Abre la app Meshtastic en tu teléfono móvil (Android o iOS).
    3. En la app, utiliza la opción para escanear dispositivos Bluetooth. Verifica que el Bluetooth de tu teléfono esté activo.
    4. Debes buscar tu módulo, que aparecerá con un nombre similar a «Heltec LoRa 32 V3» o algo relacionado.
    5. Selecciona el dispositivo y, cuando la app lo solicite, introduce el PIN que aparecerá en la pantalla de tu módulo (usualmente es un código corto que muestra el dispositivo).
    6. Tras emparejar, configura la región y el canal para que el nodo se integre correctamente en la red mesh con otros dispositivos. Es esencial que todos los nodos usen la misma frecuencia y región.
    7. Guarda la configuración. En caso necesario, reinicia tu módulo para aplicar los cambios.

    En caso de que no veas el dispositivo en la app, confirma que tu módulo tiene correctamente flasheado el firmware Meshtastic mediante el Meshtastic Web Flasher y que el Bluetooth está activo. La versión V3 utiliza el ESP32-S3 con Bluetooth 5 LE, por lo que es imprescindible que el firmware sea el oficial y actualizado.

    Configuración avanzada: opciones clave en Meshtastic para enviar y recibir mensajes

    Para que tu Heltec LoRa 32 funcione correctamente como nodo capaz de enviar y recibir mensajes en la red mesh, debes prestar atención a tres secciones principales dentro de la configuración de la app Meshtastic: LoRa (radio), Canales y Seguridad.

    1. LoRa (Radio)

    • Selecciona la región de frecuencia adecuada para tu zona geográfica. En Europa, normalmente se utiliza EU_868 (868 MHz), asegurando compatibilidad con la legislación local.
    • En las opciones avanzadas podrás elegir entre:
    • Long range: prioriza mayor alcance a costa de velocidad.
    • Fast: prioriza mayor velocidad con menor alcance.
    • Para la mayoría de aplicaciones de mensajería mesh se recomienda usar long range para mayor cobertura.
    • Otras opciones importantes:
    • Transmisión activa debe estar activada para que el nodo retransmita mensajes y forme parte del mesh.
    • Número de hops (saltos) establece cuántas retransmisiones puede hacer un mensaje. Un valor de 3 es equilibrado para pequeñas redes.
    • Rx boosted gain aumenta la sensibilidad del receptor para captar señales débiles y es recomendable tenerlo activado.

    2. Canales

    • Los nodos deben compartir exactamente el mismo canal para comunicarse.
    • El canal define las frecuencias y parámetros de la red mesh.
    • Puedes usar el canal por defecto, llamado «longfast«, o crear un canal nuevo con los parámetros personalizados que necesites (nombre, región, velocidad, frecuencia).

    3. Seguridad

    • Debes configurar una clave de red (network key) común para todos los nodos.
    • Esta clave asegura que solo los dispositivos autorizados formen parte de la red y mantengan la confidencialidad del intercambio de mensajes.
    • Puedes conservar la clave por defecto para pruebas, pero se recomienda crear una clave personalizada si quieres seguridad.

    Crear y compartir un canal nuevo en Meshtastic

    Si deseas un canal personalizado para tu red mesh, sigue estos pasos:

    1. Conecta tu nodo vía Bluetooth a la app Meshtastic.
    2. Accede a Configuración > Canales.
    3. Pulsa en el botón para añadir un canal nuevo.
    4. Configura:
    • El nombre del canal (por ejemplo, «MiRedMesh»).
    • La región correcta para tu país (ejemplo: «EU_868»).
    • El ajuste de velocidad (long range o fast).
    • El slot de frecuencia, que puede quedar con el valor por defecto.
    1. Guarda y selecciona el nuevo canal para que el nodo lo utilice.
    2. Repite exactamente esta configuración en los otros nodos que quieres que se comuniquen, incluyendo nombre, región y parámetros.
    3. Asegúrate también de usar la misma clave de seguridad en todos los dispositivos.

    Puede que sea necesario reiniciar el dispositivo para que los cambios se apliquen correctamente.

    Resumen rápido

    • Enciende y conecta tu Heltec LoRa 32 vía Bluetooth con la app Meshtastic.
    • Configura la región, canal y clave de seguridad idénticos en todos los nodos que participen de la red.
    • Ajusta las opciones avanzadas de LoRa para equilibrar alcance y velocidad según tus necesidades.
    • Para crear un canal personalizado, configura y comparte el mismo en todos los nodos.

    Con estos pasos podrás crear una red mesh funcional para enviar y recibir mensajes entre teléfonos y módulos Heltec LoRa 32 con Meshtastic, aprovechando la potencia de LoRa para comunicaciones de largo alcance y bajo consumo.

    Servos y sensores climáticos


    Se trata de un proyecto sencillo realizado por Miguel Torres Gordo donde nos muestra como mostrar la hora, la temperatura y la humedad en una habitación con pocos módulos. El diseño muestra solo la hora y los minutos, porque los segundos no son relevantes y obviamente encarecen el proyecto.

    La foto muestra una posible distribución de la pantalla, pero se deja a la imaginación del lector cómo podrían usarse, por ejemplo, en una caja hecha con una impresora 3D.

    Proyecto finalizado

    Materiales necesarios

    • Chip Nano V3.0 CH340 presoldado, versión mejorada con cable USB
    • MAX7219 Módulo de pantalla LED de matriz de puntos 8×32 4 en 1
    • KY-015 DHT 11 Módulo de sensor de temperatura ( del que por cierto hemos tratado en numerosos proyectos en este blog)
    • Reloj en tiempo real DS3231 I2C (idéntico al DS1307).Alternativamente con modificaciones DS1302 Serial Real Time Clock RTC Real Time Clock Module. Este tipo de módulos lo hemos tratado tambien en numerosos ejemplos en este blog
    • Micro servomotor digital MG995 o micro servomotor SG90 Micro servomotor 9G o micro servomotor MG90S
    • MB 102 Kit de placa de pruebas – 830 Breadboard, adaptador de fuente de alimentación 3.3V 5V, 65pcs Jumpers
    • Fuente de alimentación externa (9V – 12V)

    Software requerido

    IMPORTANTE: Encuentre las bibliotecas que faltan en el IDE de Arduino a través de «Herramientas -> Administrar bibliotecas…»

    Circuito y descripción de su funcionamiento

    El módulo DS1302 RTC( que hemos tratado tambien en numerosos ejemplos en este blog )es responsable de proporcionar la hora en el microcontrolador, mientras que el módulo DHT-11 mide la temperatura y la humedad ( del que por cierto hemos usado tratado en este blog). A continuación, el microcontrolador utiliza la información para controlar el grupo de módulos LED de 8×8 para la hora y los servomotores para mostrar la temperatura y la humedad.

    Es muy importante que introduzcamos una batería adecuada, ya que aunque este módulo funcionará correctamente sin ella, si desconectamos el módulo del circuito, se reiniciará la hora.

    Para establecer la fecha y la hora actuales, debemos configurar el siguiente circuito usando los pines SDA/SCL de nuestra placa Arduino o compatible:

    Configuración de RTC
    RTC (I2C)Nano V3
    VCC5V
    GNDGND
    CLKA5 (SCL)
    DATA4 (SDA)
    RST

    A continuación, ejecutamos el sketch DS1307_setup.ino, abrimos el Monitor Serie y podemos ver tanto la fecha como la hora en que se ha guardado el módulo. Estos datos son los datos que proporciona el sistema operativo del PC en el momento en que se ejecuta el boceto. Si nos fijamos en el boceto, podemos ver que la línea de código

    clock.setDateTime(__DATE__, __TIME__);

    es el que carga el módulo con los dos datos del sistema. A partir de ese momento, hemos configurado el módulo con la hora y la fecha y gracias a la batería, estos datos no se eliminarán del módulo cuando se corte el voltaje.

    Además en el diseño tenemos dos servos , un sensor dht11 y 4 Display que completen el total de conexiones junto a los hilos de alimentación de 5v DC correspondientes para cada módulo:

    • GND y VIN para alimentación de todos los dispositivos.
    • A4 y A5 para la conexión del DS1302.
    • D13, D11 y D10 para los 4 displays (MAX7219).
    • D3 y D4 para los dos servos.
    • D2 para el DHT11.

    Después de configurar la hora y la fecha, unto con los otros módulos en el circuito y ejecutamos el boceto clock_temperature_humidity.ino. Cuando hayamos terminado de cargar, deberíamos ver la hora exacta en la matriz de LED y los dos servomotores deberían moverse hasta que se posicionen en el valor de la temperatura y la humedad en el ambiente.

    Circuito

    Para cargar el boceto en el microcontrolador, elimine la línea entre +5V y Vin.

    Ampliada

    Tenemos la fuente de alimentación de 5V DC, el microcontrolador, el módulo RTC DS1302, DHT-11, el array de LED y los 2 servomotores.

    Foto de la construcción

    Analicemos el código:

    En primer lugar, cargamos las librerías que son necesarias para la ejecución del boceto. Los tres primeros son para la matriz LED, los dos siguientes son para usar el módulo DS1307, el penúltimo es la biblioteca para el módulo DHT-11 y el último es para usar los servomotores:

    #include <MD_Parola.h>
    #include <MD_MAX72xx.h>
    #include <SPI.h>
    #include <Wire.h>
    #include <DS3231.h>
    #include <DHT.h>
    #include <Servo.h>

    Después de las librerías, tenemos que configurar las conexiones de los módulos con los pines del microcontrolador. Luego el tipo de controlador y el número de módulos LED de la matriz (4 en nuestro caso). A continuación, el tipo de módulo DHT. Creamos las instancias de cada módulo y las variables necesarias para almacenar los datos de las mismas:

    // Define hardware type, size, and output pins MAX7219 8x32 4 in 1 Dot Matrix LED Display Module
    #define HARDWARE_TYPE MD_MAX72XX::FC16_HW
    #define MAX_DEVICES 4
    #define CS_PIN 10
    
    // Define hardware type andi pins DHT-11
    #define DHTPIN 2
    #define DHTTYPE DHT11
    
    // Create a new instance of the MD_Parola class with hardware SPI connection:
    MD_Parola reloj = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
    
    // Create a instance of DHT-11 sensor and variables for temperature and humidity
    DHT dht(DHTPIN, DHTTYPE);
    float t, hu;
    
    // Instances of the servos for humidity and temperature
    Servo servoTemperature;
    Servo servoHumidity;
    
    // Instance for the DS3231 clock
    DS3231 clock;
    RTCDateTime dt;

    Después de configurar los parámetros del módulo, inicializamos los módulos en la función setup() del boceto:

          // Initialization of Monitor Serial
          Serial.begin(9600);
          Serial.println("Initialize RTC module");
      
          // Initialization of DS3231 Module
          clock.begin();
    
          // Initialization MAX7219 LED Matrix Display
          reloj.begin();                // Intialize the object
          reloj.setIntensity(0);        // Set the intensity (brightness) of the display (0-15)
          reloj.displayClear();         // Clear the display
    
          // Initialization DHT-11 module
          dht.begin();
    
          // Servo pins connections
          servoTemperature.attach(3);
          servoHumidity.attach(4);

    La función loop() genera los valores medidos y los cálculos necesarios para la visualización.

    En primer lugar, analizaremos los datos de temperatura y humedad. Asignamos el valor de temperatura a la variable t y el valor de humedad a la variable hu. Si no recibimos ningún dato, lo comunicamos a través del monitor de serie. Los rangos de valores con los que trabajaremos van de 0 a 50 grados centígrados de temperatura y de 0% a 100% de humedad. Sabemos que los servomotores suelen tener un rango de ángulo de 180 grados. Para que los servomotores marquen los datos correctamente, realizamos una sencilla operación matemática para asignar los valores máximos de los rangos a los 180 grados del ángulo de los servomotores.

         // Temperature and humidity reading
          t = dht.readTemperature();
          hu = dht.readHumidity();
          if (isnan(hu) || isnan(t)) {
                  Serial.println("DHT sensor reading failure !!!");
          }

    ...
          servoTemperature.write((t*180)/50);   // Move the servos to value
          servoHumidity.write((hu*180)/100);

    Como alternativa, puede utilizar la función map().

    El procedimiento para registrar y mostrar las horas y los minutos es muy sencillo. Solo una nota: cuando el módulo DS1302 envía las horas y los minutos, envía los dígitos mínimos necesarios, es decir, del 0 al 9 solo un dígito. Entonces, si obtenemos menos de 10 horas o 10 minutos, solo veremos un dígito a la vez. Esto daría la impresión de un mal funcionamiento o no se ve bien. Así que siempre tenemos que mostrar dos dígitos en las horas y los minutos.

    Con la primera línea, pedimos al módulo DS1302 que recupere los datos de fecha y hora. A continuación, creamos dos variables (h y m) para almacenar los datos en el formato de cadena de la hora y los minutos. Si los valores son menores que 10, la instrucción if va precedida de un 0 como carácter, no como un dígito, con concat. Ahora solo tenemos que mostrar estos datos en la matriz LED. Para mostrar que el reloj está corriendo, mostramos dos cadenas muy similares. Uno con la separación entre horas y minutos con dos puntos y otro sin dos puntos. La visualización se realiza en incrementos de 500 ms, lo que corresponde a medio segundo. Por lo tanto, los dos puntos parpadean.

    La función delay() bloquea el flujo del programa, lo que no es relevante en este caso, ya que hay tiempo suficiente para leer y mostrar los datos.

          dt = clock.getDateTime();               // Reading data from the RTC module
    
          String h;                               // Variable for the hours
          String m;                               // Variable for the minutes
      
          int hora = (dt.hour);                   // The variable "hora" is used 
          if (dt.hour<10) {                       // to set the time to always show two digits 
    	            h = "0";                        // two digits in the clock hours.
    	            h.concat((String) hora);
          } else {
    	            h = (String) hora;
          }
    
          int minuto = (dt.minute);               // The variable "minuto" is used
          if (dt.minute<10) {                     // to set the minutes to always
    	            m ="0";                         // two digits en the clock minutes
    	            m.concat((String) minuto);
          } else {
    	            m = (String) minuto;
          }
          
          String r = h + ":" + m;                 // Hour and minutes with colon separation
          String q = h + " " + m;                 // Hour and minutes without colon separation
    
          Serial.print("Hora: ");
          Serial.print(dt.hour);   	Serial.print(":");
          Serial.print(dt.minute); 	Serial.print(":");
          Serial.print(dt.second); 	Serial.println("");
          Serial.print( "T = " );
          Serial.print(t);
          Serial.print(" ºC, H = ");
          Serial.print(hu);
          Serial.print( "%, " );
    
          reloj.setTextAlignment(PA_CENTER);    // Configuration the text centered
          reloj.print(r);                       // We change the text showing the separation
          delay(500);                           // and without it every half second for the
          reloj.print(q);                       // sensation of movement.
          delay(500);

    A continuación el código completo:

    /**************************************************************************************
     *   Easy Arduino project with clock, temperature and humidity measurement            *
     *   Last revisión 10-12-2021 - Getafe (Madrid) - España                              
     *   Miguel Torres Gordo                                                              
    *************************************************************************************/
    
    // Required Arduino libraries
    #include <MD_Parola.h>                          // Matrix LED Display Module
    #include <MD_MAX72xx.h>                         // MAX7219
    #include <SPI.h>                                // SPI Communications
    
    #include <Wire.h>                               // I2C communications protocol
    #include <DS3231.h>                             // Real Time Clock Module
    
    #include <DHT.h>                                // Temperature and Humidity module
    
    #include <Servo.h>                              // Servomotors
    
    // Define hardware type, size, and output pins MAX7219 8x32 4 in 1 Dot Matrix LED Display Module
    #define HARDWARE_TYPE MD_MAX72XX::FC16_HW
    #define MAX_DEVICES 4
    #define CS_PIN 10
    
    // Define hardware type andi pins DHT-11
    #define DHTPIN 2
    #define DHTTYPE DHT11
    
    // Create a new instance of the MD_Parola class with hardware SPI connection:
    MD_Parola reloj = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
    
    // Create a instance of DHT-11 sensor and variables for temperature and humidity
    DHT dht(DHTPIN, DHTTYPE);
    float t, hu;
    
    // Instances of the servos for humidity and temperature
    Servo servoTemperature;
    Servo servoHumidity;
    
    // Instance for the DS3231 clock
    DS3231 clock;
    RTCDateTime dt;
    
    
    void setup() {
    
          // Initialization of Monitor Serial
          Serial.begin(9600);
          Serial.println("Initialize RTC module");
      
          // Initialization of DS3231 Module
          clock.begin();
    
          // Initialization MAX7219 LED Matrix Display
          reloj.begin();                // Intialize the object
          reloj.setIntensity(0);        // Set the intensity (brightness) of the display (0-15)
          reloj.displayClear();         // Clear the display
    
          // Initialization DHT-11 module
          dht.begin();
    
          // Servo pins connections
          servoTemperature.attach(3);
          servoHumidity.attach(4);
    
    }
    
    void loop() {
    
          // Temperature and humidity reading
          t = dht.readTemperature();
          hu = dht.readHumidity();
          if (isnan(hu) || isnan(t)) {
                  Serial.println("DHT sensor reading failure !!!");
          }
         
          dt = clock.getDateTime();               // Reading data from the RTC module
    
          String h;                               // Variable for the hours
          String m;                               // Variable for the minutes
      
          int hora = (dt.hour);                   // The variable "hora" is used 
          if (dt.hour<10) {                       // to set the time to always show two digits 
    	            h = "0";                        // two digits in the clock hours.
    	            h.concat((String) hora);
          } else {
    	            h = (String) hora;
          }
    
          int minuto = (dt.minute);               // The variable "minuto" is used
          if (dt.minute<10) {                     // to set the minutes to always
    	            m ="0";                         // two digits en the clock minutes
    	            m.concat((String) minuto);
          } else {
    	            m = (String) minuto;
          }
          
          String r = h + ":" + m;                 // Hour and minutes with colon separation
          String q = h + " " + m;                 // Hour and minutes without colon separation
    
          Serial.print("Hora: ");
          Serial.print(dt.hour);   	Serial.print(":");
          Serial.print(dt.minute); 	Serial.print(":");
          Serial.print(dt.second); 	Serial.println("");
          Serial.print( "T = " );
          Serial.print(t);
          Serial.print(" ºC, H = ");
          Serial.print(hu);
          Serial.print( "%, " );
    
          reloj.setTextAlignment(PA_CENTER);    // Configuration the text centered
          reloj.print(r);                       // We change the text showing the separation
          delay(500);                           // and without it every half second for the
          reloj.print(q);                       // sensation of movement.
          delay(500);
    
          // To display the value of temperature and humidity we assign
          // a maximum value (50ºC and 100% of humidity) to the 180 degrees of the servomotor and
          // by means of a rule of three we display the actual values.
          
          servoTemperature.write((t*180)/50);   // Move the servos to value
          servoHumidity.write((hu*180)/100);
                
    }