Re: Бортовой компьютер мотоцикла
Мотоцикл достался с неродными карбюраторами, и я хочу по ШДК оценить зависимость оборотов\дросселя\температур от состава смеси и впоследствии по температуре выхлопа и полученным данным, подобрать жиклеры и настроить иглы. С ШДК постоянно ездить нет возможности. Карбы стоят как полмотоцикла, из-за этого мне и достался с неродными.
Я понимаю что идея почти бредовая, но надо девайс, и я его ковыряю :)
Вложений: 1
Re: Бортовой компьютер мотоцикла
Вложение 18890
Вот что получилось, сразу напишу что это прототип, дисплей с кнопками колхоз полный ;) только что бы проверить функционал, больше я делать так не буду, встрою большой графический дисплей вместо спидометра всю электрику запихну в панель.
Что он умеет.
Показывать температуру - двигателя, масла, наружного воздуха, напряжение сети
Предупреждать о превышении температуры : масла, двигателя и о перезаряде или не до заряде АКБ, всплывает сообщение на дисплее и горит светодиод.
Включать и выключать вентилятор охлажения по заданной температуре (выключить раньше чем заложено в штатный датчик не может, что бы не вторгаться в штатную проводку)
Показывать литраж в баке в процентах или литрах, датчик в баке поплавковый собственного изготовления.
Считает пробег одной поездки, при выключении зажигания остаётся включеным на заданное время,что бы счётчик не сбрасывался. (дабы не мучить EEPROM!)
Из меню можно принудительно включить вентилятор охлаждения
В панели приборов установлена PRO MINI которая управляет восьми сегментным индикатором это датчик включенной скорости, связь с основным блоком через I2C шину
Индикатор включенной скорости снабжен блинкером, что бы не забыть переключить скорость на повышенную (дался мне тяжело, затык с таймерами)
Плюс много полезных функций, для исключения ложных срабатываний меню и устройств
https://youtu.be/sGv7toyiIVo
Re: Бортовой компьютер мотоцикла
Сегодня прошли ходовые испытания, в результате которых выявилось куча косяков, один из них: Датчик уровня топлива (резистивный) показывает точное показание только стоя на месте, тк мой алгоритм предполагает средне-арифметическую выборку за 20 секунд. На деле я получил среднее показание.
Как сделать точную выборку с датчика, что бы показания на дисплее не прыгали (бензин плещется в баке) ?? есть какой нибудь алгоритм ?
Re: Бортовой компьютер мотоцикла
Как вариант собрать в массив 100 - 300 замеров и вычислить при помощи функции find_similar часто повторяющиеся значения
И самое главное керамический конденсатор 1мкФ паралельно входу АЦП поставить нужно
Re: Бортовой компьютер мотоцикла
Конденсатор это гуд, а насчёт библиотеки непонял
Re: Бортовой компьютер мотоцикла
Функция find_similar это фильтр шума
Эта функция есть в библиотеке CyberLib
Вложений: 1
Re: Бортовой компьютер мотоцикла
Придумал свой алгоритм
1. На нейтральной передаче, обновляем сразу (напрямую с датчика без задержки) уровень топлива, в большинстве случаев на нейтральной передаче мотоцикл стоит прямо и не двигается.
2. Если передача не нейтральная начинаем высчитывать минимальное и максимальное значение значение с датчика уровня топлива (если появляется значение больше или меньше существующих заменяем) Может нужно выбирать наименьшее значение из максимального и минимального ?
3. Каждые 200 метров записываем это значение в массив (потому что если мы не едем, топливо не расходуется) ;)
4. Каждый километр высчитываем средне арифметическое из ячеек массива
Вот код, не на С++ под рукой больше ничего небыло, для проверки самое то, ардуинки стоят на мотоцикле. Думаю всё понятно, вместо километража таймеры и счётчики
Как это работает - Вложение 18908
PHP код:
#NoTrayIcon
Global $Max = 0, $Min = 500, $Random = 0, $index = 0, $sa = 0
Global $metr = 0 ; 200 метровый счетчик, примерно по времени 5 секунд =)
Dim $Array[6]
$Form1 = GUICreate("", 241, 226, 649, 150)
$Label1 = GUICtrlCreateLabel("", 48, 20, 156, 25)
$Label2 = GUICtrlCreateLabel("", 48, 40, 156, 25)
$Label3 = GUICtrlCreateLabel("", 48, 60, 156, 25)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case Else
If _timer(@MSEC) = 1 Then ; таймер раз в секунду
GUICtrlSetData($Label1, "Mаксимальное : " & $Max)
GUICtrlSetData($Label2, "Минимальное : " & $Min)
$Random = Random(100, 250, 1) ; Имитируем АЦП датчика уровня топлива
If $Random > $Max Then $Max = $Random
If $Random < $Min Then $Min = $Random
If $index > 5 Then $index = 0
If $metr > 5 Then $metr = 0
$Array[$index] = ($Max + $Min) / 2 ; Раз в секунду записываем значения в массив
$index += 1
$metr += 1
If $metr > 5 Then ; проехали 200 метров (типа 5 секунд прошло =) )
$sa = ($Array[0] + $Array[1] + $Array[2] + $Array[3] + $Array[4]) / 5
GUICtrlSetData($Label3, "Среднее значение : " & $sa)
$Max = 0
$Min = 250
EndIf
EndIf
EndSwitch
WEnd
Func _timer($sec)
For $i = 500 To 520 Step 1
If $sec = $i Then
Return 1
EndIf
Next
EndFunc ;==>_timer
Re: Бортовой компьютер мотоцикла
У меня какие то проблемы с библиотекой CyberLib.h
Ошибку такую выдаёт,что я сделал не так ?
Цитата:
vc1.ino: In function 'void _fuel_level()':
vc1.ino:723:49: error: 'find_similar' was not declared in this scope
Ошибка компиляции.
"абстрактная часть кода "
PHP код:
#include <CyberLib.h>
#define cFt 250 // Размер массива для считывания уровня топлива
byte bFUEL_LEVEL;
int iFuelTripArray = 0; // Колличество проходов для записи в массив показаний датчика, максимальное значение в cFt
int aFuelLevel[cFt + 1];
void _fuel_level(){
if (iFuelTripArray > cFt) {
iFuelTripArray = 0;
bFUEL_LEVEL = find_similar(aFuelLevel, cFt,0);
}
iFuelTripArray ++;
int val = analogRead(FUEL_LEVEL__ANALOG_PIN);
if (val > cADC_LIMIT_FUEL_LEVEL) val = cADC_LIMIT_FUEL_LEVEL; // ограничение уровня напряжения АЦП
aFuelLevel[iFuelTripArray] = map(val, cMIN_ABC_FUEL_LEVEL, cMAX_ABC_FUEL_LEVEL, 100, 0);
}
Re: Бортовой компьютер мотоцикла
А где секция setup и loop?
Re: Бортовой компьютер мотоцикла
Так то ничего не меняется, как не работал так и не работает :(
PHP код:
#include <CyberLib.h>
#define cFt 250 // Размер массива для считывания уровня топлива
byte bFUEL_LEVEL;
int iFuelTripArray = 0; // Колличество проходов для записи в массив показаний датчика, максимальное значение в cFt
int aFuelLevel[cFt + 1];
void setup() {
}
void loop() {
_fuel_level();
}
void _fuel_level() {
if (iFuelTripArray > cFt) {
iFuelTripArray = 0;
bFUEL_LEVEL = find_similar(aFuelLevel, cFt, 0);
}
iFuelTripArray ++;
int val = analogRead(3);
if (val > 1000) val = 1000; // ограничение уровня напряжения АЦП
aFuelLevel[iFuelTripArray] = map(val, 100, 800, 100, 0);
}