Отладил алгоритм. На столе все работает как задумано. Осталось запихнуть в какой-нибудь корпус и провести испытания на автомобиле. С онлайн тарировкой пока ничего не придумал путного, корректировать нужно поправочным коэффициентом в коде.
При запуске начинается отсчет времени, пройденного расстояния, скорости средней, скорости текущей.
При нажатии на кнопку можно запомнить расстояние и время, с момента предыдущего нажатия, также автоматом рассчитается средняя скорость на этом участке.
void loop (){
uint16_t secTime1 = 0; // Время с момента предыдущей отсечки, [с] float S1 = 0; // Расстояние, пройденное с момента отсечки, [м] float Ss = 0; // Расстояние, пройденное за секунду, [м] float V = 0; // Средняя скорость, [км/ч] float Vs = 0; // Текущая скорость, [км/ч] float V1 = 0; // Средняя скорость отсечки, [км/ч] while(millis() - lastTime >= 1000){
lastTime = millis();
Ss = ((float)impuls*1000)/(float)k; // Расстояние, пройденное за секунду, [м]
impuls = 0;
secTime = secTime+1;
S = S + Ss; // Расстояние от старта, [м]
V = 3600*S/lastTime; // Средняя скорость [км/ч]
Vs = 36*Ss/10; // Текущая скорость [км/ч]
showTime (12, 1, secTime); // Вызов функции вывода времени на экран (столбец первого символа, строка первого символа, количество секунд)
showTrip (10, 0, S); // Вызов функции вывода расстояния на экран (столбец первого символа, строка первого символа, расстояние)
showSpeed (0, 0, V); // Вызов функции вывода скорости на экран (столбец первого символа, строка первого символа, скорость)
showSpeed (0, 1, Vs); // Вызов функции вывода скорости на экран (столбец первого символа, строка первого символа, скорость) /* По нажатию кнопки запоминаем время пройденного учстка */ if(digitalRead(buttonPin) == LOW){
secTime1 = secTime-secTime0; // Определяем сколько прошло секунд с момента предыдущей отсечки, [с]
secTime1 = secTime0; // Делаем новую отсечку времени, [с]
showTime (12, 3, secTime1); // Вызов функции вывода времени на экран (столбец первого символа, строка первого символа, количество секунд)
S1 = S - S0; // Определяем пройденное расстояние с момента отсечки, [м]
S0 = S1; // Делаем новую отсечку расстояния, [м]
showTrip (10, 2, S1); // Вызов функции вывода расстояния на экран (столбец первого символа, строка первого символа, расстояние)
V1 = S1/secTime1*3.6; // Средняя скорость отсечки, [км/ч]
showSpeed (0, 3, V1); // Вызов функции вывода скорости на экран (столбец первого символа, строка первого символа, скорость) } } }