Придумал свой алгоритм
1. На нейтральной передаче, обновляем сразу (напрямую с датчика без задержки) уровень топлива, в большинстве случаев на нейтральной передаче мотоцикл стоит прямо и не двигается.
2. Если передача не нейтральная начинаем высчитывать минимальное и максимальное значение значение с датчика уровня топлива (если появляется значение больше или меньше существующих заменяем) Может нужно выбирать наименьшее значение из максимального и минимального ?
3. Каждые 200 метров записываем это значение в массив (потому что если мы не едем, топливо не расходуется)
4. Каждый километр высчитываем средне арифметическое из ячеек массива
Вот код, не на С++ под рукой больше ничего небыло, для проверки самое то, ардуинки стоят на мотоцикле. Думаю всё понятно, вместо километража таймеры и счётчики
Как это работает - fuel.zip
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