#include "driver/twai.h"
// Запрос оборотов двигателя по OBD-II.
//
// Контроллер CAN внутри ESP32 (он называется TWAI) выдаёт обычные
// логические уровни на TX и RX. Шине нужна дифференциальная пара
// CANH/CANL — её даёт трансивер SN65HVD230. Он питается от 3,3 В и
// стоит между выводами платы и разъёмом.
//
// Диагностика OBD-II устроена как вопрос и ответ:
// вопрос — кадр 0x7DF (всем блокам): 02 01 0C («служба 01, параметр 0C»)
// ответ — кадр 0x7E8 (двигатель): 04 41 0C A B
// обороты = (256 * A + B) / 4
const gpio_num_t CAN_TX = GPIO_NUM_5; // к CTX трансивера
const gpio_num_t CAN_RX = GPIO_NUM_4; // к CRX трансивера
void setup() {
Serial.begin(115200);
twai_general_config_t general = TWAI_GENERAL_CONFIG_DEFAULT(CAN_TX, CAN_RX, TWAI_MODE_NORMAL);
twai_timing_config_t timing = TWAI_TIMING_CONFIG_500KBITS(); // скорость легковой шины
twai_filter_config_t filter = TWAI_FILTER_CONFIG_ACCEPT_ALL();
if (twai_driver_install(&general, &timing, &filter) != ESP_OK) {
Serial.println("CAN: драйвер не установился");
return;
}
if (twai_start() != ESP_OK) {
Serial.println("CAN: драйвер не запустился");
return;
}
Serial.println("CAN запущен, 500 кбит/с");
}
void loop() {
twai_message_t request = {};
request.identifier = 0x7DF;
request.data_length_code = 8;
request.data[0] = 0x02; // длина полезных данных
request.data[1] = 0x01; // служба 01: текущие данные
request.data[2] = 0x0C; // параметр 0C: обороты
twai_transmit(&request, 0);
// Ответ ждём не дольше четверти секунды: если автомобиль молчит, это
// тоже результат, а не повод зависнуть.
unsigned long start = millis();
bool answered = false;
while (millis() - start < 250 && !answered) {
twai_message_t reply;
while (twai_receive(&reply, 0) == ESP_OK) {
if (reply.identifier == 0x7E8 && reply.data[1] == 0x41 && reply.data[2] == 0x0C) {
int rpm = (256 * reply.data[3] + reply.data[4]) / 4;
Serial.printf("обороты: %d об/мин\n", rpm);
answered = true;
break;
}
}
delay(5);
}
if (!answered) Serial.println("автомобиль не ответил: проверьте CANH, CANL и скорость шины");
delay(1000);
}
SN65HVD230: обороты двигателя по шине CAN (OBD-II)
Контроллер TWAI в ESP32 выдаёт логические уровни, а шине нужна дифференциальная пара. Трансивер SN65HVD230 стоит между ними. Скетч спрашивает у автомобиля обороты (служба 01, параметр 0x0C) и печатает ответ.
Что на схеме
Плата ESP32 DevKit v1, к ней подключены:
- Трансивер CAN SN65HVD230 (модуль) —
xc - Разъём OBD-II автомобиля (CAN) —
obd
Задействованы выводы платы: 3V3, GND, D5, D4. Всего соединений на схеме: 7.
Библиотеки
Дополнительных библиотек не нужно: всё делается ядром Arduino для ESP32, которое уже стоит в сборочном окружении.
Как это устроено в коде
Основное, чем пользуется скетч:
Serial.begin()— открывает монитор порта на заданной скоростиSerial.println()— печатает строку в монитор портаmillis()— миллисекунды с запуска: на них строят работу без остановкиSerial.printf()— печатает в монитор порта с форматированиемdelay()— пауза, на время которой ядро занято ожиданием
В скетче 64 строки; подключено заголовков: 1. Сам скетч открыт на соседней вкладке — его можно менять и запускать заново.
Что попробовать изменить
- Поменяйте период в константе и посмотрите на анализаторе, как меняется картина на выводе.
- Добавьте свои
Serial.println()в интересных местах — монитор порта здесь и есть отладчик. - Перенесите деталь на другой вывод — на схеме и в коде — и убедитесь, что пример работает так же.
- Нажмите «Форкнуть»: копия станет вашим проектом, и в ней можно менять что угодно.
Смотрите также
- Подключение трансивера CAN SN65HVD230 — Трансивер шины CAN, 3,3 В
- NTPClient: время из сети — Библиотека поверх UDP: свой пакет, свой разбор, свой период обновления. Отличие от configTime — в том, кто владеет време…
- WiFi: поиск сетей — Список точек доступа с уровнем сигнала и типом защиты. Проверка того, что радио работает.
- WiFi: подключение с переподключением — Соединение может пропасть в любой момент. Проверка состояния в loop() — не роскошь.
- HTTP-запрос — Клиент, код ответа и тело. Ответ читается целиком в строку — для больших страниц так делать не надо.
- Веб-сервер: управление выводом — Страница с двумя кнопками и обработчики маршрутов. Кнопка «Веб-интерфейс» над схемой открывает её в отдельном окне — как…
- Веб-сервер: JSON с показаниями — Машиночитаемый ответ вместо страницы. Откройте «Веб-интерфейс» и наберите /data — отсюда данные забирает что угодно, от…
Сборка ещё не запускалась.
Печатайте в Serial числа — они станут графиком.
Serial.println(t); — один ряд,
Serial.printf("t:%.1f h:%.1f\n", t, h); — два с подписями.
Формат тот же, что понимает плоттер Arduino IDE.