
Un beacon de publicite simple ne repond qu’a une question : “ou est ce tag ?”. Ajoutez un capteur — temperature, humidite, acceleration, lumiere — et le meme materiel devient un noeud de mesure distribue qui repond “quel est l’etat ici, et quelque chose a-t-il change ?”. Cet article couvre les decisions d’ingenierie derriere les beacons a capteur : comment interfacer les capteurs, comment compresser les lectures dans la charge utile de 31 octets, comment la cadence d’echantillonnage pilote la duree de vie de la batterie, et comment la logique de seuil sur appareil transforme un emetteur stupide en detecteur de peripherie.
1. Pourquoi les beacons a capteur sont differents
Un beacon de position seule transmet une charge utile fixe a un intervalle fixe. Sa consommation est deterministe et son firmware est trivial. Un beacon a capteur doit :
1. Reveiller le capteur du sommeil (ou le maintenir en mode echantillonnage basse consommation)
2. Acquerir une lecture via I2C/SPI, ce qui prend des millisecondes et consomme le courant de repos du capteur
3. Traiter la valeur (filtrage, calibration, verification de seuil)
4. Decider quoi envoyer — la valeur brute, un delta, ou rien
5. Encoder et publier le resultat
Chaque etape ajoute latence et courant. Le probleme de conception est l’equilibre entre fidelite de mesure et duree de vie de la batterie, car le sous-systeme capteur — pas la radio — domine generalement le budget des qu’on echantillonne plus de quelques fois par heure.
2. Interfaces capteur et consommation de courant
La plupart des capteurs de beacon pendent a un bus numerique. Les deux choix courants :
| Interface | Vitesse | Courant capteur typique | Latence reveil | Notes |
|---|---|---|---|---|
| I2C | 100-400 kHz | 1-15 µA repos, 100-500 µA actif | 1-5 ms | 2 fils, limite par adresse, facile a partager |
| SPI | 1-8 MHz | 2-20 µA repos, 200-800 µA actif | 0,1-1 ms | 4 fils, plus rapide, latence plus faible |
Pour un beacon a pile bouton, le cout dominant n’est pas le courant actif mais l’energie par echantillon = (latence_reveil + temps_conversion) × courant_moyen. Un capteur d’humidite qui prend 10 ms a 300 µA coute 3 µC par lecture. A 1 echantillon/h cela fait 3 µC/h ≈ 0,83 µA moyen — negligeable. A 1 echantillon/minute c’est 50 µA moyen — desormais en competition avec la radio.
2.1 Capteurs courants et leurs empreintes
| Capteur | Piece typique | Bus | Courant actif | Temps conversion | Plage sortie |
|---|---|---|---|---|---|
| Temperature | TMP117 | I2C | 3,5 µA | 15,5 ms (moy) | -0,1 a 0,2 °C |
| Humidite | HDC2080 | I2C | 300 µA | 1,2 ms | ±2 % HR |
| Accel 3 axes | LIS2DH12 | I2C/SPI | 4 µA (bas conso) | 1 ms | ±2/4/8/16 g |
| Lumiere ambiante | OPT3001 | I2C | 1,8 µA | 100-800 ms | 0,01-83k lux |
| Pression | LPS22HB | I2C/SPI | 25 µA | 13 µs (ODR) | ±0,025 hPa |
| CO2 (NDIR) | SCD40 | I2C | 18 mA (impulsion) | 0,5-5 s | 0-40000 ppm |
Le capteur CO2 se distingue : a 18 mA il est 1000× le courant de sommeil de la radio et ne peut fonctionner en continu sur pile bouton. C’est l’exemple canonique de pourquoi le choix du capteur contraint l’architecture de puissance — un beacon CO2 necessite une pile plus grosse ou une alimentation filaire.
3. Encodage des donnees capteur en 31 octets
Un paquet de publicite BLE transporte une charge utile de 31 octets (legacy) divisee en structures AD : 1 octet de longueur, 1 octet de type, puis donnees. iBeacon utilise 25 octets de donnees fabricant ; Eddystone-URL en utilise ~20. Il reste peu de place pour les capteurs.
3.1 La regle “ajouter, ne pas remplacer”
Conservez le cadre d’identite (iBeacon / Eddystone-UID) intact pour les systemes de position, et ajoutez un cadre de publicite secondaire portant les donnees capteur. BLE permet a un beacon de basculer entre plusieurs cadres de publicite (en alternant a chaque evenement). Une passerelle qui scanne les 3 canaux pendant quelques secondes capture les deux.
3.2 Eddystone-TLM : le canal de telemetrie integre
Eddystone-TLM est la facon standardisee de transporter la telemetrie :
| Champ | Octets | Contenu |
|---|---|---|
| Version | 1 | 0x00 |
| Tension batterie | 2 | 1 mV unites, 0-65535 |
| Temperature beacon | 2 | virgule fixe 8.8, °C |
| Compte PDU | 4 | compteur de paquets vie |
| Temps marche | 4 | 0,1 s unites |
TLM est propre mais limite : une valeur de temperature, batterie seule, pas d’humidite/acceleration. Pour des donnees plus riches vous avez besoin d’un cadre de donnees fabricant (MSD) personnalise.
3.3 Exemple d’encodage MSD personnalise
Une disposition compacte pour un beacon multi-capteur (little-endian) :
Octet 0 : Company ID LSB (0x4C pour Apple, ou votre CID)
Octet 1 : Company ID MSB
Octet 2 : Type cadre = 0x50 (cadre capteur vendeur)
Octet 3 : Bitmap capteur (bit0 temp, bit1 hum, bit2 accel, bit3 lum, bit4 batt)
Octet 4-5 : Temperature, virgule fixe 8.8, signee (×256)
Octet 6-7 : Humidite, virgule fixe 8.8 (×256)
Octet 8-9 : Lumiere, echelle log 10 bits (0-1023 → 0,01-100k lux log)
Octet 10-11: Batterie mV (0-65535)
Octet 12-13: Amplitude acceleration, 8.8 fixe (g × 256)
Octet 14 : Statut / drapeaux (mouvement detecte, seuil declenche)
Octet 15 : Numero sequence (boucle 0-255)
Ce cadre de 16 octets coexiste avec un cadre d’identite iBeacon avec de la marge. La bitmap permet a un beacon d’omettre les capteurs absents, reduisant la charge utile. Un beacon temp-seul envoie les octets 0-7 (8 octets) ; un noeud capteur complet envoie les 16.
3.4 Astuces de compression
- Encodage delta : publiez le changement depuis la derniere lecture, pas l’absolu. Une temperature derivant de 0,1 °C/h tient dans un delta 8 bits signe (±127 × 0,01 °C) au lieu d’un absolu 16 bits.
- Virgule fixe plutot que flottant : 8.8 virgule fixe coute 2 octets pour ±127,99 avec resolution 0,004 °C — suffisant pour le monitoring environnemental.
- Lumiere echelle log : `encoded = round(1023 × log10(lux/0,01) / log10(100000/0,01))` compacte 5 decades en 10 bits.
- Saut run-length : si rien n’a change au-dela du plancher de bruit, envoyez un cadre heartbeat tous les N cycles au lieu de chaque cycle.
4. Strategie d’echantillonnage et budget de puissance
Le plus grand levier sur la duree de vie de la batterie est la frequence d’echantillonnage. Trois strategies :
4.1 Echantillonnage periodique fixe
Le plus simple : echantillonnez toutes les T secondes, publiez chaque lecture.
Courant moyen ≈ I_radio_adv × duty_adv + I_capteur_moy × (t_ech / T)
Pour T = 60 s, t_ech = 5 ms, I_capteur_moy = 200 µA : contribution capteur = 200 µA × 5ms/60s = 0,017 µA — negligeable. La radio (ex. sommeil 1 µA, 3 ms a 15 mA chaque 1 s) domine a ~45 µA. Donc a 1/min d’echantillonnage, le capteur est gratuit ; poussez a 1/s et le cout capteur monte a ~1 µA — encore petit mais plus negligeable.
4.2 Echantillonnage adaptatif / a la demande
Echantillonnez lentement (ex. toutes les 5 min) pour le cadre d’identite, mais laissez l’interruption de l’accelerometre reveiller le MCU au mouvement. L’accelerometre en mode wake-on-motion consomme ~1-4 µA en continu mais elimine l’activite radio jusqu’a ce que quelque chose arrive. Pour le suivi d’actifs ou le mouvement est rare, cela reduit le courant moyen de 10-100×.
4.3 Rafale declenchee par seuil
Le beacon reste silencieux (sommeil profond, <1 µA) jusqu’a ce qu’une valeur depasse une limite — congelateur au-dessus de 0 °C, vibration au-dessus de 2 g, porte ouverte. Au declenchement :
1. Reveil complet
2. Capture une rafale de N echantillons a cadence elevee (pour caracteriser l’evenement)
3. Publie un cadre alerte avec valeur pic + horodatage
4. Retour au sommeil profond
C’est le modele d’intelligence de peripherie : le beacon decide *si* il parle, pas seulement *quoi* dire. Le courant moyen s’effondre au plancher de sommeil plus l’energie de rafale rare.
4.4 Exemple de budget de puissance
Pile bouton CR2032 = 225 mAh = 810 C. Duree visee 2 ans = 17,5 k heures.
| Composant | Courant | Duty | Moyen |
|---|---|---|---|
| nRF52 sommeil | 0,6 µA | 99,9% | 0,6 µA |
| Radio adv (3 ms @ 15 mA, 1/2 s) | 15 mA | 0,6% | 90 µA* |
| Echantillon capteur (5 ms @ 200 µA, 1/min) | 200 µA | 0,0008% | 0,017 µA |
| Accel wake-on-motion | 2 µA | 100% | 2 µA |
| Total (periodique) | — | — | ~92,6 µA |
| Total (seuil, 99% silencieux) | — | — | ~2,6 µA |
*La radio domine le mode periodique. Basculer sur le declenchement par seuil reduit le courant total de 35×, prolongeant la duree de ~2,5 ans a des decennies (l’auto-decharge de la pile devient la limite).
5. Filtrage sur appareil et logique de declenchement
Envoyer chaque lecture brute gaspille bande passante et batterie. Le beacon doit filtrer :
- Bande morte : publiez seulement si |valeur − dernier_envoye| > Δ (ex. 0,3 °C). Supprime le bruit de chatiere.
- Moyenne mobile : moyennez 4-8 echantillons pour tuer les pics isolés avant comparaison a la bande morte.
- Taux de changement : declenchez si d(valeur)/dt depasse une pente (ex. temp chute 5 °C/min = compresseur en defaillance).
- Hysteresis : utilisez des seuils d’entree/sortie separes (ex. alerte a >0 °C, effacement a <-0,5 °C) pour eviter le flottement d'alerte a la limite.
Une machine a etats minimale :
etat : IDLE
au tic horloge :
v = lire_capteur()
v_f = passe_bas(v)
if |v_f - dernier_envoye| > bande_morte :
publier(v_f) ; dernier_envoye = v_f
if v_f > seuil_haut and etat == IDLE :
etat = ALERTE ; publier_alerte(v_f, raison=HAUT)
if etat == ALERTE and v_f < seuil_bas :
etat = IDLE ; publier_effacement()
Cette logique tourne en <1 ms sur le nRF52 et coute un courant negligeable face a la radio.
6. Modeles de deploiement reels
6.1 Monitoring chaine du froid
Un beacon temp+humidite dans un refrigerateur a vaccins. Echantillonnez toutes les 5 min, publiez sur bande morte (0,2 °C) ou seuil (>8 °C alerte, <-0,5 °C effacement avec hysteresis). La passerelle journalise la serie temporelle ; une violation declenche une notification push. Batterie : CR2477 (1000 mAh) tient 3+ ans a 5 min d’echantillonnage.
6.2 Vibration maintenance predictive
Un beacon accelerometre visse sur un moteur. En wake-on-motion, il capture des rafales de vibration 1 kHz seulement quand le moteur tourne. L’acceleration RMS sur une fenetre indique l’usure des roulements. Comparer les tendances RMS semaine a semaine (calculees a la passerelle) predit la panne avant la casse. Puissance : les 2 µA de repos de l’accelerometre dominant ; CR2032 tient 1-2 ans.
6.3 Occupation batiment intelligent
Un beacon lumiere+PIR (ou mmWave) dans chaque piece. Niveau de lumiere + IR passif donne la presence sans camera. Le beacon publie seulement les changements d’etat d’occupation (entree/sortie), pas le lux continu. Courant moyen domine par le repos PIR ~5 µA — un pack AA tient des annees.
7. Considerations cote passerelle
La passerelle doit comprendre le cadre MSD personnalise. Points pratiques :
- Scanner les 3 canaux : les cadres capteur alternent avec les cadres d’identite ; capturer les deux necessite une permanence multicanaux ≥2-3 intervalles de publicite.
- Parser la bitmap : decodez seulement les capteurs presents ; ignorez gracefulment les types de cadre inconnus.
- Gerer les numeros de sequence : detectez les cadres manques (trou dans seq) pour marquer les liens non fiables.
- Stocker la serie temporelle : ecrire dans InfluxDB/TimescaleDB ; le beacon lui-meme ne garde pas d’historique.
- Offset calibration : appliquez les constantes de calibration par appareil cote serveur (chaque capteur a un biais).
8. Pieges
- Verrouillage bus I2C : un capteur manquant une horloge peut maintenir SDA bas et geler le bus. Ajoutez une sequence de recuperation (basculer SCL 9×, envoyer STOP) a chaque reveil.
- Offset demarrage a froid : TMP117 a besoin de 15,5 ms de conversion moyenne ; echantillonner trop vite renvoie des donnees obsoletes. Respectez t_conv.
- Tension batterie comme proxy temperature : beaucoup de beacons reportent V_batt, mais sous charge la tension chute — mesurez la batterie seulement apres une periode de repos pour la precision.
- Condensation HR : HDC2080 lit 100 % HR si condensation se forme ; la passerelle doit marquer 100 % HR soutenu comme defaut, pas comme lecture valide.
- Collision publicite : ajouter un cadre capteur double le temps d’air ; a haute densite de beacons cela augmente la probabilite de collision (voir article collision). Gardez le cadre capteur court et sur un intervalle de publicite separe si possible.
9. Checklist de conception
- [ ] Choisissez des capteurs dont le courant tient dans la pile (evitez CO2 18 mA sur bouton)
- [ ] Utilisez un cadre de publicite secondaire ; gardez le cadre identite pour la position
- [ ] Compressez avec virgule fixe + bitmap ; encodez en delta la derive lente
- [ ] Definissez bande morte + hysteresis pour supprimer le bruit
- [ ] Preferez seuil/wake-on-motion a un echantillonnage fixe rapide
- [ ] Ajoutez la recuperation bus I2C a chaque reveil
- [ ] Documentez la disposition MSD pour que la passerelle puisse la parser
- [ ] Verifiez le modele batterie contre le courant sommeil mesure, pas le typ datasheet
10. Conclusion
Un beacon a capteur est un appareil de peripherie, pas seulement un emetteur. La valeur d’ingenierie est dans les decisions prises sur appareil : quand echantillonner, quand se taire, et quels octets minimaux envoyer. Avec le packing virgule fixe, la charge utile pilotee par bitmap, le filtrage bande morte et les rafales declenchees par seuil, un beacon a pile bouton peut reporter l’etat environnemental pendant des annees tout en parlant seulement quand cela compte.
La radio n’a jamais ete le goulot d’etranglement — le courant capteur et la cadence d’echantillonnage le sont. Concevez la logique de reveil d’abord ; l’encodeur de publicite est la partie facile.
