#include <Arduino.h>
// Estrutura para mapear os PIDs
struct OBD2PID {
uint8_t pid;
const char* descricao;
const char* unidade;
float (*calcular)(uint8_t A, uint8_t B);
};
// --- Funções de Cálculo ---
float calc_RPM(uint8_t A, uint8_t B) { return ((A * 256.0) + B) / 4.0; }
float calc_Velocidade(uint8_t A, uint8_t B) { return (float)A; }
float calc_Temp(uint8_t A, uint8_t B) { return (float)(A - 40); }
float calc_Porcentagem(uint8_t A, uint8_t B) { return (A * 100.0) / 255.0; }
float calc_MAF(uint8_t A, uint8_t B) { return ((A * 256.0) + B) / 100.0; }
float calc_Voltagem(uint8_t A, uint8_t B) { return ((A * 256.0) + B) / 1000.0; }
// --- Tabela de Mapeamento ---
const OBD2PID pid_table[] = {
{0x0C, "Rotação do Motor", "RPM", calc_RPM}, // A e B
{0x0D, "Velocidade do Veículo", "km/h", calc_Velocidade}, // A
{0x05, "Temperatura Arrefecimento", "°C", calc_Temp}, // A
{0x11, "Posição da Borboleta", "%", calc_Porcentagem}, // A
{0x10, "Fluxo de Ar (MAF)", "g/s", calc_MAF}, // A e B
{0x42, "Tensão do Módulo (ECU)", "V", calc_Voltagem} // A e B
};
const int num_pids = sizeof(pid_table) / sizeof(OBD2PID);
void processarRespostaOBD2(uint8_t pid_recebido, uint8_t A, uint8_t B) {
for (int i = 0; i < num_pids; i++) {
if (pid_table[i].pid == pid_recebido) {
float valor = pid_table[i].calcular(A, B);
Serial.printf("[PID 0x%02X] %-25s: %8.2f %s (Raw: A:0x%02X B:0x%02X)\n",
pid_recebido, pid_table[i].descricao, valor, pid_table[i].unidade, A, B);
return;
}
}
}
void setup() {
Serial.begin(115200);
delay(1500);
Serial.println("=== DATASET DE TESTE OBD-II ===\n");
// 1. Exemplo de RPM (A: 0x1B, B: 0x58 -> 1750 RPM)
processarRespostaOBD2(0x0C, 0x1B, 0x58);
// 2. Exemplo de Velocidade (A: 0x50 -> 80 km/h)
processarRespostaOBD2(0x0D, 0x50, 0x00);
// 3. Exemplo de Temperatura (A: 0x82 -> 90 °C)
processarRespostaOBD2(0x05, 0x82, 0x00);
// 4. Exemplo de Porcentagem/Borboleta (A: 0x4D -> 30.20 %)
processarRespostaOBD2(0x11, 0x4D, 0x00);
// 5. Exemplo de MAF (A: 0x11, B: 0x94 -> 45.00 g/s)
processarRespostaOBD2(0x10, 0x11, 0x94);
// 6. Exemplo de Voltagem ECU (A: 0x31, B: 0x34 -> 12.60 V)
processarRespostaOBD2(0x42, 0x31, 0x34);
Serial.println("\n=== FIM DO TESTE ===");
}
void loop() {}