Close

Вывод нформации данного скетча через Тса 9548

alekseiAleksei wrote 06/24/2022 at 14:05 • 25 min read • Like

Всем добрых дел удачных

Есть вопрос по теме дописать скетч чтоб вывести по i2C через Тса9548  на Оled 1.3  на первый дисплей. Их всего будет 2 Оled

По возможности если кто знает  скетч под  А4988 в качесте спидометр,тахометр

// ToyotaOBD1_Reader
// In order to read the data from the OBD connector, short E1 + TE2. then to read the data connect to VF1.
// Note the data line output is 12V - connecting it directly to one of the arduino pins might damage (proabably) the board
// This is made for diaply with an OLED display using the U8glib - which allow wide range of display types with minor adjusments.
// Many thanks to GadgetFreak for the greate base code for the reasding of the data.
// If you want to use invert line - note the comments on the MY_HIGH and the INPUT_PULLUP in the SETUP void.

#include "U8glib.h"
//#include "SdFat.h"
#include <SPI.h>
#include <EEPROM.h>
#include <MD_KeySwitch.h>
#define VREF_MEASURED 3.32      //Измеренное опорное напряжение с 3.3В стабилизатора

// выбрать один вариант логирования
#define LOGGING_MINIMAL   // Запись минимума данных
//#define LOGGING_FULL    // Запись на SD всех данных
//#define LOGGING_DEBUG   // Запись на SD всех данных + статистику расхода и пробега
//#define SECOND_O2SENS   // Включение 2го сенсора кислорода для V движков
#define DEBUG_OUTPUT true // for debug option - swith output to Serial

//DEFINE пинов под входы-выходы
#define LED_PIN          6
#define OX_PIN          0 // A0 для сенсора кислорода
#define TT_PIN          1 // A1 для сенсора ТТ АКПП
#define ENGINE_DATA_PIN 2 // D2 VF1 PIN
#define TOGGLE_BTN_PIN  4 // D4 batton A PIN
#define TOGGLE_BTN_PINb 6 // D4 batton B PIN
//#define INJECTOR_PIN  3 // D3 Номер ноги для форсунки
#define SS 5              // D5 Номер ноги SS SD модуля

//DEFINE констант расходомера
#define Ls 0.002933333    //производительсность форсунки литров в секунду // базовый 0.004 или 240cc
#define Ncyl 4            //кол-во цилиндров

//DEFINE модуля записи на SD карту
//#define FILE_BASE_NAME "Data"   //шаблон имени файла
//#define error(msg) sd.errorHalt(&Serial,F(msg)) //ошибки при работе с SD

//DEFINE OBD READER
#define  MY_HIGH  HIGH //LOW    //Инвертировать линию Eng с помощью оптосоединителя, если у вас нет, то измените эти определения low & high на противоположные.
#define  MY_LOW   LOW //HIGH
#define  TOYOTA_MAX_BYTES  24
#define OBD_INJ 1 //Injector pulse width (INJ)   Длительность импульса инжектора
#define OBD_IGN 2 //Ignition timing angle (IGN)  Угол опережения зажигания
#define OBD_IAC 3 //Idle Air Control (IAC)       Контроль холостого хода Воздуха
#define OBD_RPM 4 //Engine speed (RPM)           Частота вращения двигателя
#define OBD_MAP 5 //Manifold Absolute Pressure (MAP)  Абсолютное давление в коллекторе
#define OBD_ECT 6 //Engine Coolant Temperature (ECT)  Температура охлаждающей жидкости двигателя
#define OBD_TPS 7 //Throttle Position Sensor (TPS)    Датчик положения дроссельной заслонки
#define OBD_SPD 8 //Speed (SPD)                       Скорость
#define OBD_OXSENS 9 // Лямбда 1
#ifdef SECOND_O2SENS
#define OBD_OXSENS2 10 // Лямбда 2 на V-образных движка. У меня ее нету.
#endif

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

//SdFat sd;
//SdFile file;

MD_KeySwitch S(TOGGLE_BTN_PIN, HIGH);
byte CurrentDisplayIDX = 1, TT_last = 0, TT_curr = 0;
float total_fuel_consumption = 0, trip_fuel_consumption = 0;
float trip_avg_fuel_consumption;
float cycle_obd_inj_dur = 0;
float cycle_trip = 0;
float trip_inj_dur = 0;
float total_inj_dur_ee = 0;
float current_trip = 0;
float total_trip = 0;
float all_trip_b = 0;
float all_fuel_b = 0;
float total_avg_consumption;
float total_avg_speed;
float trip_avg_speed;

unsigned long current_time = 0;
unsigned long total_time = 0;
unsigned long t;
unsigned long last_log_time = 0;
unsigned long odometer;
bool flagNulSpeed = true;
unsigned int OX, TT;

volatile uint8_t ToyotaNumBytes, ToyotaID, ToyotaData[TOYOTA_MAX_BYTES];
volatile uint16_t ToyotaFailBit = 0;
boolean LoggingOn = false; // dfeine connection flag and last success packet - for lost connection function.


void setup() {
//char fileName[13] = FILE_BASE_NAME "00.csv";
//  const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
  noInterrupts();
  Serial.begin(115200);
  delay(100);
  
  //EEPROM.put(200, odometer); запись значения одометра
  EEPROM.get(104, total_trip);
  EEPROM.get(108, total_time);
  EEPROM.get(200, odometer);
  EEPROM.get(204, total_inj_dur_ee);
  EEPROM.get(50, all_trip_b);
  EEPROM.get(58, all_fuel_b);
  analogReference(EXTERNAL);

  S.begin();
  S.enableDoublePress(true);
  S.enableLongPress(true);
  S.enableRepeat(false);
  S.enableRepeatResult(false);
  S.setDoublePressTime(300);
  S.setLongPressTime(2000);
  u8g.setFont(u8g_font_profont15r);
  if (DEBUG_OUTPUT) {
    Serial.println("system Started");
    Serial.println("Read float from EEPROM: ");
    Serial.print("total_trip ");
    Serial.println(total_trip, 3);
    Serial.print("total_time ");
    Serial.println(total_time, 3);
    Serial.print("odometer ");
    Serial.println(odometer, 1);
    Serial.print("total_inj_dur_ee ");
    Serial.println(total_inj_dur_ee, 3);
    Serial.print("all_fuel_b ");
    Serial.println(all_fuel_b, 3);
    Serial.print("all_trip_b ");
    Serial.println(all_trip_b, 3);
    }

/*
  if (!sd.begin(SS, SPI_FULL_SPEED )) {
    sd.initErrorHalt(&Serial);
  }
  if (BASE_NAME_SIZE > 6) {
    error("FILE_BASE_NAME too long");
  }
  if (sd.exists("Data99.csv"))                    //очистка SD карты если логов более 99 штук
  {
    u8g.setFont(u8g_font_profont15r);
    u8g.firstPage();
    do {
      u8g.drawStr( 0, 17, "WIPE DATA!" );
    } while ( u8g.nextPage() );

    if (!sd.wipe()) {
      sd.errorHalt("Wipe failed.");
    }
    if (!sd.begin(SS, SPI_FULL_SPEED )) {
      sd.initErrorHalt();
    }
  }

  while (sd.exists(fileName)) {
    if (fileName[BASE_NAME_SIZE + 1] != '9') {
      fileName[BASE_NAME_SIZE + 1]++;
    } else if (fileName[BASE_NAME_SIZE] != '9') {
      fileName[BASE_NAME_SIZE + 1] = '0';
      fileName[BASE_NAME_SIZE]++;
    } else {
      error("Can't create file name");
    }
  }

  if (!file.open(fileName, O_CREAT | O_WRITE  | O_EXCL)) {
    error("file.open");
  }
  writeHeader();
*/
  pinMode(ENGINE_DATA_PIN, INPUT); // VF1 PIN
  pinMode(LED_PIN, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(ENGINE_DATA_PIN), ChangeState, CHANGE); //setup Interrupt for data line  Настройка прерывания для линии передачи данных
  pinMode(TOGGLE_BTN_PIN, INPUT);           // кнопка СЛЕД. ЭКРАН
  CurrentDisplayIDX = 1; // set to display 1
  drawScreenSelector();
  //Расходомер
  t = millis();
  last_log_time = millis();
  interrupts();
  delay(1000);
} // END VOID SETUP

void loop(void) {
  unsigned long new_t;
  unsigned int diff_t;
  switch (S.read())
  {
    case MD_KeySwitch::KS_NULL:  break;
    case MD_KeySwitch::KS_PRESS: ent(); break;
    case MD_KeySwitch::KS_DPRESS:break;
    //{
    //  if (LoggingOn == false) LoggingOn = true; else LoggingOn = false;
    //  } break;
    case MD_KeySwitch::KS_LONGPRESS: {
        if (CurrentDisplayIDX == 5) cleardataB(); else cleardata();
         } break; 
      
    case MD_KeySwitch::KS_RPTPRESS: break;
  }

  if (ToyotaNumBytes > 0)  {    // if found bytes
    new_t = millis();
    if (new_t > t && getOBDdata(OBD_RPM) > 100 ) {// выполняем только когда на работающем двигателе
      diff_t = new_t - t;
      cycle_obd_inj_dur = getOBDdata(OBD_RPM) / 60000 * Ncyl * (float)diff_t  * getOBDdata(OBD_INJ); //Время открытых форсунок за 1 такт данных. В МС
      //ОБ/М           ОБ/С
      //форсунка срабатывает раз в 2 оборота КВ
      //6форсунок в с
      //время цикла мс в с. Получаем кол-во срабатываний за время цикла. Умножаем на время открытия форсунки, получаем время открытия 6 форсунок В МИЛЛИСЕКУНДАХ
        
         
      trip_inj_dur += cycle_obd_inj_dur;           //Время открытых форсунок за поездку        В МС
      total_inj_dur_ee += cycle_obd_inj_dur;       //Время открытых форсунок за все время. EEPROM    В МС

      trip_fuel_consumption = trip_inj_dur / 1000 * Ls;       //потребление топлива за поездку в литрах
      total_fuel_consumption = total_inj_dur_ee / 1000 * Ls;  //потребление топлива за все время. Из ЕЕПРОМ в литрах


      cycle_trip = (float)diff_t / 3600000 * getOBDdata(OBD_SPD);   //расстояние пройденное за такт обд данных
      current_trip += cycle_trip;  //Пройденное расстояние с момента включения. В КМ
      total_trip += cycle_trip;    //Полное пройденное расстояние. EEPROM. В КМ
      odometer += cycle_trip;      //электронный одометр. Хранится в еепром и не стирается кнопкой
      current_time += diff_t;      //Время в пути в миллисекундах с момента включения
      total_time += diff_t;        //полное пройденное время в миллисекундах лимит ~49 суток. EEPROM

      trip_avg_speed = current_trip / (float)current_time * 3600000 ;       //средняя скорость за поездку
      total_avg_speed = total_trip / (float)total_time * 3600000;           // средняя скорость за все время. км\ч
      trip_avg_fuel_consumption = 100 * trip_fuel_consumption / current_trip; //средний расход за поездку
      total_avg_consumption = 100 * total_fuel_consumption / total_trip;      //среднее потребление за все время - Л на 100км
      
      all_trip_b += cycle_trip ;        //Полное пройденное расстояние. EEPROM. В КМ
      all_fuel_b += cycle_obd_inj_dur;  //Время открытых форсунок за все время. EEPROM    В МС
     
      t = new_t;//тест

    //  if (LoggingOn == true) logData(); //запись в лог данных по двоному нажатию на кнопку

      updateEepromData();   //запись данных при остановке

      if (millis() - last_log_time > 180000) {  //Запись данных в EEPROM каждые 3 минуты. Чтобы не потерять данные при движении на трассе
        EEPROM.put(104, total_trip);
        EEPROM.put(108, total_time);
        EEPROM.put(200, odometer);
        EEPROM.put(204, total_inj_dur_ee);
        EEPROM.put(50, all_trip_b);
        EEPROM.put(58, all_fuel_b);
        
        last_log_time = millis();
      }
    }
    drawScreenSelector();   // draw screen
    ToyotaNumBytes = 0;     // reset the counter.
  } // end if (ToyotaNumBytes > 0)
 /* if (millis() % 50 == 0 && LoggingOn == true && CurrentDisplayIDX == 6) { //каждые 50мс, когда включено логирование и выбран экран с флагами(!)
    OX = analogRead(OX_PIN);
    if (OX < 400) { //исключаю ложные показание > ~1.3В
      file.write(';');
      file.print(((float)OX * VREF_MEASURED) / 1024, 3 );
      file.println();
    }
  }
  if (millis() % 500 == 0) {  //каждые пол секунды читаем состояние АКПП
    TT = analogRead(TT_PIN);
    TT_curr = (int)(TT * VREF_MEASURED / 1024 * 3.13 + 0.5);
    if (TT_last != TT_curr) {
      drawScreenSelector();
      TT_last = TT_curr;
    }
    //Serial.println((float)TT * VREF_MEASURED / 1024 * 3.13, 3);
    // Serial.println((int)(TT * VREF_MEASURED / 1024 * 3.13+0.5));
  }
*/
//if (millis() % 5000 < 50) autoscreenchange();      // ротация экранов
}

void updateEepromData() {
  if (getOBDdata(OBD_SPD) == 0 && flagNulSpeed == false)  {   //Запись данных в еепром когда остановка авто
    EEPROM.put(104, total_trip);
    EEPROM.put(108, total_time);
    EEPROM.put(200, odometer);
    EEPROM.put(204, total_inj_dur_ee);
    EEPROM.put(50, all_trip_b);
    EEPROM.put(58, all_fuel_b);
    flagNulSpeed = true;                                  //запрет повторной записи
    last_log_time = millis();                             //чтобы не писать лишний раз
  }
  if (getOBDdata(OBD_SPD) != 0) flagNulSpeed = false;     //начали двигаться - разрешаем запись
}

void cleardata() {
  int i;
  for (i = 104; i <= 112; i++) {
  EEPROM.update(i, 0);
  }
  for (i = 200; i <= 208; i++) {
  EEPROM.update(i, 0);
  }
  EEPROM.get(104, total_trip);
  EEPROM.get(108, total_time);
  EEPROM.get(204, total_inj_dur_ee);

}

void cleardataB () {
  int i;
  for (i = 50; i <= 62; i++) {
  EEPROM.update(i, 0);
  }

  EEPROM.get(50, all_trip_b);
  EEPROM.get(58, all_fuel_b);
  
}

/*void writeHeader() {
#ifdef LOGGING_FULL
  file.print(F(";OX_RAW;INJ TIME;IGN;IAC;RPM;MAP;ECT;TPS;SPD;VF1;OX;ASE;COLD;KNOCK;OPEN LOOP;Acceleration Enrichment;STARTER;IDLE;A/C;NEUTRAL;AVG SPD;LPK_OBD;LPH_OBD;TOTAL_OBD;AVG_OBD;CURR_OBD;CURR_RUN;total_trip"));
#endif
#ifdef LOGGING_DEBUG
  file.print(F(";OX_RAW;INJ TIME;IGN;IAC;RPM;MAP;ECT;TPS;SPD;VF1;OX;AVG SPD;LPK_OBD;LPH_OBD;TOTAL_OBD;AVG_OBD;CURR_OBD;CURR_RUN;total_trip"));
#endif
#ifdef LOGGING_MINIMAL
  file.print(F(";OX_RAW;INJ TIME;IGN;IAC;RPM;MAP;ECT;TPS;SPD;VF1;OX;LPH_OBD"));
#endif
  file.println();
  file.sync();
}
*/
//обнуление данных


/*void logData() {
  file.print(float(millis()) / 60000, 3); file.write(';')   ; file.write(';');
  file.print(getOBDdata(OBD_INJ)); file.write(';'); file.print(getOBDdata(OBD_IGN));  file.write(';');  file.print(getOBDdata(OBD_IAC));  file.write(';');
  file.print(getOBDdata(OBD_RPM)); file.write(';'); file.print(getOBDdata(OBD_MAP));  file.write(';'); file.print(getOBDdata(OBD_ECT));  file.write(';');
  file.print(getOBDdata(OBD_TPS)); file.write(';');  file.print(getOBDdata(OBD_SPD));  file.write(';'); file.print(getOBDdata(OBD_OXSENS)); file.write(';'); file.print(getOBDdata(20)); file.write(';');
#ifdef LOGGING_FULL
  file.print(getOBDdata(11)); file.write(';'); file.print(getOBDdata(12)); file.write(';'); file.print(getOBDdata(13)); file.write(';'); file.print(getOBDdata(14)); file.write(';');
  file.print(getOBDdata(15)); file.write(';'); file.print(getOBDdata(16)); file.write(';'); file.print(getOBDdata(17)); file.write(';'); file.print(getOBDdata(18)); file.write(';');
  file.print(getOBDdata(19)); file.write(';');
#endif
#ifdef  LOGGING_DEBUG
  // file.print(total_avg_speed); file.write(';');                                                                   //AVG_SPD       ok
  // file.print(100 / getOBDdata(OBD_SPD) * (getOBDdata(OBD_INJ) * getOBDdata(OBD_RPM)*Ls * 0.18)); file.write(';');  //LPK_OBD      ok
#endif
  file.print(getOBDdata(OBD_INJ) * getOBDdata(OBD_RPM)*Ls * 0.18); file.write(';');                                //LPH_OBD    ok
#ifdef LOGGING_DEBUG
  //file.print(total_fuel_consumption); file.write(';');   //TOTAL_OBD     ok
  //file.print(trip_avg_fuel_consumption); file.write(';');   //!AVG_OBD
  //file.print(trip_fuel_consumption); file.write(';');  //!CURR_OBD
  //file.print(current_trip);   file.write(';');    //CURR_RUN ok
  //file.print(total_trip); file.write(';');//RUN_TOTAL      ok
#endif
  file.println();
  file.sync();
}
*/
void drawScreenSelector(void) {
  if (CurrentDisplayIDX == 1) DrawCurrentFuelConsuption();
  else if (CurrentDisplayIDX == 2) drawTripTimeDistance();
  else if (CurrentDisplayIDX == 3) drawTimeDistance();
  else if (CurrentDisplayIDX == 4) DrawTotalFuelConsuption();
  else if (CurrentDisplayIDX == 5) drawTotalFuelDistanceB();
  else if (CurrentDisplayIDX == 6) drawAllData();
  else if (CurrentDisplayIDX == 7) drawExtraData();
} // end drawScreenSelector()

void DrawCurrentFuelConsuption(void) {
  u8g.setFont(u8g_font_profont15r);
  u8g.firstPage();
  do {
  u8g.setFont(u8g_font_profont15r);
  u8g.drawStr( 0, 15, "TRIP" );
  u8g.drawStr( 74, 15, "L" );
  u8g.setPrintPos(35, 15) ;
  u8g.print(trip_fuel_consumption, 1);
  if (LoggingOn == true)  u8g.drawHLine(20, 24, 88);
  //  u8g.setPrintPos(90, 20) ;
  //  u8g.print((float)TT * VREF_MEASURED / 1024 * 3.13, 2);
/*
    u8g.setFont(u8g_font_profont22r);
    switch (TT_curr) { //для делителя 10k + 4.7k
      case 0: u8g.drawStr( 95, 20, "1" );   break;
      case 2: u8g.drawStr( 95, 20, "2" ); break;
      case 4: u8g.drawStr( 95, 20, "3" ); break;
      case 5: u8g.drawStr( 95, 20, "3L" ); break;
      case 6: u8g.drawStr( 95, 20, "4" ); break;
      case 7: u8g.drawStr( 95, 20, "4L" ); break;
    }*/
    if (getOBDdata(OBD_SPD) > 1)
    {
      u8g.setFont(u8g_font_profont15r);
      u8g.drawStr( 0, 42, "L/100Km" );
      u8g.setFont(u8g_font_profont22r);
      u8g.setPrintPos(0, 60) ;
     // u8g.print( 100 / getOBDdata(OBD_SPD) * (getOBDdata(OBD_INJ) * getOBDdata(OBD_RPM)*Ls * 0.18), 1);
      u8g.print( 100 / getOBDdata(OBD_SPD) * (getOBDdata(OBD_INJ)/1000 *Ls*4* getOBDdata(OBD_RPM)*60), 1);
    } else {
      u8g.setFont(u8g_font_profont15r);
      u8g.drawStr( 0, 42, "L/Hour" );
      u8g.setFont(u8g_font_profont22r);
      u8g.setPrintPos(0, 60) ;
     // u8g.print(getOBDdata(OBD_INJ) * getOBDdata(OBD_RPM)*Ls * 0.18, 1);
       u8g.print(getOBDdata(OBD_INJ)/1000 *Ls*4* getOBDdata(OBD_RPM)*60, 1);
    }
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 60, 42, "Average" );
    u8g.setFont(u8g_font_profont22r);
    u8g.setPrintPos(60, 60) ;
    if (trip_avg_fuel_consumption < 100)
      u8g.print( trip_avg_fuel_consumption, 1);
    else u8g.drawStr( 60, 60, "---" );
  }
  while ( u8g.nextPage() );
}

void DrawTotalFuelConsuption(void) {
  u8g.setFont(u8g_font_profont15r);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 0, 15, "TOTAL" );
    // u8g.drawStr( 74, 15, "L" );
    u8g.drawStr( 42, 15, "Liters" );
   
  //  u8g.setPrintPos(42, 15) ;
  //  u8g.print(total_fuel_consumption, 1);
    if (LoggingOn == true)  u8g.drawHLine(20, 24, 88);
    // u8g.setFont(u8g_font_profont22r);
    // switch (TT_curr) { //для делителя 10k + 4.7k
    // case 0: u8g.drawStr( 95, 20, "1" ); break;
    // case 2: u8g.drawStr( 95, 20, "2" ); break;
    // case 4: u8g.drawStr( 95, 20, "3" ); break;
    // case 5: u8g.drawStr( 95, 20, "3L" ); break;
    // case 6: u8g.drawStr( 95, 20, "4" ); break;
    // case 7: u8g.drawStr( 95, 20, "4L" ); break;
    // }
   
   // if (getOBDdata(OBD_SPD) > 1)
   // {
      u8g.setFont(u8g_font_profont15r);
    //  u8g.drawStr( 0, 42, "L/100Km" );
      u8g.drawStr( 0, 42, "All" );
      u8g.setFont(u8g_font_profont22r);
      u8g.setPrintPos(0, 60) ;
    u8g.print(total_fuel_consumption, 1);
     // u8g.print( 100 / getOBDdata(OBD_SPD) * (getOBDdata(OBD_INJ) * getOBDdata(OBD_RPM)*Ls * 0.18), 1);
     // u8g.print( 100 / getOBDdata(OBD_SPD) * (getOBDdata(OBD_INJ) *Ls*4* getOBDdata(OBD_RPM)*60), 1);
     // } else {
     // u8g.setFont(u8g_font_profont15r);
     // u8g.drawStr( 0, 42, "L/Hour" );
     // u8g.setFont(u8g_font_profont22r);
     // u8g.setPrintPos(0, 60) ;
     // u8g.print(getOBDdata(OBD_INJ) * getOBDdata(OBD_RPM)*Ls * 0.18, 1);
     // u8g.print(getOBDdata(OBD_INJ) *Ls*4* getOBDdata(OBD_RPM)*60, 1);
     // }
    
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 60, 42, "Average" );
    u8g.setFont(u8g_font_profont22r);
    u8g.setPrintPos(60, 60) ;
    if (total_avg_consumption < 100)
    u8g.print( total_avg_consumption, 1);
    else u8g.drawStr( 60, 60, "---" );
  }
  while ( u8g.nextPage() );
}

void drawTimeDistance(void) {
  u8g.setFont(u8g_font_profont15r);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 0, 15, "TOTAL" );
    u8g.drawStr( 90, 15, "KM" );
    u8g.setPrintPos(44, 15) ;
    u8g.print(total_trip, 1);
    if (LoggingOn == true)  u8g.drawHLine(20, 24, 88);
    u8g.setFont(u8g_font_profont22r);
   //  switch (TT_curr) { //для делителя 10k + 4.7k
   //  case 0: u8g.drawStr( 95, 20, "1" ); break;
   //  case 2: u8g.drawStr( 95, 20, "2" ); break;
   //  case 4: u8g.drawStr( 95, 20, "3" ); break;
   //  case 5: u8g.drawStr( 95, 20, "3L" ); break;
   //  case 6: u8g.drawStr( 95, 20, "4" ); break;
   //  case 7: u8g.drawStr( 95, 20, "4L" ); break;
   // }
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 0, 42, "Avg SPD" );
    u8g.setFont(u8g_font_profont22r);
    u8g.setPrintPos(0, 60) ;
    u8g.print(total_avg_speed, 1);
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 60, 42, "Time (M)" );
    u8g.setFont(u8g_font_profont22r);
    u8g.setPrintPos(60, 60) ;
    u8g.print( float(total_time) / 60000, 1);
  }
  while ( u8g.nextPage() );
}

void drawTripTimeDistance(void) {
  u8g.setFont(u8g_font_profont15r);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 0, 15, "TRIP" );
    u8g.drawStr( 90, 15, "KM" );
    u8g.setPrintPos(44, 15) ;
    u8g.print(current_trip, 1);
    if (LoggingOn == true)  u8g.drawHLine(20, 24, 88);
    u8g.setFont(u8g_font_profont22r);
   // switch (TT_curr) { //для делителя 10k + 4.7k
   // case 0: u8g.drawStr( 95, 20, "1" ); break;
   // case 2: u8g.drawStr( 95, 20, "2" ); break;
   // case 4: u8g.drawStr( 95, 20, "3" ); break;
   // case 5: u8g.drawStr( 95, 20, "3L" ); break;
   // case 6: u8g.drawStr( 95, 20, "4" ); break;
   // case 7: u8g.drawStr( 95, 20, "4L" ); break;
   //  }
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 0, 42, "Avg SPD" );
    u8g.setFont(u8g_font_profont22r);
    u8g.setPrintPos(0, 60) ;
    u8g.print(trip_avg_speed, 1);
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 60, 42, "Time (M)" );
    u8g.setFont(u8g_font_profont22r);
    u8g.setPrintPos(60, 60) ;
    u8g.print( float(current_time) / 60000, 1);
  }
  while ( u8g.nextPage() );
}

void drawTotalFuelDistanceB(void)  //--------------------------------------------TRIP B
{
  u8g.setFont(u8g_font_profont15r);
  u8g.firstPage();
  do {
  u8g.setFont(u8g_font_profont15r);
  //u8g.drawStr( 0, 6, "TOTAL" );
  //u8g.drawStr( 74, 15, "L" );
  //u8g.drawStr( 20, 15, "All Trip B" );
   
 
    if (LoggingOn == true)  u8g.drawHLine(20, 24, 88);
  
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 0, 47, "Km" );
    u8g.setFont(u8g_font_profont15r);
    u8g.setPrintPos(40, 47) ;
    u8g.print(all_trip_b, 1);
    
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 0, 63, "Lit" );
    u8g.setFont(u8g_font_profont15r);
    u8g.setPrintPos(40, 63) ;
    u8g.print( all_fuel_b/ 1000 * Ls, 1);
    
    u8g.setFont(u8g_font_profont15r);
    u8g.drawStr( 0, 30, "L/100" );
    u8g.setFont(u8g_font_profont15r);
    u8g.setPrintPos(40, 30) ;
    u8g.print(  all_fuel_b / 1000 * Ls * 100 / all_trip_b , 1);
  }
  while ( u8g.nextPage() );
}
//}


void drawAllData(void) {
  // graphic commands to redraw the complete screen should be placed here
  u8g.setFont(u8g_font_profont15r);
  u8g.firstPage();
  do {
    u8g.drawStr( 0, 17, "INJ" );
    u8g.setPrintPos(25, 17) ;
    u8g.print(getOBDdata(OBD_INJ));

    u8g.drawStr( 0, 32, "IGN");
    u8g.setPrintPos(25, 32) ;
    u8g.print( int(getOBDdata(OBD_IGN)));

    u8g.drawStr( 0, 47, "IAC");
    u8g.setPrintPos(25, 47) ;
    u8g.print( int(getOBDdata(OBD_IAC)));

    u8g.drawStr( 0, 62, "RPM");
    u8g.setPrintPos(25, 62) ;
    u8g.print( int(getOBDdata(OBD_RPM)));

    u8g.drawStr( 65, 17, "MAP" );
    u8g.setPrintPos(92, 17) ;
    u8g.print( int(getOBDdata(OBD_MAP)));

    u8g.drawStr( 65, 32, "ECT");
    u8g.setPrintPos(92, 32) ;
    u8g.print( int(getOBDdata(OBD_ECT)));

    u8g.drawStr( 65, 47, "TPS");
    u8g.setPrintPos(92, 47) ;
    u8g.print( int(getOBDdata(OBD_TPS)));

    u8g.drawStr( 65, 62, "SPD");
    u8g.setPrintPos(92, 62) ;
    u8g.print( int(getOBDdata(OBD_SPD)));

    u8g.drawVLine(63, 0, 64);
  } while ( u8g.nextPage() ); // end picture loop
} // end void drawalldata

void autoscreenchange() {
  CurrentDisplayIDX++;
  if (CurrentDisplayIDX > 3) CurrentDisplayIDX = 1;
  drawScreenSelector();
}
void ent() {//ПЕРЕКЛЮЧЕНИЕ ЭКРАНОВ
  CurrentDisplayIDX++;
  if (CurrentDisplayIDX > 7) CurrentDisplayIDX = 1;
  drawScreenSelector();
}

float getOBDdata(byte OBDdataIDX) {
  float returnValue;
  switch (OBDdataIDX) {
    case 0:// UNKNOWN
      returnValue = ToyotaData[0];
      break;
    case OBD_INJ: //  Время впрыска форсунок  =X*0.125 (мс) (x / 8)
      returnValue = ToyotaData[OBD_INJ] / 8 ;  //* 0.125; //Время впрыска форсунок x/10
      break;
    case OBD_IGN: // Угол опережения зажигания X*0.47-30 (град)
      returnValue = ToyotaData[OBD_IGN] * 0.47 - 30;
      break;
    case OBD_IAC: //  Состояние клапана ХХ Для разных типов КХХ разные формулы: X/255*100 (%)
      //  X (шаг)
      returnValue = ToyotaData[OBD_IAC] * 0.39215; ///optimize divide
      break;
    case OBD_RPM: //Частота вращения коленвала X*25(об/мин)
      returnValue = ToyotaData[OBD_RPM] * 25;
      break;
    case OBD_MAP: //Расходомер возд&#

    

    
        
    

    
        

Discussions