OBD2, библиотека. Автор накосячил
- Войдите на сайт для отправки комментариев
Привет всем.
Собираю бортовой компьютер на Ардуино.
Всё на основе библиотеки работающей с ОБД2.
https://github.com/stanleyhuangyc/ArduinoOBD/tree/master/libraries/OBD
Сначала не понимал. почему данные не понятные.
Оказывается автору достаточно было переменных тип INT. Я долго смеялся.
Автор что, не знал, что многие данные идут с десятыми долями после запятой.
В общем, не могу разобраться, как переделать библиотеку.
Может кто сталкивался с эти делом и переделал.
Если читать что нибудь типа RPM, то понятно обороты с точностью до десятых и не нужны.
А вот датчик МАФ (расход воздуха) даёт данные с долями,
а на выходе округлённое или 1 или 2 грамма в сек.
что категориески не правильно, т.к к примеру 1.5 грамма в сек, это никак не 1 и не 2.
А что именно Вас не устраивает? Какие именно функции? Напряжения он во float считывает
virtual float getVoltage();
А Вам что нужно?
Посмотрите внимательно код.
Вот именно Напряжение сети читается совершенно по другому, чем всё остальное.
А именно напряжение выдаёт сама ЕЛМ, а не ЭБУ авто.
Для чтения напряжение используется совершенно отдельная функция:
Для чтения всего остального, используется универсальная функция, которая заполняет данными буфер.
ну собственно там всё выдает ELM.
Это само собой, но напряжение бортовой сети ЕЛМ выдаёт самостоятельно. без участия ЭБУ.
Напряжение можно откалибровать, дав соответствующую команду в АТ формате.
Напряжение можно запросить не подключая разъём к авто
(ради эксперимента, просто подключив питание к разъёму).
Те данные, которые могут иметь формат INT, интересуют меньше всего.
обороты, температура и тд.
А фот МАФ датчик интересует, но полные данные, а не округлённые до единиц.
На основе точных данных от МАФ датчика, можно достаточно точно посчитать расход топлива.
ну в принципе да, предполагается что на елм практически тоже питание что и на эбу, они ведь не далеко разбросаны, да и собственно вся бортовая сеть
не, не так, я вас обманул. то что вы видите по комманде atrv это напряжение elm, но эбу я уверен тоже может вернуть свое напряжение и всё остальное, это надо знать в каком пиде оно лежит.
В таком случае их тоже не удастся получить с точностью до десятых.
если не исправить библиотеку.
ну как сказать... библиотека работает по ком порту, там приходят байты в виде hex, переводите их во что угодно и с какой хотите точностью.
Библиотека в пользовательскую программу выдаёт при запросе готовые данные, которые в формате ИНТ.
Что она внутри себя получает НЕХ, это ясно, но с преобразованиями не ясно.
Вы сейчас говорите прописные истины которые все и так ясны тем, кто с этим стакивался.
Вопрос другой, кто может переделать и имеет желание - я попросил помочь.
Этот же вопрос с преобразованиями у меня (если делать самостоятельно),
займёт времени гораздо больше,
чем у человека (или с его помощью) которые с этим сталкивался и имеет опыт
так сначала надо уточнить какие идут с плавающей точкой.
вот вы пишите "А вот датчик МАФ (расход воздуха) даёт данные с долями,", я посмотрел что этот параметр выдает граммы/сек, никаких долей там нет. я сталкивался с квп2000, там тоже приходят два байта в инт, допустим 1245, я знаю что это параметр напряжения и что для вывода на дисплей с долями его надо поделить на сто, это будут целые, остаток сотые. вот и всё, возможно вам этот инт тоже надо делить, я бы не заморачивался, а просто закоментировал преобразования в библиотеке и работал бы с сырыми данными, делил бы на что надо.
Вот как читаются правильные данные:
К сожалению, стабильность этих функций, оставляет желать лучшего.
Но данные нормальные, с десятыми долями.
Что то с таймингами не так. Данные часто "высыпаются" в неизвестном направлении.
А библиотека читает стабильно, ровно, но данные не точные.
а по поводу " я бы не заморачивался, а просто закоментировал преобразования в библиотеке и работал бы с сырыми данными, делил бы на что надо."
так библиотека, кажется работаетс с одним байтом,
я не могу разобраться, где она берёт 2 байта, чтобы выдать их сырыми.
она работает и с одим и с двумя, возвращает то она int, а это уже два байта если что.
Т.е Вы предлагаете преобразование в функции Normalize закомментировать,
с полученным INT произвести разделение на 2 байта?
X- данные в ИНТ
Y - старш. байт
Z - младш байт
Y=x/256
Z=x-(x/256)
если там формулы правильные то можно переименовать ее во float и result тоже сделать флоат. а можно да, убрать формулы, оно вернет целое значение, а там уже где-то во флоате поделить на ту-же формулу, будет вам с точкой.
Переименовывание во float ничегоне дало, пробовал.
В общем, буду разбираться, есть новая почва для размышлений.
Спасибо за наводку...
К сожалению, автор, судя по его работам, далее оборотов двигателя, температуры и скорости
не заходил, а это всё целые значения и они его устроили.
а возвращаемое значение функции переименовывали?
странно что ничего не дало.
а возвращаемое значение функции переименовывали?
странно что ничего не дало.
Я правда переименовывал в double, но результат по сути должен быть тот же.
ну да
Там, похоже сами функции преобразования являются проблеммными.
Которые из шестнадцатиричных преобразуют.
ошибка при компиляции
та не, в .h файле определение этой функции тоже надо заменить на флоат.
В общем, везде заменил, нормально компилится
но увы,
данные так же обрезаны :(
Приветствую!!! Столкнулся также с проблемой в переменных. Пишу прогу круиз контроля на авто и пробег нужно отображать 35620 т.к. а у автора эта переменная INT максимум пробега получается отобразить 32 767, пришлось посидеть денек и поправить библиотеку. Все вычисления остались по формулам автора, но переменные теперь LONG на выходе. Напряжение с ЭБУ не читаю так что не стал заморачиваться и дальше править для FLOAT.