
老车没有水温表,仪表盘上只有一根油量针和一个速度表。想知道转速、水温、电瓶电够不够,只能靠自己装一个。
市面上卖的 OBD 表两三百,但自己做一个更有意思:一块单片机、一个 CAN 收发器、一块屏,成本不到五十。
这篇只讲三件事:怎么读到数据、程序怎么写、坑在哪里。
方向盘下面那块塑料板里,有一个 16 针的梯形接口,就是 OBD-II。
它本来是国家强制要求的排放检测口,但里面什么都能读:转速、车速、水温、进气温度、节气门开度、电瓶电压。
用法非常像点菜:
01 是服务号,意思是「读当前数据」;0C 是 PID,意思是「发动机转速」。就这么简单。
物理上,现在绝大多数车走 CAN 总线:接 6 脚(CAN_H)和 14 脚(CAN_L),速率 500k,差分信号。
| 部件 | 选型 | 说明 |
|---|---|---|
| 单片机 | STM32F103 / ESP32 | 带 CAN 控制器的直接接,不带的加 MCP2515 |
| CAN 收发器 | TJA1050 / SN65HVD230 | 把 3.3V 逻辑电平转成总线差分信号 |
| 电源 | 宽压 DCDC(9–36V) | 车上的 12V 一点都不干净 |
| 屏幕 | 0.96 OLED / 1.8 TFT | 小屏反而不刺眼 |
| 接口 | OBD 公头 + 杜邦线 | 直接插,不用剪线 |
一个很多人忽略的点:供电比通信难。车子启动那一瞬电压能掉到 6V,发电机抛负载能冲到 60V,接反了直接烧。TVS、防反接二极管、共模电感,一样都不能省。

拆开看就四步:
1. 探测:发一帧 01 00
这是在问「你支持哪些 PID」。有回复说明通了,没回复就换协议或换波特率重试。
2. 记下清单 回复是 4 个字节的位图,每一位代表一个 PID 支不支持。先知道能问什么,后面才不会白问。
3. 主循环:每 100ms 问一组 不要一个一个问,可以把几个 PID 揁在一起发,一次拿回四五个数。转速、水温、车速、电压,一轮就够了。
4. 解析、滤波、刷屏 拿到字节按公式换算,做一次滑动平均去掉毛刺,再推给屏幕。
| PID | 含义 | 公式 |
|---|---|---|
| 0C | 发动机转速 | ((A×256)+B) ÷ 4 |
| 0D | 车速 | A |
| 05 | 冷却液温度 | A − 40 |
| 11 | 节气门开度 | A × 100 ÷ 255 |
| 2F | 燃油液位 | A × 100 ÷ 255 |
| 42 | 模块电压 | ((A×256)+B) ÷ 1000 |
A、B 就是回复里第 3、第 4 个字节。就这几个,已经能把仪表盘填满。
三句话:
做到最后你会发现,真正难的不是写代码,是让它在零下十度的早上、在颠簸的土路上、在电压跌到 9V 的时候,还能安静地把那个数字显示对。