publish-mqtt-minimal.ino
Publicación sobria para redes LPWA: cada diez minutos el MKR NB 1500 envía tensión de batería e identificador de estación a un relé TCP. El patrón, deliberadamente mínimo, muestra la esencia de un publish; para un broker real, conecta PubSubClient a NBClient.
Hardware
Una Arduino MKR NB 1500 (microcontrolador SAMD21, módem u-blox LTE-M/NB-IoT, antena externa, alimentación LiPo en J6 o USB). SIM IoT con IP de datos, servidor relé o broker MQTT accesible por TCP, antena LTE.
Cableado
Sin cableado externo; la medida de batería usa la entrada VBAT interna de la placa.
Funcionamiento
attachGPRS obtiene una dirección IP; NBClient abre un socket TCP. El formato por líneas simplifica el relé del servidor. El ritmo de diez minutos cuida batería y celda de radio.
Ejecución
Instala el paquete Arduino SAMD Boards y la librería MKRNB, selecciona la placa y carga. Prevé una SIM IoT (LTE-M o NB1) activada y buena recepción: la conexión a la red puede tardar varios minutos.
Variantes
Pásate a MQTT real (PubSubClient + NBClient), añade sensores BME280 por I2C o comprueba la carga a binario para ahorrar esos pocos bytes de datos.
publish-mqtt-minimal.ino
// Publication MQTT "maison" (TCP brut) depuis le MKR NB 1500.
// Format minimal : topic\n valeur\n vers un petit relais TCP.
// Pour un vrai broker, remplacez par la lib PubSubClient (TCP ok).
#include <MKRNB.h>
const char PIN_SIM[] = "0000";
const char APN[] = "iot.1nce.net";
const char SERVEUR[] = "192.0.2.10"; // votre relais / broker
const int PORT = 1883;
NB nb;
NBClient client;
const long PERIODE = 600000; // 10 min (menage le reseau LPWA)
unsigned long dernier = 0;
void setup() {
Serial.begin(9600);
if (nb.begin(PIN_SIM) != NB_READY) while (true);
while (nb.getStatus() != NETWORK_JOINED) delay(2000);
nb.attachGPRS(APN);
}
void loop() {
if (millis() - dernier < PERIODE) return;
dernier = millis();
float vbat = 3.3 * analogRead(VBAT) / 1023.0 * 1.5;
if (client.connect(SERVEUR, PORT)) {
client.print("station/01/batterie\n");
client.println(vbat, 2);
client.stop();
Serial.println(F("publie"));
} else {
Serial.println(F("connexion KO, reessai au prochain cycle"));
}
}