batterie-nb.ino
La caída de tensión durante la emisión de radio revela el estado de la batería: este sketch mide VBAT antes y después de cada publicación y calcula pendiente y duración de la transacción. Un indicador de desgaste más honesto que el porcentaje restante.
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). LiPo en el conector de batería, SIM de datos, servidor de prueba accesible.
Cableado
Sin cableado; la medida VBAT es interna del SAMD21 (divisor de hardware).
Funcionamiento
analogRead(VBAT) muestrea la tensión con el divisor 1,5x; la diferencia antes/después de la transacción NB-IoT correlaciona capacidad restante y edad de la celda.
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
Registra la pendiente varios días para predecir la fecha de recarga, o salta la emisión si la pendiente supera un umbral de aviso.
batterie-nb.ino
// Estimation d'autonomie : VBAT + moyenne glissante de consommation.
// Releve la tension batterie avant/pendant/apres une emission radio.
#include <MKRNB.h>
const char PIN_SIM[] = "0000";
const char APN[] = "iot.1nce.net";
NB nb;
NBClient client;
float lireVbat() {
return 3.3 * analogRead(VBAT) / 1023.0 * 1.5;
}
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() {
float avant = lireVbat();
unsigned long t0 = millis();
bool ok = false;
if (client.connect("192.0.2.10", 1883)) {
client.print("station/01/bat\n");
client.println(avant, 2);
client.stop();
ok = true;
}
unsigned long duree = millis() - t0;
float apres = lireVbat();
Serial.print("avant="); Serial.print(avant, 3);
Serial.print(" apres="); Serial.print(apres, 3);
Serial.print(" dT="); Serial.print(duree);
Serial.println(ok ? " mV/s OK" : " mV/s ECHEC");
delay(60000);
}