Сборка

28-004 (x)

ИНТЕРНЕТ-РЕСУРС
окрашен синтетической эмалью

Цвет эмали

Онлайн

0 участник(а/ов)

Белорусский Клуб
автолюбителей «Москвич - ретро»

Рег №004 - 2024



Форум


Стиль: МЗМА, ТКМ
Сообщений/обсуждений на странице:

Форум » Разное » Флейм » Arduino в Москвич

Arduino в Москвич
Abarigen 20 марта 2020, 17:56:59

Отладил алгоритм. На столе все работает как задумано. Осталось запихнуть в какой-нибудь корпус и провести испытания на автомобиле. С онлайн тарировкой пока ничего не придумал путного, корректировать нужно поправочным коэффициентом в коде.
 

Video cannot be displayed

 
При запуске начинается отсчет времени, пройденного расстояния, скорости средней, скорости текущей.
При нажатии на кнопку можно запомнить расстояние и время, с момента предыдущего нажатия, также автоматом рассчитается средняя скорость на этом участке.
 

C++

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);          // LCD address 0x27
 
volatile uint16_t impuls = 0;
uint16_t k = 3744;                         // 626 * 6 Количество импульсов на 1000 метров пути
uint32_t lastTime = 0;
uint32_t secTime = 0;                      // Суммарное количество секунд
uint32_t secTime0 = 0;                     // Время отсечки, [c]
float S = 0;                               // Расстояние от старта, [м]
float S0 = 0;                              // Расстояние отсечки, [м]
uint8_t buttonPin = 12;                    // Номер онтакта кнопки отсечки (замыкать на массу)
 
void pinChange ()                          // Функция обработки прерывания
{
  impuls = impuls + 1;
}
 
void setup (){
  attachInterrupt (0, pinChange, RISING)// Вызов обработчика внешних прерываний
  lcd.init();                              // Инициализация экрана
  lcd.backlight();                         // Подсветка экрана
  pinMode(buttonPin, INPUT_PULLUP);        // Встроенный подтягивающий (к +5В) резистор активирован
}
 
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);                // Вызов функции вывода скорости на экран (столбец первого символа, строка первого символа, скорость)
    }
  }
}
 
/* Функция вывода времени на экран*/
void showTime (uint8_t posCol, uint8_t posRow, uint16_t secTimeShow) {
  uint8_t minutes = 0;
  uint8_t hours = 0;
  uint8_t seconds = 0;
  hours = secTimeShow/3600;
  minutes = (secTimeShow-(hours*3600))/60;
  seconds = secTimeShow-(hours*3600)-(minutes*60);
 
  lcd.setCursor(posCol,posRow);
  lcd.print("        ");
  if (hours < 10) {
    lcd.setCursor(posCol+1,posRow);
  }
  else {
    lcd.setCursor(posCol,posRow)
  }
  lcd.print(hours);
  lcd.setCursor(posCol+2,posRow);
  lcd.print(":");
  if (minutes < 10) {
    lcd.setCursor(posCol+3,posRow);
    lcd.print("0");
    lcd.setCursor(posCol+4,posRow);
  }
  else {
    lcd.setCursor(posCol+3,posRow)
  }
  lcd.print(minutes);
  lcd.setCursor(posCol+5,posRow);
  lcd.print(":");
 
  if (seconds < 10) {
    lcd.setCursor(posCol+6,posRow);
    lcd.print("0");
    lcd.setCursor(posCol+7,posRow);       
  }
  else {
    lcd.setCursor(posCol+6,posRow);
  }
  lcd.print(seconds);   
}
 
/* Функция вывода скорости на экран */
void showSpeed (uint8_t posCol, uint8_t posRow, float VShow){
  lcd.setCursor(posCol,posRow);
  lcd.print("      ");
  if (VShow < 10) {
    lcd.setCursor(posCol+1,posRow)
  }
  else {
    lcd.setCursor(posCol,posRow)
  }
  lcd.print(VShow);
  lcd.setCursor(posCol+6,posRow);
  lcd.print("km/h");
}
 
/* Функция вывода расстояния на экран */
void showTrip (uint8_t posCol, uint8_t posRow, float SShow){
  lcd.setCursor(posCol,posRow);
  lcd.print("        ");
  if (SShow < 10000) {
    lcd.setCursor(posCol+3,posRow)
  }
  else {
    if (SShow < 100000) {
      lcd.setCursor(posCol+2,posRow)
    }
    else {
      lcd.setCursor(posCol+1,posRow)
    }
  }
  lcd.print(SShow/1000);
  lcd.setCursor(posCol+8,posRow);
  lcd.print("km")
}
 

Мастерская 
Вся дискуссия в этом обсуждении:

Форум » Разное » Флейм » Arduino в Москвич