Arduino & ble TPMS (Capteur pression pneus)

J'ai essayé la dernière version du firmware du hm 10 mais il ne me montre pas de résultats avec la commande at + disa? , J'ai retéléchargé la version 609 qui est celle que j'utilise, voici quelques captures d'écran que j'obtiens:
CHAÎNE OBTENUE DU PROGRAMME tpms sur le forum v4.ino le 14 avril 2021 à 21h09

3a dd 07 30 ca ea 82 00 c0 1b 02 01 05 03 03 b0 fb 13 ff 00 01 82 ea ca 30 07 dd 00 00 00 00 a4 0b 00 00 55 00 0d 0a 4f 4b 2b 44 49 53 41 3a dd 07 30 4f 4f 4b 2b 44 49 53 43 4f 4b 2b 44 49 53 41 53 4f 4b 2b 44 49 53 41 3a ba
3a dd 07 30 ca ea 82 00 c0 1b 02 01 05 03 03 b0 fb 13 ff 00 01 82 ea ca 30 07 dd 00 00 00 00 a4 0b 00 00 55 00 0d 0a 4f 4b 2b 44 49 53 41 3a dd 07 30 4f 4f 4b 2b 44 49 53 43 4f 4b 2b 44 49 53 41 53 4f 4b 2b 44 49 53 41 3a ba 2f
3a dd 07 30 ca ea 82 00 c0 1b 02 01 05 03 03 b0 fb 13 ff 00 01 82 ea ca 30 07 dd 00 00 00 00 a4 0 pression 00 00 55 00 temp 0d 0a 4f 4b 2b 44 49 53 41 3a dd 07 30 4f 4f 4b 2b 44 49 53 43 4f 4b 2b 44 49 53 41 53 4f 4b 2b 44 49 53 41 3a ba 2f

un autre test de la même date mais avec 30 psi de pression

82 ea ca 30 7 dd 5a 32 2 0 46 9 0 0 55 1 d a 4f 4b 2b 44 49 53 41 3a dd 7 30 ca ea 82 0 bb e d 9 54 50 4d 53 33 5f 33 30 30 37 44 44 d a
6e 64 20 34 3 2 e0 fe 4f 4b 2b 44 49 53 41 3a 0 7 73 1 42 44 3 a3 1c 3 3 9f fe 17 16 9f fe 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 da 4f 4b 2b 44 49 53 41 3a dd 7 30 ca ea 82 0 bb 1b 2 1 5 3 3 b0 fb 13 ff 0 1 82 ea ca 30 7 dd 5a 32 2 0 46 9 0 0 55 1 da 4f 4b 2b 44 49 53 41 3a dd 7 30 ca ea 82 0 bb ed 9 54 50 4d
la pression est probablement à gauche du mac inversé

Cadres obtenus avec l'adaptateur usb ttl connecté directement au hm 10 et au série arduino ide le 15 avril 2021 à 21h30

OK + DISAS
OK + DISA: ⸮⸮ / # t} # ⸮ ## ⸮L
OK + DISAS
OK + DISA: ⸮⸮ / # t} # ⸮ ## ⸮L
OK + DISA: ⸮ # 0⸮⸮TPMS3_3007DD
TPMS3_3007DD = 54 50 4d 53 33 5f 33 30 30 37 44 44

La commande AT+DISA? a-t-elle été précédée des commandes AT+IMME1 et AT+ROLE comme indiqué dans la data sheet ? je viens de tester un HM-10 resté au firmware V708, la commande AT+DISA? renvoie de nombreuses infos.

Pour le problème spécifique TPMS l'idéal serait que @savoriano passe ici.
je ne possède pas de tels capteurs et le coup demain donné est trop ancien , je ne suis plus 'dans le bain' :disappointed_relieved:

Le MAC de mon capteur TPMS est 82 ea ca 30 07 dd

82 ea ca 30 7 dd [ 5a 32 2 0 46 9 0 0 55 1 d a 4f 4b 2b 44 49 53 41 3a ] dd 7 30 ca ea 82

a mettre en, relation avec le message #17, ça donnera peut être quelquechose

Mettez à jour le hm 10 a la version 710 et essayez la commande at + disa? , (précédent at + imme1, at + role1) directement dans un terminal de commande (realterm) j'ai:
OK+DISCE4F4B2B44495341534F4B2B444953413A011D7EE5FC2400C71C1BFF7500420401806024FCE57E1D0126FCE57E1D0001CEFB000000000D0A4F4B2B444953413A824287DAE44D03CF1F1EFF060001092002FD7D78A8CAC63C8534EF78D93CAE51F638B8131A6C27F40D0A4F4B2B444953413AFAE5475B665C03B01C03039FFE17169FFE00000000000000000000000000000000000000000D0A4F4B2B444953413AFAE5475B665C03B00A09FFE000015BCA746E930D0A4F4B2B4449534345

Attention ! La commande AT+DISA? donne toutes les trames d'advertizing captées durant un intervalle de temps donné , celle venant des capteurs de pression mais aussi de tout un tas d'autres appareils BLE qui sont actifs aux alentours. Il faut repérer la bonne trame et travailler sur elle.

ok, je reçois juste le signal de mes capteurs, merci

Pour bien analyser la réponse d'un HM-10 à une commande AT+DISA? il faut repérer la structure de la réponse :

  1. Elle commence par OK+DISAS et finit par OK+DISCE

  2. Entre ces limites de début et de fin on trouve un ou plusieurs blocs commençant par OK+DISA suivi d'une trame d'advertiing reçue.

Je ne connais pas Realterm mais s'il est capable d'afficher en hexa et en ASCII utiliser les deux modes comme ci dessous (avec Cutecom), ça permetde mieux repérer binaire et caractères

Dans l'exemple ci-dessous 6 trames émises par 6 objets différents ont été captées en 3 secondes seulement (5 de ces six objets ne sont pas chez moi mais chez des voisins !!)
reponse

Récapitulatif des chaînes obtenues: avec usb ttl et programme realterm hm 10

82 EA CA 30 07 DD 00 00 00 00 84 0B 00 00 55000D0A4F4B2B444953413A DD0730CAEA82{a 0psi y ~26C}
82 EA CA 30 07 DD 00 00 00 00 8C 0A 00 00 55010D0A4F4B2B444953413A DD0730CAEA82{a 0psi y ~26C}
82 EA CA 30 07 DD E5 D2 01 00 56 0A 00 00 55000D0A4F4B2B444953413A DD0730CAEA82{a 21psi y ~26C}
82 EA CA 30 07 DD E5 D2 01 00 56 0A 00 00 55000D0A4F4B2B444953413A DD0730CAEA82{a 21psi y ~26C}

un peu trié ça donne ça avec la présence étonnante du message OK+DISA: ,
Il est très peu probable qu'il soit émis par le capteur TMPS vais vientdu HM-10

82 EA CA 30 07 DD  00 00 00 00 84 0B 00 00 5500 0D0A 4F4B2B444953413A  DD0730CAEA82 {a 0psi y ~26C}
82 EA CA 30 07 DD  00 00 00 00 8C 0A 00 00 5501 0D0A 4F4B2B444953413A  DD0730CAEA82 {a 0psi y ~26C}
82 EA CA 30 07 DD  E5 D2 01 00 56 0A 00 00 5500 0D0A 4F4B2B444953413A  DD0730CAEA82 {a 21psi y ~26C}
82 EA CA 30 07 DD  E5 D2 01 00 56 0A 00 00 5500 0D0A 4F4B2B444953413A  DD0730CAEA82 {a 21psi y ~26C}
<-------MAC----->  **************************** CRLF    OK+DISA:       <  MAC >

Ensuite il faut analyser la partie qui suit l'adresse MAC (partie marquée par des étoiles) et décoder l'info qui y est présente.

Peut être le codage de l'information est identique à celui trouvé il ya un an pour les TPMS de @savoriano, peut être pas.....

Les données ci-dessus sont déjà filtrées sont celles de mon module tpms et obtenues avec le hm-10 et un module usb ttl

Savoriano profite déjà de la route avec son compteur déjà installé dans son véhicule ha ha


C'est l'équipement de test avec lequel je fais les captures et le programme Realterm

Salut Luis,

Mes capteurs donnent les infos de la pression et température après le MAC inversé (10 bytes).
Rappel:
Le capteurs envoient les données au moins toutes les 3 minutes même si rien à changé sauf si la pression est à 0 !

Je te poste la dernière version installé su mon ordinateur de bord.

void CapteursPression()
{
//  Serial.println("CP");
  while (Serial2.available() > 0)//il y a quelque chose que le BT veut nous trasmettre?
  {
    //lit le BT
    baTrama[iLenTrama] = Serial2.read();
    //Serial.println(baTrama[0]);

    if ((iLenTrama == 7 && baTrama[0] == 'O' && baTrama[1] == 'K' && baTrama[2] == '+') || iLenTrama > 38)
    { //efface les 'OK+DISA*'
      iLenTrama = 0;
      return;
    }

    if (baTrama[iLenTrama - 1] == 13 && baTrama[iLenTrama] == 10) //fin de la trame
    {
#ifdef DEBUGCAPT
      Serial.println("AnaTr");
#endif
      /*if (boLedBT)
        ssn.printSegNum(320, 5, cLedGPSOn);
      else
        ssn.printSegNum(320, 5, cLedGPSOff);

      boLedBT = !boLedBT;*/
      // Analise la trame
      if (iLenTrama == 37)//le capteur transmet 2 differentes trames
      { //seulement la plus longue nous interesse
        byte bPosX;
        if      (baTrama[0] == baMacCaptAv[0] && baTrama[1] == baMacCaptAv[1] && baTrama[2] == baMacCaptAv[2] && baTrama[3] == baMacCaptAv[3]) bPosX = 140;
        else if (baTrama[0] == baMacCaptAr[0] && baTrama[1] == baMacCaptAr[1] && baTrama[2] == baMacCaptAr[2] && baTrama[3] == baMacCaptAr[3]) bPosX = 0;
        else
        {
          iLenTrama = 0;
          return;//on sort car la trame ne provient pas de nos capteurs
#ifdef DEBUGCAPT
          Serial.println("deltra");
#endif
        }
        uint32_t c = ((long)baTrama[28] * 65536UL) + (baTrama[27] * 256) + baTrama[26];//Calcule la pression

        if (c > 400000UL)//des fois il trouve de pressions incoerrentes!
        {
          iLenTrama = 0;
          return;
        }
        bBT++;
        uiTimerBTWait = millis();
#ifdef DEBUGCAPT
        Serial.print("bBT: ");
        Serial.println(bBT);
#endif
        if (c < 200000UL && tft.readPixel(bPosX + 10 , 259) != RED)//pression insuffisante
        {
          for (byte a = 41; a < 60; a++) tft.drawCircle(bPosX + 60, 259, a, RED);//Colora le gomme in ROSSO
        }
        else if (c > 260001UL && tft.readPixel(bPosX + 10 , 259) != BLUE)// Pression elevée
        {
          for (byte a = 41; a < 60; a++) tft.drawCircle(bPosX + 60, 259, a, BLUE);//Colora le gomme in BLU
        }
        else if (c < 260000UL && c > 199000UL && tft.readPixel(bPosX + 10 , 259) != GREEN) //pression optimale
        {
          for (byte a = 41; a < 60; a++) tft.drawCircle(bPosX + 60, 259, a, GREEN);//Colora le gomme in VERDE
        }

        char cPres[8];
        float fP = float(c) / 100000.00;
        sprintf(cPres, " %1d.%02d", (int)fP, ((int)(fP * 100) - ((int)fP) * 100));// On peux utiliser %
        SET_DIM_CHAR_S;
        ssn.printSegNum(12 + bPosX, 180, cPres);//Ecrit la pression

        c = baTrama[32] * 65536 + baTrama[31] * 256 + baTrama[30];//Calcule la temp.

        char cTemp[5];
        sprintf(cTemp, "%2d", c / 100);
        ssn.printSegNum(107 + bPosX, 300, cTemp);// Ecrit sur le TFT la Temperature
        SET_DIM_CHAR_M;
      }
      iLenTrama = -1;//efface la trame
    }
    iLenTrama++;
  }

  if (uiTimerBT + 3500 < millis()) //relance tous les 3 sec la commande "AT+DISA?"
  {
    //Serial.println("Disa");
    Serial2.write("AT+DISA?");
    uiTimerBT = millis();
  }
}

Bonjour Savoriano, j'apprécie les informations qui me seront très utiles sans aucun doute, puis je publie mes résultats dans le forum arduino

Bonjour les amis J'ai des progrès en utilisant le code Savorian, merci pour le partage Je peux lire la pression et la température correctement mais seulement à partir d'un seul capteur, je ne sais pas comment faire pour les 3 autres, comment cela se passerait-il? Je veux juste obtenir la pression et la température des capteurs et les montrer via le port série arduino, puis je fais la mise en œuvre pour l'écran oled merci

Bonjour

je suppose que caque capteur a son adresse MAC à indiquer dans le code

Il faudrait donc écouter toutes les trames émises avec les adresses MAC des n capteurs

Ok, j'ai du travail à faire pour analyser les messages d'accueil du code