batterie-nb.ino

Arduino MKR NB 1500 · Archivo : batterie-nb.ino · Lenguaje : Arduino · Uso : Estimer l'autonomie de la LiPo selon le cycle radio

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);
}

← Volver a la ficha