Перейти к содержимому


Фотография

Бортовой комп в комбинации приборов

комп расход

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 390

#281 Бродяжник

Бродяжник

    Кайроновод

  • Пользователи
  • PipPipPipPipPipPip
  • 604 сообщений
  • Пол:Мужчина
  • Город:МО / Королев

  • бензин механика
  • Имя:Павел

Отправлено 22 December 2016 - 09:50 PM

Да, на ардуино.
А... а мне кто то когда то говорил, что с помощью иголки от шприца выпаивают микросхемы в корпусах DIP, вот и хотел уточнить.


Выпаивают. Только надо такую иглу найти, чтобы она на ножку микросхемы надевалась.
Хотя китайцы даже специальные наборы трубочек из нержавейки давно уже штампуют.
 
Спойлер

  • 0

#282 Sasha_K

Sasha_K

    Кайроновод

  • Пользователи
  • PipPipPipPipPipPip
  • 856 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

  • бензин механика
  • Имя:Александр

Отправлено 22 December 2016 - 10:32 PM

Выпаивают. Только надо такую иглу найти, чтобы она на ножку микросхемы надевалась.
Хотя китайцы даже специальные наборы трубочек из нержавейки давно уже штампуют.
 

Спойлер

Спасибо... поищем в аптечки иглы.


  • 0

#283 produmann

produmann

    Чайник

  • Пользователи
  • PipPipPipPip
  • 268 сообщений
  • Пол:Мужчина
  • Город:киров

  • бензин автомат
  • Имя:Денис

Отправлено 28 January 2017 - 11:39 PM

По просьбам многочисленным, выкладываю исходник версии v2 :

 

 

 


/*
назначение пинов:
подключение SD:
cs -> 53
mosi -> 51
sck -> 52
miso -> 50
vcc > 22 через управляющий транзистор на +5в

подключение OLED:
vcc > 22 через управляющий транзистор на +5в
scl > 21
sda > 20

подключение динамика: 46
кнопка1 > 2
кнопка2 > 3

вкл зажигание > 7
питание регистратора > 47
сработка сигналки > 5 (не реализовано)

блютуз адаптер к serial
elm327 к serial1

для заливки через блютуз и перезагрузки
пин reset через транзистор к 49пин
*/

#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);
#include

File myFile;
byte edit=0; // для редактирования =1
byte resp;
const byte CSPin = 53;// инициализация sd
String var;
String val = "";
String val1 = "";
int ch = 0;
byte flashload;
byte delay_var=63; // Поправьте задержку между запросами если ЭБУ не выдает показания правильно, 50-300 мс (пример: duster - 65, cirrus - 235)
double speed_korrect_val=1.0; // Корректировка коэффициента скорости, посмотреть по GPS
double VE_correct=1.0; // Корректировка Объёмного КПД ДВС: добиваемся чтобы мгновенный расход на холостых оборотах был в половину объема двигателя
double ED = 2.295; // Объем двигателя в литрах (пример: 1.398)
double tcorrect=0.99919; // Корректировка коэффициента времени
double FuelDensityGramsPerLiter = 750.0; // !!константа - грамм бензина в 1 литре бензина
double AirFuelRatio = 14.70; // !!константа расхода 14,7 воздуха к 1 литра
int bak=70; // сколко бак вмещает литров
int menuval=9; // количество элементов в основном меню
double benzstoimost = 34; // стоимость бензина
int fuelmin = 954; // уровень датчика бензина в баке 0%
int fuelmax = 197; // уровень датчика бензина в баке 100%
unsigned long regtimeoff=3600000; // время выключения регистратора по умолчанию 1 час

char v1, v2, v3, v4, v5;
char rxData[20];
char rxIndex=0;
long intake_air_temp_var, speed_var, tmp_var, clERRok;
double benzraschet, LP100now, LP100, benz_potracheno, odometr, odometr_add, time, VE, raschet_nagruzka_dvigatelya_var, maf_var, long_term_val, short_term_val, IMAP,
FuelFlowGramsPerSecond, FuelFlowLitersPerSecond, LPH, benz_add, dvk_var, uoz_var, polozh_dross_zaslon, benz_potrachenoMEM, odometrMEM,LP100MEM,benzraschetMEM,limitkm, LP100X;
byte kol_check_engine_error_val, fss_val;
unsigned long previousMillis, previousMillis1, previousMillis2, previousMillis3, previousMillis4, previousMillis5, time_new, time_old, time_old_gurnal, time_corr, time_corr_prev;
byte selmon=0;
byte flag,flag1,flag2, flag3, flag4, flag5, par, key1, key2, key3, key1_sec, key3_2sec, menu_scr, respm, clearErrorFN, fuelrun, prev_menu_flag;
byte speedlimit=1;
byte comp, speed_flag, speed_flag1;
int reg_on=1;
int rpm_var;
int h,h1,w,selm,m1,menu,prev_menu,menu_select;
double analog2, fvar, fuel;
int analog[100];
unsigned long analog1=0;
int ii;
int sel;
char kod1[5];
char kod2[5];
char kod3[5];


/// символы экрана
const unsigned char logo[] U8G_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xF0,0x3F,0x00,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFE,0x0F,0x00,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0xFF,0x07,0x00,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0xFF,0x01,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0x00,0x00,0xC0,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0xFF,0x7F,0x00,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0xFF,0x3F,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF0,0xFF,0x1F,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0xFC,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFC,0xFF,0x07,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFC,0xFF,0x07,0x00,0x00,0x00,0xF8,0xF7,0x0F,0xE0,0xE0,0x01,0x39,0x06,0x00,
0x00,0xFE,0xFD,0x03,0x00,0x00,0x00,0xF0,0xFF,0x1F,0x20,0x11,0x82,0x49,0x1A,0x00,
0x00,0xFF,0xFF,0x03,0x00,0x00,0x00,0xF0,0xEF,0x3F,0x20,0x09,0x44,0x49,0x22,0x00,
0x00,0xFF,0xFE,0x01,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x20,0x09,0x64,0x49,0x42,0x00,
0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0xE0,0xFF,0x3F,0xE0,0x08,0x24,0x3B,0x42,0x00,
0x80,0xFF,0xFF,0x01,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x20,0x09,0xF4,0x2B,0x42,0x00,
0x80,0xFF,0xFF,0x01,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x20,0x11,0x1A,0x6A,0x22,0x00,
0x80,0xFF,0xFF,0x01,0x00,0x00,0x00,0xE0,0xFF,0x7F,0xE0,0xE0,0x09,0x4A,0x1E,0x00,
0x80,0xFF,0xFE,0x01,0x00,0x00,0x00,0xE0,0xDF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0xF0,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFC,0xFB,0x03,0x00,0x00,0x00,0xF0,0xF7,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFC,0xF7,0x07,0x00,0x00,0x00,0xF8,0xFB,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0xFC,0xFF,0x07,0x8E,0x07,0xC9,0x01,0x41,0x07,
0x00,0xE0,0xFF,0x1F,0x00,0x00,0x00,0xFE,0xFF,0x01,0x4B,0x08,0x49,0x02,0xE1,0x09,
0x00,0xC0,0xFF,0x3F,0x00,0x00,0x00,0xFF,0xFF,0x00,0x21,0x90,0x49,0x02,0x23,0x08,
0x00,0x00,0xFF,0xFF,0x01,0x00,0xE0,0xFF,0x3F,0x80,0x20,0x90,0x4D,0x02,0x32,0x0C,
0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFC,0xFF,0x0F,0x80,0x20,0x90,0xCD,0x01,0x12,0x03,
0x00,0x00,0xE0,0xFF,0xFF,0xE0,0xFF,0xFF,0x01,0x80,0x20,0xD0,0x56,0x00,0x9E,0x01,
0x00,0x00,0x00,0xFF,0xFF,0xF3,0xFF,0x1F,0x00,0x80,0x48,0x48,0x52,0x00,0x9C,0x00,
0x00,0x00,0x00,0xE0,0xFF,0xF3,0xFF,0x01,0x00,0x00,0x87,0x47,0x52,0x00,0x8C,0x0F,
0x00,0x00,0x00,0x00,0xFE,0xF1,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF0,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7C,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7C,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFC,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE0,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,
0xE0,0x83,0xEF,0x07,0xFC,0xFF,0x1F,0xFE,0x3F,0x3E,0xE0,0x07,0xDE,0x70,0xF8,0x01,
0xF0,0xE3,0xC7,0x0F,0xFF,0xFF,0xBF,0xFF,0x7F,0xFE,0xE0,0x03,0xDF,0x78,0xF8,0x03,
0xF0,0xFB,0x81,0xDF,0xCF,0x8F,0xFF,0x1F,0xFF,0xFF,0xF1,0x83,0xC3,0xC8,0x18,0x03,
0xF0,0xFF,0x00,0xFF,0xC3,0xF7,0xFF,0x07,0xFC,0xFF,0xF7,0x81,0xC1,0xC0,0x18,0x03,
0xF8,0xFF,0x00,0xFE,0xE1,0xF7,0xEF,0x07,0xFC,0xDF,0xFF,0xBD,0xC1,0xF0,0x18,0x03,
0xF8,0xFF,0x01,0x7C,0xE0,0xE3,0xE7,0x07,0xFC,0x8F,0xFF,0xBD,0xC1,0xCC,0x18,0x03,
0xF8,0xF1,0x03,0x7E,0xE0,0xC3,0xE7,0x1F,0xBF,0x0F,0xFF,0x80,0xC3,0xCC,0x18,0x03,
0xFC,0xE0,0x07,0x7E,0xF0,0x81,0xCF,0xFF,0xDF,0x0F,0xFE,0x00,0xDF,0xFC,0x18,0x03,
0x7C,0xC0,0x0F,0x3E,0xF0,0x81,0x9F,0xFF,0xCF,0x07,0x7C,0x00,0xDE,0xF8,0x18,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; // лого
const unsigned char LP100_pict[] = {0x02,0x00,0x00,0x02,0x70,0x00,0x02,0x1C,0x00,0x82,0x03,0x00,0xE2,0x00,0x00,
0x1C,0x20,0x00,0x07,0x20,0x00,0xE8,0xAE,0x3E,0xA8,0x6A,0x2A,0xA8,0x6A,0x2A,0xA8,0xAA,0x2A,0xE8,0xAE,0x2A}; // литров/100км 22х12
const unsigned char rubl[] = {0x3F,0x46,0xC6,0xC6,0xC6,0x46,0x3F,0x06,0x7F,0x06,0x06,0x06};// рубли 8х12
const unsigned char LPH_B[] U8G_PROGMEM = {0x00,0x00,0x00,0xC0,0x7F,0x04,0x00,0x0E,0x00,0xF0,0xFF,0x07,0x07,0x0E,0x00,0xF8,0xFF,0x0F,
0x07,0x0E,0x00,0x3C,0x80,0x0F,0x07,0x0E,0x00,0x0E,0x86,0x0F,0x07,0xCE,0x00,0x07,0x86,0x0F,0x07,0xFE,0x83,0x03,0x06,0x00,
0x07,0xFE,0x83,0x03,0x06,0x30,0x07,0x9E,0xC3,0x03,0x06,0x70,0x07,0x0E,0xC3,0x01,0x06,0x70,0x07,0x0E,0xC7,0x01,0x06,0x00,
0x07,0x0E,0xC7,0x01,0x06,0x60,0x07,0x0E,0xC7,0x01,0x0E,0x70,0x07,0x0E,0xC7,0x01,0x3E,0x60,0x07,0x0E,0xC7,0x01,0xFC,0x00,
0x07,0x0E,0xC7,0x01,0xF0,0x73,0x07,0x00,0xC0,0x03,0xC0,0x73,0x07,0x00,0x80,0x03,0x00,0x73,0x07,0x00,0x80,0x03,0x00,0x18,
0x07,0x00,0x00,0x07,0x00,0x1C,0x07,0x00,0x00,0x0F,0x00,0x1C,0xFF,0x07,0x00,0x3E,0x80,0x0B,0xFF,0x0F,0x00,0xFC,0xB1,0x03,
0xFF,0x0F,0x00,0xF0,0xFB,0x03,0xFF,0x07,0x00,0xE0,0x7B,0x00}; // литров в час большая 47х25
const unsigned char LP100_B[] U8G_PROGMEM = {0x00,0xFC,0xFF,0xFF,0x01,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x07,0x00,0x00,0x00,0xC0,0xFF,0x83,0x0F,0x00,0x00,
0x00,0xF0,0x7F,0x00,0x3C,0x00,0x00,0xC0,0xFF,0x0F,0xF0,0x7F,0x00,0x00,0x00,0xF0,0x07,0x80,0xFF,0x00,0x00,0xE0,0xFF,0x01,0x00,0xFE,0x0F,0x00,
0x00,0xFF,0x00,0x00,0x80,0xFF,0x01,0x00,0x07,0x00,0x00,0x00,0x00,0x03,0xFC,0x03,0x00,0x00,0x00,0x00,0x02,0xF0,0x03,0x00,0x00,0x00,0x00,0x02,
0xFF,0x03,0x03,0x00,0x00,0x07,0x02,0x00,0xF8,0x0F,0x00,0xF0,0x0F,0x02,0x80,0xFF,0x1D,0x00,0xFC,0x19,0x00,0xC0,0x7F,0x10,0x80,0x7F,0x20,0x00,
0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x11,0x8E,0x13,0x00,0x00,
0x00,0x02,0x19,0x51,0x14,0x00,0x00,0x00,0x82,0x14,0x51,0x94,0xDC,0x00,0x00,0x82,0x10,0x51,0x54,0x24,0x01,0x00,0x82,0x10,0x51,0x34,0x24,0x01,
0x00,0x42,0x10,0x51,0x54,0x24,0x01,0x00,0x5E,0x10,0x8E,0x93,0x24,0x01}; // литров/100км большая 50х25
const unsigned char scale[] U8G_PROGMEM = {
0x30,0x06,0x00,0x80,0x18,0x00,0x00,0xC0,0x01,0x00,0x00,0x88,0x01,0x00,0x00,0x63,
0x48,0x09,0x00,0xC0,0x24,0x00,0x00,0x20,0x02,0x00,0x40,0x4C,0x02,0x00,0x90,0x94,
0x40,0x09,0x00,0xA0,0x24,0x00,0x00,0x20,0x02,0x00,0x40,0x4A,0x02,0x00,0x10,0x94,
0x20,0x09,0x00,0x80,0x24,0x00,0x00,0x20,0x02,0x00,0xF0,0x49,0x02,0x00,0x7C,0x92,
0x13,0x09,0x00,0x8C,0x24,0x00,0x00,0x20,0x02,0x00,0x40,0x48,0x02,0x00,0x10,0x91,
0x08,0x09,0x00,0x80,0x24,0x00,0x00,0x20,0x02,0x00,0x40,0x48,0x02,0x00,0x90,0x90,
0x78,0x06,0x00,0x80,0x18,0x00,0x00,0xC0,0x01,0x00,0x00,0x88,0x01,0x00,0x80,0x67,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x08,
0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x08,
0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,
0x48,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x09,
0x48,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x09,
0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,
0x48,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x09,
0x48,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x09,
0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,
0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x08,
0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x30,0x06,0x00,0x80,0x18,0x00,0x00,0xC0,0x01,0x00,0x00,0x88,0x01,0x00,0x00,0x63,
0x48,0x09,0x00,0xC0,0x24,0x00,0x00,0x20,0x02,0x00,0x40,0x4C,0x02,0x00,0x90,0x94,
0x40,0x09,0x00,0xA0,0x24,0x00,0x00,0x20,0x02,0x00,0x40,0x4A,0x02,0x00,0x10,0x94,
0x20,0x09,0x00,0x80,0x24,0x00,0x00,0x20,0x02,0x00,0xF0,0x49,0x02,0x00,0x7C,0x92,
0x13,0x09,0x00,0x8C,0x24,0x00,0x00,0x20,0x02,0x00,0x40,0x48,0x02,0x00,0x10,0x91,
0x08,0x09,0x00,0x80,0x24,0x00,0x00,0x20,0x02,0x00,0x40,0x48,0x02,0x00,0x90,0x90,
0x78,0x06,0x00,0x80,0x18,0x00,0x00,0xC0,0x01,0x00,0x00,0x88,0x01,0x00,0x80,0x67}; // шкала 128x41
const unsigned char cur[] = {0x20,0x00,0x70,0x00,0xD8,0x00,0x8C,0x01,0x06,0x03,0xFF,0x07}; // стрелка ST 11х6
const unsigned char cur1[] = {0xFF,0x07,0x06,0x03,0x8C,0x01,0xD8,0x00,0x70,0x00,0x20,0x00}; // стрелка LT 11х6
const unsigned char bat[] U8G_PROGMEM = {0x38,0xC0,0x01,0xFF,0xFF,0x0F,0x01,0x00,0x08,0x01,0x80,0x08,
0x39,0xC0,0x09,0x01,0x80,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0xFF,0xFF,0x0F}; // напряжение 20х11
const unsigned char coolant[] U8G_PROGMEM = {0x80,0x01,0x80,0x01,0x80,0x07,0x80,0x01,0x80,0x07,0x80,0x01,
0x80,0x07,0x80,0x01,0x80,0x01,0xD8,0x1B,0xC0,0x03,0xDC,0x3B,0x00,0x00,0xFF,0xFF}; // температура двигателя 16х14
const unsigned char temp_[] U8G_PROGMEM = {0x0E,0x0E,0x3E,0x0E,0x3A,0x0A,0x3A,0x0A,0x0A,
0x1B,0x11,0x11,0x1F}; // температура впуска 6х13
const unsigned char grad[] = {0x06,0x09,0x09,0x06}; // градус 4х4
const unsigned char SPEED_P[] U8G_PROGMEM = {0x00,0x80,0x1F,0x00,0x00,0x00,0xFC,0xF0,0x03,0x00,0x00,0x07,0x00,0x0E,0x00,0x80,0x01,0x00,0x18,0x00,
0x60,0x00,0x00,0x60,0x00,0x30,0x00,0x00,0xC0,0x00,0x18,0x00,0x00,0x81,0x01,0x0C,0x00,0x80,0x01,0x03,0x04,0x00,0xC0,0x00,0x02,0x06,0x00,0x60,0x00,0x06,
0x02,0x00,0x30,0x00,0x04,0x02,0x00,0x18,0x00,0x04,0x03,0x00,0x0E,0x00,0x0C,0x03,0x00,0x0F,0x00,0x0C,0x01,0x00,0x0F,0x00,0x08,
0x00,0x00,0x06,0x00,0x00}; // скорость 36х16
const unsigned char fuel_p [] U8G_PROGMEM = {0xE0,0xFF,0xFF,0x01,0x00,0xF0,0xFF,0xFF,0x03,0x00,0xF8,0xFF,0xFF,0x03,0x00,0xF8,0xFF,0xFF,0x77,0x00,
0x78,0x00,0xC0,0xFF,0x00,0x78,0x00,0x80,0xFF,0x01,0x78,0x00,0x80,0xF7,0x03,0x78,0x00,0x80,0xE7,0x07,0x78,0x00,0x80,0xC7,0x0F,0x78,0x00,0x80,0x07,0x3F,
0x78,0x00,0x80,0x07,0x7F,0x78,0x00,0x80,0x07,0x7F,0x78,0x00,0x80,0x07,0xFF,0x78,0x00,0xC0,0x07,0xFF,0xF8,0xFF,0xFF,0x07,0xFF,0xF8,0xFF,0xFF,0x07,0xFF,
0xF8,0xFF,0xFF,0x07,0xFE,0xF8,0xFF,0xFF,0x07,0xFC,0xF8,0xFF,0xFF,0x07,0xF8,0xF8,0xFF,0xFF,0x7F,0xF0,0xF8,0xFF,0xFF,0xFF,0xF0,0xF8,0xFF,0xFF,0xFF,0xF0,
0xF8,0xFF,0xFF,0xFF,0xF1,0xF8,0xFF,0xFF,0xE7,0xF1,0xF8,0xFF,0xFF,0xE7,0xF1,0xF8,0xFF,0xFF,0xE7,0xF1,0xF8,0xFF,0xFF,0xE7,0xF1,0xF8,0xFF,0xFF,0xE7,0xF1,
0xF8,0xFF,0xFF,0xE7,0xF1,0xF8,0xFF,0xFF,0xE7,0xF1,0xF8,0xFF,0xFF,0xE7,0xF3,0xF8,0xFF,0xFF,0xC7,0xFF,0xF8,0xFF,0xFF,0xC7,0x7F,0xF8,0xFF,0xFF,0x87,0x7F,
0xFE,0xFF,0xFF,0x0F,0x3F,0xFF,0xFF,0xFF,0x3F,0x00,0xFF,0xFF,0xFF,0x3F,0x00,0xFF,0xFF,0xFF,0x3F,0x00}; // бензин картинка 40х38
const unsigned char check_eng [] U8G_PROGMEM = {0x00,0xE0,0xFF,0xFF,0x0F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x00,
0x00,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0xF0,0xFF,0xFF,0x0F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,
0x00,0x38,0x00,0x00,0x38,0x00,0x00,0xC0,0x3F,0x00,0x00,0xF8,0x03,0x7E,0xE0,0x3F,0x00,0x00,0xF8,0x07,0x7F,0xE3,0x1F,0x00,0x00,0xF0,0x07,0x7F,
0xE3,0x00,0x00,0x00,0x00,0x07,0xE7,0xE3,0x00,0x00,0x00,0x00,0x87,0xE3,0xE3,0x00,0x00,0x00,0x00,0x8E,0xE3,0xE3,0x00,0x00,0x00,0x00,0x8E,0xE3,
0xE3,0x00,0x00,0x00,0x00,0xFE,0xE1,0xE3,0x00,0x00,0x00,0x00,0xFC,0xE1,0xE3,0x00,0x00,0x00,0x00,0xFC,0xE1,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,
0xFF,0x38,0x22,0x3E,0x0E,0x11,0xE0,0xFF,0x44,0x22,0x02,0x11,0x09,0xE0,0xE3,0x04,0x22,0x02,0x01,0x05,0xC0,0xE3,0x04,0x3E,0x3E,0x01,0x05,0xC0,
0xE3,0x04,0x22,0x02,0x01,0x0B,0xE0,0xE3,0x44,0x22,0x02,0x11,0x11,0xE0,0xE3,0x38,0x22,0x3E,0x0E,0x21,0xE0,0xE3,0x00,0x00,0x00,0x00,0x00,0xE0,
0xE3,0x00,0x00,0x00,0x00,0x00,0xE0,0xE3,0x0F,0x00,0x00,0x00,0x78,0xE0,0xE3,0x3F,0x00,0x00,0x00,0xFC,0xE1,0xE0,0x7F,0x00,0x00,0x00,0xFC,0xE1,
0x00,0x70,0x00,0x00,0x00,0x8E,0xE3,0x00,0xE0,0x00,0x00,0x00,0x8E,0xE3,0x00,0xE0,0x01,0x00,0x00,0x8E,0xE3,0x00,0xC0,0x03,0x00,0x00,0x07,0xE3,
0x00,0x80,0x03,0x00,0x00,0x07,0xE7,0x00,0x00,0xFF,0xFF,0xFF,0x07,0x7F,0x00,0x00,0xFE,0xFF,0xFF,0x03,0x7E}; // ошибки 56х38
const unsigned char toplivo [] U8G_PROGMEM = {0xF8,0x0F,0x00,0xFC,0x7F,0x00,0x0C,0xF8,0x00,0x0C,0xD8,0x01,0x0C,0x98,0x03,0x0C,0x98,0x07,0xFC,0x9F,0x07,
0xFC,0x9F,0x07,0xFC,0x1F,0x07,0xFC,0x7F,0x06,0xFC,0xFF,0x06,0xFC,0xDF,0x06,0xFC,0xDF,0x06,0xFC,0xDF,0x06,0xFC,0xDF,0x07,0xFC,0xDF,0x07,
0xFE,0xBF,0x03,0xFF,0x7F,0x00}; // значек топливо 19*18
const unsigned char up_cur [] U8G_PROGMEM = {0x04,0x0E,0x1F}; // курсор вверх 5х3
const unsigned char down_cur [] U8G_PROGMEM = {0x1F,0x0E,0x04}; // курсор вниз 5х3
const unsigned char spdlimit80 [] U8G_PROGMEM = {0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0xFF,0x03,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0xF0,0xFF,0x0F,0xFF,0xFF,0x00,0x00,
0x00,0xF8,0x7F,0x00,0xE0,0xFF,0x01,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x03,0x00,0x00,0xFC,0x0F,0x00,0x00,0xFF,0x00,0x00,0x00,0xF0,0x0F,0x00,
0x80,0x7F,0x00,0x00,0x00,0xE0,0x1F,0x00,0xC0,0x3F,0x00,0x00,0x00,0xC0,0x3F,0x00,0xE0,0x1F,0x00,0x00,0x00,0x80,0x7F,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0xFF,0x00,
0xF0,0x07,0x00,0x00,0x00,0x00,0xFE,0x00,0xF8,0x03,0x00,0x00,0x00,0x00,0xFC,0x01,0xF8,0x03,0x7F,0x00,0xF0,0x07,0xFC,0x01,0xFC,0xC1,0xFF,0x01,0xFC,0x1F,0xF8,0x03,
0xFC,0xE1,0xFF,0x03,0xFE,0x3F,0xF8,0x03,0xFC,0xF0,0xFF,0x07,0xFF,0x7F,0xF0,0x03,0xFE,0xF0,0xE3,0x07,0x3F,0x7E,0xF0,0x07,0xFE,0xF0,0xE3,0x07,0x3F,0x7E,0xF0,0x07,
0x7E,0xF0,0xE3,0x87,0x1F,0xFC,0xE0,0x07,0x7E,0xF0,0xE3,0x87,0x1F,0xFC,0xE0,0x07,0x7F,0xE0,0xFF,0x83,0x1F,0xFC,0xE0,0x0F,0x7F,0xC0,0xFF,0x81,0x1F,0xFC,0xE0,0x0F,
0x7F,0xC0,0xFF,0x81,0x1F,0xFC,0xE0,0x0F,0x3F,0xF0,0xFF,0x87,0x1F,0xFC,0xC0,0x0F,0x3F,0xF0,0xE3,0x87,0x1F,0xFC,0xC0,0x0F,0x3F,0xF8,0xC1,0x8F,0x1F,0xFC,0xC0,0x0F,
0x3F,0xF8,0xC1,0x8F,0x1F,0xFC,0xC0,0x0F,0x7F,0xF8,0xC1,0x8F,0x1F,0xFC,0xE0,0x0F,0x7F,0xF8,0xC1,0x0F,0x3F,0x7E,0xE0,0x0F,0x7F,0xF8,0xE3,0x0F,0x3F,0x7E,0xE0,0x0F,
0x7E,0xF0,0xFF,0x07,0xFE,0x7F,0xE0,0x07,0x7E,0xF0,0xFF,0x07,0xFE,0x3F,0xE0,0x07,0xFE,0xE0,0xFF,0x03,0xFC,0x1F,0xF0,0x07,0xFE,0x80,0x7F,0x00,0xF0,0x07,0xF0,0x07,
0xFC,0x00,0x00,0x00,0x10,0x00,0xF0,0x03,0xFC,0x01,0x00,0x00,0x10,0x00,0xF8,0x03,0xFC,0x01,0x00,0x00,0x08,0x00,0xF8,0x03,0xF8,0x03,0x88,0xC6,0x28,0x02,0xFC,0x01,
0xF8,0x03,0x48,0xC6,0x28,0x02,0xFC,0x01,0xF0,0x07,0x28,0xC6,0x24,0x02,0xFE,0x00,0xF0,0x0F,0x18,0xAA,0x44,0x02,0xFF,0x00,0xE0,0x1F,0x28,0xAA,0x84,0x83,0x7F,0x00,
0xC0,0x3F,0x48,0xAA,0x02,0xC2,0x3F,0x00,0x80,0x7F,0x88,0x92,0x02,0xE2,0x1F,0x00,0x00,0xFF,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0xFF,0x03,0x00,0x00,0xFC,0x0F,0x00,
0x00,0xFE,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xF8,0x7F,0x00,0xE0,0xFF,0x01,0x00,0x00,0xF0,0xFF,0x0F,0xFF,0xFF,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x7F,0x00,0x00,
0x00,0xC0,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0xFC,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,
0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00}; // превышение 80км/ч 60х60
const unsigned char spdlimit100 [] U8G_PROGMEM = {0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0xFF,0x03,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0xF0,0xFF,0x0F,0xFF,0xFF,0x00,0x00,
0x00,0xF8,0x7F,0x00,0xE0,0xFF,0x01,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x03,0x00,0x00,0xFC,0x0F,0x00,0x00,0xFF,0x00,0x00,0x00,0xF0,0x0F,0x00,
0x80,0x7F,0x00,0x00,0x00,0xE0,0x1F,0x00,0xC0,0x3F,0x00,0x00,0x00,0xC0,0x3F,0x00,0xE0,0x1F,0x00,0x00,0x00,0x80,0x7F,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0xFF,0x00,
0xF0,0x07,0x00,0x00,0x00,0x00,0xFE,0x00,0xF8,0x03,0x00,0x00,0x00,0x00,0xFC,0x01,0xF8,0x03,0x00,0x00,0x00,0x00,0xFC,0x01,0xFC,0x81,0x07,0xF8,0x00,0x7C,0xF8,0x03,
0xFC,0xC1,0x07,0xFE,0x03,0xFF,0xF9,0x03,0xFC,0xC0,0x07,0xFF,0x83,0xFF,0xF1,0x03,0xFE,0xE0,0x07,0xFF,0x87,0xFF,0xF3,0x07,0xFE,0xF0,0x07,0xDF,0x87,0xEF,0xF3,0x07,
0x7E,0xFC,0x87,0x8F,0xCF,0xC7,0xE7,0x07,0x7E,0xFE,0x87,0x8F,0xCF,0xC7,0xE7,0x07,0x7F,0xFE,0x87,0x8F,0xCF,0xC7,0xE7,0x0F,0x7F,0xCE,0x87,0x8F,0xCF,0xC7,0xE7,0x0F,
0x7F,0xC2,0x87,0x8F,0xCF,0xC7,0xE7,0x0F,0x3F,0xC0,0x87,0x8F,0xCF,0xC7,0xC7,0x0F,0x3F,0xC0,0x87,0x8F,0xCF,0xC7,0xC7,0x0F,0x3F,0xC0,0x87,0x8F,0xCF,0xC7,0xC7,0x0F,
0x3F,0xC0,0x87,0x8F,0xCF,0xC7,0xC7,0x0F,0x7F,0xC0,0x87,0x8F,0xCF,0xC7,0xE7,0x0F,0x7F,0xC0,0x07,0xDF,0x87,0xEF,0xE3,0x0F,0x7F,0xC0,0x07,0xFF,0x87,0xFF,0xE3,0x0F,
0x7E,0xC0,0x07,0xFE,0x07,0xFF,0xE3,0x07,0x7E,0xC0,0x07,0xFE,0x03,0xFF,0xE1,0x07,0xFE,0xC0,0x07,0xF8,0x00,0x7C,0xF0,0x07,0xFE,0x00,0x00,0x00,0x20,0x00,0xF0,0x07,
0xFC,0x00,0x00,0x00,0x20,0x00,0xF0,0x03,0xFC,0x01,0x00,0x00,0x10,0x00,0xF8,0x03,0xFC,0x01,0x10,0x8D,0x51,0x04,0xF8,0x03,0xF8,0x03,0x90,0x8C,0x51,0x04,0xFC,0x01,
0xF8,0x03,0x50,0x8C,0x49,0x04,0xFC,0x01,0xF0,0x07,0x30,0x54,0x89,0x04,0xFE,0x00,0xF0,0x0F,0x50,0x54,0x09,0x07,0xFF,0x00,0xE0,0x1F,0x90,0x54,0x05,0x84,0x7F,0x00,
0xC0,0x3F,0x10,0x25,0x05,0xC4,0x3F,0x00,0x80,0x7F,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0xFF,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0xFF,0x03,0x00,0x00,0xFC,0x0F,0x00,
0x00,0xFE,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xF8,0x7F,0x00,0xE0,0xFF,0x01,0x00,0x00,0xF0,0xFF,0x0F,0xFF,0xFF,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x7F,0x00,0x00,
0x00,0xC0,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0xFC,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,
0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00}; // превышение 100км/ч 60х60
const unsigned char drive_pic [] U8G_PROGMEM = {0x80,0x87,0xE1,0x01,0x80,0x87,0xE1,0x01,0x80,0xC3,0xC3,0x01,0x80,0xC3,0xC3,0x01,0xC0,0xC3,0xC3,0x03,
0xC0,0xC3,0xC3,0x03,0xC0,0xC3,0xC3,0x03,0xC0,0xC3,0xC3,0x03,0xC0,0x03,0xC0,0x03,0xE0,0x03,0xC0,0x07,0xE0,0x01,0x80,0x07,0xE0,0x01,0x80,0x07,
0xE0,0x01,0x80,0x07,0xE0,0x01,0x80,0x07,0xF0,0x01,0x80,0x0F,0xF0,0xC1,0x83,0x0F,0xF0,0xC1,0x83,0x0F,0xF0,0xC0,0x03,0x0F,0xF0,0xE0,0x07,0x0F,
0xF8,0xE0,0x07,0x1F,0xF8,0xE0,0x07,0x1F,0xF8,0xE0,0x07,0x1F,0xF8,0xE0,0x07,0x1F,0xF8,0xE0,0x07,0x1F,0xFC,0x00,0x00,0x3F,0x7C,0x00,0x00,0x3E,
0x7C,0x00,0x00,0x3E,0x7C,0x00,0x00,0x3E,0x7C,0x00,0x00,0x3E,0x7E,0x00,0x00,0x7E,0x7E,0x00,0x00,0x7E,0x7E,0xE0,0x03,0x7E,0x3E,0xE0,0x03,0x7C,
0x3E,0xE0,0x03,0x7C,0x3F,0xE0,0x03,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xF0,0x07,0xFC}; // экран драйв 32х39
///


void setup()
{
Serial.begin(115200); // для перепрошивки
Serial1.begin(38400); //default communication baud rate of HC-05 is 38400
pinMode(49, OUTPUT);/// сброс для прошивки
pinMode(2, INPUT_PULLUP);// КНОПКА МЕНЮ на 2 pin с подтягивающим резистором
pinMode(3, INPUT_PULLUP);// КНОПКА 2 на 3 pin с подтягивающим резистором
pinMode(22, OUTPUT);// вкл дисплей pin22
pinMode(7, INPUT);// // проверка ВКЛ зажигание pin7
pinMode(CSPin, OUTPUT);// sd
pinMode(47, OUTPUT);// регистратор
// pinMode(5, INPUT);// сработка сигналки
}

void loop()
{ // ОСНОВНОЙ ЦИКЛ
resp=1;
if(digitalRead(7)==HIGH){
digitalWrite( 47 , HIGH ); ///регистратор вкл
previousMillis5 = millis();// для регистратора и задержки выкл
serialread();/// опрос сериал команд
}
if(digitalRead(7)==LOW && flashload==2)
{flashload=0;
if(benz_potrachenoMEM!=0 && odometrMEM!=0){SDwrite();}
delay(500); digitalWrite( 22 , LOW ); comp=0;}

//////////////////////////////////////////////////БОРТОВОЙ КОМПЬЮТЕР/////////////////////////////////////////////////////////////
if(digitalRead(7)==HIGH && comp==0) // ЗАЖИГАНИЕ ВКЛЮЧЕНО
{
digitalWrite( 22 , HIGH );// включаем дисплей
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);// инициализация дисплея
u8g.setRot180();
if(!edit){
if( !SD.begin(CSPin)) {// инициализация sd
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
}

////// лого при загрузке
u8g.firstPage();
do {
u8g.drawXBMP(0, 0, 128, 64, logo);
} while( u8g.nextPage() );
/////

tone(46, 3000, 100); delay (100); tone(46, 3500, 100); delay (100); tone(46, 4000, 100); delay (100); tone(46, 4500, 100);

start_comp(); // запуск компа
previousMillis2 = millis(); // для рассчета топлива в баке
previousMillis1 = millis();// для меню
previousMillis4 = millis();// топливо в баке 1 раз при включении
fuelrun=0; // топливо в баке 1 раз при включении
comp=1;
SearchErrorEngine();// поиск ошибок
SDread();// восстанавливаем значения с карты
}

if(digitalRead(7)==LOW && comp==1 && (millis() - previousMillis5 > 5000)) {// ждем выкл питания.....
if(benz_potrachenoMEM!=0 && odometrMEM!=0){SDwrite();}
digitalWrite( 22 , LOW ); comp=0;
if(reg_on==3) {digitalWrite( 47 , LOW );}//выкл регистратор
}

if ((millis() - previousMillis4 > 6000) && !fuelrun) {analog2 = analogRead(0); fuelrun=1;} // топливо в баке 1 раз при включении

if (comp==1) // комп ВКЛ
{comp_();}
/////////////////////////////////////////////////////КОНЕЦ БОРТ КОМП//////////////////////////////////////////////////////////////////////////////////////////
/*if(digitalRead(5)==HIGH){// если сработала сигналка, вкл рег....
digitalWrite( 47 , HIGH ); ///регистратор вкл
previousMillis5 = millis();
}*/

if(reg_on==1 || reg_on==2){//выкл регистратор через час или 3часа
if (millis() - previousMillis5 > regtimeoff) {digitalWrite( 47 , LOW );}
}


if (!resp) {rezet();}// если elm не отвечает сбрасываем его



}// ОСНОВНОЙ ЦИКЛ


////////////////////////////////////////////////////// ПОДПРОГРАММЫ ////////////////////////////////////////////////////////////////////////////
void start_comp (void){// запуск компа
Serial1.println("ATZ"); //rezet
Serial1.print("\r");
delay(900);

Serial1.println("ATSP0"); // протокол ATSP0 - авто, cirrus ATSP3
Serial1.print("\r");
delay(100);

while (Serial1.available()) {Serial1.read();} // очистка буфера serial

speed_var =0;
tmp_var = 0;
rpm_var = 0;
intake_air_temp_var = 0;
raschet_nagruzka_dvigatelya_var = 0;
maf_var = 0;
short_term_val = 0;
long_term_val = 0;
fss_val = 0;
kol_check_engine_error_val=0;
kod1[0]=' ';
kod1[1]=' ';
kod1[2]=' ';
kod1[3]=' ';
kod2[0]=' ';
kod2[1]=' ';
kod2[2]=' ';
kod2[3]=' ';
kod3[0]=' ';
kod3[1]=' ';
kod3[2]=' ';
kod3[3]=' ';
delay(500);
}

void comp_ (void){// бортовой компьютер
IMAP=0;
FuelFlowGramsPerSecond=0;
FuelFlowLitersPerSecond=0;
LPH=0;
odometr_add=0;
benz_add=0;
LP100now = 0;

fuel_var();
Rpm();
Rnd();
FuelSystemStatus();
Speed();
Maf();
if(speedlimit){
if(speed_var>80 && speed_flag == 0) // пищит при превышении скорости
{if(!prev_menu_flag) {prev_menu=menu;}
menu_scr=0; menu=110; previousMillis1 = millis();
speed_flag = 1; tone(46, 4500, 500);}
if(speed_var<60 && speed_flag == 1) { speed_flag = 0;}

if(speed_var>100 && speed_flag1 == 0) // пищит при превышении скорости
{if(!prev_menu_flag) {prev_menu=menu;}
menu_scr=0; menu=111; previousMillis1 = millis();
speed_flag1 = 1; tone(46, 4500, 500);}
if(speed_var<80 && speed_flag1 == 1) { speed_flag1 = 0;}
}

/////////////// ОСНОВНЫЕ ВЫЧИСЛЕНИЯ//////////////////
if (rpm_var>400 && digitalRead(7)==HIGH) // проверка работы двигателя
{ if (raschet_nagruzka_dvigatelya_var<30 && fss_val==4) {} // Проверка торможения двигателем по нагрузке двигателя и FSS
else
{FuelFlowGramsPerSecond = double(maf_var/AirFuelRatio); // Получаем расход грамм бензина в секунду в соотношении 14,7 воздуха/к 1 литра бензина
FuelFlowLitersPerSecond = FuelFlowGramsPerSecond / FuelDensityGramsPerLiter; // Переводим граммы бензина в литры
LPH = FuelFlowLitersPerSecond * 3600.0;} // Конвертирование литров в час

if (time_old==0) {time_old = millis();} // выполнится один раз при появлении оборотов

time_new = millis(); // время со старта программы в мс
time=(double(time_new-time_old)/1000.0)*tcorrect; // прошло время с последнего расчета скорости, расхода - в сек
if (time>10) { time=0; }
time_old = time_new; // записать новое время для сравнения в следующем цикле

if (speed_var>0)
{odometr_add=double((double(speed_var*1000.0)/3600.0)*time)/1000.0;
odometr=odometr+odometr_add;} //обший пробег в км

benz_add=FuelFlowLitersPerSecond*time;
benz_potracheno=benz_potracheno+benz_add; // общий расход в литрах
}
if (odometr>0) {LP100=(benz_potracheno/odometr)*100.0;} //расход бензина на 100 км (в литрах)
if (speed_var>0) {LP100now = (benz_add/odometr_add)*100.0;} // литров/100км мгновенное
benzraschet = benz_potracheno*benzstoimost;

benz_potrachenoMEM=benz_potrachenoMEM+benz_add;// общее
odometrMEM=odometrMEM+odometr_add;// общее
if (odometrMEM>0) {LP100MEM=(benz_potrachenoMEM/odometrMEM)*100.0;} //ОБЩИЙ расход бензина на 100 км (в литрах)
benzraschetMEM = benz_potrachenoMEM*benzstoimost;//ОБЩЕЕ
if(LP100>0) {LP100X=LP100;}// расход для расчетов сколько осталось проехать
else {LP100X=LP100MEM;}
limitkm=(fuel/LP100X)*100;// сколько можно проехать на остатке топлива

/////// КОНЕЦ ОБРАБОТКИ, ВЫВОД НА ЭКРАН////////

if(clearErrorFN){clearError(); // сброс ошибок двигателя....
if(clERRok==68){tone(46, 4500, 50); delay (100); tone(46, 4500, 50); delay (100); tone(46, 4500, 50); previousMillis1 = millis(); menu=107;}
else {tone(46, 800, 200);}
clearErrorFN=0;}
respm=1;// опрос датчиков только отсюда
key(); // обработчик кнопок
LCD();
}

void LCD(void){

////////////отрисовка основного меню////////////////////////////////////////////////////////
if(menu_scr) {
if(key1_sec) {menu_scr=0; key1_sec=0; key1=0;}// выход на экран
if(key2) {selm++; menu_select++;}
if(selm>1) {m1++; selm=1;}
if(key1) {selm--; menu_select--;}
if(selm<0) {m1--; selm=0;}
if(menu_select<0) {selm=0; m1=0; menu_select=0; tone(46, 4500, 50); delay(100); tone(46, 4500, 50);}
if(menu_select>(menuval-1)) {selm=1; m1=(menuval-2); menu_select=(menuval-1); tone(46, 4500, 50); delay(100); tone(46, 4500, 50);}
if(menu_select==0) {menu=0;} // пункт-0 >>> экран-0
if(menu_select==1) {menu=1;} // пункт-1 >>> экран-1
if(menu_select==2) {menu=2;} // пункт-2 >>> экран-2
if(menu_select==3) {menu=8;} // пункт-3 >>> экран-8
if(menu_select==4) {menu=3;} // пункт-4 >>> экран-3
if(menu_select==5) {menu=4;} // пункт-5 >>> экран-4
if(menu_select==6) {menu=5;} // пункт-6 >>> экран-5
if(menu_select==7) {menu=6;} // пункт-7 >>> экран-6
if(menu_select==8) {menu=7;} // пункт-7 >>> экран-7
u8g.setRot180();
u8g.firstPage();
do {
if(digitalRead(7)==HIGH) {
if (resp){
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
h = u8g.getFontAscent()-u8g.getFontDescent();
h1=(2-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(8, h1, "poezdka");} // пункт-0
h1=((h+9)-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(13, h1, "obschiy");} // пункт-1
h1=((h+7)*2+3-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(18, h1, "benzin");} // пункт-2
h1=((h+7)*3+3-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(29, h1, "drive");} // пункт-3
h1=((h+7)*4+3-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(16, h1, "temp 'c");} // пункт-4
h1=((h+7)*5+3-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(5, h1, "topl korr");} // пункт-5
h1=((h+7)*6+3-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(20, h1, "drugie");} // пункт-6
h1=((h+7)*7+3-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(23, h1, "errors");} // пункт-7
h1=((h+7)*8+3-(h+7)*m1); if(h1>=0 && h1<=64) {u8g.drawStr(13, h1, "settings");} // пункт-8
u8g.drawFrame(0, (h+7)*selm, 122, h+6);
if(m1>0) {u8g.drawXBMP(123, 0, 5, 3, up_cur);}
if(m1<(menuval-2)) {u8g.drawXBMP(123, 61, 5, 3, down_cur);}
}
else{u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(19, 8, "OBD II");// вывод строки
u8g.drawStr(0, 37, "TIMEOUT");// вывод строки
}
}
else{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(0, 8, "OFF :(");// вывод строки
}
} while( u8g.nextPage() );

previousMillis1 = millis();
flag4=0;
}
//////////////////////////////////////////////////////////////////////////////


///////////////ПОДМЕНЮ экранов функция>>(menu)//////////////////////////////////////////////////////////////
if(!menu_scr) {
if(key1_sec) {menu_scr=1; key1_sec=0; key1=0;}// выход в основное меню

if(menu==0 && (millis() - previousMillis3 > 1500) && flag1) { // сброс поездки
LP100=0; benz_potracheno=0;
odometr=0; tone(46, 4500, 50); delay (100); tone(46, 4500, 50); delay (100); tone(46, 4500, 50);
previousMillis3 = millis();}

if(menu==1 && key3_2sec==1) {menu=101; previousMillis1 = millis();} // меню обнулить общие счетчики двойное нажатие 2 сек
if(menu==101 && key1) { // обнуление....
benz_potrachenoMEM=0; odometrMEM=0;
LP100MEM=0; SDwrite();
menu=1; tone(46, 4500, 50); delay (100); tone(46, 4500, 50); delay (100); tone(46, 4500, 50);}
if(menu==101 && key2) {menu=1;} // отмена, обратно в меню

if(menu==61 && key2) {tone(46, 4500, 50); delay(100); tone(46, 4500, 50);}
if(menu==6 && key2) {menu=61; flag5=0;} // переключение режима ошибок
if(menu==6 && key1) {tone(46, 4500, 50); delay(100); tone(46, 4500, 50);}
if(menu==61 && key1) {menu=6; flag5=0;} // переключение режима ошибок
if((menu==6 || menu==61) && key3_2sec==1 && rpm_var==0) {menu=106; previousMillis1 = millis();} // меню стереть ошибки двойное нажатие 2 сек
if(menu==106 && key1) {clearErrorFN=1;}
if(menu==106 && key2) {menu=6; flag5=0;} // отмена, обратно в меню

if(menu==7 && key2 && par==0) {sel++;}// листание параметров
if(menu==7 && key1 && par==0) {sel--;}// листание параметров
if(menu==7 && sel<0) {sel=0; tone(46, 4500, 50); delay(100); tone(46, 4500, 50);}
if(menu==109 && key2) {tone(46, 4500, 50); delay(100); tone(46, 4500, 50);}
if(menu==7 && key3 && par==0) {par=1;}// выбор параметров
if(menu==7 && key3 && par==2) {// сохранение параметров
par=0; if(benz_potrachenoMEM!=0 && odometrMEM!=0){SDwrite();}
tone(46, 4500, 50); delay (100); tone(46, 4500, 50); delay (100); tone(46, 4500, 50);}
if(menu==7 && sel==0 && (par==1 || par==2) && key1) // изменение значения
{benzstoimost=benzstoimost+0.1;}
if(menu==7 && sel==0 && (par==1 || par==2) && key2) // изменение значения
{benzstoimost=benzstoimost-0.1;}
if(menu==7 && sel==1 && (par==1 || par==2) && (key2 || key1)) // изменение значения
{speedlimit=!speedlimit;}
////время регистратора////
if(menu==7 && sel==3 && (par==1 || par==2) && key1) // изменение значения время регистратора
{reg_on++;}
if(menu==7 && sel==3 && (par==1 || par==2) && key2) // изменение значения время регистратора
{reg_on--;}
if(reg_on<0) {reg_on=0; tone(46, 4500, 50); delay(100); tone(46, 4500, 50);}
if(reg_on>3) {reg_on=3; tone(46, 4500, 50); delay(100); tone(46, 4500, 50);}
if(reg_on==1) {regtimeoff=3600000;}
if(reg_on==2) {regtimeoff=10800000;}
////подменю корректировка топливного бака////
if(menu==7 && sel==2 && key3) {menu=108;}
if(menu==108 && key1) {fuelmax=analog2;} //запись значения датчика бензина 100%
if(menu==108 && key2) {fuelmin=analog2;} //запись значения датчика бензина 0%
if(menu==108 && key3_2sec) {fuelmin = 830; fuelmax = 155;} // значения датчика бензина по умолчанию кнопка1 + кнопка2 2секунды
if(menu==108 && key3 && par==0) {menu=7;// сохранение параметров кнопка1 + кнопка2
if(benz_potrachenoMEM!=0 && odometrMEM!=0){SDwrite();}
tone(46, 4500, 50); delay (100); tone(46, 4500, 50); delay (100); tone(46, 4500, 50);}
////// коррекция времени//////
if(menu==7 && sel==4) {menu=109;}
if(menu==109 && key1) {menu=7; sel--;}
if(menu==109 && key3) {time_corr_prev = millis();}
if(menu==109) {time_corr = (double(millis()-time_corr_prev)/1000)*tcorrect;}

////опрос датчиков, события/////
if(respm){
if(menu == 3) {Tmp(); IntakeAirTemp(); Voltage();}
if(menu == 4) {ShortTerm(); LongTerm();}
if(menu == 5) {Uoz(); DavlenVpuskKoll(); Pdz();}
if(menu == 6 && !flag4) {SearchErrorEngine();}
if(menu == 6 && !flag5) {error03();}
if(menu == 61 && !flag5) {error07();}
}
////////

////////////////////////////// ПРОРИСОВКА ЭКРАНА/////////////////////////////////////////
u8g.setRot180();
u8g.firstPage();
do {
if(digitalRead(7)==HIGH) {
if (resp){
switch (menu){

case 0:
////////////ЗА ПОЕЗДКУ, МГНОВЕННЫЙ РАСХОД, ИЗРАСХОДОВАНО ДЕНЕГ, СРЕДНИЙ РАСХОД...../////////////////////////////////////////////////////
if (millis() - previousMillis1 < 2500)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(13, 0, "poezdka");// вывод строки
u8g.drawHLine(0, 25, 128);
u8g.setScale2x2();
u8g.drawXBM(56, 15, 8, 12, rubl);
u8g.undoScale();
u8g.drawXBMP(0, 30, 50, 25, LP100_B);
u8g.drawXBMP(57, 30, 47, 25, LPH_B);}
else {
u8g.drawHLine(0, 0, 128);
u8g.drawHLine(0, 35, 128);
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат

if (raschet_nagruzka_dvigatelya_var<30 && fss_val==4)
{ u8g.drawStr(20, 3, "engine"); u8g.drawStr(60, 18, "braking");}
else{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
if (speed_var>0) {
u8g.setPrintPos(0, 8);//позиция переменных
u8g.print(LP100now);//литр на 100км мгновенное
u8g.drawXBMP(78, 5, 50, 25, LP100_B);
}
else {
u8g.setPrintPos(0, 8);//позиция переменных
u8g.print(LPH);//литров в час
u8g.drawXBMP(81, 5, 47, 25, LPH_B);
}
}

u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(0, 37, "RASHOD: ");// вывод строки
w = u8g.getStrWidth("RASHOD: ");
u8g.setPrintPos(w, 37);//позиция переменных
u8g.print(LP100);//вывод числа, переменных
u8g.drawXBM(106, 37, 22, 12, LP100_pict);
u8g.drawStr(0, 49, "DENEG: ");// вывод строки
w = u8g.getStrWidth("DENEG: ");
u8g.setPrintPos(w, 49);//позиция переменных
u8g.print(benzraschet);//вывод числа, переменных
u8g.drawXBM(106, 50, 8, 12, rubl);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
break;

case 1:
////////////////////////ОБЩИЙ РАСХОД////////////////////////////////////////////////
if (millis() - previousMillis1 < 2500)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(15, 0, "obschiy");// вывод строки
u8g.drawHLine(0, 25, 128);
u8g.setScale2x2();
u8g.drawXBM(47, 15, 8, 12, rubl);
u8g.undoScale();
u8g.drawXBMP(18, 30, 50, 25, LP100_B);
}
else {
u8g.setFont(u8g_font_timB10);//выбор шрифта
h = u8g.getFontAscent()-u8g.getFontDescent();
u8g.setFontPosTop();//начало координат
u8g.drawStr(0, 0, "RASHOD: ");// вывод строки
w = u8g.getStrWidth("RASHOD: ");
u8g.setPrintPos(w, 0);//позиция переменных
u8g.print(LP100MEM);//вывод числа, переменных
u8g.drawXBM(106, 0, 22, 12, LP100_pict);
u8g.setPrintPos(0, h+3);
u8g.print("LITROV: "+String(benz_potrachenoMEM)+" l.");
u8g.setPrintPos(0, (h+3)*2);
u8g.print("ODO: "+String(int(odometrMEM))+" km");
u8g.setPrintPos(0, (h+3)*3);
u8g.print("DENEG: "+String(int(benzraschetMEM))+" p.");
}
break;
//// сброс счетчиков общего расхода на 0
case 101:
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(13, 3, "CLEAR?");// вывод строки
h = u8g.getFontAscent()-u8g.getFontDescent();
w = u8g.getStrWidth("CLEAR?");
u8g.drawFrame(13-1, 3-2, w+2, h+2);
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(35, 30, "key1: Yes");
u8g.drawStr(35, 45, "key2: No");
if (millis() - previousMillis1 > 6000) {menu = 1;}
break;

case 2:
///////////////////////БЕНЗИН В БАКЕ///////////////////////////////////////////
if (millis() - previousMillis1 < 2500)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(23, 0, "benzin");// вывод строки
u8g.drawHLine(0, 23, 128);
u8g.drawXBMP(44, 26, 40, 38, fuel_p);
}
else {
u8g.drawHLine(0, 0, 128);
u8g.drawHLine(0, 25, 128);
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawXBMP(27, 4, 19, 18, toplivo);
u8g.setPrintPos(58, 3);//позиция переменных
u8g.print(String(int(fuel))+" l.");
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(14, 28, "ostalos' proehat':");// вывод строки
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.setPrintPos(21, 45);//позиция переменных
u8g.print(String(int(limitkm))+" km");
}
break;


case 3:
////////////// ТЕМПЕРАТУРА ДВИГАТЕЛЯ, ТЕМПЕРАТУРА НА ВПУСКЕ, НАПРЯЖЕНИЕ//////////////////////////////////////////
if (millis() - previousMillis1 < 2500)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(16, 0, "temp 'C");// вывод строки
u8g.drawHLine(0, 25, 128);
u8g.setScale2x2();
u8g.drawXBMP(0, 15, 16, 14, coolant);
u8g.drawXBMP(27, 15, 6, 13, temp_);
u8g.drawXBMP(42, 16, 20, 11, bat);
u8g.undoScale();
}
else {
u8g.drawXBMP(2, 5, 16, 14, coolant);
u8g.drawXBMP(8, 26, 6, 13, temp_);
u8g.drawXBMP(33, 48, 20, 11, bat);
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.setPrintPos(23, 5);//позиция переменных
u8g.print(String(tmp_var)+" 'C coolant");
u8g.setPrintPos(23, 26);//позиция переменных
u8g.print(String(intake_air_temp_var)+" 'C int. temp");
if (v1!=49) {
u8g.drawStr(60, 48, "-");
u8g.drawStr(67, 48, "-");
u8g.drawStr(74, 48, ".");
u8g.drawStr(81, 48, "-");
u8g.drawStr(90, 48, "v.");
}
else {
u8g.setPrintPos(60, 48);//позиция переменных
u8g.print(v1);
u8g.setPrintPos(67, 48);//позиция переменных
u8g.print(v2);
u8g.setPrintPos(74, 48);//позиция переменных
u8g.print(v3);
u8g.setPrintPos(81, 48);//позиция переменных
u8g.print(v4);
u8g.drawStr(90, 48, "v.");
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
break;

case 4:
/////////////ТОПЛИВНЫЕ КОРРЕКЦИИ....////////////////////////////////////////////////////////////////
if (millis() - previousMillis1 < 2500)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(18, 0, "korrect");// вывод строки
u8g.drawHLine(0, 23, 128);
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(34, 30, "ShortTerm");
u8g.drawStr(36, 45, "LongTerm");
}
else {
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(33, 0, "S.T. =");
u8g.drawStr(33, 53, "L.T. =");
u8g.setPrintPos(71, 0);//позиция переменных
u8g.print(short_term_val);
u8g.setPrintPos(71, 53);//позиция переменных
u8g.print(long_term_val);
u8g.drawXBMP(0, 12, 128, 41, scale);
u8g.drawXBM(58+short_term_val*3, 26, 11, 6, cur);
u8g.drawXBM(58+long_term_val*3, 33, 11, 6, cur1);
}
///////////////////////////////////////////////////////////////////////////////////////
break;


case 5:
/////////////// скорость, нагрузка, обороты, маф, loop, давление впуска, угол зажигания ///////////////////////////////////////////////////////
if (millis() - previousMillis1 < 2500)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(21, 0, "drugie");// вывод строки
u8g.drawHLine(0, 25, 128);
u8g.drawXBMP(12, 34, 36, 16, SPEED_P);
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(62, 40, "TECHNIC");
}
else {
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
h = u8g.getFontAscent()-u8g.getFontDescent();
u8g.drawStr(0, 0, "speed: ");
w = u8g.getStrWidth("speed: ");
u8g.setPrintPos(w, 0);//позиция переменных
u8g.print(int(speed_var));
u8g.drawStr(64, 0, "rpm: ");
w = u8g.getStrWidth("rpm: ");
u8g.setPrintPos(w+64, 0);//позиция переменных
u8g.print(int(rpm_var));
u8g.drawStr(0, h+3, "load: ");
w = u8g.getStrWidth("load: ");
u8g.setPrintPos(w, h+3);//позиция переменных
u8g.print(String(int(raschet_nagruzka_dvigatelya_var))+"%");
u8g.drawStr(75, h+3, "uoz: ");
w = u8g.getStrWidth("uoz: ");
u8g.setPrintPos(w+75, h+3);//позиция переменных
u8g.print(String(int(uoz_var))+"'");
u8g.drawStr(0, (h+3)*2, "drossel: ");
w = u8g.getStrWidth("drossel: ");
u8g.setPrintPos(w, (h+3)*2);//позиция переменных
u8g.print(String(int(polozh_dross_zaslon))+"%");
u8g.drawStr(89, (h+3)*2, "loop: ");
w = u8g.getStrWidth("loop: ");
u8g.setPrintPos(w+89, (h+3)*2);//позиция переменных
u8g.print(int(fss_val));
u8g.drawStr(0, (h+3)*3, "maf: ");
w = u8g.getStrWidth("maf: ");
u8g.setPrintPos(w, (h+3)*3);//позиция переменных
u8g.print(int(maf_var));
u8g.drawStr(57, (h+3)*3, "davl'vp: ");
w = u8g.getStrWidth("davl'vp: ");
u8g.setPrintPos(w+57, (h+3)*3);//позиция переменных
u8g.print(dvk_var, 0);
}
break;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////// ОШИБКИ ДВИГАТЕЛЯ///////////////////////////////////////////////////////////////////////
case 6:
if (millis() - previousMillis1 < 6000)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(13, 0, "ERROR");// вывод строки
u8g.drawHLine(0, 23, 128);
u8g.drawXBMP(15, 26, 56, 38, check_eng);
u8g.setScale2x2();
u8g.setPrintPos(41, 13);//позиция переменных
u8g.print(kol_check_engine_error_val);
u8g.undoScale();
}
else {
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
h = u8g.getFontAscent()-u8g.getFontDescent();
u8g.drawStr(45, 0, "errors:");
u8g.drawHLine(0, h, 128);
u8g.drawXBMP(123, 61, 5, 3, down_cur);
if (atoi(kod1)==0)
{u8g.drawStr(29, 32, "NO ERROR");}
else{
u8g.drawStr(0, h+4, "P");
u8g.setPrintPos(9, h+4);//позиция переменных
u8g.print(kod1);
if (kol_check_engine_error_val>=2)
{u8g.drawStr(37, h+4, ", P");
u8g.setPrintPos(52, h+4);//позиция переменных
u8g.print(kod2);}
if (kol_check_engine_error_val>=3)
{u8g.drawStr(81, h+4, ", P");
u8g.setPrintPos(97, h+4);//позиция переменных
u8g.print(kod3);}
u8g.drawHLine(0, (h+4)*2, 128);
u8g.drawStr(13, 50, "erase: key1+key2");
if (key3_2sec==1 && rpm_var>400) {tone(46, 800, 500); u8g.drawStr(17, 38, "ENGINE OFF!!!");}
}
}
break;

case 61:
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
h = u8g.getFontAscent()-u8g.getFontDescent();
u8g.drawStr(31, 0, "wait errors:");
u8g.drawHLine(0, h, 128);
u8g.drawXBMP(123, 0, 5, 3, up_cur);
if (atoi(kod1)==0)
{u8g.drawStr(29, 32, "NO ERROR");}
else{
u8g.drawStr(0, h+4, "P");
u8g.setPrintPos(9, h+4);//позиция переменных
u8g.print(kod1);
if (atoi(kod2)!=0)
{u8g.drawStr(37, h+4, ", P");
u8g.setPrintPos(52, h+4);//позиция переменных
u8g.print(kod2);}
if (atoi(kod3)!=0)
{u8g.drawStr(81, h+4, ", P");
u8g.setPrintPos(97, h+4);//позиция переменных
u8g.print(kod3);}
u8g.drawHLine(0, (h+4)*2, 128);
u8g.drawStr(13, 50, "erase: key1+key2");
if (key3_2sec==1 && rpm_var>400) {tone(46, 800, 500); u8g.drawStr(17, 38, "ENGINE OFF!!!");}
}
break;

case 106:
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(13, 3, "CLEAR?");// вывод строки
h = u8g.getFontAscent()-u8g.getFontDescent();
w = u8g.getStrWidth("CLEAR?");
u8g.drawFrame(13-1, 3-2, w+2, h+2);
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(35, 30, "key1: Yes");
u8g.drawStr(35, 45, "key2: No");
if (millis() - previousMillis1 > 6000) {menu = 6; flag5=0;}
break;

case 107:
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(20, 5, "ERASE");// вывод строки
u8g.drawStr(40, 30, "'OK'");// вывод строки
if (millis() - previousMillis1 > 2000) {SearchErrorEngine(); menu = 6;}
break;
/////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////// ПАРАМЕТРЫ///////////////////////////////////////////////////////////////////////
case 7:
if (millis() - previousMillis1 < 2500)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawHLine(0, 17, 128);
u8g.drawStr(12, 20, "Settings");// вывод строки
u8g.drawHLine(0, 43, 128);
}
else {
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
h = u8g.getFontAscent()-u8g.getFontDescent();
u8g.drawStr(3, 2, "benzstoimost P.:");
w = u8g.getStrWidth("benzstoimost P.:");
u8g.setPrintPos(w+5, 2);//позиция переменных
u8g.print(benzstoimost,1);
u8g.drawStr(3, h+5, "speed alarm:");
w = u8g.getStrWidth("speed alarm:");
u8g.drawStr(3, (h+4)*2-1, "benzobak min/max");
u8g.drawStr(3, (h+3)*3, "registrator:");
w = u8g.getStrWidth("registrator:");
if(reg_on==0) {u8g.drawStr(w+5, (h+3)*3, "on");}
if(reg_on==1) {u8g.drawStr(w+5, (h+3)*3, "1h off");}
if(reg_on==2) {u8g.drawStr(w+5, (h+3)*3, "3h off");}
if(reg_on==3) {u8g.drawStr(w+5, (h+3)*3, "off");}
if(speedlimit){
u8g.drawStr(w+10, h+5, "YES");}
if(!speedlimit){
u8g.drawStr(w+10, h+5, "NO");}
if(sel==0 && par==0)
{u8g.drawHLine(0, h+2, 128);}
if(sel==1 && par==0)
{u8g.drawHLine(0, (h+3)*2, 128);}
if(sel==2 && par==0)
{u8g.drawHLine(0, (h+3)*3-1, 128);}
if(sel==3 && par==0)
{u8g.drawHLine(0, (h+3)*4-2, 128);}
if(sel==0 && (par==1 || par==2))
{u8g.drawFrame(0, 0, 128, h+3); par=2;}
if(sel==1 && (par==1 || par==2))
{u8g.drawFrame(0, h+4, 128, h+3); par=2;}
if(sel==3 && (par==1 || par==2))
{u8g.drawFrame(0, (h+3)*3-1, 128, h+3); par=2;}
}
break;

case 108:
par=0;
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
h = u8g.getFontAscent()-u8g.getFontDescent();
u8g.drawStr(3, 2, "MAX 100%:");
w = u8g.getStrWidth("MAX 100%:");
u8g.drawXBMP(123, 2, 5, 3, up_cur);
u8g.setPrintPos(w+5, 2);//позиция переменных
u8g.print(fuelmax);
u8g.drawStr(3, (h+4), "MIN 0%:");
w = u8g.getStrWidth("MIN 0%:");
u8g.drawXBMP(123, h+12, 5, 3, down_cur);
u8g.setPrintPos(w+5, (h+4));//позиция переменных
u8g.print(fuelmin);
u8g.drawStr(3, h*3, "current value:");
w = u8g.getStrWidth("current value:");
u8g.setPrintPos(w+5, h*3);//позиция переменных
u8g.print(analog2,0);
break;

case 109:// коррекция времени
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
h = u8g.getFontAscent()-u8g.getFontDescent();
u8g.drawStr(3, 2, "time correct");
u8g.drawStr(3, (h+14), "sec:");
w = u8g.getStrWidth("sec:");
u8g.setPrintPos(w+5, (h+14));//позиция переменных
u8g.print(time_corr);
break;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////ошибки SD//////////////////////////////////////////////////////////////////
case 100:
tone(46, 800, 50);
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(45, 8, "SD");// вывод строки
u8g.drawStr(13, 37, "ERROR");// вывод строки
prev_menu_flag=1;
if (millis() - previousMillis1 > 3000) {prev_menu_flag=0; menu = prev_menu;}
break;
//////////////скорость//////////////////////////////////////////////////////////////////////////////////////
case 8:
if (millis() - previousMillis1 < 2500)
{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(31, 0, "drive");// вывод строки
u8g.drawHLine(0, 23, 128);
u8g.drawXBMP(48, 27, 32, 39, drive_pic);
}
else {
//////скорость////////
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.setScale2x2();
if(speed_var<10) {u8g.setPrintPos(26, 0);}
if(speed_var>9) {u8g.setPrintPos(18, 0);}
if(speed_var>99) {u8g.setPrintPos(11, 0);}
u8g.print(speed_var);
u8g.undoScale();
u8g.setFont(u8g_font_timB10);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(51, 42, "km/h");
/////обороты///////
if (rpm_var>=700) {u8g.drawStr(8, 50, "rpm");}
if (rpm_var>=5000) {u8g.drawBox(0, 0, 17, 7);} //5000
if (rpm_var>=4000) {u8g.drawBox(0, 8, 14, 7);} //4000
if (rpm_var>=3000) {u8g.drawBox(0, 16, 11, 7);}//3000
if (rpm_var>=2500) {u8g.drawBox(0, 24, 9, 7);} //2500
if (rpm_var>=2000) {u8g.drawBox(0, 32, 7, 7);} //2000
if (rpm_var>=1500) {u8g.drawBox(0, 40, 6, 7);} //1500
if (rpm_var>=1000) {u8g.drawBox(0, 48, 5, 7);} //1000
if (rpm_var>=650) {u8g.drawBox(0, 56, 4, 7);} //650
/////нагрузка////////
if (raschet_nagruzka_dvigatelya_var>=12) {u8g.drawStr(96, 50, "load");}
if (raschet_nagruzka_dvigatelya_var>=95) {u8g.drawBox(111, 0, 17, 7);} //95%
if (raschet_nagruzka_dvigatelya_var>=87) {u8g.drawBox(114, 8, 14, 7);} //87%
if (raschet_nagruzka_dvigatelya_var>=75) {u8g.drawBox(117, 16, 11, 7);}//75%
if (raschet_nagruzka_dvigatelya_var>=62) {u8g.drawBox(119, 24, 9, 7);} //62%
if (raschet_nagruzka_dvigatelya_var>=50) {u8g.drawBox(121, 32, 7, 7);} //50%
if (raschet_nagruzka_dvigatelya_var>=37) {u8g.drawBox(122, 40, 6, 7);} //37%
if (raschet_nagruzka_dvigatelya_var>=25) {u8g.drawBox(123, 48, 5, 7);} //25%
if (raschet_nagruzka_dvigatelya_var>=12) {u8g.drawBox(124, 56, 4, 7);} //12%
}
break;

case 110:
u8g.drawXBMP(34, 2, 60, 60, spdlimit80);
prev_menu_flag=1;
if (millis() - previousMillis1 > 3000) {prev_menu_flag=0; menu = prev_menu;}
break;

case 111:
u8g.drawXBMP(34, 2, 60, 60, spdlimit100);
prev_menu_flag=1;
if (millis() - previousMillis1 > 3000) {prev_menu_flag=0; menu = prev_menu;}
break;
/////////////////////////////////////////////////////////////////////////////
}
}
else{u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(19, 8, "OBD II");// вывод строки
u8g.drawStr(0, 37, "TIMEOUT");// вывод строки
}
}
else{
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(0, 8, "OFF :(");// вывод строки
}
} while( u8g.nextPage() );
}
///////////////////////////////////////////////////////////////////////////////////////////////
}





///////////////// ПОДПРОРАММЫ ДАТЧИКОВ///////////////////////

void Speed(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("010D"); // скорость
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==13)) {
speed_var = strtol(&rxData[6],0,16)*speed_korrect_val;
}
}
}

void Tmp(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("0105"); // температура
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==5)) {
tmp_var = strtol(&rxData[6],0,16)-40;
}
}
}

void Rpm(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("010C"); // обороты
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==12)) { //запрос приходит от ЭБУ в виде "41 0С XX XX", где XX XX это обороты, а 41 0С это проверка, где 0С это запрос оборотов
rpm_var = double((strtol(&rxData[6], 0,16) * 256) + strtol(&rxData[9], 0,16)) / 4.0; // но мы проверяем в десятичном формате, а запрос в 16чном, итого 41 это 65, а 0С - 12.
if (rpm_var<399) {
rpm_var=0;
}
}
}
}

void IntakeAirTemp(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("010F"); // Температура всасываемого воздуха
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==15)) {
intake_air_temp_var = strtol(&rxData[6],0,16)-40;

}
}
}

void Voltage(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("ATRV"); // Вольтаж
Serial1.print("\r");
getResponse2X();
v1=rxData[0];
v2=rxData[1];
v3=rxData[2];
v4=rxData[3];
}
}

void Rnd(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("0104"); // Расчетное значение нагрузки на двигатель
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==4)) {
raschet_nagruzka_dvigatelya_var = double(strtol(&rxData[6],0,16)*100)/255.0;
}
}
}

void Maf(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("0110"); // Массовый расход воздуха
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==16)) {
maf_var = double((strtol(&rxData[6], 0,16) * 256) + strtol(&rxData[9], 0,16)) / 100.0;
}
}
}

void ShortTerm(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("0106"); // Short term fuel % trim—Bank 1
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==6)) {
short_term_val=double(strtol(&rxData[6], 0,16)-128)*0.78125;
}
}
}

void LongTerm(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("0107"); // Long term fuel % trim—Bank 1
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==7)) {
long_term_val=double(strtol(&rxData[6], 0,16)-128)*0.78125;
}
}
}

void SearchErrorEngine(void) {
if (resp){
flag4=1;
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("0101"); // Проверка ошибок двигателя
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==1) and (strtol(&rxData[6],0,16)!=0)) {
kol_check_engine_error_val=strtol(&rxData[6], 0,16)-128;
}
if (kol_check_engine_error_val>0)
{error03(); tone(46, 4700, 1000);
menu_scr=0; menu = 6; previousMillis1 = millis();}
}
}

void error03(void) {
if (resp){
flag5=1;
delay(500);
kod1[0]=' ';
kod1[1]=' ';
kod1[2]=' ';
kod1[3]=' ';
kod2[0]=' ';
kod2[1]=' ';
kod2[2]=' ';
kod2[3]=' ';
kod3[0]=' ';
kod3[1]=' ';
kod3[2]=' ';
kod3[3]=' ';
while (Serial1.available()) {Serial1.read();}
Serial1.print("03"); // Error codes view
Serial1.print("\r");
getResponse2X();
if (strtol(&rxData[0],0,16)==67) {
kod1[0]=rxData[3];
kod1[1]=rxData[4];
kod1[2]=rxData[6];
kod1[3]=rxData[7];
kod2[0]=rxData[9];
kod2[1]=rxData[10];
kod2[2]=rxData[12];
kod2[3]=rxData[13];
kod3[0]=rxData[15];
kod3[1]=rxData[16];
kod3[2]=rxData[18];
kod3[3]=rxData[19];
}
}
}

void error07(void) {
if (resp){
flag5=1;
delay(500);
kod1[0]=' ';
kod1[1]=' ';
kod1[2]=' ';
kod1[3]=' ';
kod2[0]=' ';
kod2[1]=' ';
kod2[2]=' ';
kod2[3]=' ';
kod3[0]=' ';
kod3[1]=' ';
kod3[2]=' ';
kod3[3]=' ';
while (Serial1.available()) {Serial1.read();}
Serial1.print("07"); // Error codes view
Serial1.print("\r");
getResponse2X();
if (strtol(&rxData[0],0,16)==71) {
kod1[0]=rxData[3];
kod1[1]=rxData[4];
kod1[2]=rxData[6];
kod1[3]=rxData[7];
kod2[0]=rxData[9];
kod2[1]=rxData[10];
kod2[2]=rxData[12];
kod2[3]=rxData[13];
kod3[0]=rxData[15];
kod3[1]=rxData[16];
kod3[2]=rxData[18];
kod3[3]=rxData[19];
}
}
}

void clearError(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("04"); // очистка ошибок
Serial1.print("\r");
getResponse2X();
clERRok=strtol(&rxData[0],0,16);
}
}

void FuelSystemStatus(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("0103"); // Проверка, если форсунки отключены то 1, если работают то 2
Serial1.print("\r");
getResponse2X();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==3)) {
fss_val=strtol(&rxData[6], 0,16);
}
}
}

void DavlenVpuskKoll(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("010B"); // давление впускного коллектора
Serial1.print("\r");
getResponse();
getResponse();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==11)) {
dvk_var = strtol(&rxData[6],0,16);
}
}
}

void Uoz(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("010E"); // Угол опережения зажигания
Serial1.print("\r");
getResponse();
getResponse();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==14)) {
uoz_var = double(strtol(&rxData[6],0,16)/2.0)-64.0;
}
}
}

void Pdz(void) {
if (resp){
delay(delay_var);
while (Serial1.available()) {Serial1.read();}
Serial1.print("0111"); // Положение дроссельной заслонки
Serial1.print("\r");
getResponse();
getResponse();
if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==17)) {
polozh_dross_zaslon = double(strtol(&rxData[6],0,16)*100)/255.0;
}
}
}


void getResponse(void){
if(!edit){
if(digitalRead(7)==HIGH && comp==1 && resp) {
char inChar=0;
previousMillis = millis();
while(inChar != '\r' && comp == 1){
respm=0; // выкл опрос датчиков в этом цикле
key(); // обработчик кнопок
if(key1 || key2 || key3 || key1_sec || key3_2sec) {LCD();} // экран всегда при нажатии
if (millis() - previousMillis > 15000) ////// если время ожидания ответа превышено, сбрасываем elm
{resp=0; break;}
if(digitalRead(7)==LOW) {break;}
if(Serial1.available() > 0){
if(Serial1.peek() == '\r'){
inChar=Serial1.read();
rxData[rxIndex]='\0';
rxIndex=0;
}
else {
inChar = Serial1.read();
rxData[rxIndex++]=inChar;
}
}
}
}
else {while (Serial1.available()) {Serial1.read();}}
} else {respm=0; // выкл опрос датчиков в этом цикле
key(); // обработчик кнопок
if(key1 || key2 || key3 || key1_sec || key3_2sec) {LCD();} // экран всегда при нажатии
}
}

void getResponse2X(void){
getResponse();
getResponse();
// если PID обновляется..., ждем данных и еще раз читаем
if(rxData[0]=='S' && rxData[1]=='E' && rxData[2]=='A' && rxData[3]=='R' && rxData[4]=='C' && rxData[5]=='H')
{ while (Serial1.available()) {Serial1.read();} getResponse();}
// если данных нет, сбрасывает elm
if(rxData[0]=='N' && rxData[1]=='O' && rxData[3]=='D' && rxData[4]=='A' && rxData[5]=='T' && rxData[6]=='A')
{rezet();}
}

void rezet(void){
Serial1.println("ATZ"); //rezet
Serial1.print("\r");
delay(900);

Serial1.println("ATSP0"); // протокол ATSP0 - авто, cirrus ATSP3
Serial1.print("\r");
delay(100);

while (Serial1.available()) {Serial1.read();} // очистка буфера serial
speed_var =0;
tmp_var = 0;
rpm_var = 0;
intake_air_temp_var = 0;
raschet_nagruzka_dvigatelya_var = 0;
maf_var = 0;
short_term_val = 0;
long_term_val = 0;
fss_val = 0;
}

void fuel_var(void){
//////////////////////// топливо в баке////////////////////////////
if (millis() - previousMillis2 > 500)
{if (ii <= 99){
analog[ii] = analogRead(0);
ii++;}
previousMillis2 = millis();
}
if (ii==100)
{
ii=0;
analog1=0;
while (ii<=99){
analog1 = analog1+analog[ii];
ii++;}
ii=0;
analog2 = analog1/100; // среднее значение датчика топлива
}
fvar=((analog2-fuelmin)*1000/(fuelmin-fuelmax))/(-10); // выражаем в %%% количество топлива
if (fvar>100) {fvar=100;}
if (fvar<0) {fvar=0;}
fuel=bak*fvar/100; // количество литров в баке
}


void SDwrite(void){
if(!edit){
SD.remove("benz");// удалить старый файл
myFile = SD.open("benz", FILE_WRITE);// создать\открыть файл
if (myFile) {
myFile.println(benz_potrachenoMEM*100);
myFile.close();
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
SD.remove("odometr");// удалить старый файл
myFile = SD.open("odometr", FILE_WRITE);// создать\открыть файл
if (myFile) {
myFile.println(odometrMEM*100);
myFile.close();
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
SD.remove("benzst");// удалить старый файл
myFile = SD.open("benzst", FILE_WRITE);// создать\открыть файл
if (myFile) {
myFile.println(benzstoimost*100);
myFile.close();
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
SD.remove("spdlim");// удалить старый файл
myFile = SD.open("spdlim", FILE_WRITE);// создать\открыть файл
if (myFile) {
myFile.println(speedlimit);
myFile.close();
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
SD.remove("fuelmin");// удалить старый файл
myFile = SD.open("fuelmin", FILE_WRITE);// создать\открыть файл
if (myFile) {
myFile.println(fuelmin);
myFile.close();
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
SD.remove("fuelmax");// удалить старый файл
myFile = SD.open("fuelmax", FILE_WRITE);// создать\открыть файл
if (myFile) {
myFile.println(fuelmax);
myFile.close();
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
}
}

void SDread(void){
if(!edit){
myFile = SD.open("benz");// открываем файл
var="";
if (myFile) {
while (myFile.available()) {
var=var+char(myFile.read());
}
myFile.close();// закрыть файл
benz_potrachenoMEM=double(var.toInt())/100;
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
myFile = SD.open("odometr");// открываем файл
var="";
if (myFile) {
while (myFile.available()) {
var=var+char(myFile.read());
}
myFile.close();// закрыть файл
odometrMEM=double(var.toInt())/100;
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
myFile = SD.open("benzst");// открываем файл
var="";
if (myFile) {
while (myFile.available()) {
var=var+char(myFile.read());
}
myFile.close();// закрыть файл
if(double(var.toInt())>0){
benzstoimost=double(var.toInt())/100;}
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
myFile = SD.open("spdlim");// открываем файл
var="";
if (myFile) {
while (myFile.available()) {
var=var+char(myFile.read());
}
myFile.close();// закрыть файл
speedlimit=var.toInt();
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
myFile = SD.open("fuelmin");// открываем файл
var="";
if (myFile) {
while (myFile.available()) {
var=var+char(myFile.read());
}
myFile.close();// закрыть файл
if(!((var.toInt())==0)) {fuelmin=var.toInt();}
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
myFile = SD.open("fuelmax");// открываем файл
var="";
if (myFile) {
while (myFile.available()) {
var=var+char(myFile.read());
}
myFile.close();// закрыть файл
if(!((var.toInt())==0)) {fuelmax=var.toInt();}
} else {
if(!prev_menu_flag) {prev_menu=menu;} menu_scr=0; menu=100; previousMillis1 = millis();// sd error
}
}
}

void serialread(void) {/// ОБРАБОТКА КОМАНД С SERIAL///////////////////////////////////////
if (Serial.available()) { //если в мониторе порта ввели что-то
while (Serial.available()) { //сохраняем строку в переменную val
ch = Serial.read();
val += char(ch);
val1 += ch;
delay(10);
}
if (val.indexOf("FLASH") > -1 || val.indexOf("flash") > -1) {
Serial.println("FLASH MODE OK");
flashload=1;
comp=3;
tone(46, 800, 500);
}
if (val.indexOf("EXIT") > -1 || val.indexOf("exit") > -1) {
Serial.println("EXIT OF FLASH MODE");
flashload=0;
comp=1;
tone(46, 3000, 100); delay (100); tone(46, 3500, 100); delay (100); tone(46, 4000, 100); delay (100); tone(46, 4500, 100);
}
if (val.indexOf("RESET") > -1 || val.indexOf("reset") > -1) {
Serial.println("OK");
digitalWrite(49,HIGH);// перезагружаем
}
if (flashload==2)
{
if (val1=="2710114120")// ждем команды загрузчика
{
delay(9500);
digitalWrite(49,HIGH);// перезагружаем, заливаем прошивку
}
}
val = "";
val1 = "";
}
if (flashload==1){
u8g.setRot180();
u8g.firstPage();
do {
u8g.setFont(u8g_font_ncenB18);//выбор шрифта
u8g.setFontPosTop();//начало координат
u8g.drawStr(0, 8, "FLASH");// вывод строки
u8g.drawStr(0, 37, "MODE");// вывод строки
} while( u8g.nextPage() );
flashload=2;}
}

void key(void){
///////////////////// обработчик кнопок ////////////////////////////////////////
key1=0; key2=0; key3=0;
key1_sec=0; key3_2sec=0;

if (!(digitalRead(2)) && !(digitalRead(3)) && flag2==0)// нажатие 2х кнопок flag2
{flag2=1; tone(46, 4500, 200); flag=0; flag1=0; previousMillis3 = millis();}
if (((digitalRead(2)) && (digitalRead(3))) && flag2==1)
{flag2=0; key3=1;}

if(!(digitalRead(2)) && flag==0 && flag1==0 && flag2==0) // кнопка 1 flag
{flag=1; tone(46, 4500, 50); previousMillis3 = millis();}
if((digitalRead(2)) && flag==1) {flag=0; key1=1;}

if(!(digitalRead(3)) && flag1==0 && flag==0 && flag2==0) // кнопка 2 flag1
{flag1=1; tone(46, 4500, 50); previousMillis3 = millis();}
if((digitalRead(3)) && flag1==1) {flag1=0; key2=1;}

///////////// комбинации /////////////////////////////////////////////////////////
if(flag && (millis() - previousMillis3 > 1000) && !flag3) {tone(46, 4500, 100); delay (120); tone(46, 4500, 100); flag3=1;} // оповещение кнопки 1 1сек
if(key1 && (millis() - previousMillis3 > 1000)) {key1_sec=1; key1=0; flag3=0;} // нажатие кнопки 1 1сек

if(flag2 && (millis() - previousMillis3 > 2000) && !flag3) {tone(46, 4500, 100); delay (120); tone(46, 4500, 100); flag3=1;} // оповещение 2х кнопок 2сек
if(key3 && (millis() - previousMillis3 > 2000)) {key3_2sec=1; key3=0; flag3=0;} // нажатие 2х кнопок 2сек
}

 


Сообщение отредактировал produmann: 28 January 2017 - 11:43 PM

  • 0

#284 Muhin555

Muhin555

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

  • бензин автомат
  • Имя:Андрей

Отправлено 07 February 2017 - 04:14 PM

вот именно can и не хватает в нашем проекте! будем ждать ваших достижений, еще раз повторюсь, заинтересованным лицам, нуждающимся в моих исходниках, все скину.

Не плохо бы добавить в наш проект can и исключить несчастную elm)))

Сам этим вопросом по can решил заняться, но из-за нехватки времени все тормозится.....

На счет единой платы я думал, но опять упирается все в нехватку времени)))) разработать плату, развести и тд....

А не пробовал Приемопередатчики шины CAN (CAN Bus Transceivers SN65HVD230) для Arduino?

http://iarduino.ru/s...n65hvd230.html#


  • 0

#285 Alexander74

Alexander74

    Бывалый

  • Пользователи
  • PipPipPipPipPip
  • 353 сообщений
  • Пол:Мужчина
  • Город:Челябинская обл.

  • дизель автомат
  • Имя:Александр

Отправлено 07 February 2017 - 04:48 PM

А есть у кого инфа по CAN мессаджам?

я вот пока что по косвенным признакам догадываюсь что в ID=0x208 на моём рексе скорость с ABS/ESP, но больше пока не знаю ничего... Всё времени нет заняться.


  • 0

#286 produmann

produmann

    Чайник

  • Пользователи
  • PipPipPipPip
  • 268 сообщений
  • Пол:Мужчина
  • Город:киров

  • бензин автомат
  • Имя:Денис

Отправлено 07 February 2017 - 09:00 PM

А не пробовал Приемопередатчики шины CAN (CAN Bus Transceivers SN65HVD230) для Arduino?

http://iarduino.ru/s...n65hvd230.html#

Да у меня есть can mcp2515, нету только не информации по протоколу, ни времени так глубоко капать)))

Меня щас больше интересует продолжение начатого, версия v4  c функциями охраны по GSM уже готова, ждет своего часа на встраивание :russian_ru:


  • 0

#287 Muhin555

Muhin555

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

  • бензин автомат
  • Имя:Андрей

Отправлено 12 February 2017 - 01:08 PM

Мы не одиноки в исследовании CAN шины https://www.drive2.r...33581140951184/


  • 0

#288 produmann

produmann

    Чайник

  • Пользователи
  • PipPipPipPip
  • 268 сообщений
  • Пол:Мужчина
  • Город:киров

  • бензин автомат
  • Имя:Денис

Отправлено 13 February 2017 - 08:18 AM

наконец то я доделал версию 4 с GSM, все отлично работает, теперь я всегда и везде буду знать что с машинкой....)))

16b55b9466c1t.jpg

 

и наконец то я избавился от соплей :happy:

dcc13db6bedat.jpg

 

Теперь в планах прикрутить GPS приемник :ganj2:


Сообщение отредактировал produmann: 13 February 2017 - 08:22 AM

  • 1

#289 Олег03

Олег03

    Черный пиарщик клана

  • Пользователи
  • PipPipPipPipPipPipPip
  • 14298 сообщений
  • Пол:Мужчина
  • Город:Улан-Удэ

  • бензин автомат
  • Имя:Олег

Отправлено 13 February 2017 - 09:10 AM

наконец то я доделал версию 4 с GSM, все отлично работает, теперь я всегда и везде буду знать что с машинкой...

+, Какие команды/инфообмен предусмотрены?


  • 1

#290 produmann

produmann

    Чайник

  • Пользователи
  • PipPipPipPip
  • 268 сообщений
  • Пол:Мужчина
  • Город:киров

  • бензин автомат
  • Имя:Денис

Отправлено 13 February 2017 - 09:22 AM

+, Какие команды/инфообмен предусмотрены?

Да в принципе самые простые, это дублирование основной сигналки по смс, датчики удара, датчик вызова на стекле, открытие дверей, капота, оповещение о начале движении (если не отключена охрана по смс), сработка даже в случае отключения сигналки с брелка (охрана по смс отдельно от сигналки работает), датчик наклона можно еще воткнуть.

Ну и инфо по состоянию датчиков, напряжение аккумулятора, уровню топлива в баке, по смс....


  • 1

#291 Muhin555

Muhin555

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

  • бензин автомат
  • Имя:Андрей

Отправлено 13 February 2017 - 08:12 PM

Да в принципе самые простые, это дублирование основной сигналки по смс, датчики удара, датчик вызова на стекле, открытие дверей, капота, оповещение о начале движении (если не отключена охрана по смс), сработка даже в случае отключения сигналки с брелка (охрана по смс отдельно от сигналки работает), датчик наклона можно еще воткнуть.

Ну и инфо по состоянию датчиков, напряжение аккумулятора, уровню топлива в баке, по смс....

Супер!!! Идея с GPS тоже отличная! Особенно полезно для Москвы, хорошо знать куда отвезут "зелёные крокодильчики" твою машину!


  • 0

#292 Muhin555

Muhin555

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

  • бензин автомат
  • Имя:Андрей

Отправлено 14 February 2017 - 06:55 PM

еще экран 3й версии, подешевле будет...

Если не хочется ждать посылку из поднебесной, то в МСК они тоже есть http://mcustore.ru/s...-44-dyujma-spi/


  • 0

#293 Олег03

Олег03

    Черный пиарщик клана

  • Пользователи
  • PipPipPipPipPipPipPip
  • 14298 сообщений
  • Пол:Мужчина
  • Город:Улан-Удэ

  • бензин автомат
  • Имя:Олег

Отправлено 15 February 2017 - 03:45 AM

Да в принципе самые простые...

+, Можно и запуск предпускового подогревателя Бинар организовать по команде с телефона?


Сообщение отредактировал Олег03: 15 February 2017 - 03:46 AM

  • 1

#294 produmann

produmann

    Чайник

  • Пользователи
  • PipPipPipPip
  • 268 сообщений
  • Пол:Мужчина
  • Город:киров

  • бензин автомат
  • Имя:Денис

Отправлено 15 February 2017 - 05:29 AM

+, Можно и запуск предпускового подогревателя Бинар организовать по команде с телефона?


Все, что угодно по смс...
  • 0

#295 ProninD

ProninD

    Кайроновод

  • Пользователи
  • PipPipPipPipPipPip
  • 813 сообщений
  • Пол:Мужчина
  • Город:Краснодар
  • Интересы:Горный туризм, рыбалка.

  • дизель автомат
  • Имя:Денис

Отправлено 17 February 2017 - 03:08 PM

Денис доброго дня, скажи по дизелю рабочая версия получилось, может кто воплотил твою идею в жизнь!? :unknw:


  • 0

#296 produmann

produmann

    Чайник

  • Пользователи
  • PipPipPipPip
  • 268 сообщений
  • Пол:Мужчина
  • Город:киров

  • бензин автомат
  • Имя:Денис

Отправлено 17 February 2017 - 05:37 PM

По дизелю я выкладывал версию 2 с разными настройками, так никто и не испробывал...
  • 0

#297 talah

talah

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

  • бензин механика
  • Имя:saha

Отправлено 17 April 2017 - 06:36 PM

добрый день

подскажите пожалуйста подойдет ли для вашего проекта Arduino Mega1280

спасибо


  • 0

#298 produmann

produmann

    Чайник

  • Пользователи
  • PipPipPipPip
  • 268 сообщений
  • Пол:Мужчина
  • Город:киров

  • бензин автомат
  • Имя:Денис

Отправлено 17 April 2017 - 08:46 PM

 в принципе скетч компилируется, возможно и пойдет, нужно пробовать.....


  • 0

#299 Бродяжник

Бродяжник

    Кайроновод

  • Пользователи
  • PipPipPipPipPipPip
  • 604 сообщений
  • Пол:Мужчина
  • Город:МО / Королев

  • бензин механика
  • Имя:Павел

Отправлено 17 April 2017 - 08:55 PM

 в принципе скетч компилируется, возможно и пойдет, нужно пробовать.....

А скетч то какого размера выходит? в 1280 Меге памяти в два раза меньше чем в 2560.

Хотя если отказаться от графического экрана, то памяти точно должно хватить.


  • 0

#300 produmann

produmann

    Чайник

  • Пользователи
  • PipPipPipPip
  • 268 сообщений
  • Пол:Мужчина
  • Город:киров

  • бензин автомат
  • Имя:Денис

Отправлено 18 May 2017 - 01:08 PM

собирал ли себе кто такой комп? делитесь обзорами)

 

Я сейчас осваиваю общение компа минуя elm по линии k-line, дабы исключить "прокладку" между мозгами и ардуиной)

Возможно, что будет версия v3_2 на цветном экране и я ее выложу бесплатно), но гвоздь в том, что придется паять самому согласуюшую микросхемку.

Что-то типа этого:

f89e82s-960.jpg


  • 0




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых