Para usar 4G en un ESP32 PLC necesitas la placa de comunicación 4G (M1)-NB1 IoT LTE (u-blox SARA-R412M), una SIM con tarifa de datos LTE-M o NB-IoT y una antena. En el Arduino IDE, selecciona tu modelo de ESP32 PLC y pon Tools > Extension module 1 en LTE para LTE-M o en NB para NB-IoT. La librería NB del paquete de placas de Industrial Shields registra el módem en la red, y su NBClient funciona con ArduinoHttpClient para HTTP y con PubSubClient para MQTT.
Esta guía explica cómo insertar la tarjeta SIM, qué opciones elegir en los menús y dos sketches: una petición HTTP y un cliente MQTT que publica y se suscribe. Se ha comprobado la sintaxis de los dos, pero no se han compilado ni probado en un PLC, así que compílalos y pruébalos en tu propio ESP32 PLC antes de usarlos. Al final hay una tabla para encontrar la causa cuando el PLC no se conecta.
- Paso 1Placa y SIMPlaca 4G en la ranura 1, SIM LTE-M o NB-IoT, antena
- Paso 2Arduino IDEModelo, versión v3 y Extension module
- Paso 3Conectarbegin() con PIN y APN, después attachGPRS()
- Paso 4Enviar datosHTTP o MQTT sobre NBClient
Por qué usar 4G en un ESP32 PLC
El ESP32 PLC ya tiene Wi-Fi, Bluetooth y Ethernet. Necesitan una red local. Una placa 4G permite al PLC enviar datos desde lugares sin ella: estaciones de bombeo, pozos, vehículos, vagones de tren o máquinas en casa de un cliente donde no puedes usar la red de la planta. LTE-M y NB-IoT son las tecnologías 4G pensadas para este tipo de equipos: poco volumen de datos, bajo consumo y buena cobertura.
Un enlace móvil pierde la cobertura de vez en cuando. Tenlo en cuenta desde el principio: guarda los datos en el PLC mientras el enlace está caído y envíalos cuando vuelva.
Hardware necesario
- Un ESP32 PLC con la placa de comunicación 4G (M1)-NB1 IoT LTE (u-blox). En la página del producto, elígela como placa de comunicación 1. La placa lleva un módulo u-blox SARA-R412M.
- Una tarjeta SIM con tarifa de datos para LTE-M (LTE Cat M1) o NB-IoT. Pregunta a tu operador cuál ofrece en tu zona y qué APN usar.
- Una antena LTE conectada a la placa 4G.
- Un ordenador con el Arduino IDE y el paquete de placas de Industrial Shields. Consulta Cómo instalar las placas de Industrial Shields en el Arduino IDE.
¿Qué placa 4G? La librería NB del paquete de placas funciona con los módulos u-blox SARA-R412M y SARA-R422M8S: lee el modelo del módem y se detiene con un error si es otro. Esta guía es para la placa 4G (M1)-NB1 IoT LTE (u-blox). Si tu PLC lleva una placa Quectel o LTE Cat 4, pregunta a nuestro equipo técnico qué librería usar. El ESP32 PLC 14 se puede pedir con el 4G integrado: consulta Enviar mensajes por SMS o Telegram con un ESP32 PLC 14.
Insertar la tarjeta SIM en el ESP32 PLC
Desconecta la alimentación antes de abrir la tapa.
- Quita la tapa del puerto Ethernet. Mete un dedo en el puerto Ethernet y empuja hacia arriba para levantar la tapa, o levántala con cuidado por un lado con un destornillador plano.
- Inserta la tarjeta SIM. La ranura de la SIM está encima del botón de reset. Inserta la tarjeta con los contactos hacia arriba.
- Vuelve a poner la tapa. Presiónala hasta que encaje con un clic.


Configurar el Arduino IDE para la placa 4G
La placa 4G es opcional, así que tienes que indicar al IDE dónde está. Estas opciones están en el menú Tools:
| Menú | Valor | Nota |
|---|---|---|
| Board | Industrial Shields ESP32 Boards > ESP32 PLC Family | Se instala con el paquete de placas |
| Model | Tu modelo, por ejemplo ESP32 PLC 21 IO+ | Define el mapa de E/S del PLC |
| Version | v3 | Las opciones NB y LTE solo existen para v3. v1 es la versión antigua |
| Extension module 1 | LTE para LTE-M, o NB para NB-IoT | Usa Extension module 2 si la placa está en la ranura 2 |
La opción que eliges en Extension module decide la tecnología de radio. Con LTE, la librería pone el módem en LTE Cat M1 (AT+URAT=7). Con NB, en NB-IoT (AT+URAT=8). Si la SIM solo funciona en LTE-M y eliges NB, el PLC nunca se registra. La opción GPRS es para la placa GPRS de 2G, no para la placa 4G.
Si no hay ningún módulo seleccionado, el sketch no compila y muestra: No NB expansion module has been defined. Please select one in Tools -> Extension module.
La librería NB viene con el paquete de placas. Sus ejemplos están en File > Examples > NB: NBWebClient, NBSSLWebClient, SendSMS, ReceiveSMS y, dentro de Tools, TestModem, TestGPRS y NBScanNetworks. Para los sketches de abajo, instala también dos librerías desde Sketch > Include Library > Manage Libraries:
- ArduinoHttpClient, para HTTP.
- PubSubClient, para MQTT.
Ejemplo 1: enviar una petición HTTP por 4G
El sketch se registra en la red móvil, abre la conexión de datos y envía una petición GET a httpbin.org, un servicio público de pruebas que responde con la petición que recibe. Rellena el PIN y el APN de tu SIM. Deja el PIN vacío si la SIM no tiene PIN.
#include <NB.h>
#include <ArduinoHttpClient.h>
// Uncomment once if the modem does not answer: it finds the baud rate and sets it to 38400
// #define MAKE_AUTOBAUD
const char PINNUMBER[] = ""; // SIM PIN, empty if the SIM has no PIN
const char APN[] = ""; // APN of your operator
const char USERNAME[] = ""; // only if the operator asks for it
const char PASSWORD[] = "";
NBClient nbClient;
GPRS gprs;
NB nbAccess; // NB nbAccess(true); prints every AT command on the serial monitor
const char server[] = "httpbin.org";
const int port = 80;
HttpClient http(nbClient, server, port);
void setup() {
Serial.begin(115200);
Serial.println("Starting the 4G web client");
#ifdef MAKE_AUTOBAUD
if (!nbAccess.autobaud()) {
Serial.println("Autobaud failed, check the Extension module setting");
while (true);
}
nbAccess.shutdown();
#endif
// Register on the LTE-M or NB-IoT network and open the data connection
while (nbAccess.begin(PINNUMBER, APN, USERNAME, PASSWORD) != NB_READY ||
gprs.attachGPRS() != GPRS_READY) {
Serial.println("Not connected, retrying");
delay(1000);
}
Serial.println("Connected to the mobile network");
int err = http.get("/get");
if (err != 0) {
Serial.print("Request failed, error ");
Serial.println(err);
return;
}
int status = http.responseStatusCode();
String body = http.responseBody();
Serial.print("HTTP status: ");
Serial.println(status);
Serial.println(body);
http.stop();
}
void loop() {
}
Cómo funciona:
nbAccess.begin(PIN, APN, USERNAME, PASSWORD)arranca el módem, aplica la configuración y espera a que se registre en la red. DevuelveNB_READY.gprs.attachGPRS()abre la conexión de datos y devuelveGPRS_READY. El nombre viene de la librería Arduino MKR NB en la que se basa: la conexión usa LTE-M o NB-IoT, no 2G.NBClientes unClientestándar de Arduino, así queHttpClientlo usa igual que un cliente Ethernet o Wi-Fi.http.get()devuelve 0 cuando la petición se ha enviado.responseStatusCode()da el código HTTP (200 si todo va bien) yresponseBody()la respuesta.
Abre el monitor serie a 115200 baudios. El registro tarda como mínimo 24 segundos, porque la librería reinicia el módem y su radio, y puede tardar unos minutos la primera vez, mientras el módem busca la red.
Ejemplo 2: publicar y suscribirse con MQTT por 4G
MQTT envía mensajes pequeños a través de un broker. Gasta pocos datos, así que encaja con LTE-M y NB-IoT. Este sketch se conecta a un broker público de pruebas, publica un mensaje, se suscribe al mismo topic e imprime cada mensaje que recibe.
#include <NB.h>
#include <PubSubClient.h>
const char PINNUMBER[] = ""; // SIM PIN, empty if the SIM has no PIN
const char APN[] = ""; // APN of your operator
const char USERNAME[] = "";
const char PASSWORD[] = "";
NBClient nbClient;
GPRS gprs;
NB nbAccess;
PubSubClient mqtt(nbClient);
const char* MQTT_SERVER = "broker.hivemq.com"; // public test broker: no login, no TLS
const int MQTT_PORT = 1883;
const char* TOPIC = "test/esp32plc-4g";
const char* CLIENT_ID = "esp32plc-4g-0001"; // must be unique on the broker
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message on ");
Serial.print(topic);
Serial.print(": ");
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void connectNetwork() {
while (nbAccess.begin(PINNUMBER, APN, USERNAME, PASSWORD) != NB_READY ||
gprs.attachGPRS() != GPRS_READY) {
Serial.println("Not connected, retrying");
delay(1000);
}
Serial.println("Connected to the mobile network");
}
void connectMqtt() {
Serial.print("Connecting to the MQTT broker... ");
if (mqtt.connect(CLIENT_ID)) {
Serial.println("connected");
mqtt.publish(TOPIC, "Hello from the ESP32 PLC over 4G");
mqtt.subscribe(TOPIC);
} else {
Serial.print("failed, state ");
Serial.println(mqtt.state());
delay(5000);
}
}
void setup() {
Serial.begin(115200);
connectNetwork();
mqtt.setServer(MQTT_SERVER, MQTT_PORT);
mqtt.setCallback(callback);
}
void loop() {
if (!mqtt.connected()) {
if (!nbAccess.isAccessAlive()) {
connectNetwork(); // registration lost: attach again
}
connectMqtt();
}
mqtt.loop();
}
Cómo funciona:
connectNetwork()se registra en la red y abre la conexión de datos, como en el ejemplo 1.connectMqtt()hace un intento de conexión. Si falla, imprime el código de error y espera 5 segundos.- En
loop(), si MQTT está desconectado,isAccessAlive()comprueba el registro conAT+CEREG?. Si el PLC ha perdido la red, vuelve a conectarse antes de reconectar con el broker. mqtt.loop()mantiene viva la conexión y llama acallback()por cada mensaje que llega.
El client ID tiene que ser único en el broker: si dos equipos usan el mismo, el broker desconecta el primero. broker.hivemq.com es un broker público de pruebas sin usuario ni cifrado, así que cualquiera puede leer el topic. En una instalación real, usa tu propio broker con usuario, contraseña y TLS. Consulta MQTT sobre TLS con el ESP32 PLC y fundamentos de seguridad en MQTT.
El delay(5000) y los bucles de reintento bloquean el programa. Para una prueba no importa. En un PLC que también controla salidas, reconecta sin bloquear, como en la reconexión sin bloqueo en un ESP32 PLC.
LTE-M o NB-IoT: cuál elegir
| LTE-M (LTE Cat M1) | NB-IoT | |
|---|---|---|
| Opción de Extension module | LTE | NB |
| Velocidad de datos | Cientos de kbit/s | Decenas de kbit/s |
| Equipos en movimiento | Sí, cambia de celda sin cortar la conexión | Mejor para equipos fijos |
| Encaja con | MQTT y HTTP con mensajes frecuentes, descargas de firmware, vehículos | Mensajes pequeños unas pocas veces por hora, instalaciones fijas, cobertura en interiores profundos |
Las dos dependen del operador: comprueba que tu SIM y tu zona tienen la que eliges. La librería también aplica el perfil de operador Standard Europe del módem y las bandas LTE 3, 8 y 20, que son las habituales para LTE-M y NB-IoT en Europa. Si tu operador usa otras bandas, consulta a nuestro equipo técnico antes de instalar.
Diagnóstico de la conexión 4G
| Qué ves | Causa probable | Qué hacer |
|---|---|---|
| Error de compilación: No NB expansion module has been defined | Extension module está en None | Pon Tools > Extension module 1 (o 2) en LTE o NB |
| El módem no responde, begin() devuelve un error enseguida | El módem usa otra velocidad en baudios | Descomenta #define MAKE_AUTOBAUD y carga el sketch una vez. La librería prueba varias velocidades y deja el módem a 38400. Después vuelve a comentarlo |
| "Not connected, retrying" sin fin | Tecnología equivocada (NB o LTE), APN o PIN incorrectos, sin antena, sin cobertura o la SIM no tiene LTE-M ni NB-IoT | Revisa la opción del menú, el APN y la antena. Ejecuta los ejemplos NBScanNetworks y TestGPRS |
| Necesitas ver qué dice el módem | Crea el objeto como NB nbAccess(true);: cada comando AT y su respuesta salen por el monitor serie | |
| MQTT state -2 | Ha fallado la conexión TCP con el broker | Revisa el nombre del servidor, el puerto y la conexión de datos |
| MQTT state -4 o -3 | Tiempo agotado o conexión perdida, a menudo por poca cobertura | Revisa la antena y la señal, y guarda los datos en el PLC hasta que se reconecte |
| MQTT state 2, 4 o 5 | El broker rechaza el client ID, el usuario y la contraseña, o el acceso | Usa un client ID único y las credenciales del broker |
De un sketch de prueba a la telemetría remota
Una instalación de campo añade tres cosas a estos ejemplos: un búfer para los datos mientras no hay cobertura, marcas de tiempo y un servidor que recibe los mensajes de muchos PLC. El caso ferroviario de abajo envía datos de energía por 4G LTE-M y los guarda a bordo cuando el tren no tiene cobertura. El caso del pozo de petróleo muestra el mismo patrón desde una instalación remota, con un ESP32 PLC 21 FLEX y una placa 4G. Para recoger los mensajes de muchos PLC, consulta el concentrador MQTT en Node-RED para flotas de ESP32 PLC.
Llévalo a la práctica
Un enlace 4G se cae y vuelve. Mira cómo gestiona la cobertura un proyecto real, un simulador donde cortas el enlace y el código que conserva los datos.
Caso de estudio
Confort a bordo. Datos de energía que esperan a la cobertura.
Un ESP32 PLC 57R controla luz, ventilación y A/C en un vagón de tren y envía datos de energía por 4G LTE-M, con un búfer local.
Lee el caso de estudio
Simulador
Entérate de que tu red falla antes de que el municipio se quede sin agua
Unos RTU ESP32 PLC informan de una red de agua municipal por 4G y LoRaWAN. Corta un enlace y mira el almacenamiento y reenvío, las alarmas y la detección de fugas por caudal nocturno.
Abre el simulador
PLC Solution Library
Datalogging MQTT offline-first con búfer en SD
Cada mensaje se escribe en un archivo diario de la SD antes de publicarse, así que no falta nada cuando vuelve la red.
Ver el ejemplo
Preguntas frecuentes sobre 4G en el ESP32 PLC
¿Qué tarjeta SIM necesito para la placa 4G del ESP32 PLC?
Una SIM con tarifa de datos para LTE-M o NB-IoT, de un operador que lo ofrezca en tu zona. Muchas SIM IoT incluyen las dos. Una SIM solo de 2G no funciona con esta placa, porque la librería pone el módem en LTE-M o NB-IoT.
¿Por qué el código usa una clase llamada GPRS en una placa 4G?
La librería NB se basa en la librería Arduino MKR NB, que mantiene el nombre GPRS para la conexión de datos. attachGPRS() abre la conexión de datos por LTE-M o NB-IoT.
¿Puedo usar HTTPS o MQTT con TLS por 4G?
Sí. La librería NB incluye NBSSLClient, con el ejemplo NBSSLWebClient. Para MQTT con TLS en el ESP32 PLC, consulta esta guía.
¿La placa 4G puede enviar SMS?
Sí. La librería incluye los ejemplos SendSMS y ReceiveSMS, en File > Examples > NB.
¿Qué pasa con los datos cuando el PLC pierde la cobertura?
Los ejemplos de arriba no los guardan. En un proyecto real, escribe primero cada mensaje en la tarjeta SD o en memoria y envíalo cuando vuelva el enlace. Consulta el datalogging MQTT offline-first con búfer en SD.
Más sobre conectividad móvil y MQTT
- Enviar mensajes por SMS o Telegram con un ESP32 PLC 14 con 4G integrado
- LTE Cat.4 con Raspberry PLC
- Conexión MQTT sobre TLS para el ESP32 PLC
- Cómo elegir un controlador industrial
Referencias de las librerías: ArduinoHttpClient y API de PubSubClient.