![]() |
я бы так записал ((bite3<<8) + byte4) / 20 + 50. По одометру идей пока нет.
|
По одометру скатаюсь на работу сегодня и обратно и посмотрим что покажет.
Там впереди самое сложное останется. Найти расход на 100км (моментальный уже есть), передачу RDS сообщений от магнитолы и второй трип счётчик который на бортовике отображается. В принципе мне больше ни чего и не надо. Это позволит перенести все показания которые отображаются ща на бортовике в планшет не прибегая к загрузке основной шины ELM327. |
Появились мысли по одометру. Это 3 байтное число. Показания округляются отбрасывая последнюю цифру, на самом деле там:
17 36 70 - 1123398 17 36 71 - 1123399 17 36 72 - 1123400 17 36 73 - 1123401 17 36 74 - 1123402 и тд |
Прокатился.
Вот что стало 17 38 174 112401 xmetal так я изначально 3 байта давал имея в виду что это только одометр Как это преобразование написать в коде-то? |
Цитата:
000100010010011010101110 в Dec 1124014 То есть, что бы получить фактический пробег нужно считать так: ((bite2<<16) + (bite1<<8) + byte0) / 10 |
Не забываем про приведение типов
unsigned long result = (((unsigned long)data[0] << 16) + ((unsigned int)data[1] << 8) + data[2])/10; Код:
byte data[3] = {17,38,174}; |
(unsigned long)data[0] << 16)
Вот оно что! я писал (int)buf[2] << 16 | (int)buf[3] << 8| buf[4] и у меня выходила охинея Просто данные не входили! Во блин! Зато пока искал причину- нашёл где расход на 100км не моментальный. 2A1 байты 3 и 4 Почти всё отискал :) Осталось найти где данные от кнопок стрелочек магнитолы в режиме отличного от меню и данные которые передаются текстом о названии радиостанции и данные которые она передаёт |
xmetal, собственно так и есть, как Вы выше писали.
T_r_D, int занимает 2 байта, а unsigned long 4 байта. У Вас получается 3, по этому и получалась охинея. |
Я уже осознал свою ошибку.
Народ- сильно не бейте! Я программированием занимался последний раз лет так 15 назад. А по существу. Я уже имею почти все данные кроме трипа который отображается на бортовике (не знаю нафига он мне) и нету текстовой инфы с магнитолы. На остальное описание вроде есть, добавлю в скетч и посмотрю что получается (читать данные о CD и CD Changer), а так же вывод данных настроек (Menu). Ещё там всякие Loud, TA, RDS и прочая шняга буковками выводится, но на это тоже вроде есть описание. Ну и надо найти где прячут нажатие на стрелочки не в режиме Menu, а так же кнопки с 1 по 6. Тоесть по сути я чисто для себя уже заменил TORQE. Нужно ещё сделать вольтметр или поискать передаётся ли эта инфа по шине. Пока сидел в машине, то пришла в голову идея выкинуть нафиг блок климата, а кондеем управлять с планшета. И тут кстати я подхожу к моменту когда нужно будет писать оболочку под это всё под андройд, а в этом я уж точно чайник! весь список того что ща уже можно читать Speed RPM Instant fuel consumption /100Km Fuel consumption /100Km Run on current fuel level Odometr Themperature (not water temp) Steering while Scroll value Steering while key Radio key (частично) Radio ON/OFF Radio source Radio band and frequency Volume (выводится на секунду, нужно найти где всегда инфа есть) Нашёл где трип прячется 2A1 байты 1 и 2 Пытался там же найти среднею скорость, но толи она не так же как всё выглядит, толи она просто не там. |
Народ, помогите с выдёргиванием инфы из
1E5 байта 5. первые два бита это показывает меню или нет и значение этого меню. 3 бит второе меню, 4 не используется, 5,6,7 значение второго меню. Как в коде это воплотить? Не могу не фига сообразить! хотелось бы в виде if (buf[5] >> 7 == 1) без дополнительных переменных. Как избавится от лишних данных в байте? |
Цитата:
if (bitRead(buf[5], 6) == 1) |
Цитата:
Именно это и имел в виду! и тогда вопрос в догонку. Это один бит считать, а считать скажем два или три и получить число? Ну тоесть в моём случае вытащить значение меню. Есть такой же простой способ? |
Цитата:
PHP код:
|
Есть способ проще. Любые биты или группу бит можно проверить битовой маской: if ((buf[5] & 0x70) >> 4 == 7) - проверяем 5,6,7 биты, если они все в 1, то условие срабатывает.
Для наглядности маску можно написать в битовом виде: if ((buf[5] & B01110000) >> 4 == 7) |
Вот так
if (bitRead(buf[5], 6) == 1) и так if (buf[5], 6 == 1) Hе работает! Хорошая была попытка. Ещё есть идеи? А, стоп! Заработало. Я не учёл что оно с право налево идёт. За одно походу нашлась средняя скорость. И в догонку. Ардуина с шилдом тормозят. Похоже что надо поставить апаратный фильтр в шилде, а то очень много сообщений сыпется. Как это реализовать? |
Всё, с показаниями бортового компа полностью закончено.
Читаю все параметры что есть на экране! Speed RPM Instant fuel consumption /100Km Fuel consumption /100Km Trip Average Speed Themperature Odometr Run on current fuel level Средняя скорость была в 0B6 байт 0. Целиком байт это скорость без каких либо конвертаций. Что осталось: ну раз уж сдублировали с основного дисплея одометр и скорость, то надо и всё сдублировать :) А осталось там 1 Уровень топлива 2 Температура охлаждайки 3 Остаток пробега до ТО 4 Уровень масла 5 Ограничитель и круиз 6 Трип Ну и доделать сообщения в меню настройки, докопать кнопки на магнитоле. Время к сожалению очень мало на это всё. И нужно какую нить программу анализа данных. Я вижу это так: в первом столбце все ID найденных сообщение во втором сами посылки если было какое изменение, то перенос старой посылки в третий столбец Может кто знает такую готовую прогу или готов написать? А то в ручную отлавливать каждое сообщение очень геморно. Ну и желательно чтоб прога могла с логом работать. Тоесть данные устаканились- снял лог экрана проги, потом его загрузил и сравнил с новыми данными. Это актуально для таких затяжных параметров как прогрев двигателя и топливо. |
Вложений: 1
Цитата:
|
Цитата:
Так веселее пойдёт. |
Цитата:
Только мне родной скетч не понравился, я пользовался во этим: PHP код:
|
Цитата:
Ну и сообщений там не очень много идёт, так что вид не важен- чисто эстетика. |
Помогите ещё чутка.
есть бит в котором 01022222 0 - не используются 1 - активно меню или нет 2 - данные меню. Пишу вот так (переменная равна int) AM = buf[6] << 3; Serial.println(AM); По моему мнению это должно заставить сообщение принять вид 22222000 но в реале почему-то получаю число типо 696. Этого числа вообще тут быть не может! При этом видно что значения меняются и данные ячеек меню тоже. Что я не так делаю? Вот кусок кода if(canId == 485) //1E5 { if (bitRead(buf[0],7) == 1){AP = 1; APV = (buf[0] << 1 / 2) - 191; AM = 0;} if (bitRead(buf[1],7) == 1){AP = 2; APV = (buf[1] << 1 / 2) - 191; AM = 0;} if (bitRead(buf[2],7) == 1){AP = 3; APV = (buf[2] << 1 / 2) - 191; AM = 0;} if (bitRead(buf[4],7) == 1){AP = 4; APV = (buf[4] << 1 / 2) - 191; AM = 0;} if (bitRead(buf[5],7) == 1){AP = 5; APV = bitRead(buf[5],6); AM = 0;} if (bitRead(buf[5],4) == 1){AP = 6; APV = bitRead(buf[5],2); AM = 0;} if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = buf[6] << 3;} } Serial.println(AM); значение в этом байте такие. 00011 None 00111 Classical 01011 Jazz-Blues 01111 Pop-Rock 10011 Vocal 10111 Techno полностью сообщение с активным меню и предустановкой Classic выглядит как 01000111 |
Ты путаешь биты и байты.
Бит может быть 0 или 1. 2 быть не может. Сдвиг осуществляется побитно, а не побайтно. Хотя код выглядит логично, о каких 22222 речь совершенно не понятно |
T_r_D, попробуйте так:
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = buf[6]^=1<<6;} В итоге в переменной AM получите: 3 или 00000011 None 7 или 00000111 Classical 11 или 00001011 Jazz-Blues 15 или 00001111 Pop-Rock 19 или 00010011 Vocal 23 или 00010111 Techno |
Цитата:
Res := 01000111 AND 00111111, а результат Res = 00000111 проверял на нужные вам цифры 3, 7... И учитывая что последние два бита не несут нужной вам информации или вы не знаете что они означают, я бы их убрал сложением с маской 00111100 с соответствующим перерасчетом цифр 3, 7... |
Цитата:
Где x не используемые биты y бит состояния меню И z содержание меню. |
Цитата:
И почему моё смещение не приводит к такому результату? По сути я хочу первые 5 бит переместить в начало обнулив последним 3 Мне кажется что при смещении какой-то мусор прилетает. Может сначала спаять с байтом забитым нулями, а потом сместить? Только хочется это по компактнее расписать, а не с кучей строк и условий. |
Цитата:
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = (unsigned char)(buf[6] << 3);} Цитата:
|
Извиняюсь, ввел в заблуждение.:huh2: В данном случае buf[6]^=1<<6 будет отрабатывать как надо, так как стоит проверка if (bitRead(buf[6],6) == 1).
|
Цитата:
Вечером попробую сделать вот так AX = buf[6],0 | buf[6],1 | buf[6],2 | buf[6],3 | buf[6],4; Ну и способ со смещением if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = (unsigned char)(buf[6] << 3);} |
Цитата:
|
Цитата:
Только надо было не 0-4, а 4-0 |
Так они и так склеены. Тебе надо только отбросить не нужное. Чтобы взять первые 5 бит нужно просто сделать следующее: AX = buf[6] & 0x1F;
|
Н
Цитата:
Спасибо |
Оттестировал.
Всё заработало нормально. Всем спасибо! Заработало вот так AX = buf[6] & 0x1F; Теперь можно дальше копать что есть к чему. Дальше продолжу с поисков всех опций меню. |
Цитата:
|
Цитата:
|
Ещё требуется хелп, а то не соображу.
Получаю по ID 2A5 RDS: 45,69,78,69,82,71,89,45 соответствует -ENERGY- и это ASCII. Как записать это в переменную в виде символов? И какого она должна быть типа? String? |
Цитата:
PHP код:
|
Цитата:
Да и вообще хочу в итоге все получаемые параметры записывать в строку и отправлять целой строкой. Не одной конечно, разбить на группы. Ну например если активно радио, то отправлять что-то типо что будет значить что радио включено (RADIO 1), что выбрано как источник радио (1), на частоте 100.0, банд FM1, ну и сообщение от рдс. Таких сообщений будет несколько по типу данных. Пока вижу так: 1 Все данные что отображались на экране трипа (пробег, средняя скорость и т.д.) 2 Данные которые отображаются на верхнем дисплее (скорость одометр и т.д) 3 Включено ли радио и если да, то его источник и в зависимости от источника данные (номер трека, время трека или РДС) 4 Если активно какое либо из меню, то данные этого меню (выбранный элемент и значение элемента) 5 Значки дисплея (LOUD, Play,Pause и т.д) 6 Нажатые кнопки. Как показала практика кнопки нажимаемые на магнитоле нужны только частично. Собственно это позволит полностью заменить дисплей. Вот только блин не могу ни как найти сообщения о состояние меню. Те меню что по кнопкам отдельным открываются- понятно, они есть, а вот те меню что при нажатии на кнопку MENU не могу найти! Да и то, то меню что по кнопке LIST открывается, открывается жутко криво. Такое впечатление что данные выдаются только во время нажатия кнопки и естественно ардуина их поймать не всегда успевает. Так что в последствие очень нужно будет аппаратно шилдом убрать не нужные сообщения и может быть это поможет. Если уж совсем туго с этим всем будет, то собственно данные трипа я достал из шины, а на радио можно и забить. Тем более что RD4 это полный шлак по приёму даже в городе. Слушать радио не возможно. Оставлю на крайняк балалайку эту в виде усилителя и всё. Тем более я заказал уже модуль радио. Хочу его опробовать. Есть очень большие опасения что ардуины на всё к тому же не хватит. |
T_r_D, для андойда у меня пока реализовано так:
PHP код:
Цитата:
Цитата:
Цитата:
|
Часовой пояс GMT +4, время: 08:37. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot