Hello, this is a program that reads the pressure and temperature of the tires through external bluetooth low energy sensors model vc601 or equivalent using the bluetooth module HM-10, with this you can improve the code to add an oled screen and integrate it into the dashboard of any car. Thanks to everyone who supported this
Hola este es un programa que lee la presion y temperatura de las llantas por medio de los sensores externos bluetooth low energy modelo vc601 o equivalente utiizando el modulo bluetooth HM-10, con esto se puede mejorar el codigo para agregarle una pantalla oled e integrarlo al tablero de instrumentos de cualquier coche. Gracias a todos los que apoyaron en esto
[code]
/* El presente codigo se obtuvo a partir del hilo publicado en: https://forum.arduino.cc/t/arduino-ble-tpms-capteur-pression-pneus/592030
* Mi agradecimiento y reconocimiento a los autores originales del codigo
* Este programa permite leer los sensores Ble TPMS externos por medio del modulo BLE HM-10 conectado al arduino
* y mostrar la presion y temperatura de esos sensores en el monitor serial
* Detalles importantes
* Conexion:
* pin arduino HM-10
* D4<--------->TXD
* D5<--------->RXD
* 5v<--------->VCC
* GND<-------->GND
* El modulo HM-10 debe estar actualizado con la version 709 consulte:
* http://kio4.com/arduino/161_HM10_BLE_Actualizar.htm
* Ami me funciono sin usar resistencias
* 21 abril de 2021
*/
#include <SoftwareSerial.h>
unsigned int baTrama[50];// trama de datos leidos de los sensores tpms
int iLenTrama = 0; //indice para los arreglos
/*Datos de los sensores El ID de cada sensor transformarlo a decimal por pares y ponerlo en forma inversa en las variables de abajo ejemplo
* ID= 3007DD
* HEX 30 07 DD
* DEC 48 7 221--->221,7,48 invertido
*/
byte IDsti[3]={221,7,48};//IDsti=Identificador sensor trasero izquierdo en decimal -->"30 07 DD"
byte IDstd[3]={153,3,64};//IDstd=Identificador sensor trasero derecho en decimal -->"40 03 99"
byte IDsdi[3]={208,0,32};//IDsti=Identificador sensor delantero izquierdo en decimal-->"20 00 D0"
byte IDsdd[3]={98,1,16};//IDsti=Identificador sensor delantero derecho en decimal-->"10 01 62"
String IDstiTxt="30 07 DD"; //Identificador sensor trasero izquierdo en texto
String IDstdTxt="40 03 99"; //Identificador sensor trasero derecho en texto
String IDsdiTxt="20 00 D0"; //Identificador sensor delantero izquierdo en texto
String IDsddTxt="10 01 62"; //Identificador sensor delantero derecho en texto
/*
* Variables para la temperatura y presion de cada rueda
* pdd=presion de la rueda delantera derecha
* pdi=presion de la rueda delantera izquierda
* ptd=presion de la rueda trasera derecha
* pti=presion de la rueda trasera izquierda
*
* tdd=temperatura de la rueda delantera derecha
* tdi=temperatura de la rueda delantera izquierda
* ttd=temperatura de la rueda trasera derecha
* tti=temperatura de la rueda trasera izquierda
*/
char pdd[8],pdi[8],ptd[8],pti[8];
char tdd[5],tdi[5],ttd[5],tti[5];
SoftwareSerial moduloHM_10(4, 5);//rx, tx
unsigned long uiTimerBT;
char cTemp[5];
char cPres[8];
void setup() {
Serial.begin(9600);
moduloHM_10.begin(9600);
moduloHM_10.write("AT+IMME1");
moduloHM_10.write("AT+ROLE1");
}
void loop() {
presion_temp();
}
void presion_temp()
{
while (moduloHM_10.available() > 0)//mientras haya datos
{
//leer los datos
baTrama[iLenTrama] = moduloHM_10.read();
if ((iLenTrama == 7 && baTrama[0] == 'O' && baTrama[1] == 'K' && baTrama[2] == '+') || iLenTrama > 38)
{ // borra el texto "OK+DISA:" de la trama obtenida de los sensores
iLenTrama = 0;
return;
}
if (baTrama[iLenTrama - 1] == 13 && baTrama[iLenTrama] == 10) //fin de la trama
{
// Analise la trame
if (iLenTrama == 37)//el sensor transmite 2 tramas diferentes
{ //solo nos interesa la trama mas larga
if (baTrama[0]==IDsti[0]&&baTrama[1]==IDsti[1]&&baTrama[2]==IDsti[2])//muestra presion y temp de un sensor especifico
{ uint32_t c = ((long)baTrama[28] * 65536UL) + (baTrama[27] * 256) + baTrama[26];//Calcule la pression
if (c > 400000UL)// a veces da lecturas incoherentes
{
iLenTrama = 0;
return;
}
unsigned long uiTimerBTWait = millis();
float fP = float(c) / 100000.00;
sprintf(pti, " %1d.%02d", (int)fP, ((int)(fP * 100) - ((int)fP) * 100));// podemos usar%
c = baTrama[32] * 65536 + baTrama[31] * 256 + baTrama[30];//Calcule la temp.
sprintf(tti, "%2d", c / 100);
}
if (baTrama[0]==IDstd[0]&&baTrama[1]==IDstd[1]&&baTrama[2]==IDstd[2])//muestra presion y temp de un sensor especifico
{ uint32_t ctd = ((long)baTrama[28] * 65536UL) + (baTrama[27] * 256) + baTrama[26];//Calcule la pression
if (ctd > 400000UL)// a veces da lecturas incoherentes
{
iLenTrama = 0;
return;
}
unsigned long uiTimerBTWait = millis();
float fPtd = float(ctd) / 100000.00;
sprintf(ptd, " %1d.%02d", (int)fPtd, ((int)(fPtd * 100) - ((int)fPtd) * 100));// podemos usar%
ctd = baTrama[32] * 65536 + baTrama[31] * 256 + baTrama[30];//Calcula la temp.
sprintf(ttd, "%2d", ctd / 100);
}
if (baTrama[0]==IDsdi[0]&&baTrama[1]==IDsdi[1]&&baTrama[2]==IDsdi[2])//muestra presion y temp de un sensor especifico
{ uint32_t cdi = ((long)baTrama[28] * 65536UL) + (baTrama[27] * 256) + baTrama[26];//Calcula la pression
if (cdi > 400000UL)// a veces da lecturas incoherentes
{
iLenTrama = 0;
return;
}
unsigned long uiTimerBTWait = millis();
float fPdi = float(cdi) / 100000.00;
sprintf(pdi, " %1d.%02d", (int)fPdi, ((int)(fPdi * 100) - ((int)fPdi) * 100));// podemos usar%
cdi = baTrama[32] * 65536 + baTrama[31] * 256 + baTrama[30];//Calcule la temp.
sprintf(tdi, "%2d", cdi / 100);
}
if (baTrama[0]==IDsdd[0]&&baTrama[1]==IDsdd[1]&&baTrama[2]==IDsdd[2]) //muestra presion y temp de un sensor especifico
{ uint32_t c = ((long)baTrama[28] * 65536UL) + (baTrama[27] * 256) + baTrama[26];//Calcula la pression
if (c > 400000UL)// a veces da lecturas incoherentes
{
iLenTrama = 0;
return;
}
unsigned long uiTimerBTWait = millis();
float fP = float(c) / 100000.00;
sprintf(pdd, " %1d.%02d", (int)fP, ((int)(fP * 100) - ((int)fP) * 100));//podemos usar%
c = baTrama[32] * 65536 + baTrama[31] * 256 + baTrama[30];//Calcule la temp.
sprintf(tdd, "%2d", c / 100);
}
}
iLenTrama = -1;// borra la trama
}
iLenTrama++;
}
if (uiTimerBT + 3500 < millis()) // relanzar el comando "AT+DISA?" cada 3.5 segundos y muestra los datos en el puerto serial
{
Serial.print("ID: "+IDstiTxt);//Sensor 1
Serial.println();
Serial.print("Presion: ");//presion en bar
Serial.println(pti);
Serial.print("Temp: ");//temperatura en Celcius
Serial.println(tti);
Serial.print("ID: "+IDstdTxt);//Sensor 2
Serial.println();
Serial.print("Presion: ");
Serial.println(ptd);//presion en bar
Serial.print("Temp: ");
Serial.println(ttd);
Serial.print("ID: "+IDsdiTxt);// Sensor 3
Serial.println();
Serial.print("Presion: ");
Serial.println(pdi);//presion en bar
Serial.print("Temp: ");
Serial.println(tdi);
Serial.print("ID: "+IDsddTxt); //Sensor 4
Serial.println();
Serial.print("Presion: ");
Serial.println(pdd);//presion en bar
Serial.print("Temp: ");
Serial.println(tdd);
moduloHM_10.write("AT+DISA?");//comando para consultar la informacion y obtener la trama de datos de cada sensor
uiTimerBT = millis();
}
}
[/code]