Arduino & ble TPMS (Capteur pression pneus)

Bonjour,
J'ai dans la tête de fabriquer un"ordinateur de bord" pour mon scooter avec un Arduino mega + module bluetooth HM-10 + Module GPS + écran tactile 3.5.
La fonctionnalité de cet ordinateur qui me donne fil à retordre est le contrôle de la pression des pneus.
J'ai acheté des tpms ble pour les installer sur les pneus.
Mon problème est que je ne sais pas comme lire les donnes de ses capteurs étant donné qu'ils transmettent les donné seulement quand il y a un changement de pression ou de température.
Il faut que mon module bluetooth soit de façon permanent à l’écoute.
Il y a la commande "AT+DISI?" mais l’écoute ne dure très peu.
Comme puis-je faire? Quelqu’un à une idée?
Merci

Bonsoir

Il est question du TPMS dans cette vidéo d'Andrés Spiess

ce sujet n'a pas encore été abordé sur ce forum

Que donne un moteur de recherche avec les mots cles "HM-10 TPMS" ? des tentatives ? des succès ? des impasses ?
Suivre ces pistes :
TMPS.png
Remarque : le HM-10 n'est pas un composant BLE universel, il se cantonne à 2 ou trois fonctionnalités (émulation série, beacon..) Le BLE du Raspberry PI 3 est utilisé ici pour capter et décoder les trames TPMS (des utilitaires Bluetooth de Linux permettent le scan ininterrompu)

TMPS.png

Je l'ai tous lues ces posts. Le premier est très intéressant mais il n’explique pas comme écouter ces capteur avec un arduino. J'ai essayé avec un android et effectivement,comme dit ce post, je vois les transmissions des capteurs.
Je n'ai jamais travaillé avec le bluetooth donc pour moi ce monde est tout nouveau.

Donc le scan ininterrompu est obtenu via software?
La video parle des tpms hf 433mhz: peut être qu'ils sont plus faciles à utiliser!

scan ininterrompu : oui c'est le software (ou le firmware) et dans le cas du HM-10 le firmware est , par le jeu de commandes AT, limité à certaines fonctionnalités

le 433MHz est , pour une carte Arduino et un récepteur radio , sans doute plus facile à intercepter

En dehors de 'sentiers battus' le Bluetooth 'classique'demande un gros effort de compréhension
De mon point de vue le BLE est 'pire'.

PS : pourrais tu éditer le titre du message initial en ajoutant au moins TPMS ou pression des pneus.... ça facilitera les recherches ultérieures sur ce sujet particulier ?

sans garantie du résultat : un ESP32 possède une radio Bluetooth.
Avec la librairie BLE et son exemple BLE_scan on va au delà des limites du HM-10.
Sous réserve que les infos utiles soient visibles par un scan, en augmentant la durée de la boucle de scan (scantime , ligne 11) on réduit la probabilité de perte de trame TPMS
Avec l'ESP32 les résultats du scan ne sont pas affichés à la fin de celui-ci (cas du HM-10) mais au fur et à mesure ce qui permet de traiter une trame TPMS dès sa réception.

Une carte à ESP32 pourrait remplacer l'ensemble Mega + HM-10 .... (sous réserve que l'écran tactile actuel ne réclame pas trop de GPIO pour une ESP32)

Remarque : si avec un HM-10 il est possible récuperer et exploiter des trames TPMS (sinon toutes les trames vu la faible durée d'écoute par AT+DISI?) une boucle relançant AT+DISI? est peut être un compromis acceptable.
J''obtiens une écoute de 5s environ par les commande AT+DISI? et AT+DISA? , (cette dernière récupère plus d'infos et les restitue par un mix ASCII et hexadécimal)

Grace à al1fch j'avance: :slight_smile:

Pour le câblage: Bluetooth LE: Using CC-41A (HM-10 Clone):

La commande "AT+DISI? a été ajouté à partir du firmware 536 donc si vous avez un CC-41A avec le firmware 3.03 il faut faire un upgrade du firmware: How to flash genuine HM-10 firmware on CC2541 (make genuine HM-10 from CC41):

Si vous voulez savoir tout sur HM-10: HM-10

Le simple code:

#include <SoftwareSerial.h>
 
SoftwareSerial BTSerial(4, 5);
unsigned long lTimer = 0; 
void setup() {
   Serial.begin(9600);
   BTSerial.begin(9600);
   Serial.println("ok");
   BTSerial.write("AT");
   delay(500);
   BTSerial.write("AT+RENEW");
   delay(1000);
   Serial.println("1 ");
   //BTSerial.write("AT+NAME=Controller\r\n");
   BTSerial.write("AT+IMME1");
   delay(1000);
    lTimer = millis();
   BTSerial.write("AT+ROLE1"); 
}
 
void loop()
{
  
  char c;
  if (BTSerial.available())
  {
    //c = BTSerial.read();
    //Serial.println("r");
    Serial.write(BTSerial.read());
  }
  if (Serial.available())
  {
    //c = Serial.read();
    //Serial.print(c);
    //Serial.println("");
    BTSerial.write(Serial.read());
  }
  if (lTimer + 3000 < millis())
  {
    Serial.println("");
    BTSerial.write("AT+DISI?");
    lTimer = millis();
  }
}

résultat:

OK+DISISOK+DISC:00000000:00000000000000000000000000000000:0000000000:987BF3348E71:-080
OK+DISC:00000000:00000000000000000000000000000000:0000000000:83EACA4003AA:-054
OK+DISISOK+DISCEOK+DISC:00000000:00000000000000000000000000000000:0000000000:987BF3348E71:-076
OK+DISISOK+DISC:00000000:00000000000000000000000000000000:0000000000:83EACA4003AA:-071
OK+DISCEOK+DISC:00000000:00000000000000000000000000000000:0000000000:987BF3348E71:-079
OK+DISC:00000000:00000000000000000000000000000000:0000000000:83EACA4003AA:-071
OK+DISISOK+DISCEOK+DISC:00000000:00000000000000000000000000000000:0000000000:987BF3348E71:-085
OK+DISC:00000000:00000000000000000000000000000000:0000000000:83EACA4003AA:-071
OK+DISISOK+DISCEOK+DISC:00000000:00000000000000000000000000000000:0000000000:987BF3348E71:-086
OK+DISC:00000000:00000000000000000000000000000000:0000000000:83EACA4003AA:-070
OK+DISCE
OK+DISISOK+DISC:00000000:00000000000000000000000000000000:0000000000:83EACA4003AA:-071
OK+DISC:00000000:00000000000000000000000000000000:0000000000:987BF3348E71:-086

83:EA:CA:40:03:aa est mon capteur TPMS
La chose intéressante est que on peux envoyer un AT+DISI? même si celui précédemment envoyé n'a pas fini (OK+DISCE).
Maintenant le problème est que je vois seulement des "0" comme donné!

OK

Pour être tranquille mieux vaut acheter des vrais HM-10 !!

Tous les bidules BLE n'envoient pas de données dans la première partie de la trame émise, d'où les 0; AT+DISI? ne peut pas en faire plus.

Essayer AT+DISA? qui renvoie plus de données (certaines en ASCII et les autres en hexadécimal d'ou un travail supplémentaire pour extraire les infos utiles).

La même chose mais avec AT+DISA? au lieu de AT+DISI?:

Je n'arrive pas à faire un copié/collé car il y a des caractères étranges!
Photo:

caractère étranges car ce ne sont pas des 'caractères imprimables', le terminal de l'IDE Arduino ne peut montrer les valeurs

En réceptionnant les données avec un terminal sachant afficher l'hexadécimal on y voit plus clair

Firmware : en février 2019 la version 703 est sortie sur le site du fabricant du vrai HM-10

Si j'ai bien compris je dois prendre chaque byte et le transformer en HEX ?

Oui mais pour la version 703 le upgrade se fait différemment!!

oui, c'est ça
Voilà la structure de la réponse à AT+DISA? d'après la doc
DISA.png

DISA.png

al1fch:
PS : pourrais tu éditer le titre du message initial en ajoutant au moins TPMS ou pression des pneus.... ça facilitera les recherches ultérieures sur ce sujet particulier ?

C'est mieux?

Oui , ça permettra de retrouver plus vite le fil quand il sera question de TPMS !

Oui mais pour la version 703 le upgrade se fait différemment!!

Ah ! les miens sont encore en version 701

Oui mais ça peut être utile pour n'importe quel ble!
Maintenant je vais étudier comme il faut faire pour transformer un byte en HEX: ça aussi je ne l'ai jamais fait. :o

  if (BTSerial.available())
  {
    //c = BTSerial.read();
    Serial.print(BTSerial.read(), HEX);
    //Serial.write(BTSerial.read());
  }
[code]

[/code]

Ce qu'il me donne en HEX:

4F 4B 2B 44 49 53 41 53 4F 4B 2B 44 49 53 41 3A AA 3 40 CA EA 83 0 AB 1B 2 1 5 3 3 B0 FB 13 FF 0 1 83 EA CA 40 3 AA B5 2E 0 0 FC 6 0 0 2F 0 D A
4F 4B 2B 44 49 53 41 3A AA 3 40 CA EA 83 0 AA E D 9 54 50 4D 53 34 5F 34 30 30 33 41 41 D A
4F 4B 2B 44 49 53 43 45 4F 4B 2B 44 49 53 41 3A 71 8E 34 F3 7B 98 0 B0 11 2 1 6 3 2 F0 FF 9 FF 1 7 98 7B F3 34 8E 71 D A
4F 4B 2B 44 49 53 41 3A 71 8E 34 F3 7B 98 0 B0 15 B 9 53 4D 50 2D 42 31 36 2D 46 52 5 12 10 0 10 0 2 A 0 D A
4F 4B 2B 44 49 53 41 3A AA 3 40 CA EA 83 0 C6 1B 2 1 5 3 3 B0 FB 13 FF 0 1 83 EA CA 40 3 AA B5 2E 0 0 FC 6 0 0 2F 0 D A
4F 4B 2B 44 49 53 41 3A AA 3 40 CA EA 83 0 C6 E D 9 54 50 4D 53 34 5F 34 30 30 33 41 41 D A

rouge = ADDR MAC

pas mal !!

ta routine semble eliminer les zéros non significatifs, tu as vu plus haut que l'adrese MAC est
83 EA CA 40 03 AA et non 83 EA CA 40 3 AA

ci joint un debut de coloriage des trames

Les infos émises par le capteur TPMS sont apparement distribuées sur des trames de divers types et non sur une longue trame de type unique (contrainte de taille des trames "Advertizing"), il pourrait y avoir une trame pression , une trame température.... un octet dans chaque trame signalant en général son type.

Dans certaines trames l'adresse MAC figure aussi à l'envers
On voit aussi des chaines de caractères comme TPMS 4_003

Il se pourrait qu' entre les deux occurence de l'adresse MAC , se placent des entiers porteurs des infos utiles.
Ci dessous cette zone 'à fort potentiel' dans deux des trames reçues.
Pression et température s'y trouvent probablement de même que l'identifiant de chaque capteur
localisation.png

trames en couleur.doc (11 KB)

localisation.png

Lien : dans la réponse 1 figure un exemple de codage TPMS. (je ne sais pas si c'est 'standard' )

Avec l'application dédié aux capteurs les valeurs de température et de pression sont connues , reste à les trouver , codées sous une forme ou une autre

Penser aussi aux 4F 4B 2B 44 49 53 41 = " OK+DISA" produits par le HM-10 après chaque trame reçue et non par le capteur TPMS

Pour ce genre d'investigation un terminal affichant côte à côte ASCII et hexa est utile (Cutecom dans mon cas) et puis bien entendu l'incontournable application 'nRF Connect' sur smartphone (et les outils Bluetooth de Linux)
cutecom.png

cutecom.png

Voici les trame filtrées et simplifiées:

AT+DISA: MAC(AA 03 40 CA EA 83) 00 BE 1B 02 01 05 03 03 B0 FB 13 FF 00 01 MAC(83 EA CA 40 03 AA) 2C 5B 00 00 A5 09 00 00 2F 00 0D 0A
AT+DISA: MAC(AA 03 40 CA EA 83) 00 BE 0E 0D 09 TPMS4_4003AA(54 50 4D 53 34 5F 34 30 30 33 41 41) 0D 0A
AT+DISA: MAC(AA 03 40 CA EA 83) 00 C4 1B 02 01 05 03 03 B0 FB 13 FF 00 01 MAC(83 EA CA 40 03 AA) 5D 52 00 00 9E 09 00 00 2F 00 0D 0A
AT+DISA: MAC(AA 03 40 CA EA 83) 00 C4 0E 0D 09 TPMS4_4003AA(54 50 4D 53 34 5F 34 30 30 33 41 41) 0D 0A
AT+DISA: MAC(AA 03 40 CA EA 83) 00 C3 1B 02 01 05 03 03 B0 FB 13 FF 00 01 MAC(83 EA CA 40 03 AA) F6 5D 00 00 85 09 00 00 2F 00 0D 0A
AT+DISA: MAC(AA 03 40 CA EA 83) 00 C3 0E 0D 09 TPMS4_4003AA(54 50 4D 53 34 5F 34 30 30 33 41 41) 0D 0A

Mes conclusions:
en rouge la pression: 2C 5B = 5B 2C = 23,340 psi en décimal
en vert la température: A5 09 = 09 A5 = 24.69 C° en décimal
Il y a aussi caché le niveau de la batterie! bleu jaune rose?

Gagné !

batterie 00 2F (rose) , pour 4,7V ? (un peu élévé) mais le 2F est pourtant bien placé après les deux autres donnénes.

Un lien SVP vers les capteurs utilisés pour permettre de reproduire la manip ?