batterie-nb.ino

Arduino MKR NB 1500 · Fichier : batterie-nb.ino · Langage : Arduino · Usage : Estimer l'autonomie de la LiPo selon le cycle radio

La chute de tension pendant l'émission radio révèle l'état de la batterie : ce croquis mesure VBAT avant et après chaque publication, calcule la pente et la durée de la transaction. Un indicateur d'usurement bien plus honnête que le seul pourcentage restant.

Matériel requis

Une Arduino MKR NB 1500 (microcontrôleur SAMD21, modem u-blox LTE-M/NB-IoT, antenne externe, alimentation LiPo sur J6 ou USB). LiPo sur le connecteur batterie, SIM data, serveur de test joignable.

Câblage

Aucun câblage ; la mesure VBAT est interne au SAMD21 (diviseur matériel).

Fonctionnement

analogRead(VBAT) échantillonne la tension via le diviseur 1,5× ; la différence avant/après pendant la transaction NB-IoT corrèle capacité restante et âge de la cellule.

Exécution

Installez le package Arduino SAMD Boards et la bibliothèque MKRNB, sélectionnez la carte, téléversez. Prévoyez une carte SIM IoT (LTE-M ou NB1) activée et une bonne réception : l'attachement au réseau peut demander plusieurs minutes.

Variantes

Journalisez la pente sur plusieurs jours pour prédire la date de recharge, ou coupez l'émission si la pente dépasse un seuil d'alerte.

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

← Retour à la fiche