[Solucionado] Visualizar Sensor TPMS por CAN en Puerto serie ayuda

Buenas amigos, compre para mi hijo unos sensores TPMS para las ruedas del coche y quería visualizar los datos en una pantalla, de momento en el puerto serie, para después implantarlo en alguna pantalla.

El fabricante me dio estos dados de la trama Can que manda cada sensor:

ID 0x01 Sensor Delantero Derecho, 0x02 Delanter Izquierdo, 0x03 Trasero Derecho, 0x04 Trasero Izq.

Bufer = [D0, D1, D2, D3, D4, D5, D6]

Donde:

D1 y D2 es la presión en Kpa....................0x0100 son 256 kpa

D4 es la temperatura en ºC.......................0x18 son 30ºC

D6 es el voltaje de la pila en Voltios...........0x21 son 3,3v

Tengo problemas para visualizar la presión ya que me viene en dos byte y la tengo que pasar a bares y con decimales.

Y tambien tengo problemas para visualizar el voltaje de la batería

Esto es lo que he echo,de momento para probar solo lo hice con un sensor.
Resultado:

1.- La temperatura me funciona prefectamente.

2.- La Presion también me funciona pero me sale en Kpa,no se si lo hice bien, como la paso a bares.

3.- La bateria me imprime 33v en vez de 3,3v, como hago para que me salga 3,3v

Las pruebas las hice por que el sensor trae un pulsador oculto que con un pincho lo dejas presionado 30seg y te lanza los datos de 0x0100, 0x18 y 0x21 que puse arriba

#include <SPI.h>
#include "mcp_can_h"

int Presion = 0;
int temp = 0;
int bat = 0;

const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN);
void setup() {
  Serial.begin(9600);
  if (CAN_OK == CAN.begin(CAN_500KBPS)) {
    Serial.println("CAN BUS Shield init ok!");
  }
  else {
    Serial.println("CAN BUS Shield init fail");
    Serial.println("Init CAN BUS Shield again");
    delay(100);
    
  }
}

void loop() {
  unsigned char len = 0;
  unsigned char buf[8];

  while (CAN_MSGAVAIL == CAN.checkReceive()) {

    CAN.readMsgBuf(&len, buf);

    switch (CAN.getCanId()) {

      case 0x01:
        temp = buf[4];
        Serial.print("Temperatura= ");
        Serial.println(temp);

        bat = buf[6];
        Serial.print("Bateria= ");
        Serial.println(bat);

        Presion = buf[1] + buf[2];
        Serial.print("Presion= ");
        Serial.println(Presion);
        

        break;
     
    }
  }
}

La Presion también me funciona pero me sale en Kpa,no se si lo hice bien, como la paso a bares.

Google : Conversión de presión como esta link

1 kpa ===> 0.01 bares

Asi que solo divide por 100

Dudo que esto este bien
Presion = buf[1] + buf[2];

Según esto que te dió el fabricante
D1 y D2 es la presión en Kpa....................0x0100 son 256 kpa
entonces D1 tiene un peso de 256 y la expresión que a continuación te detallo es la que corresponde.

Presion = buf[1]*256+buf[2];

Ahora para obtener el valor en bares solo haz esto

flot fPresion = Presion/100.0;
Serial.print("Presion= ");
Serial.println(fPresion);

3.- La bateria me imprime 33v en vez de 3,3v, como hago para que me salga 3,3v

Me sorprende el tipo de preguntas que haces.

Divide por 10. Si lo preguntas a nivel de tu código entonces

no puedes usar solo int bat

Agrega

float fbat;

y en esta línea

bat = buf[6];
        Serial.print("Bateria= ");
        Serial.println(bat);

usa esto

bat = buf[6];
fbat = bat / 10.0;
Serial.print("Bateria= ");
Serial.println(fbat);

Gracias surbyte por tu respuesta.

Me sorprende el tipo de preguntas que haces.

Divide por 10. Si lo preguntas a nivel de tu código entonces

no puedes usar solo int bat

Ahora lo entiendo, perfectamente, sabia que había que dividirlo entre 10, es lógico, pero no me salia con int, con float como me has indicado, es mas logico ya que permite decimales.

Dudo que esto este bien
Presion = buf[1] + buf[2];

Según esto que te dió el fabricante
D1 y D2 es la presión en Kpa....................0x0100 son 256 kpa
entonces D1 tiene un peso de 256 y la expresión que a continuación te detallo es la que corresponde.
Code: [Select]
Presion = buf[1]*256+buf[2];

Yo tenia mis dudas, pero como sume los dos buf y en el pueto me salia 256Kpa, crei que funcionaria.

No entiendo muy bien por que lo multiplicas por 256 el buf[1] y el buf[2] no. Me lo puedes explicar por favor.

Gracias

Cuando el fabricante te dijo

D1 y D2 es la presión en Kpa....................0x0100 son 256 kpa

te esta indicando precisamente eso, te dice que te envia 2 bytes, y que 0x0100 en notacion hexadecimal representa 256.
D1 es el mas significativo y D2 el menos significativo.

Si recibes un número por ejemplo : 53 lo rearmas justamente de este modo

5x256+3 = 1283

Pero si solo fuera 0009 = tendrías 9
Como los números vienen expresados en hexadecimal
puedes recibir esto

000A = 10
o esto
00FF = 255
el siguiente será justamente
0100 = 256

Buenas surbyte,

Gracias por la explicación, lo he entendido, pero lo he probado y no me funciona.

Si pulso un reset que tiene el sensor, me manda 256kpa, para hacer pruebas,pero obtengo esto

CAN BUS Shield init OK!

Temperatura = 23

Bat = 3,2

Presion = 5.11

Sin embargo si uso esto:

Presion = buf[1] + buf[2];

Me imprime esto:

CAN BUS Shield init OK!

Temperatura = 23

Bat = 3,2

Presion = 2,56

Pero se que no tiene mucho sentido sumar los bufer sin multiplicar por 256, es mas logico como tu me has explicado.

El fabricante también me envió esto, que no se si tendrá alguna relevancia

Si pulsas reset envia dos bytes
Y tal como te lo puse yo basado en lo que tienes mostró 5.11 o sea tenemos un overflow por ahi.
Veamos.

Hice un pequeño código donde definí de este modo dos vectores

// variables globales
unsigned char buf1[3];
unsigned char buf2[3];

// en el setup
buf1[0] = buf2[1] = 0x01;
buf1[1] = buf2[0] = 0x00;

// loop
float fp1 = buf1[0]*256+buf1[1];
float fp2 = buf2[0]*256+buf2[1];

Por supuesto que el orden no es como lo presento, son variables globales, incializadas en el setup y mostradas en el loop.

Los resultados son estos

fp1 = 2.56 fp2 = 0.01

asi que no se por qué a ti se sale 5.11

porque en lugar de sumar no invertiste los elementos del vector como yo lo hago acá?

Pues ya esta solucionado, el problema estaba en el sensor que al pulsar el reset me mandaba la señal mal, probé con otro y funcionando,

surbyte muchas gracias por tu gran ayuda.

Saludos

Puedes poner por favor el link de los sensores TPMS que estas usando? El hilo quedará mas completo si lo haces.

Recuerda usar etiquetas.