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
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'
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.
Pour bien analyser la réponse d'un HM-10 à une commande AT+DISA? il faut repérer la structure de la réponse :
Elle commence par OK+DISAS et finit par OK+DISCE
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 !!)
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.....
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 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