Бортовой компьютер для Опель Зафира.

viki13viki
Offline
Зарегистрирован: 14.11.2016

Попробую утром на 17 байте, убедится проблема ли в стабильности. И закоментирую 244

MaksVV
Offline
Зарегистрирован: 06.08.2015

ну можно и с 17 байта сделать, байт 16 только при старте будет, строки с 441 по 446 убрать, подставить это:

else Fuel = MessageRxGauge[17]/2.00;

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

Это идея. Утром посмотрим.

viki13viki
Offline
Зарегистрирован: 14.11.2016

подправил все указанное выше. произошло 5 пересчетов за 30 км прогона. все данные на экране стабильные, не бегающие.

    отчет                                                                                                                      

kmTrip 6 , FuelTrip 2 ,  L100M 33,3  ,kmREFUELING 207  ,Fuel 43  ,L100SR_TFT 6,4  

kmTrip 12 , FuelTrip 1 ,  L100M 8,3  ,kmREFUELING 815  ,Fuel 44  ,L100SR_TFT 5,4   

kmTrip 18 , FuelTrip 1 ,  L100M 5,6  ,kmREFUELING 215  ,Fuel 44  ,L100SR_TFT 5,4  

kmTrip 24 , FuelTrip 2 ,  L100M 8,3  ,kmREFUELING 880  ,Fuel 43  ,L100SR_TFT 4,9  

kmTrip 30 , FuelTrip 1 ,  L100M 3,3  ,kmREFUELING 881  ,Fuel 44  ,L100SR_TFT 4,9  

L100M работает, всегда меняется когда меняется FuelTrip. kmREFUELING как видем танцует. Может проблема в том, что я поставил через 5 км, и мало записей для подсчета? возможно что, за 10 км у него будет больше записей для среднего расчета и будет более правильный вывод данных? за 5 км он записывает все 10 ячеек и подсчитывает или только 5 ячеек и подсчитывает?

прокатил еще 6 км по фабрике (это так для размышления) после повторного включения зажигания.

kmTrip 6 , FuelTrip 3-5(менялось из за крена ) , L100SR_TFT 4,9 выключил зажигание , включил L100SR_TFT  стал 5.1

думаю реальность kmREFUELING и L100SR_TFT бует видно к концу топлива в баке.

Может ты че поймешь....

чтобы не возвращатся на прошлые страницы вот скетч

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #include <UTouch.h>
  #include <UTFT.h>
  #include <SPI.h>
  #include <EEPROM.h>
  
  
  //pin 20 SCL , 21 SDA датчик реального времени
  #include <Wire.h>
  #include "RTClib.h"
  RTC_DS3231 rtc;       
  
  //датчик наружней температуры
  #include <OneWire.h>
  #define ONE_WIRE_BUS 8   
  OneWire oneWire(ONE_WIRE_BUS);
  #include <DallasTemperature.h>
  DallasTemperature sensors(&oneWire);
  
  //датчик внутринней температуры и влаги
  #include "DHT.h"
  #define DHTPIN 9   
  #define DHTTYPE DHT22 
  DHT dht(DHTPIN, DHTTYPE);
  
  ///////////////////////////////////////////////////////////////////////////////////
  //пины экрана и тача
  ///////////////////////////////////////////////////////////////////////////////////
  UTFT    myGLCD(31,38,39,40,41); 
  UTouch  myTouch(6,5,4,3,2);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool MessageParse = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
  
  int numberbyte = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 4;  
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100M = 0;           //расход на 100 км измеренный за поездку
  float L100 = 0;            //мгновенный расход литров на 100км
  float LHor = 0;           //мгновенный расход топлива литров в час
  float L100SR = 0;         //расход литров на 100км измеренный раз в интервал kmL  
  float L100SR_TFT = 0;     // самый средний из расходов на 100км, он выводится на экран

  int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};
  int FuelZamer[10]= {0};  // массив для измерения уровня (количества) топлива 
  int ZamerNumber = 0;     // номер замера уровня (количества) топлива 
  int n_eeprom = 0;        // текущий адрес ячейки еепром для записи расхода
  
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int FuelIGN = 0;      // количество топлвива в баке на момент включения зажигания
  int Fuel_last = 0;   // для формул
  bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания 
  int FuelTrip = 0;     // количество литров топлива, израсходованное за один цикл включения зажигания
  
  
  
  int kmAge = 0;             //пробег, полученный со щитка приборов
  int kmAgeIGN = 0;          //пробег который был в момент включения зажигания 
  int kmAge_last = 0;       // для формул
  bool flagkmAgeIGN = 0;     //флаг записан ли пробег в момент вкл. зажигания 
  int kmTrip = 0;            //пробег за один цикл включения зажигания
  int kmL = 5;               // интервал, через который будет происходить обновление среднего расхода на 100км
  int km = 0;              // переменная для расчетов
  int kmeeprom = 5;         // интервал, через который будет происходить подсчет среднеарифмитического расхода  L100SR_TFT
  int kmTFT =  0;     // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
  int kmREFUELING;            // пробег до заправки на остатке топлива 
  
  int colerror = 0;           //количество ошибок в правом верхнем углу третьего экрана
  //float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {0};  // массив байтов принимаемого сообщения от щитка приборов
  
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


  
  unsigned long prevPID = 0;
  unsigned long prevPIDgauge = 0;
  unsigned long prevTemperature = 0;
  unsigned long prevpres = 0;
  unsigned long prevWatch = 0;
  unsigned long prevDvoet = 0;
  unsigned long prevData = 0;
 
  unsigned long TimewaitPID, timerwaitPID = 0;
  bool timerenabledPID = 0;
  #define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 200 // здесь задержка на ожидание правильного ответа пидов, мс

  unsigned long TimewaitInit, timerwaitInit = 0;
  bool timerenabledInit = 0;
  #define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 500 // здесь задержка на ожидание ответа об удачной инициализации, мс

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
    myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  


    for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
    for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];
    L100SR_TFT = (float)L100SR_TFT/110.00;
    if (L100SR_TFT<0) L100SR_TFT = 0;
    if (L100SR_TFT>99) L100SR_TFT = 99;
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {



  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}

    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis(); Trip ();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();



   }

void Trip () {
  
  if (flagkmAgeIGN){

//if (Fuel > FuelIGN + 5) {flagkmAgeIGN = 0; flagFuelIGN = 0; kmTFT = 0; km = 0;}

FuelTrip = FuelIGN - Fuel;                          
if (kmAge>kmAgeIGN) kmTrip = kmAge - kmAgeIGN;
if (kmAge<kmAgeIGN) kmTrip = 2000 - (kmAgeIGN - kmAge);  // 2000 это через сколько км у тебя суточный пробег сбрасывается на ноль, поменяй если другое число
if (kmAge==kmAgeIGN) kmTrip = 0;
    
L100M = ((float)FuelTrip*100.00)/(float)kmTrip;
 if (L100M<0) L100M = 0;
 if (L100M>99) L100M = 99;
 
// ниже цикл считает среднеарифметический расход из еепром раз в пробег, указанный в переменной kmeeprom
if (kmTrip-kmTFT>kmeeprom) {kmTFT = kmTrip; 
// тут считаем среднеарифметический расход из ячеек еепром 
for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];

  L100SR_TFT = (float)L100SR_TFT/110.00;
 if (L100SR_TFT<0) L100SR_TFT = 0;
 if (L100SR_TFT>99) L100SR_TFT = 99;
}

// ниже цикл считает расход топлива за пробег, указанный в переменной kmL, здесь же запись в ячейки еепром 
if (kmTrip-km>kmL) {km=kmTrip; 

L100SR = ((float)(Fuel_last-Fuel)*100.00)/(float)kmL; // расход/100км  - обновляется раз в 10км
Fuel_last = Fuel;      // сохранение параметров с последнего измерениея
if (L100SR<0) L100SR = 0;
if (L100SR>99) L100SR = 99;
 

if (L100SR>0) kmREFUELING=((float)Fuel*100.00)/(float)L100SR;
else kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;

// тут записываем  L100SR последовательно в одну из 11 ячеек еепром
//EEPROM.write (12,n_eeprom);      // ЗДЕСЬ ВНИМАТЕЛЬНО. ЗАГРУЗИТЬ ПРОШИВКУ С ЭТОЙ СТРОКОЙ ОДИН РАЗ, ПОТОМ ЗАКОМЕНТИРОВАТЬ И ЕЩЁ РАЗ ЗАГРУЗИТЬ
n_eeprom = EEPROM.read (12);    // в ячейке 12 хранится № текущей ячейки для записи расхода, чтобы где остановился при выкл питания, от туда и продолжил
EEPROM.write(n_eeprom, L100SR*10); 
n_eeprom++; if (n_eeprom>10) n_eeprom=0;
EEPROM.write (12,n_eeprom);

}}}


   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
       
      myGLCD.printNumF(LHor, 1, 60, 40, '.',5);
      myGLCD.printNumF(L100, 1, 210, 40,'.',5 );
      //if (kmTrip>=1) 
      myGLCD.printNumF(L100M, 1, 60, 75,'.',5 );
      //else myGLCD.print("0", 123, 75); 
      myGLCD.printNumF(L100SR_TFT, 1, 210, 75,'.',5 );
      myGLCD.printNumI(kmREFUELING, 60, 110,5 ); 
      if (Fuel<53) myGLCD.printNumI(Fuel, 210, 110,5);
      else myGLCD.print("MAX", 210, 110); 
      //if (kmTrip>=1) 
      myGLCD.printNumI(kmTrip, 60, 145,5);
      //else myGLCD.print("0", 123, 145);
      //if (FuelTrip>=1)
      myGLCD.printNumI(FuelTrip, 210, 145,5);
      //else myGLCD.print("0", 273, 145);

      myGLCD.printNumI(PumpRPM, 210, 180,5);
      myGLCD.printNumI(RPM, 210, 215,5);
               
      myGLCD.printNumI(Temp, 415, 40, 3);
      myGLCD.printNumI(TempOil, 415, 75, 3);
      myGLCD.printNumI(TempFuel, 415, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3);
      myGLCD.printNumI(t, 415, 180, 3);
      myGLCD.printNumI(TempAir, 415, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(h, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


MessageParse = 0;
while (InitGauge && !MessageParse) {

 if (!dataMessageOK) {   
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}
     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     numberbyte=0;}

 else {

   if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}
      
      if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0;}
     
     }
      

   if (dataMessageEND) { 
    int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
    int CRC =200;
    for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

    Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}
 
 //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (CRC==crc) {Serial.println ("    OK!!!");
    
  if (!flagFuelIGN)   Fuel = MessageRxGauge[16]/2.00;
  else Fuel = MessageRxGauge[17]/2.00;
  /*else { FuelZamer[ZamerNumber] = MessageRxGauge[16]/2.00;
  ZamerNumber++; if (ZamerNumber>9) ZamerNumber = 0;
  if (ZamerNumber==9) {
  for (int i = 0; i < 10; i++) Fuel = Fuel + FuelZamer[i];
  Fuel = (float)Fuel/10.0;}
    } */  
 

   kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10.00;


if (Fuel<53){
if (!flagkmAgeIGN) { kmAgeIGN = kmAge; flagkmAgeIGN =1;}
if (!flagFuelIGN) { FuelIGN = Fuel; Fuel_last = Fuel; flagFuelIGN = 1; }}
   
    }
    
  else Serial.println ("    ERROR!!!");   
   dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();

    for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }}



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(195);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (0,255,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (255,0,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    //Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    delay (5);
    } 
    delay (55);
 }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //стартовая инициализация
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void fastinit() {
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(295,35,295,248); // линия вертикальная
     myGLCD.setColor(0, 255, 0); // цвет линии зеленый
     myGLCD.drawLine(145,35,145,178); // линия вертикальная
     myGLCD.drawLine(1,178,295,178); // линия горизонтальная
     myGLCD.print("L/H", 10, 40);
     myGLCD.print("L/A", 148, 40);
     myGLCD.print("L/V", 10, 75);
     myGLCD.print("L/M", 148, 75);
     myGLCD.print("D/K", 10, 110);
     myGLCD.print("D/L", 148, 110);
     myGLCD.print("V/K", 10, 145);
     myGLCD.print("V/L", 148, 145);
     myGLCD.print("PUMP RPM", 10, 180);
     myGLCD.print("Engi RPM", 10, 215);
     myGLCD.print("Motor C", 300, 40);
     myGLCD.print("Oil   C", 300, 75);
     myGLCD.print("Fuel  C", 300, 110);
     myGLCD.print("Inter C", 300, 145);
     myGLCD.print("Exter C", 300, 180);
     myGLCD.print("IntAirC", 300, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     Watch ();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("MAF  mg/s:", 10, 215);
     myGLCD.print("Humedad %:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void drawFrame(int x1, int y1, int x2, int y2) {
     myGLCD.setColor(255, 0, 0);
     myGLCD.drawRoundRect (x1, y1, x2, y2);
     while (myTouch.dataAvailable())
     myTouch.read();
     myGLCD.setColor(255, 255, 255); 
   }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка кнопок и координат тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void buttonHome() {
     myGLCD.setColor(0,0,0); // цвет кнопки -серый
     myGLCD.fillRoundRect (1, 1, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  void line() {
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,73,479,73); // линия горизонтальная
     myGLCD.drawLine(1,108,479,108); // линия горизонтальная
     myGLCD.drawLine(1,143,479,143); // линия горизонтальная
     myGLCD.drawLine(1,178,479,178); // линия горизонтальная
     myGLCD.drawLine(1,212,479,212); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
   }


  /////////////////////////////////////////////////////////////////////////////////////////////
  //верхняя часть экрана часы и дата отображается на всех экранах
  /////////////////////////////////////////////////////////////////////////////////////////////
  void Watch (){
    DateTime now = rtc.now();
    int m = now.minute(); 
    int hour = now.hour();
    int mon = now.month();
    int date = now.day();
  
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
  
    if (date<10) { 
    myGLCD.print("0", 85, 0); 
    myGLCD.printNumI(now.day(), 100, 0); } 
    else if (date >=10) {
    myGLCD.printNumI(now.day(), 85, 0); }
    myGLCD.print("/", 115, 0);
    if ( mon<10) {
    myGLCD.print("0", 130, 0); 
    myGLCD.printNumI(now.month(), 145, 0);} 
    else if (mon >=10) {
    myGLCD.printNumI(now.month(), 130, 0);}  
    myGLCD.print("/", 160, 0);
    myGLCD.printNumI(now.year(), 175, 0);
    if (hour<10) {
    myGLCD.print("0",255, 0); 
    myGLCD.printNumI(now.hour(), 270, 0); } 
    else if(hour>=10){ 
    myGLCD.printNumI(now.hour(), 255, 0); } 
    if (m<10) {
    myGLCD.print("0",300, 0); 
    myGLCD.printNumI(now.minute(), 315, 0); } 
    else if (m>=10){ 
    myGLCD.printNumI(now.minute(), 300, 0); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

за каждые 5 км записывает только в одну ячейку. 5 км да, конечно мало, учитывая неточность датчика уровня топлива. Даже 10 по идее маловато. Т.е. если выбрано раз 10 км . То все ячейки T100SR_TFT запишутся через 110 км и поидее грамотный расход должно показать при этом пробеге.  Выведи ещё T100SR этот параметр очень важный. По нему как раз и рассчитывается  kmREFUELING и L100SR_TFT

viki13viki
Offline
Зарегистрирован: 14.11.2016

понял. поставлю 10 км, и вывкду   L100SR для контроля. побегаю два дня это примерно и будет 110 км. тогда и посмотрим че выдатс. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Сфоткай хоть как на панели все это добро выглядит.

viki13viki
Offline
Зарегистрирован: 14.11.2016

завтра утром после пробега сделаю фотки и выкину. 

viki13viki
Offline
Зарегистрирован: 14.11.2016

вид в панели. магнитолу пока не ставлю, с зади спрятан кабель для прошивки БК

утренний пробег. для понимания 

L/H-LHor, L/A-L100, L/V-L100M, L/M-L100SR_TFT,

D/K-kmREFUELING, D/L-Fuel, V/K-kmTrip, V/L-FuelTrip, 100S-L100SR(временно выведен с лева внизу)

для размышления, вчера за 30 км, L100SR так и осталься 0

теперь по утренней пробежке. конечный результат фотка выше.

первая запись Fuel была 40 литров. при первых данных после 10км было:

Fuel- 39, kmTrip-11, FuelTrip-1, L100M 10, L100SR_TFT-4.8, kmREFUELING-380, L100SR-10

на втором перерасчета на 22х км, kmREFUELING-380, L100SR-10 так и не поменялись, так как был  FuelTrip-1. Думаю это все на коротких дистанциях работать не будет, ведь затрачено на 30км гдето  1.5-2 литров, а пляска в баке всю дорогу плясала  от 39-41, в зависимости идешь ты на подьем или спуск с маленьким уклоном(трассы не всегда же прямые+крены). Так как у нас все расчеты зависят от Fuel то соответсвенно более менее будет показывать после 5-10 потраченых литров или 80-150км пройденых км, но все равно погрешность будет, так как пляска всю дорогу будет в 1 литер плюс или минус на маленьких подьемах и спусках, а на больших и того больше. Но в среднем болтанка по трассе в 1 литре + или - . Без понятия что делать, уже пришла такая глупая идея, может тупо прописать для kmREFUELING  kmREFUELING=((float)Fuel*100.00)/6.5; а потом с парой выкатаных баков смотреть реальность остатка км в баке и подрегулировать 6.5 до мааксимально блиского значения? так будет сразу при включении зажигания видно км в баке и всю дорогу даже на малых дистанциях. Да я понимаю что один бак можно выкатать больше по городу а другой больше по трассе, соответсвенно и расходы разные но, какойто оптимальный средний вариант взять и вписать в формулу. Ну а L100RS_TFT и L100M в любом случае будут эфиктивны только при больших пробегах. Других мыслей как это все устаканить, нету. 

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

короче похоже надо FuelTrip и kmTrip тоже в еепром сохранять и делать замеры по более большим отрезкам например в 50 км. ну ячеек для среднего расхода тогда можно поменьше сделать например 5 штук. Т.е. полностью расход выйдет  на правильную цифру через 250 км.  

kmREFUELING=((float)Fuel*100.00)/6.5   а это будет тогда ООЧЕнь примерно и далеко от реальности, всмысле не будет показатель адаптивным и от режима езды не будет зависеть вовсе. 

viki13viki
Offline
Зарегистрирован: 14.11.2016

kmtrip нет смысла, км пройденых показывает чётко. А вот FuelTrip да нужно, я раньше предлагал в каком то посте записывать Fuel, ведь у нас все зависит от Fuel, чем он стабильнее тем стабильнее все расчёты. Но ты наверна прав лучше и kmTrip. Пусть выйдет корректный через 250 км, это не важно. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

kmtrip нужно тоже записывать, иначе  при перевключении зажигания он будет сбрасываться, а все расчеты от него зависят. Можно другие переменные ввести, а эти оставить, пусть пробег и топливо за поездку показывают

viki13viki
Offline
Зарегистрирован: 14.11.2016

Да. Ты прав, как всегда. последний скетч с подправками

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #include <UTouch.h>
  #include <UTFT.h>
  #include <SPI.h>
  #include <EEPROM.h>
  
  
  //pin 20 SCL , 21 SDA датчик реального времени
  #include <Wire.h>
  #include "RTClib.h"
  RTC_DS3231 rtc;       
  
  //датчик наружней температуры
  #include <OneWire.h>
  #define ONE_WIRE_BUS 8   
  OneWire oneWire(ONE_WIRE_BUS);
  #include <DallasTemperature.h>
  DallasTemperature sensors(&oneWire);
  
  //датчик внутринней температуры и влаги
  #include "DHT.h"
  #define DHTPIN 9   
  #define DHTTYPE DHT22 
  DHT dht(DHTPIN, DHTTYPE);
  
  ///////////////////////////////////////////////////////////////////////////////////
  //пины экрана и тача
  ///////////////////////////////////////////////////////////////////////////////////
  UTFT    myGLCD(31,38,39,40,41); 
  UTouch  myTouch(6,5,4,3,2);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool MessageParse = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
  
  int numberbyte = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 4;  
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100M = 0;           //расход на 100 км измеренный за поездку
  float L100 = 0;            //мгновенный расход литров на 100км
  float LHor = 0;           //мгновенный расход топлива литров в час
  float L100SR = 0;         //расход литров на 100км измеренный раз в интервал kmL  
  float L100SR_TFT = 0;     // самый средний из расходов на 100км, он выводится на экран

  int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};
  int FuelZamer[10]= {0};  // массив для измерения уровня (количества) топлива 
  int ZamerNumber = 0;     // номер замера уровня (количества) топлива 
  int n_eeprom = 0;        // текущий адрес ячейки еепром для записи расхода
  
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  float Fuel = 0;         //остаток топлива
  int FuelIGN = 0;      // количество топлвива в баке на момент включения зажигания
  int Fuel_last = 0;   // для формул
  bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания 
  float FuelTrip = 0;     // количество литров топлива, израсходованное за один цикл включения зажигания
  
  
  
  float kmAge = 0;             //пробег, полученный со щитка приборов
  int kmAgeIGN = 0;          //пробег который был в момент включения зажигания 
  int kmAge_last = 0;       // для формул
  bool flagkmAgeIGN = 0;     //флаг записан ли пробег в момент вкл. зажигания 
  float kmTrip = 0;            //пробег за один цикл включения зажигания
  int kmL = 10;               // интервал, через который будет происходить обновление среднего расхода на 100км
  int km = 0;              // переменная для расчетов
  int kmeeprom = 10;         // интервал, через который будет происходить подсчет среднеарифмитического расхода  L100SR_TFT
  int kmTFT =  0;     // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
  int kmREFUELING;            // пробег до заправки на остатке топлива 
  
  int colerror = 0;           //количество ошибок в правом верхнем углу третьего экрана
  //float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {0};  // массив байтов принимаемого сообщения от щитка приборов
  
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


  
  unsigned long prevPID = 0;
  unsigned long prevPIDgauge = 0;
  unsigned long prevTemperature = 0;
  unsigned long prevpres = 0;
  unsigned long prevWatch = 0;
  unsigned long prevDvoet = 0;
  unsigned long prevData = 0;
 
  unsigned long TimewaitPID, timerwaitPID = 0;
  bool timerenabledPID = 0;
  #define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 200 // здесь задержка на ожидание правильного ответа пидов, мс

  unsigned long TimewaitInit, timerwaitInit = 0;
  bool timerenabledInit = 0;
  #define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 500 // здесь задержка на ожидание ответа об удачной инициализации, мс

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
    myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  


    for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
    for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];
    L100SR_TFT = (float)L100SR_TFT/110.00;
    if (L100SR_TFT<0) L100SR_TFT = 0;
    if (L100SR_TFT>99) L100SR_TFT = 99;
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {



  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}

    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis(); Trip ();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();



   }

void Trip () {
  
  if (flagkmAgeIGN){

//if (Fuel > FuelIGN + 5) {flagkmAgeIGN = 0; flagFuelIGN = 0; kmTFT = 0; km = 0;}

FuelTrip = FuelIGN - Fuel;                          
if (kmAge>kmAgeIGN) kmTrip = kmAge - kmAgeIGN;
if (kmAge<kmAgeIGN) kmTrip = 2000 - (kmAgeIGN - kmAge);  // 2000 это через сколько км у тебя суточный пробег сбрасывается на ноль, поменяй если другое число
if (kmAge==kmAgeIGN) kmTrip = 0;
    
L100M = ((float)FuelTrip*100.00)/(float)kmTrip;
 if (L100M<0) L100M = 0;
 if (L100M>99) L100M = 99;
 
// ниже цикл считает среднеарифметический расход из еепром раз в пробег, указанный в переменной kmeeprom
if (kmTrip-kmTFT>kmeeprom) {kmTFT = kmTrip; 
// тут считаем среднеарифметический расход из ячеек еепром 
for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];

  L100SR_TFT = (float)L100SR_TFT/110.00;
 if (L100SR_TFT<0) L100SR_TFT = 0;
 if (L100SR_TFT>99) L100SR_TFT = 99;
}

// ниже цикл считает расход топлива за пробег, указанный в переменной kmL, здесь же запись в ячейки еепром 
if (kmTrip-km>kmL) {km=kmTrip; 

L100SR = ((float)(Fuel_last-Fuel)*100.00)/(float)kmL; // расход/100км  - обновляется раз в 10км
Fuel_last = Fuel;      // сохранение параметров с последнего измерениея
if (L100SR<0) L100SR = 0;
if (L100SR>99) L100SR = 99;
 

if (L100SR>0) kmREFUELING=((float)Fuel*100.00)/(float)L100SR;
else kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;

// тут записываем  L100SR последовательно в одну из 11 ячеек еепром
//EEPROM.write (12,n_eeprom);      // ЗДЕСЬ ВНИМАТЕЛЬНО. ЗАГРУЗИТЬ ПРОШИВКУ С ЭТОЙ СТРОКОЙ ОДИН РАЗ, ПОТОМ ЗАКОМЕНТИРОВАТЬ И ЕЩЁ РАЗ ЗАГРУЗИТЬ
n_eeprom = EEPROM.read (12);    // в ячейке 12 хранится № текущей ячейки для записи расхода, чтобы где остановился при выкл питания, от туда и продолжил
EEPROM.write(n_eeprom, L100SR*10); 
n_eeprom++; if (n_eeprom>10) n_eeprom=0;
EEPROM.write (12,n_eeprom);

}}}


   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
       
      myGLCD.printNumF(LHor, 1, 60, 40, '.',5);
      myGLCD.printNumF(L100, 1, 210, 40,'.',5 );
      //if (kmTrip>=1) 
      myGLCD.printNumF(L100M, 1, 60, 75,'.',5 );
      //else myGLCD.print("0", 123, 75); 
      myGLCD.printNumF(L100SR_TFT, 1, 210, 75,'.',5 );
      myGLCD.printNumI(kmREFUELING, 60, 110,5 ); 
      //if (Fuel<53) 
	  myGLCD.printNumF(Fuel, 1, 210, 110,'.',5);
      //else myGLCD.print("MAX", 210, 110); 
      //if (kmTrip>=1) 
      myGLCD.printNumF(kmTrip, 1, 60, 145,'.',5);
      //else myGLCD.print("0", 123, 145);
      //if (FuelTrip>=1)
      myGLCD.printNumF(FuelTrip, 1, 210, 145,'.',5);
      //else myGLCD.print("0", 273, 145);

      myGLCD.printNumI(PumpRPM, 210, 180,5);
      myGLCD.printNumI(RPM, 210, 215,5);
               
      myGLCD.printNumI(Temp, 415, 40, 3);
      myGLCD.printNumI(TempOil, 415, 75, 3);
      myGLCD.printNumI(TempFuel, 415, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3);
      myGLCD.printNumI(t, 415, 180, 3);
      myGLCD.printNumI(TempAir, 415, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(h, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


MessageParse = 0;
while (InitGauge && !MessageParse) {

 if (!dataMessageOK) {   
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}
     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     numberbyte=0;}

 else {

   if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}
      
      if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0;}
     
     }
      

   if (dataMessageEND) { 
    int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
    int CRC =200;
    for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

    Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}
 
 //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (CRC==crc) {Serial.println ("    OK!!!");
    
  if (!flagFuelIGN)   Fuel = MessageRxGauge[16]/2.00;
  else Fuel = MessageRxGauge[17]/2.00;
  /*else { FuelZamer[ZamerNumber] = MessageRxGauge[16]/2.00;
  ZamerNumber++; if (ZamerNumber>9) ZamerNumber = 0;
  if (ZamerNumber==9) {
  for (int i = 0; i < 10; i++) Fuel = Fuel + FuelZamer[i];
  Fuel = (float)Fuel/10.0;}
    } */  
 

   kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10.00;


if (Fuel<53){
if (!flagkmAgeIGN) { kmAgeIGN = kmAge; flagkmAgeIGN =1;}
if (!flagFuelIGN) { FuelIGN = Fuel; Fuel_last = Fuel; flagFuelIGN = 1; }}
   
    }
    
  else Serial.println ("    ERROR!!!");   
   dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();

    for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }}



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(195);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (0,255,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (255,0,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    //Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    delay (5);
    } 
    delay (55);
 }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //стартовая инициализация
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void fastinit() {
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(295,35,295,248); // линия вертикальная
     myGLCD.setColor(0, 255, 0); // цвет линии зеленый
     myGLCD.drawLine(145,35,145,178); // линия вертикальная
     myGLCD.drawLine(1,178,295,178); // линия горизонтальная
     myGLCD.print("L/H", 10, 40);
     myGLCD.print("L/A", 148, 40);
     myGLCD.print("L/V", 10, 75);
     myGLCD.print("L/M", 148, 75);
     myGLCD.print("D/K", 10, 110);
     myGLCD.print("D/L", 148, 110);
     myGLCD.print("V/K", 10, 145);
     myGLCD.print("V/L", 148, 145);
     myGLCD.print("PUMP RPM", 10, 180);
     myGLCD.print("Engi RPM", 10, 215);
     myGLCD.print("Motor C", 300, 40);
     myGLCD.print("Oil   C", 300, 75);
     myGLCD.print("Fuel  C", 300, 110);
     myGLCD.print("Inter C", 300, 145);
     myGLCD.print("Exter C", 300, 180);
     myGLCD.print("IntAirC", 300, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     Watch ();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("MAF  mg/s:", 10, 215);
     myGLCD.print("Humedad %:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void drawFrame(int x1, int y1, int x2, int y2) {
     myGLCD.setColor(255, 0, 0);
     myGLCD.drawRoundRect (x1, y1, x2, y2);
     while (myTouch.dataAvailable())
     myTouch.read();
     myGLCD.setColor(255, 255, 255); 
   }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка кнопок и координат тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void buttonHome() {
     myGLCD.setColor(0,0,0); // цвет кнопки -серый
     myGLCD.fillRoundRect (1, 1, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  void line() {
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,73,479,73); // линия горизонтальная
     myGLCD.drawLine(1,108,479,108); // линия горизонтальная
     myGLCD.drawLine(1,143,479,143); // линия горизонтальная
     myGLCD.drawLine(1,178,479,178); // линия горизонтальная
     myGLCD.drawLine(1,212,479,212); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
   }


  /////////////////////////////////////////////////////////////////////////////////////////////
  //верхняя часть экрана часы и дата отображается на всех экранах
  /////////////////////////////////////////////////////////////////////////////////////////////
  void Watch (){
    DateTime now = rtc.now();
    int m = now.minute(); 
    int hour = now.hour();
    int mon = now.month();
    int date = now.day();
  
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
  
    if (date<10) { 
    myGLCD.print("0", 85, 0); 
    myGLCD.printNumI(now.day(), 100, 0); } 
    else if (date >=10) {
    myGLCD.printNumI(now.day(), 85, 0); }
    myGLCD.print("/", 115, 0);
    if ( mon<10) {
    myGLCD.print("0", 130, 0); 
    myGLCD.printNumI(now.month(), 145, 0);} 
    else if (mon >=10) {
    myGLCD.printNumI(now.month(), 130, 0);}  
    myGLCD.print("/", 160, 0);
    myGLCD.printNumI(now.year(), 175, 0);
    if (hour<10) {
    myGLCD.print("0",255, 0); 
    myGLCD.printNumI(now.hour(), 270, 0); } 
    else if(hour>=10){ 
    myGLCD.printNumI(now.hour(), 255, 0); } 
    if (m<10) {
    myGLCD.print("0",300, 0); 
    myGLCD.printNumI(now.minute(), 315, 0); } 
    else if (m>=10){ 
    myGLCD.printNumI(now.minute(), 300, 0); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

Мысли в слух. А может всетаки нужно прописывать в ячейки Fuel и высчитывать среднее, от него зависят два параметра FuelTrip и kmREFUELING а так же L100SR, если мы будем получать среднее от Fuel то и все остальное у нас будет устаканено. а если как ты говоришь записывать FuelTrip то да, некоторе  устаканися но kmREFUELING и L100SR, они так и останутся танцуюцими от Fuel. Ведь у нас в принципе все работает, наша проблема это болтанка в баке, ее и нужно усреднять. Если я не ошибаюсь.

MaksVV
Offline
Зарегистрирован: 06.08.2015

дак мы же пробовали, тебе не понравилось, правда мы от 16 байта пробовали. 

Ну попробуй 442 строку закоментировать, раскоментируй далее несколько строк (которые ты ранее законментировал), только там вместо 16 байта поставь 17-й. 

viki13viki
Offline
Зарегистрирован: 14.11.2016

ок. попробую еще раз. только с 17. 

viki13viki
Offline
Зарегистрирован: 14.11.2016

этот расчет не работает правильно

if (!flagFuelIGN)   Fuel = MessageRxGauge[16]/2.00;
  //else Fuel = MessageRxGauge[17]/2.00;
  else { FuelZamer[ZamerNumber] = MessageRxGauge[17]/2.00;
  ZamerNumber++; if (ZamerNumber>9) ZamerNumber = 0;
  if (ZamerNumber==9) {
  for (int i = 0; i < 10; i++) Fuel = Fuel + FuelZamer[i];
  Fuel = (float)Fuel/10.0;}
    } 
с самого начала происходит такое всегда, включаем зажигание видим 28 литров бак. через 15 секунд в пару литров плюс или минус, потом показывает 31 и уже так и держится, но уже FuelTrip в минус 3 и уже так всю дорогу и держит ,иногда давая маленькую разницу. Пробовал байты местами менять и одинаковые ставить, эфект всегда одинаковый. 
короче осталяю от усредненного расхода. 

//if (L100SR>0) kmREFUELING=((float)Fuel*100.00)/(float)L100SR;

276

//else

kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;

 

и изменил на int kmREFUELIN = 0; (добавил = 0) не знаю или нужно было это делать...

 

но как сделать чтобы он мгновенно пересчитывал от показаний на экране L100SR_TFT. Ведь при включении L100SR_TFT уже показывает усредненый расход а пересчет kmREFUELING не происходит, он будет сделан только через 10 км, на сколько я понимаю. Как сделать чтобы при включении зажигания он сразу пересчитывал от цифр L100SR_TFT которые уже есть на экране? и постоянно на нее ориентировался а не каждые 10 км.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

попробуй так 

  else { FuelZamer[ZamerNumber] = MessageRxGauge[17]/2.00;
  if (ZamerNumber==9) {
Fuel = 0 ;
  for (int i = 0; i < 10; i++) Fuel = Fuel + FuelZamer[i];
  Fuel = (float)Fuel/10.0;}
ZamerNumber++; if (ZamerNumber>9) ZamerNumber = 0;}

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

да. так вроде работает. пропал косяк с прибавлением при старте и происходит усреднение топлева. вечерм в поездке будет видно. Но я все таки хочу испробовать и вариант из поста 1117, да в любом варианте хочется включить зажигание и сразу видеть kmREFUELING, как мне это сделать? да  и скажи разве int kmREFUELIG; не должен иметь как и все = 0 ?

MaksVV
Offline
Зарегистрирован: 06.08.2015

viki13viki пишет:
да  и скажи разве int kmREFUELIG; не должен иметь как и все = 0 ?

да, сделай int kmREFUELIG=0; особой погоды это не сделает, но переменная кладётся при этом в более правильную область памяти МК чтоли. В эти дебри я не лезу, просто стараюсь сразу инициализировать объявляемые переменные. 

добавь в строку 192 эту строку:

kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;

чтобы

viki13viki пишет:
да в любом варианте хочется включить зажигание и сразу видеть kmREFUELING

viki13viki
Offline
Зарегистрирован: 14.11.2016

вставил в 192 строку kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;

при включении зажигания на экране он так и не появляется. по ходу он как то заваязан на int kmL=10; , если выставить в ноль то даже без вставляния в 192 строку появлятеся сразу при включении зажигания. вставил так в 192 строку

kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;

if (kmL=0) kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;

теперь появляется. 

проведу полное испытание на короткие и длинные дистанции, и если все будет нормально то, буду готовить проэкт к публикации. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

 не , ты вообще неправильно сделал. во-первых надо не так if (kmL=0),   а так      if (kmL==0)

во-вторых убери всё таки эту строку свою и мою из 192,  и вставь мою после этой строки

 if (!flagFuelIGN)   Fuel = MessageRxGauge[16]/2.00;        она  находится в районе 441

MaksVV
Offline
Зарегистрирован: 06.08.2015

блин нет короче

441 замни вот этим 

if (!flagFuelIGN) {  Fuel = MessageRxGauge[16]/2.00;  kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;}

viki13viki
Offline
Зарегистрирован: 14.11.2016

убрал мою и вставить в 441 вот это. 

if (!flagFuelIGN) {  Fuel = MessageRxGauge[16]/2.00;  kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;} 

Работает, появляется сразу. Спасибо

Есть один косяк кторый наблюдаю всегда, с небольшой разницей гдето в литри(плюс-минус), наврядли это можно устранить. Первая запись литров записывается, но, если машина запаркована ровно, то все ништяк. А вот если машина запаркована на спуске или на подьеме или имеет крен в одну из сторон, то конечно запись будет не соответствовать реальному, будет отклонение в минус или плюс, ровному уровню. Но это не принцепиально, это так для информации. В любом случае некоторые  данные будут эфективны только при минимальном расходе в 5-10 литров, например L100M и FuelTrip. Но это не принципиально. Меня все устраивает и я получил больше данных чем собирался видеть. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

viki13viki
Offline
Зарегистрирован: 14.11.2016

не стоит заморачиватся. это еще на долго работы. все и так супер. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

да уж,  вот так с виду бк и бк - подумают люди. они не представляют сколько труда тут, сколько было препятствий программных и железных. 

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

Интересный был путь. опыт то вещь незаменимая. 

viki13viki
Offline
Зарегистрирован: 14.11.2016

Это точно. Хотел сказать тебе ОГРОМНОЕ СПАСИБО за помощь и за твое терпение. Ты ВЕЛИКИЙ ИЗ ВЕЛИКИМХ. Проеэкт завершен благодаря тебе. :)

Inglor
Offline
Зарегистрирован: 20.09.2017

Здравствуйте уважаемые специалисты! Уже давненько с трепетом наблюдаю за этой темой и этим очень интересным проектом, и вот наконец решился зарегаться тут. Как я полагаю, все уже близко к завершению, и теперь можно, без боязни помешать или отвлечь, рассказать свою ситуацию и задать пару-тройку вопросов.

Итак, как и топикстартер, я имею авто Opel Zafira A,2003г,с бензиновым мотором Z18XE. Отличный автомобиль, есть все необходимое, если бы не одно НО. В моей комплектации как и у автора, стоит часики-дата-радиоTID, это непонятное недоразумение, раздражающее уже одним своим видом. В течение целого года я ломал голову над тем, чем бы заменить эту затычку. Рассматривал такие варианты, как вмонтировать экран от чего нибудь, начиная от термометров, китайских бортовиков с Али, к примеру Аutool x100 и его различные копии,а так же различных мониторчиков на камеру заднего вида. Хотелось функционал. Изначально гугл наталкивал на темы с использованием микроконтроллеров для построения маршрутника, но тогда еще казалось, что можно обойтись малыми трудо- время- и материальными затратами, но основной же причиной было то, что в программировании я не смыслю ровным счетом ничего. И вот,уже отчаявшись что либо сделать,а штатный дисплей никак не выходит из головы, наткнулся в середине лета на вашу тему. Очень надеюсь на то, что тут появиться подробное описание что,как и из чего сделать, чтобы даже чайник справился. Итак по порядку:

1. Насколько подробно собираетесь описать ваш проект и будут ли доступны все маретиалы, являющиеся плодом вашего столь упорного труда?

2. Подойдет ли данная конструкция на мой авто без каких либо изменений? Смонтировать хардварную часть а так же залить в ардуину готовый скетч я думаю в состоянии. Авто zafira 1,8 бензинка, ЭБУ Simtec 71, общается с Elm327 v1,5 и программой Torque по KWP2000, прогой OP-com старой версии и K-line адаптером соединиться не удалось, хотя сильно и не вникал, для острых нужд хватало и ELM, адаптер при необходимости смогу и другой спаять.Окошко экрана имеет размеры примерно 97мм на 65мм,есть место под две тактовые кнопки в корпусе штатного дисплея.

3.Могу ли я рассчитывать на вашу помощь, если все же что то пойдет не так или захочется видеть другой набор параметров? (собственно, у автора мотор дизельный, и на видео присутствуют некоторые лишние для моего авто параметры, меня же интересуют в первую очередь: расход л/100, расход л/час, средний расход, температура ОЖ,обороты,скорость, температура за бортом и в салоне,напряжение акб, время. этот набор поместиться и на один экран. в качестве бонуса если уж совсем раскатывать губу хотел бы видеть расход воздуха, напряжение датчика кислорода, топливную коррекцию по ДК и время впрыска форсунок. ну и из приятного чтение и очистка кодов неисправностей. Реально ли сделать текст одинаково оранжевого цвета, как и вся остальная информация и подсветка дисплея одометра на приборке и дисплея климат-контроля?

P.s. на эбу этого авто имеется пин,посылающий данные о расходе(хз,цифровой или аналоговый сигнал) на дисплей установленный в более лучших комплектациях(MID). Не пробовали ли найти информацию о характере сигнала? где то читал о 16 000 импульсах на литр топлива для мотора x16xe. Может если обработать ардуиной этот сигнал получили бы более точные данные о расходе чем с OBD?

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

viki13viki
Offline
Зарегистрирован: 14.11.2016

Привет Inglor. Рад что тебя заинтересовало. Для начала скажу что я так же начинал с полного нуля. Я так и не стал полным спецом как MaksVV, да и специалистом не стал, так, любитель. Давай по порядку.

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

2. Опишу подробно на сколько смогу, так же будут выложены все материалы, скетчи, железо и все что нужно. В скетчах все будет прокоментировано.

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

4. Нужно только убедится что у тебя протокол KWP2000. Можешь посмотреть в опкоме, в левом верхнем углу, там же и увидишь два ключа. Если это так то да подойдет. Вопрос только в том что байты для считывания инфы могут быть у бензина другие. И вообще-то чесно говоря я не знаю может у бензина и дизеля разные мозги и например инициализация может быть другой. а значит и прошивку нужно будет подправлять под нее, мне жаль но я сдесь не в курсе.

5. все на экране можно делать любого цвета. 

6. На счет помощи чем смогу, помогу. Но в скетчах много для меня осталось не понятным, так как заслуга в доработке сложных вещей это MaksVV.

7. На счет пина расхода , это тебе нужно изучать. А скетч само собой можно подгонять под что угодно.

P.S. Совет. Сначало изучи какой у тебя протокол в ОБД. а дальше будет видно. начни просматривать с 8 го поста

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

 

Inglor
Offline
Зарегистрирован: 20.09.2017

Опкома у меня нет, подключился с телефона torque через elm327, протокол выбирает ISO 14230-4 KWP (fast init,10.4 Kbaud)

MaksVV
Offline
Зарегистрирован: 06.08.2015

адаптер k-line можно такой. надежный и дешевый. Микросхема LM393 доступна и стоит копейки. К тому же она есть в DIP корпусе. Паять легче.

А вот ОПКОМ все таки очень желательно чтобы заработал. Для облегечени работы с проектом

Можно собрать такой USB K-line адаптер, заказав USB-UART переходник в китае.  В опкоме необходимо выбирать правильный компорт и работу по к-лайн. 

ССылка на программу ОПКОМ сообщение #833

Inglor
Offline
Зарегистрирован: 20.09.2017

Имеется адаптер как у человека в посте номер 3, попробую еще раз вечером с вашей версией программы

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

Inglor
Offline
Зарегистрирован: 20.09.2017

Я поправил пост, перепутал opcom с другой диагностической прогой(российский автопром дипгностирую ей, там есть выбор между елм и клайн), оpcom же какие то версии позволяет прикрутится через два вида адаптеров

viki13viki
Offline
Зарегистрирован: 14.11.2016

тогда пробуй по версии опкома MaksVV. читай с 320 поста. использовался адаптер L9637D юсб.

viki13viki
Offline
Зарегистрирован: 14.11.2016

если есть готовый адаптер и ардуино ,то можешь уже попробовать пробить адрес твоего блока и инициализацию, читай пост 11,12

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот нарисовал заготовку для K-line на LM393 по схеме выше. Файл Sprint Layout 5.0

 https://yadi.sk/d/CqgcNiTe3N87Rp

Inglor
Offline
Зарегистрирован: 20.09.2017

Не работает программа оп-ком той версии с моей машиной,нет там нужного,более современного протокола, буду ждать адаптер опком с чайны для новых версий одноименной программы. Может пока к-лайн адаптер без юсб соберу, жаль лазерный принтер еще с отпуска не приехал(ну сосед всмысле). Можете пока хотя бы ссылку на дисплей свой или подобный дать? На Али рылся, дак только 3,5 дюйма нашел

viki13viki
Offline
Зарегистрирован: 14.11.2016

я брал набор на али эксерс, но это было год назад, 3.95 pulgadas TFT LCD+Mega 2560 R3 цена 14,30 евро, своего продовца не буду рекомендовать, на экране отсутсвовал шлейф для тача, пришлось самому паять, да и закончились у него.  Самое странное что на али експресс их было валом, сейчас не нахожу ни одного. Короче ищи либо отдельно 3.95 pulgadas TFT LCD arduinо либо набор с мегой 2560 R3

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

https://ru.aliexpress.com/store/product/3-5-inch-TFT-Touch-LCD-Screen-Display-Module-For-Arduino-UNO-R3-HIGH-QUALITY-Free/917211_1854649569.html

и вторая ссылка

https://ru.aliexpress.com/store/product/3-95-inch-TFT-LCD-Module-with-Touch-Panel-ILI9488-Drive-IC-for-UNO-Mage2560-Due/224898_32383380537.html

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

viki13viki
Offline
Зарегистрирован: 14.11.2016

MaksVV посмотри, я правильно прописал средний FuelTrip ? Я все еще в поисках оптимального варианта.

 int FuelTripZamer[10]= {0};  // массив для измерения уровня (количества) потраченного топлива 
  int FuelTripZamerNumber = 0;     // номер замера уровня (количества) потраченного топлива
 
  //для усреднения потраченного топлива 
  if (FuelTrip) { FuelTrip = FuelIGN - Fuel; }
  else { FuelTripZamer[FuelTripZamerNumber] = FuelTrip;
  if (FuelTripZamerNumber==9) { FuelTrip = 0;
  for (int i = 0; i < 10; i++) FuelTrip = FuelTrip + FuelTripZamer[i];
  FuelTrip = (float)FuelTrip/10.0; }
  FuelTripZamerNumber++; if (FuelTripZamerNumber>9) FuelTripZamerNumber = 0;}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

все неверно. Зачем усреднять FuelTrip? этот показатель итак рассчитывается уже от усредненного Fuel.  

 if (FuelTrip) - так пишут только про переменные типа bool (boolean), которые могут принимать только два состояния,  1 или 0, да или нет, истина или лож. А у тебя int. 

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

да. я чуток позже уже понял что это наверняка не верно. я хотел попробовать оставить Fuel без усреднения а усреднить FuelTrip, для эксперемента. 

viki13viki
Offline
Зарегистрирован: 14.11.2016
Вот и закончен проэкт. В первую очередь хочу поблагодарить MaksVV, пользователя этого формума, за его огромный вклад в разработку прошивки(скетча). MaksVV ОГРОМНОЕ СПАСИБО.
 
ПРЕДУПРЕЖДЕНИЕ. Если я что-то не обьяснил, пропустил, или вам что-то не понятно то, не поленитесь прочитайте весь формум, там всего-то 23 страницы. Я вообще рекомендую сначало все прочесть а потом братся за проэкт, так вы будете все понимать, все было разжовано с нуля. Выкладываю как могу.
 
Вот результат на YouTube (позже выложу)
 
 
Не буду вас томить и начнем. Что нам нужно для проэкта.
Авто Opel Zafira A от 99-05 годы, с дизельным мотором 2.0 литров. (на других моторах еще не проверено) выкладывайте у кого получилось. На бензиновых еще тоже не проверено, один из пользователей начинает разработку для бензина, посмотрим что выйдет. выкладывайте у кого получилось
 
   Железо:
1. 3.95 pulgadas TFT LCD módul экран
2. Mega 2560 R3 Mega2560 REV3  плата
3. DS18B20 датчик наружной температуры
4. DHT22 датчик внутренней температуры и влаги
5. LM2596 LM2596S DC-DC 3-40 V стабилизатор напряжения. подсоеденяем к ардуино плюс на VIN и минус на Массу. К машине     подсоеденяем на плюс 12в замка. Тестером пробуете сколько вольт на выхде дает ардуино, регулируете напряжение на LM2596 до того момента когда на ардуино на выходе будет 5в. А то я сначало дал на выходе LM2596  5в а на ардуино выходе было меньше около 3в. Покрутил регулиратор пока на выходе ардуино не стало 5в. 
6. DS3231 AT24C32 IIC  реле реального времени
7. OPCOM чина + программа.
6. DuPont 60 Pines 20 cm (20 мама-папа, 20 мама-мама, 20 папа-папа) соединительные проводочки
7. Стандартная коробка бортовика с панели(можно купить и потом заменить, либо сразу использовать свою.)
8. Клеевой пистолет(для монтирования всего железа в коробку панели)
9. Паяльник
10. Тестер(для пробы напряжений)
11. Скачиваем весь пакет материалов (архив). В нем будет все, включая несколько фотокрафий, документы, скетчи и т.д .
12. Список что и где в скетчах нужно будет менять на ваше, если вы вдруг будете цеплять на другие пины ардуино и если у вас будут другие адреса и ключи для инициализации и еще что-то. 
номер строки в скетче // строка  //описание
16   // #define ONE_WIRE_BUS 8 // наружняя температура DS18B20
23   // #define DHTPIN 9         // внутренняя температура и влага DHT22
30   //UTFT    myGLCD(31,38,39,40,41); //пины экрана
31   //UTouch  myTouch(6,5,4,3,2);     //пины тач
42,43 // #define mySerial_gauge Serial2 // второй адаптер для панели приборов 12 контакт ОБД
         #define TX_gauge 16
44,45 // #define TX 13                  //первый адаптер блока мотора 7 контакт ОБД
         SoftwareSerial mySerial   (12, 13); //RХ,TХ
с 125 по 129 //    Следующие строки где вы меняете 0x11 на свой адрес и не забываем пересчитывать контрольную сумму. Делается это так, пример первой строки
    81+11+F1+81= 04, для удобства скачайте из плаймаркета приложение Simple HEX DEC, все контрольные суммы нужно будет пересчитать, если у вас 
    будет другой адрес блока или еще чтото.
          byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
          byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
          byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
          byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
          byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок
179    //  rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));       // для програмирования часов, читаем внимательно в скетче
265    //EEPROM.write (12,n_eeprom);  //читаем внимательно в скетче
370    //mySerial_gauge.write (0x11);  delay (1);  // меняем на свой адрес блока
с 415 по 417 // ----------// читаем, касается количества топлива в баке, есть нюансы.
Подкдючение притания. LM2596 полключает к плюсу от ключа зажигания, например провод в магнитоле, чтобы бортовик запускался только при включеном зажигании. Потом LM2596 подключаем к ардуино, плюс к пину VIN, минус к массе ардуино(ниже будет описано как отрегулировать напряжение). Все остальное подключение видно в пункте 12, чуть выше. Единственное что скажу что, в коробке бортовика сделал колодочку для 5в и массы от ардуино и в нее уже подключал все железо.
  
    Первым делом выкидываем из архива IDE-3.95-2560-9488 в люлое удобное место, у меня на рабочем столе. Соединяем ардуино с экраном и заливаем тесты для проверки работы экрана. Проверили, работает, едем дальше.  
   Спаиваем два адаптера, адаптер из поста 8 на L9637D(работает и с 7 и 12 пином ОБД) и адаптер из поста 1(под номером 4) на BC547(работает только с 7 пином ОБД). В адаптерах мы получаем с одной стороны к авто 12в+Масса+7(или 12)пин ОБД, с другой к ардуино 5в+Масса+TX+RX. Соединяем RX адаптера к 12 пину(ардуино) ТХ к к 13 пину(ардуино). Можете испльзовать любой адаптер для пробы, но лучше использовать BC547, именно он и будет у нас потом работать на 7 контакте ОБД. Для того чтобы не тыкатся всеми тремя проводами от адаптера в ОБД, можно к проводу 12в и Массе подцепить штекер для прикуривателя, и втыкать его в прикуриватель, а в ОБД тыкать только провод в 7 контакт. 
    Теперь берем ОПКОМ подсоединяем, выбераем свое авто, мотор и попадаем на страницу где в верхнем левом углу видем, ваш протокол (например KWP2000) и два ключа (например keyword1 - 6B , keyword2 - 8F) ,записываем на бумжку, ключи это очень важно, в будущем в скетчах нужно будет заменить на ваши. Нужно выяснить какой у вас протокол и какая у него инициализация а так же адрес вашего блока. У меня он 0х11, у вас может быть другой. Для тех у кого есть ОПКОМ дело облегчается. Подсоединяме ОПКОМ и к контакту 7 паралельно адаптер. Как подсоединится паралельно к 7 линии? один способ, разбераем ОПКОМ и ищем 7 контакт, прикручиваем или припаиваем к нему дополнительный провод и кидаем его на адаптер, или вынемаем ОБД разьме и снизу подкручиваем провод, как вам будет удобнее. На компе нужно будет запустить прогу ОПКОМа и IDE для просмотра порта.
    Заливаем в ардуино снифер контакта 7.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
unsigned long prevTimedelay = 0; 
int Delay = 0;
void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
}

void loop() {

if (mySerial.available()) {
delay (51);
unsigned long curTimedelay = millis ();
   Delay = curTimedelay-prevTimedelay;
Serial.println (""); Serial.print (Delay); Serial.println ("ms");
prevTimedelay = millis();  
while( mySerial.available()) {
    byte inByte = mySerial.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
   }
     
    }
}
-------------------------------------------------------------------------------------
  и смотрим что посылает и отправляют ОПКОМ и АВТО. Тут то мы все и видим. Не забываем 11 это мой адрес блока. У вас может быть другой. В должны увидить примерно эти строки
81 11 F1 81 04     запрос инициализации
  83 F1 11 C1 6B 8F 40  отет, где С1 это положительный ответ а 6B 8F это ключи
  Начиная от сюда, это все информация о прошивк о блоке о моторе, вся инфа которая у вас выходит на первой странице ОПКОМА. это    все нам нужно будет для использования в эмуляторе, когда будем
  щупать какие байты за что отвечают.
  82 11 F1 1A  81 1F   отправляте ОПКОМ, ниже ответ (в эмуляторе это IDEN1)
  A8 11 5A 81 04 90 6F 62 03 91 6B 03 92 6B 03 93 01 03 94 6A 03 
  95 02 03 96 66 03 97 69 03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC

  82 11 F1 1A  80 1E   отправляте ОПКОМ, ниже ответ (в эмуляторе это IDEN2)
  80 F1 11 5F 5A 80 57 30 4C 30 54 47 46 37 35 31 32 32 33 33 37 31 
  34 32 34 34 31 37 31 36 39 20 50 44 42 4F 53 20 20 30 31 30 35 30 
  35 FF 4B 4D 37 4D 33 30 34 30 5F 53 00 06 42 30 31 30 31 35 59 32 
  30 44 54 48 20 44 33 53 30 30 31 30 30 36 39 34 30 20 07 07 25 05 
  48 30 32 38 31 30 31 30 32 36 38 FF

  82 11 F1 21 01 А6   отправляте ОПКОМ, ниже ответ со всеми данными которые нам нужны 2101
  80 F1 4C 61 01 00 00 00 00 00 00 00 00 0D 37 01 79 0C EB 00 00 
  02 B3 00 00 11 89 04 30 00 00 03 20 0B 55 03 A3 04 2D 03 20 EE B9 
  00 00 00 00 0C 35 03 0A 02 D9 08 A3 01 90 0C 27 A0 00 01 2C 02 76 
  AD 08 01 30 00 03 01 7B 0B DB 03 A3 00 02 5C
  
  81 11 F1 3E C1  запрос присутсвия 
  81 F1 11 7E 01 ответ. Где 7Е положительный ответ
  Записываем на бумажку или я пользуюсь Notepad++. Чтобы потом подправлять в скетче.
  
     Для тех у кого нет ОПКОМА в будущем будет сложно. Можно попробовать прогой findECU (в архиве), если не получается то сначало просмотрите пост 12. Далее делаем первое, пробуем пробить адрес. Как пользоватся программой посмотрите в интернете. Обычно адрес блока находится в диапазоне от 10 по 17 адрес.
  
  В ДАЛЬНЕЙШЕМ ЕСЛИ У ВАС ДРУГОЙ АДРЕС БЛОКА МОТОРА, И КЛЮЧИ БЛОКА ТО, НЕ ЗАБЫВАЕМ ПОДПРАВЛЯТЬ ВО ВСЕХ СКЕТЧАХ.
  коротко обьяснение что такое Fast init и Fast init 5 Boud пост 166.
  Пробивка адреса только для Fast init
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;

//-----variables------------------------------------------------------------------
int dotdelay = 1000;
int timeout = 4000;
int timeold;
int messagelength = 5;
//int messagelength2 = 6;
//int messagelength3 = 8;

//-----PAQUETES HEX---------------------------------------------------------------

byte message1[5] = {0x81,0x01,0xF1,0x81,0xF4};             //COMUNICACION// 
byte message2[5] = {0x81,0x02,0xF1,0x81,0xF5};             //COMUNICACION//
byte message3[5] = {0x81,0x03,0xF1,0x81,0xF6};             //COMUNICACION//
byte message4[5] = {0x81,0x04,0xF1,0x81,0xF7};             //COMUNICACION//
byte message5[5] = {0x81,0x05,0xF1,0x81,0xF8};             //COMUNICACION//
byte message6[5] = {0x81,0x06,0xF1,0x81,0xF9};             //COMUNICACION//
byte message7[5] = {0x81,0x07,0xF1,0x81,0xFA};             //COMUNICACION//
byte message8[5] = {0x81,0x08,0xF1,0x81,0xFB};             //COMUNICACION// 
byte message9[5] = {0x81,0x09,0xF1,0x81,0xFC};             //COMUNICACION//
byte message10[5] = {0x81,0x10,0xF1,0x81,0x03};             //COMUNICACION//
byte message11[5] = {0x81,0x11,0xF1,0x81,0x04};             //COMUNICACION//
byte message12[5] = {0x81,0x12,0xF1,0x81,0x05};             //COMUNICACION//
byte message13[5] = {0x81,0x13,0xF1,0x81,0x06};             //COMUNICACION//
byte message14[5] = {0x81,0x14,0xF1,0x81,0x07};             //COMUNICACION//
byte message15[5] = {0x81,0x15,0xF1,0x81,0x08};             //COMUNICACION// 
byte message16[5] = {0x81,0x16,0xF1,0x81,0x09};             //COMUNICACION//
byte message17[5] = {0x81,0x17,0xF1,0x81,0x0A};             //COMUNICACION//
byte message18[5] = {0x81,0x18,0xF1,0x81,0x0B};             //COMUNICACION//
byte message19[5] = {0x81,0x19,0xF1,0x81,0x0C};             //COMUNICACION//
byte message20[5] = {0x81,0x20,0xF1,0x81,0x13};             //COMUNICACION//
byte message21[5] = {0x81,0x21,0xF1,0x81,0x14};             //COMUNICACION//
byte message22[5] = {0x81,0x22,0xF1,0x81,0x15};             //COMUNICACION// 
byte message23[5] = {0x81,0x23,0xF1,0x81,0x16};             //COMUNICACION//
byte message24[5] = {0x81,0x24,0xF1,0x81,0x17};             //COMUNICACION//
byte message25[5] = {0x81,0x25,0xF1,0x81,0x18};             //COMUNICACION//
byte message26[5] = {0x81,0x26,0xF1,0x81,0x19};             //COMUNICACION// 
byte message27[5] = {0x81,0x27,0xF1,0x81,0x1A};             //COMUNICACION//
byte message28[5] = {0x81,0x28,0xF1,0x81,0x1B};             //COMUNICACION//
byte message29[5] = {0x81,0x29,0xF1,0x81,0x1C};             //COMUNICACION//
byte message30[5] = {0x81,0x30,0xF1,0x81,0x23};             //COMUNICACION// 
byte message31[5] = {0x81,0x31,0xF1,0x81,0x24};             //COMUNICACION//
byte message32[5] = {0x81,0x32,0xF1,0x81,0x25};             //COMUNICACION//
byte message33[5] = {0x81,0x33,0xF1,0x81,0x26};             //COMUNICACION//
byte message34[5] = {0x81,0x34,0xF1,0x81,0x27};             //COMUNICACION// 
byte message35[5] = {0x81,0x35,0xF1,0x81,0x28};             //COMUNICACION//
byte message36[5] = {0x81,0x36,0xF1,0x81,0x29};             //COMUNICACION//
byte message37[5] = {0x81,0x37,0xF1,0x81,0x2A};             //COMUNICACION//
byte message38[5] = {0x81,0x38,0xF1,0x81,0x2B};             //COMUNICACION//
byte message39[5] = {0x81,0x39,0xF1,0x81,0x2C};             //COMUNICACION//
byte message40[5] = {0x81,0x40,0xF1,0x81,0x33};             //COMUNICACION//
byte message41[5] = {0x81,0x41,0xF1,0x81,0x34};             //COMUNICACION// 
byte message42[5] = {0x81,0x42,0xF1,0x81,0x35};             //COMUNICACION//
byte message43[5] = {0x81,0x43,0xF1,0x81,0x36};             //COMUNICACION//
byte message44[5] = {0x81,0x44,0xF1,0x81,0x37};             //COMUNICACION//
byte message45[5] = {0x81,0x45,0xF1,0x81,0x38};             //COMUNICACION//
byte message46[5] = {0x81,0x46,0xF1,0x81,0x39};             //COMUNICACION//
byte message47[5] = {0x81,0x47,0xF1,0x81,0x3A};             //COMUNICACION//
byte message48[5] = {0x81,0x48,0xF1,0x81,0x3B};             //COMUNICACION// 
byte message49[5] = {0x81,0x49,0xF1,0x81,0x3C};             //COMUNICACION//
byte message50[5] = {0x81,0x50,0xF1,0x81,0x43};             //COMUNICACION//
byte message51[5] = {0x81,0x51,0xF1,0x81,0x44};             //COMUNICACION//
byte message52[5] = {0x81,0x52,0xF1,0x81,0x45};             //COMUNICACION//
byte message53[5] = {0x81,0x53,0xF1,0x81,0x46};             //COMUNICACION//
byte message54[5] = {0x81,0x54,0xF1,0x81,0x47};             //COMUNICACION//
byte message55[5] = {0x81,0x55,0xF1,0x81,0x48};             //COMUNICACION// 
byte message56[5] = {0x81,0x56,0xF1,0x81,0x49};             //COMUNICACION//
byte message57[5] = {0x81,0x57,0xF1,0x81,0x4A};             //COMUNICACION//
byte message58[5] = {0x81,0x58,0xF1,0x81,0x4B};             //COMUNICACION//
byte message59[5] = {0x81,0x59,0xF1,0x81,0x4C};             //COMUNICACION// 
byte message60[5] = {0x81,0x60,0xF1,0x81,0x53};             //COMUNICACION//
byte message61[5] = {0x81,0x61,0xF1,0x81,0x54};             //COMUNICACION//
byte message62[5] = {0x81,0x62,0xF1,0x81,0x55};             //COMUNICACION//
byte message63[5] = {0x81,0x63,0xF1,0x81,0x56};             //COMUNICACION// 
byte message64[5] = {0x81,0x64,0xF1,0x81,0x57};             //COMUNICACION//
byte message65[5] = {0x81,0x65,0xF1,0x81,0x58};             //COMUNICACION//
byte message66[5] = {0x81,0x66,0xF1,0x81,0x59};             //COMUNICACION//
byte message67[5] = {0x81,0x67,0xF1,0x81,0x5A};             //COMUNICACION// 
byte message68[5] = {0x81,0x68,0xF1,0x81,0x5B};             //COMUNICACION//
byte message69[5] = {0x81,0x69,0xF1,0x81,0x5C};             //COMUNICACION//
byte message70[5] = {0x81,0x70,0xF1,0x81,0x63};             //COMUNICACION//
byte message71[5] = {0x81,0x71,0xF1,0x81,0x64};             //COMUNICACION//
byte message72[5] = {0x81,0x72,0xF1,0x81,0x65};             //COMUNICACION//
byte message73[5] = {0x81,0x73,0xF1,0x81,0x66};             //COMUNICACION//
byte message74[5] = {0x81,0x74,0xF1,0x81,0x67};             //COMUNICACION// 
byte message75[5] = {0x81,0x75,0xF1,0x81,0x68};             //COMUNICACION//
byte message76[5] = {0x81,0x76,0xF1,0x81,0x69};             //COMUNICACION//
byte message77[5] = {0x81,0x77,0xF1,0x81,0x6A};             //COMUNICACION//
byte message78[5] = {0x81,0x78,0xF1,0x81,0x6B};             //COMUNICACION//
byte message79[5] = {0x81,0x79,0xF1,0x81,0x6C};             //COMUNICACION//
byte message80[5] = {0x81,0x80,0xF1,0x81,0x73};             //COMUNICACION//
byte message81[5] = {0x81,0x81,0xF1,0x81,0x74};             //COMUNICACION// 
byte message82[5] = {0x81,0x82,0xF1,0x81,0x75};             //COMUNICACION//
byte message83[5] = {0x81,0x83,0xF1,0x81,0x76};             //COMUNICACION//
byte message84[5] = {0x81,0x84,0xF1,0x81,0x77};             //COMUNICACION//
byte message85[5] = {0x81,0x85,0xF1,0x81,0x78};             //COMUNICACION//
byte message86[5] = {0x81,0x86,0xF1,0x81,0x79};             //COMUNICACION//
byte message87[5] = {0x81,0x87,0xF1,0x81,0x7A};             //COMUNICACION//
byte message88[5] = {0x81,0x88,0xF1,0x81,0x7B};             //COMUNICACION// 
byte message89[5] = {0x81,0x89,0xF1,0x81,0x7C};             //COMUNICACION//
byte message90[5] = {0x81,0x90,0xF1,0x81,0x83};             //COMUNICACION//
byte message91[5] = {0x81,0x91,0xF1,0x81,0x84};             //COMUNICACION//
byte message92[5] = {0x81,0x92,0xF1,0x81,0x85};             //COMUNICACION// 
byte message93[5] = {0x81,0x93,0xF1,0x81,0x86};             //COMUNICACION//
byte message94[5] = {0x81,0x94,0xF1,0x81,0x87};             //COMUNICACION//
byte message95[5] = {0x81,0x95,0xF1,0x81,0x88};             //COMUNICACION//
byte message96[5] = {0x81,0x96,0xF1,0x81,0x89};             //COMUNICACION// 
byte message97[5] = {0x81,0x97,0xF1,0x81,0x8A};             //COMUNICACION//
byte message98[5] = {0x81,0x98,0xF1,0x81,0x8B};             //COMUNICACION//
byte message99[5] = {0x81,0x99,0xF1,0x81,0x8C};             //COMUNICACION//
//-----------------------------------------------------------------------------------------
byte message101[5] = {0x81,0x0A,0xF1,0x81,0xFD};             //COMUNICACION// 
byte message102[5] = {0x81,0x1A,0xF1,0x81,0x0D};             //COMUNICACION//
byte message103[5] = {0x81,0x2A,0xF1,0x81,0x1D};             //COMUNICACION//
byte message104[5] = {0x81,0x3A,0xF1,0x81,0x2D};             //COMUNICACION//
byte message105[5] = {0x81,0x4A,0xF1,0x81,0x3D};             //COMUNICACION//
byte message106[5] = {0x81,0x5A,0xF1,0x81,0x4D};             //COMUNICACION//
byte message107[5] = {0x81,0x6A,0xF1,0x81,0x5D};             //COMUNICACION//
byte message108[5] = {0x81,0x7A,0xF1,0x81,0x6D};             //COMUNICACION// 
byte message109[5] = {0x81,0x8A,0xF1,0x81,0x7D};             //COMUNICACION//
byte message110[5] = {0x81,0x9A,0xF1,0x81,0x8D};             //COMUNICACION//
byte message111[5] = {0x81,0xA0,0xF1,0x81,0x93};             //COMUNICACION//
byte message112[5] = {0x81,0xA1,0xF1,0x81,0x94};             //COMUNICACION//
byte message113[5] = {0x81,0xA2,0xF1,0x81,0x95};             //COMUNICACION//
byte message114[5] = {0x81,0xA3,0xF1,0x81,0x96};             //COMUNICACION//
byte message115[5] = {0x81,0xA4,0xF1,0x81,0x97};             //COMUNICACION// 
byte message116[5] = {0x81,0xA5,0xF1,0x81,0x98};             //COMUNICACION//
byte message117[5] = {0x81,0xA6,0xF1,0x81,0x99};             //COMUNICACION//
byte message118[5] = {0x81,0xA7,0xF1,0x81,0x9A};             //COMUNICACION//
byte message119[5] = {0x81,0xA8,0xF1,0x81,0x9B};             //COMUNICACION//
byte message120[5] = {0x81,0xA9,0xF1,0x81,0x9C};             //COMUNICACION//
byte message121[5] = {0x81,0x0B,0xF1,0x81,0xFE};             //COMUNICACION//
byte message122[5] = {0x81,0x1B,0xF1,0x81,0x0E};             //COMUNICACION// 
byte message123[5] = {0x81,0x2B,0xF1,0x81,0x1E};             //COMUNICACION//
byte message124[5] = {0x81,0x3B,0xF1,0x81,0x2E};             //COMUNICACION//
byte message125[5] = {0x81,0x4B,0xF1,0x81,0x3E};             //COMUNICACION//
byte message126[5] = {0x81,0x5B,0xF1,0x81,0x4E};             //COMUNICACION// 
byte message127[5] = {0x81,0x6B,0xF1,0x81,0x5E};             //COMUNICACION//
byte message128[5] = {0x81,0x7B,0xF1,0x81,0x6E};             //COMUNICACION//
byte message129[5] = {0x81,0x8B,0xF1,0x81,0x7E};             //COMUNICACION//
byte message130[5] = {0x81,0x9B,0xF1,0x81,0x8E};             //COMUNICACION// 
byte message131[5] = {0x81,0xB0,0xF1,0x81,0xA3};             //COMUNICACION//
byte message132[5] = {0x81,0xB1,0xF1,0x81,0xA4};             //COMUNICACION//
byte message133[5] = {0x81,0xB2,0xF1,0x81,0xA5};             //COMUNICACION//
byte message134[5] = {0x81,0xB3,0xF1,0x81,0xA6};             //COMUNICACION// 
byte message135[5] = {0x81,0xB4,0xF1,0x81,0xA7};             //COMUNICACION//
byte message136[5] = {0x81,0xB5,0xF1,0x81,0xA8};             //COMUNICACION//
byte message137[5] = {0x81,0xB6,0xF1,0x81,0xA9};             //COMUNICACION//
byte message138[5] = {0x81,0xB7,0xF1,0x81,0xAA};             //COMUNICACION//
byte message139[5] = {0x81,0xB8,0xF1,0x81,0xAB};             //COMUNICACION//
byte message140[5] = {0x81,0xB9,0xF1,0x81,0xAC};             //COMUNICACION//
byte message141[5] = {0x81,0x0C,0xF1,0x81,0xFF};             //COMUNICACION// 
byte message142[5] = {0x81,0x1C,0xF1,0x81,0x0F};             //COMUNICACION//
byte message143[5] = {0x81,0x2C,0xF1,0x81,0x1F};             //COMUNICACION//
byte message144[5] = {0x81,0x3C,0xF1,0x81,0x2F};             //COMUNICACION//
byte message145[5] = {0x81,0x4C,0xF1,0x81,0x3F};             //COMUNICACION//
byte message146[5] = {0x81,0x5C,0xF1,0x81,0x4F};             //COMUNICACION//
byte message147[5] = {0x81,0x6C,0xF1,0x81,0x5F};             //COMUNICACION//
byte message148[5] = {0x81,0x7C,0xF1,0x81,0x6F};             //COMUNICACION// 
byte message149[5] = {0x81,0x8C,0xF1,0x81,0x7F};             //COMUNICACION//
byte message150[5] = {0x81,0x9C,0xF1,0x81,0x8F};             //COMUNICACION//
byte message151[5] = {0x81,0xC0,0xF1,0x81,0xB3};             //COMUNICACION//
byte message152[5] = {0x81,0xC1,0xF1,0x81,0xB4};             //COMUNICACION//
byte message153[5] = {0x81,0xC2,0xF1,0x81,0xB5};             //COMUNICACION//
byte message154[5] = {0x81,0xC3,0xF1,0x81,0xB6};             //COMUNICACION//
byte message155[5] = {0x81,0xC4,0xF1,0x81,0xB7};             //COMUNICACION// 
byte message156[5] = {0x81,0xC5,0xF1,0x81,0xB8};             //COMUNICACION//
byte message157[5] = {0x81,0xC6,0xF1,0x81,0xB9};             //COMUNICACION//
byte message158[5] = {0x81,0xC7,0xF1,0x81,0xBA};             //COMUNICACION//
byte message159[5] = {0x81,0xC8,0xF1,0x81,0xBB};             //COMUNICACION// 
byte message160[5] = {0x81,0xC9,0xF1,0x81,0xBC};             //COMUNICACION//
byte message161[5] = {0x81,0x0D,0xF1,0x81,0x00};             //COMUNICACION//
byte message162[5] = {0x81,0x1D,0xF1,0x81,0x10};             //COMUNICACION//
byte message163[5] = {0x81,0x2D,0xF1,0x81,0x20};             //COMUNICACION//
byte message164[5] = {0x81,0x3D,0xF1,0x81,0x30};             //COMUNICACION//
byte message165[5] = {0x81,0x4D,0xF1,0x81,0x40};             //COMUNICACION//
byte message166[5] = {0x81,0x5D,0xF1,0x81,0x50};             //COMUNICACION// 
byte message167[5] = {0x81,0x6D,0xF1,0x81,0x60};             //COMUNICACION//
byte message168[5] = {0x81,0x7D,0xF1,0x81,0x70};             //COMUNICACION//
byte message169[5] = {0x81,0x8D,0xF1,0x81,0x80};             //COMUNICACION//
byte message170[5] = {0x81,0x9D,0xD9,0x81,0x90};             //COMUNICACION//
byte message171[5] = {0x81,0xD0,0xD0,0x81,0xC3};             //COMUNICACION//
byte message172[5] = {0x81,0xD1,0x0D,0x81,0xC4};             //COMUNICACION//
byte message173[5] = {0x81,0xD2,0x9D,0x81,0xC5};             //COMUNICACION// 
byte message174[5] = {0x81,0xD3,0x8D,0x81,0xC6};             //COMUNICACION//
byte message175[5] = {0x81,0xD4,0x7D,0x81,0xC7};             //COMUNICACION//
byte message176[5] = {0x81,0xD5,0x6D,0x81,0xC8};             //COMUNICACION//
byte message177[5] = {0x81,0xD6,0x5D,0x81,0xC9};             //COMUNICACION//
byte message178[5] = {0x81,0xD7,0x4D,0x81,0xCA};             //COMUNICACION//
byte message179[5] = {0x81,0xD8,0x3D,0x81,0xCB};             //COMUNICACION//
byte message180[5] = {0x81,0xD9,0x2D,0x81,0xCC};             //COMUNICACION// 
byte message181[5] = {0x81,0x0E,0x1D,0x81,0x01};             //COMUNICACION//
byte message182[5] = {0x81,0x1E,0xF1,0x81,0x11};             //COMUNICACION//
byte message183[5] = {0x81,0x2E,0xF1,0x81,0x21};             //COMUNICACION//
byte message184[5] = {0x81,0x3E,0xF1,0x81,0x31};             //COMUNICACION//
byte message185[5] = {0x81,0x4E,0xF1,0x81,0x41};             //COMUNICACION//
byte message186[5] = {0x81,0x5E,0xF1,0x81,0x51};             //COMUNICACION//
byte message187[5] = {0x81,0x6E,0xF1,0x81,0x61};             //COMUNICACION// 
byte message188[5] = {0x81,0x7E,0xF1,0x81,0x71};             //COMUNICACION//
byte message189[5] = {0x81,0x8E,0xF1,0x81,0x81};             //COMUNICACION//
byte message190[5] = {0x81,0x9E,0xF1,0x81,0x91};             //COMUNICACION//
byte message191[5] = {0x81,0xE0,0xF1,0x81,0xD3};             //COMUNICACION// 
byte message192[5] = {0x81,0xE1,0xF1,0x81,0xD4};             //COMUNICACION//
byte message193[5] = {0x81,0xE2,0xF1,0x81,0xD5};             //COMUNICACION//
byte message194[5] = {0x81,0xE3,0xF1,0x81,0xD6};             //COMUNICACION//
byte message195[5] = {0x81,0xE4,0xF1,0x81,0xD7};             //COMUNICACION// 
byte message196[5] = {0x81,0xE5,0xF1,0x81,0xD8};             //COMUNICACION//
byte message197[5] = {0x81,0xE6,0xF1,0x81,0xD9};             //COMUNICACION//
byte message198[5] = {0x81,0xE7,0xF1,0x81,0xDA};             //COMUNICACION//
byte message199[5] = {0x81,0xE8,0xF1,0x81,0xDB};             //COMUNICACION//
byte message200[5] = {0x81,0xE9,0xF1,0x81,0xDC};             //COMUNICACION// 
byte message201[5] = {0x81,0x0F,0xF1,0x81,0x02};             //COMUNICACION//
byte message202[5] = {0x81,0x1F,0xF1,0x81,0x12};             //COMUNICACION//
byte message203[5] = {0x81,0x2F,0xF1,0x81,0x22};             //COMUNICACION//
byte message204[5] = {0x81,0x3F,0xF1,0x81,0x32};             //COMUNICACION//
byte message205[5] = {0x81,0x4F,0xF1,0x81,0x42};             //COMUNICACION// 
byte message206[5] = {0x81,0x5F,0xF1,0x81,0x52};             //COMUNICACION//
byte message207[5] = {0x81,0x6F,0xF1,0x81,0x62};             //COMUNICACION//
byte message208[5] = {0x81,0x7F,0xF1,0x81,0x72};             //COMUNICACION//
byte message209[5] = {0x81,0x8F,0xF1,0x81,0x82};             //COMUNICACION//
byte message210[5] = {0x81,0x9F,0xF1,0x81,0x92};             //COMUNICACION// 
byte message211[5] = {0x81,0xF0,0xF1,0x81,0xE3};             //COMUNICACION//
byte message212[5] = {0x81,0xF1,0xF1,0x81,0xE4};             //COMUNICACION//
byte message213[5] = {0x81,0xF2,0xF1,0x81,0xE5};             //COMUNICACION//
byte message214[5] = {0x81,0xF3,0xF1,0x81,0xE6};             //COMUNICACION//
byte message215[5] = {0x81,0xF4,0xF1,0x81,0xE7};             //COMUNICACION//
byte message216[5] = {0x81,0xF5,0xF1,0x81,0xE8};             //COMUNICACION//
byte message217[5] = {0x81,0xF6,0xF1,0x81,0xE9};             //COMUNICACION//
byte message218[5] = {0x81,0xF7,0xF1,0x81,0xEA};             //COMUNICACION// 
byte message219[5] = {0x81,0xF8,0xF1,0x81,0xEB};             //COMUNICACION//
byte message220[5] = {0x81,0xF9,0xF1,0x81,0xEC};             //COMUNICACION//

//-----------------------------------------------------------------------------------
void setup() {
    Serial.begin(57600);
  pinMode(TX, OUTPUT);
}
//-----------------------------------------------------------------------------------
void loop() {
  fastinit();
  comunicacion1();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion2();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion3();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion4();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion5();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion6();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion7();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion8();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion9();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion10();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion11();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion12();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
    fastinit();
  comunicacion13();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion14();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion15();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion16();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion17();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion18();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion19();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion20();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion21();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion22();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion23();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion24();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion25();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion26();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion27();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion28();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion29();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion30();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion31();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion32();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion33();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion34();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion35();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion36();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion37();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion38();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion39();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion40();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion41();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion42();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion43();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion44();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion45();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
    fastinit();
  comunicacion46();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion47();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion48();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion49();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion50();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion51();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion52();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion53();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion54();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion55();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion56();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion57();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion58();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion59();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion60();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion61();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion62();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion62();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion64();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion65();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion66();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion67();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion68();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion69();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion70();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion71();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion72();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion73();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion74();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion75();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion76();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion77();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion78();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
    fastinit();
  comunicacion79();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion80();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion81();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion82();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion83();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion84();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion85();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion86();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion87();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion88();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion89();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion90();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion91();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion92();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion93();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion94();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion95();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion96();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion97();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion98();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion99();
  delay(50);
  recievedata();
  delay(360);
  //--------------------------------------------------------------------------------------------------------
  fastinit();
  comunicacion101();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion102();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion103();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion104();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion105();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion106();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion107();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion108();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion109();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion110();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion111();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion112();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
    fastinit();
  comunicacion113();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion114();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion115();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion116();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion117();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion118();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion119();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion120();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion121();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion122();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion123();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion124();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion125();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion126();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion127();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion128();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion129();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion130();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion131();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion132();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion133();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion134();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion135();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion136();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion137();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion138();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion139();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion140();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion141();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion142();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion143();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion144();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion145();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
    fastinit();
  comunicacion146();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion147();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion148();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion149();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion150();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion151();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion152();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion153();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion154();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion155();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion156();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion157();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion158();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion159();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion160();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion161();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion162();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion163();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion164();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion165();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion166();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion167();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion168();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion169();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion170();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion171();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion172();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion173();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion174();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion175();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion176();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion177();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion178();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
    fastinit();
  comunicacion179();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion180();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion181();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion182();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion183();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion184();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion185();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion186();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion187();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion188();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion189();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion190();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion191();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion192();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion193();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion194();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion195();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion196();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion197();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion198();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion199();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion200();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion201();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion202();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion203();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion204();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion205();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion206();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion207();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion208();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion209();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion210();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion211();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion212();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion213();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion214();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion215();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion216();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion217();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion218();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  fastinit();
  comunicacion219();
  delay(50);
  recievedata();
  delay(360);
  fastinit();
  comunicacion220();
  delay(50);
  recievedata();
  delay(360);
  Serial.println("");
  Serial.println("FIN COMUNICACION PRUEBA");
  //fincomun();
  //delay(50);
  recievedata();
  delay(50000);
}

//-----FAST INIT---------------------------------------------------------------------
void fastinit(){
  if (!mode) {
    Serial.println("starting comunication (fastinit)");
    digitalWrite (TX, HIGH);  
    delay(360);             
    digitalWrite (TX, LOW);  
    delay(25);
    digitalWrite (TX, HIGH); 
    delay(25);               
    mySerial.begin(10400);  
    Serial.println("starting serial comunication");
    mode++;
  }
}

//-----ENVIO DE PAQUETES-------------------------------------------------------------
void comunicacion1() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message1[i]);
    Serial.print(message1[i],HEX);
  } 
}
void comunicacion2() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message2[i]);
    Serial.print(message2[i],HEX);
  } 
}
void comunicacion3() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message3[i]);
    Serial.print(message3[i],HEX);
  } 
}
void comunicacion4() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message4[i]);
    Serial.print(message4[i],HEX);
  } 
}
void comunicacion5() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message5[i]);
    Serial.print(message5[i],HEX);
  } 
}
void comunicacion6() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message6[i]);
    Serial.print(message6[i],HEX);
  } 
}
void comunicacion7() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message7[i]);
    Serial.print(message7[i],HEX);
  } 
}
void comunicacion8() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message8[i]);
    Serial.print(message8[i],HEX);
  } 
}
void comunicacion9() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message9[i]);
    Serial.print(message9[i],HEX);
  } 
}
void comunicacion10() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message10[i]);
    Serial.print(message10[i],HEX);
  } 
}
void comunicacion11() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message11[i]);
    Serial.print(message11[i],HEX);
  } 
}
void comunicacion12() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message12[i]);
    Serial.print(message12[i],HEX);
  } 
}
void comunicacion13() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message13[i]);
    Serial.print(message13[i],HEX);
  } 
}
void comunicacion14() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message14[i]);
    Serial.print(message14[i],HEX);
  } 
}
void comunicacion15() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message15[i]);
    Serial.print(message15[i],HEX);
  } 
}
void comunicacion16() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message16[i]);
    Serial.print(message16[i],HEX);
  } 
}
void comunicacion17() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message17[i]);
    Serial.print(message17[i],HEX);
  } 
}
void comunicacion18() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message18[i]);
    Serial.print(message18[i],HEX);
  } 
}
void comunicacion19() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message19[i]);
    Serial.print(message19[i],HEX);
  } 
}
void comunicacion20() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message20[i]);
    Serial.print(message20[i],HEX);
  } 
}
void comunicacion21() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message21[i]);
    Serial.print(message21[i],HEX);
  } 
}
void comunicacion22() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message22[i]);
    Serial.print(message22[i],HEX);
  } 
}
void comunicacion23() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message23[i]);
    Serial.print(message23[i],HEX);
  } 
}
void comunicacion24() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message24[i]);
    Serial.print(message24[i],HEX);
  } 
}
void comunicacion25() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message25[i]);
    Serial.print(message25[i],HEX);
  } 
}
void comunicacion26() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message26[i]);
    Serial.print(message26[i],HEX);
  } 
}
void comunicacion27() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message27[i]);
    Serial.print(message27[i],HEX);
  } 
}
void comunicacion28() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message28[i]);
    Serial.print(message28[i],HEX);
  } 
}
void comunicacion29() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message29[i]);
    Serial.print(message29[i],HEX);
  } 
}
void comunicacion30() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message30[i]);
    Serial.print(message30[i],HEX);
  } 
}
void comunicacion31() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message31[i]);
    Serial.print(message31[i],HEX);
  } 
}
void comunicacion32() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message32[i]);
    Serial.print(message32[i],HEX);
  } 
}
void comunicacion33() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message33[i]);
    Serial.print(message33[i],HEX);
  } 
}
void comunicacion34() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message34[i]);
    Serial.print(message34[i],HEX);
  } 
}
void comunicacion35() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message35[i]);
    Serial.print(message35[i],HEX);
  } 
}
void comunicacion36() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message36[i]);
    Serial.print(message36[i],HEX);
  } 
}
void comunicacion37() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message37[i]);
    Serial.print(message37[i],HEX);
  } 
}
void comunicacion38() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message38[i]);
    Serial.print(message38[i],HEX);
  } 
}
void comunicacion39() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message39[i]);
    Serial.print(message39[i],HEX);
  } 
}
void comunicacion40() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message40[i]);
    Serial.print(message40[i],HEX);
  } 
}
void comunicacion41() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message41[i]);
    Serial.print(message41[i],HEX);
  } 
}
void comunicacion42() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message42[i]);
    Serial.print(message42[i],HEX);
  } 
}
void comunicacion43() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message43[i]);
    Serial.print(message43[i],HEX);
  } 
}
void comunicacion44() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message44[i]);
    Serial.print(message44[i],HEX);
  } 
}
void comunicacion45() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message45[i]);
    Serial.print(message45[i],HEX);
  } 
}
void comunicacion46() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message46[i]);
    Serial.print(message46[i],HEX);
  } 
}
void comunicacion47() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message47[i]);
    Serial.print(message47[i],HEX);
  } 
}
void comunicacion48() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message48[i]);
    Serial.print(message48[i],HEX);
  } 
}
void comunicacion49() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message49[i]);
    Serial.print(message49[i],HEX);
  } 
}
void comunicacion50() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message50[i]);
    Serial.print(message50[i],HEX);
  } 
}
void comunicacion51() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message51[i]);
    Serial.print(message51[i],HEX);
  } 
}
void comunicacion52() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message52[i]);
    Serial.print(message52[i],HEX);
  } 
}
void comunicacion53() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message53[i]);
    Serial.print(message53[i],HEX);
  } 
}
void comunicacion54() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message54[i]);
    Serial.print(message54[i],HEX);
  } 
}
void comunicacion55() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message55[i]);
    Serial.print(message55[i],HEX);
  } 
}
void comunicacion56() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message56[i]);
    Serial.print(message56[i],HEX);
  } 
}
void comunicacion57() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message57[i]);
    Serial.print(message57[i],HEX);
  } 
}
void comunicacion58() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message58[i]);
    Serial.print(message58[i],HEX);
  } 
}
void comunicacion59() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message59[i]);
    Serial.print(message59[i],HEX);
  } 
}
void comunicacion60() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message60[i]);
    Serial.print(message60[i],HEX);
  } 
}
void comunicacion61() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message61[i]);
    Serial.print(message61[i],HEX);
  } 
}
void comunicacion62() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message62[i]);
    Serial.print(message62[i],HEX);
  } 
}
void comunicacion63() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message63[i]);
    Serial.print(message63[i],HEX);
  } 
}
void comunicacion64() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message64[i]);
    Serial.print(message64[i],HEX);
  } 
}
void comunicacion65() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message65[i]);
    Serial.print(message65[i],HEX);
  } 
}
void comunicacion66() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message66[i]);
    Serial.print(message66[i],HEX);
  } 
}
void comunicacion67() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message67[i]);
    Serial.print(message67[i],HEX);
  } 
}
void comunicacion68() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message68[i]);
    Serial.print(message68[i],HEX);
  } 
}
void comunicacion69() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message69[i]);
    Serial.print(message69[i],HEX);
  } 
}
void comunicacion70() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message70[i]);
    Serial.print(message70[i],HEX);
  } 
}
void comunicacion71() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message71[i]);
    Serial.print(message71[i],HEX);
  } 
}
void comunicacion72() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message72[i]);
    Serial.print(message72[i],HEX);
  } 
}
void comunicacion73() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message73[i]);
    Serial.print(message73[i],HEX);
  } 
}
void comunicacion74() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message74[i]);
    Serial.print(message74[i],HEX);
  } 
}
void comunicacion75() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message75[i]);
    Serial.print(message75[i],HEX);
  } 
}
void comunicacion76() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message76[i]);
    Serial.print(message76[i],HEX);
  } 
}
void comunicacion77() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message77[i]);
    Serial.print(message77[i],HEX);
  } 
}
void comunicacion78() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message78[i]);
    Serial.print(message78[i],HEX);
  } 
}
void comunicacion79() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message79[i]);
    Serial.print(message79[i],HEX);
  } 
}
void comunicacion80() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message80[i]);
    Serial.print(message80[i],HEX);
  } 
}
void comunicacion81() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message81[i]);
    Serial.print(message81[i],HEX);
  } 
}
void comunicacion82() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message82[i]);
    Serial.print(message82[i],HEX);
  } 
}
void comunicacion83() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message83[i]);
    Serial.print(message83[i],HEX);
  } 
}
void comunicacion84() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message84[i]);
    Serial.print(message84[i],HEX);
  } 
}
void comunicacion85() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message85[i]);
    Serial.print(message85[i],HEX);
  } 
}
void comunicacion86() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message86[i]);
    Serial.print(message86[i],HEX);
  } 
}
void comunicacion87() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message87[i]);
    Serial.print(message87[i],HEX);
  } 
}
void comunicacion88() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message88[i]);
    Serial.print(message88[i],HEX);
  } 
}
void comunicacion89() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message89[i]);
    Serial.print(message89[i],HEX);
  } 
}
void comunicacion90() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message90[i]);
    Serial.print(message90[i],HEX);
  } 
}
void comunicacion91() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message91[i]);
    Serial.print(message91[i],HEX);
  } 
}
void comunicacion92() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message92[i]);
    Serial.print(message92[i],HEX);
  } 
}
void comunicacion93() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message93[i]);
    Serial.print(message93[i],HEX);
  } 
}
void comunicacion94() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message94[i]);
    Serial.print(message94[i],HEX);
  } 
}
void comunicacion95() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message95[i]);
    Serial.print(message95[i],HEX);
  } 
}
void comunicacion96() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message96[i]);
    Serial.print(message96[i],HEX);
  } 
}
void comunicacion97() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message97[i]);
    Serial.print(message97[i],HEX);
  } 
}
void comunicacion98() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message98[i]);
    Serial.print(message98[i],HEX);
  } 
}
void comunicacion99() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message99[i]);
    Serial.print(message99[i],HEX);
  } 
}
void comunicacion101() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message101[i]);
    Serial.print(message101[i],HEX);
  } 
}
void comunicacion102() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message102[i]);
    Serial.print(message102[i],HEX);
  } 
}
void comunicacion103() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message103[i]);
    Serial.print(message103[i],HEX);
  } 
}
void comunicacion104() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message104[i]);
    Serial.print(message104[i],HEX);
  } 
}
void comunicacion105() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message105[i]);
    Serial.print(message105[i],HEX);
  } 
}
void comunicacion106() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message106[i]);
    Serial.print(message106[i],HEX);
  } 
}
void comunicacion107() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message107[i]);
    Serial.print(message107[i],HEX);
  } 
}
void comunicacion108() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message108[i]);
    Serial.print(message108[i],HEX);
  } 
}
void comunicacion109() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message109[i]);
    Serial.print(message109[i],HEX);
  } 
}
void comunicacion110() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message110[i]);
    Serial.print(message110[i],HEX);
  } 
}
void comunicacion111() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message111[i]);
    Serial.print(message111[i],HEX);
  } 
}
void comunicacion112() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message112[i]);
    Serial.print(message112[i],HEX);
  } 
}
void comunicacion113() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message113[i]);
    Serial.print(message113[i],HEX);
  } 
}
void comunicacion114() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message114[i]);
    Serial.print(message114[i],HEX);
  } 
}
void comunicacion115() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message115[i]);
    Serial.print(message115[i],HEX);
  } 
}
void comunicacion116() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message116[i]);
    Serial.print(message116[i],HEX);
  } 
}
void comunicacion117() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message117[i]);
    Serial.print(message117[i],HEX);
  } 
}
void comunicacion118() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message118[i]);
    Serial.print(message118[i],HEX);
  } 
}
void comunicacion119() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message119[i]);
    Serial.print(message119[i],HEX);
  } 
}
void comunicacion120() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message120[i]);
    Serial.print(message120[i],HEX);
  } 
}
void comunicacion121() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message121[i]);
    Serial.print(message121[i],HEX);
  } 
}
void comunicacion122() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message122[i]);
    Serial.print(message122[i],HEX);
  } 
}
void comunicacion123() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message123[i]);
    Serial.print(message123[i],HEX);
  } 
}
void comunicacion124() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message124[i]);
    Serial.print(message124[i],HEX);
  } 
}
void comunicacion125() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message125[i]);
    Serial.print(message125[i],HEX);
  } 
}
void comunicacion126() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message126[i]);
    Serial.print(message126[i],HEX);
  } 
}
void comunicacion127() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message127[i]);
    Serial.print(message127[i],HEX);
  } 
}
void comunicacion128() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message128[i]);
    Serial.print(message128[i],HEX);
  } 
}
void comunicacion129() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message129[i]);
    Serial.print(message129[i],HEX);
  } 
}
void comunicacion130() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message130[i]);
    Serial.print(message130[i],HEX);
  } 
}
void comunicacion131() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message131[i]);
    Serial.print(message131[i],HEX);
  } 
}
void comunicacion132() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message132[i]);
    Serial.print(message132[i],HEX);
  } 
}
void comunicacion133() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message133[i]);
    Serial.print(message133[i],HEX);
  } 
}
void comunicacion134() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message134[i]);
    Serial.print(message134[i],HEX);
  } 
}
void comunicacion135() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message135[i]);
    Serial.print(message135[i],HEX);
  } 
}
void comunicacion136() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message136[i]);
    Serial.print(message136[i],HEX);
  } 
}
void comunicacion137() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message137[i]);
    Serial.print(message137[i],HEX);
  } 
}
void comunicacion138() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message138[i]);
    Serial.print(message138[i],HEX);
  } 
}
void comunicacion139() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message139[i]);
    Serial.print(message139[i],HEX);
  } 
}
void comunicacion140() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message140[i]);
    Serial.print(message140[i],HEX);
  } 
}
void comunicacion141() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message141[i]);
    Serial.print(message141[i],HEX);
  } 
}
void comunicacion142() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message142[i]);
    Serial.print(message142[i],HEX);
  } 
}
void comunicacion143() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message143[i]);
    Serial.print(message143[i],HEX);
  } 
}
void comunicacion144() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message144[i]);
    Serial.print(message144[i],HEX);
  } 
}
void comunicacion145() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message145[i]);
    Serial.print(message145[i],HEX);
  } 
}
void comunicacion146() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message146[i]);
    Serial.print(message146[i],HEX);
  } 
}
void comunicacion147() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message147[i]);
    Serial.print(message147[i],HEX);
  } 
}
void comunicacion148() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message148[i]);
    Serial.print(message148[i],HEX);
  } 
}
void comunicacion149() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message149[i]);
    Serial.print(message149[i],HEX);
  } 
}
void comunicacion150() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message150[i]);
    Serial.print(message150[i],HEX);
  } 
}
void comunicacion151() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message151[i]);
    Serial.print(message151[i],HEX);
  } 
}
void comunicacion152() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message152[i]);
    Serial.print(message152[i],HEX);
  } 
}
void comunicacion153() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message153[i]);
    Serial.print(message153[i],HEX);
  } 
}
void comunicacion154() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message154[i]);
    Serial.print(message154[i],HEX);
  } 
}
void comunicacion155() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message155[i]);
    Serial.print(message155[i],HEX);
  } 
}
void comunicacion156() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message156[i]);
    Serial.print(message156[i],HEX);
  } 
}
void comunicacion157() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message157[i]);
    Serial.print(message157[i],HEX);
  } 
}
void comunicacion158() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message158[i]);
    Serial.print(message158[i],HEX);
  } 
}
void comunicacion159() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message159[i]);
    Serial.print(message159[i],HEX);
  } 
}
void comunicacion160() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message160[i]);
    Serial.print(message160[i],HEX);
  } 
}
void comunicacion161() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message161[i]);
    Serial.print(message161[i],HEX);
  } 
}
void comunicacion162() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message162[i]);
    Serial.print(message162[i],HEX);
  } 
}
void comunicacion163() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message163[i]);
    Serial.print(message163[i],HEX);
  } 
}
void comunicacion164() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message164[i]);
    Serial.print(message164[i],HEX);
  } 
}
void comunicacion165() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message165[i]);
    Serial.print(message165[i],HEX);
  } 
}
void comunicacion166() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message166[i]);
    Serial.print(message166[i],HEX);
  } 
}
void comunicacion167() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message167[i]);
    Serial.print(message167[i],HEX);
  } 
}
void comunicacion168() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message168[i]);
    Serial.print(message168[i],HEX);
  } 
}
void comunicacion169() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message169[i]);
    Serial.print(message169[i],HEX);
  } 
}
void comunicacion170() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message170[i]);
    Serial.print(message170[i],HEX);
  } 
}
void comunicacion171() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message171[i]);
    Serial.print(message171[i],HEX);
  } 
}
void comunicacion172() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message172[i]);
    Serial.print(message172[i],HEX);
  } 
}
void comunicacion173() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message173[i]);
    Serial.print(message173[i],HEX);
  } 
}
void comunicacion174() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message174[i]);
    Serial.print(message174[i],HEX);
  } 
}
void comunicacion175() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message175[i]);
    Serial.print(message175[i],HEX);
  } 
}
void comunicacion176() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message176[i]);
    Serial.print(message176[i],HEX);
  } 
}
void comunicacion177() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message177[i]);
    Serial.print(message177[i],HEX);
  } 
}
void comunicacion178() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message178[i]);
    Serial.print(message178[i],HEX);
  } 
}
void comunicacion179() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message179[i]);
    Serial.print(message179[i],HEX);
  } 
}
void comunicacion180() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message180[i]);
    Serial.print(message180[i],HEX);
  } 
}
void comunicacion181() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message181[i]);
    Serial.print(message181[i],HEX);
  } 
}
void comunicacion182() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message182[i]);
    Serial.print(message182[i],HEX);
  } 
}
void comunicacion183() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message183[i]);
    Serial.print(message183[i],HEX);
  } 
}
void comunicacion184() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message184[i]);
    Serial.print(message184[i],HEX);
  } 
}
void comunicacion185() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message185[i]);
    Serial.print(message185[i],HEX);
  } 
}
void comunicacion186() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message186[i]);
    Serial.print(message186[i],HEX);
  } 
}
void comunicacion187() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message187[i]);
    Serial.print(message187[i],HEX);
  } 
}
void comunicacion188() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message188[i]);
    Serial.print(message188[i],HEX);
  } 
}
void comunicacion189() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message189[i]);
    Serial.print(message189[i],HEX);
  } 
}
void comunicacion190() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message190[i]);
    Serial.print(message190[i],HEX);
  } 
}
void comunicacion191() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message191[i]);
    Serial.print(message191[i],HEX);
  } 
}
void comunicacion192() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message192[i]);
    Serial.print(message192[i],HEX);
  } 
}
void comunicacion193() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message193[i]);
    Serial.print(message193[i],HEX);
  } 
}
void comunicacion194() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message194[i]);
    Serial.print(message194[i],HEX);
  } 
}
void comunicacion195() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message195[i]);
    Serial.print(message195[i],HEX);
  } 
}
void comunicacion196() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message196[i]);
    Serial.print(message196[i],HEX);
  } 
}
void comunicacion197() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message197[i]);
    Serial.print(message197[i],HEX);
  } 
}
void comunicacion198() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message198[i]);
    Serial.print(message198[i],HEX);
  } 
}
void comunicacion199() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message199[i]);
    Serial.print(message199[i],HEX);
  } 
}
void comunicacion200() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message200[i]);
    Serial.print(message200[i],HEX);
  } 
}
void comunicacion201() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message201[i]);
    Serial.print(message201[i],HEX);
  } 
}
void comunicacion202() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message202[i]);
    Serial.print(message202[i],HEX);
  } 
}
void comunicacion203() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message203[i]);
    Serial.print(message203[i],HEX);
  } 
}
void comunicacion204() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message204[i]);
    Serial.print(message204[i],HEX);
  } 
}
void comunicacion205() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message205[i]);
    Serial.print(message205[i],HEX);
  } 
}
void comunicacion206() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message206[i]);
    Serial.print(message206[i],HEX);
  } 
}
void comunicacion207() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message207[i]);
    Serial.print(message207[i],HEX);
  } 
}
void comunicacion208() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message208[i]);
    Serial.print(message208[i],HEX);
  } 
}
void comunicacion209() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message209[i]);
    Serial.print(message209[i],HEX);
  } 
}
void comunicacion210() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message210[i]);
    Serial.print(message210[i],HEX);
  } 
}
void comunicacion211() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message211[i]);
    Serial.print(message211[i],HEX);
  } 
}
void comunicacion212() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message212[i]);
    Serial.print(message212[i],HEX);
  } 
}
void comunicacion213() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message213[i]);
    Serial.print(message213[i],HEX);
  } 
}
void comunicacion214() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message214[i]);
    Serial.print(message214[i],HEX);
  } 
}
void comunicacion215() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message215[i]);
    Serial.print(message215[i],HEX);
  } 
}
void comunicacion216() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message216[i]);
    Serial.print(message216[i],HEX);
  } 
}
void comunicacion217() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message217[i]);
    Serial.print(message217[i],HEX);
  } 
}
void comunicacion218() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message218[i]);
    Serial.print(message218[i],HEX);
  } 
}
void comunicacion219() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message219[i]);
    Serial.print(message219[i],HEX);
  } 
}
void comunicacion220() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message220[i]);
    Serial.print(message220[i],HEX);
  } 
}


//-----RESPUESTAS DE DATOS----------------------------------------------------------------------
void recievedata() {
  int i = 0;
  int dataok = 0;
  Serial.println("   waiting for data");
  while (!dataok) {
    int time = millis();
    if ((timeold + timeout) < time) {
      timeold = time;
      Serial.println("  TIMEOUT");
      mode = 0;
      mySerial.end();
      return;  
    }
    if (mySerial.available()) {
      byte inByte = mySerial.read();
      Serial.print("");
      Serial.println(inByte,HEX);
    }
    if (Serial.available()) {
      byte inByte = Serial.read();
      mySerial.print("");
      mySerial.print(inByte,HEX);
      
    }
  }
}
  Нашли адрес теперь берем и пробуем инициализацию
  Fast init (в строке 10 заменяме 0х11 на свой адрес и пересчитываем контрольную сумму)
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;
int dotdelay = 1000;
int timeout = 10100;
int timeold;
int messagelength = 5;

byte message[5] = {0x81,0x11,0xF1,0x81,0x04}; //0x11 меняем на свой адрес
void setup() {
  Serial.begin(115200);
  pinMode(TX, OUTPUT);
       
}

void loop() {
   fastinit();
   sendrequest();
   delay(50);
   recievedata();
}
//FAST INIT 5baud--------------------------------------
void fastinit(){
  if (!mode) {
    Serial.println("starting comunication (fastinit)");
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    Serial.println("starting serial comunication");
    mode++;
  }
}

//PAQUETE SEND INIT-----------------------------------------------------------
void sendrequest() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message[i]);
    Serial.print(message[i],HEX);
  } 
}

//RESEBIR DATA---------------------------------------------------
void recievedata() {
  int i = 0;
  int dataok = 0;
  Serial.println("   waiting for data");
  while (!dataok) {
    int time = millis();
    if ((timeold + timeout) < time) {
      timeold = time;
      Serial.println("   TIMEOUT");
      mode = 0;
      mySerial.end();
      return;
      }
    if (mySerial.available()) {
      byte inByte = mySerial.read();
      Serial.print("");
      Serial.println(inByte,HEX);
      }
      if (Serial.available()) {
      byte inByte = Serial.read();
      mySerial.print("");
      mySerial.print(inByte,HEX);
    }
  }
}
  Не пошло? пробуем 
  Fast init 5 Baud (в строке 10 заменяме 0х11 на свой адрес и пересчитываем контрольную сумму)
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;
int dotdelay = 1000;
int timeout = 10100;
int timeold;
int messagelength = 1;
                                             //0x11 меняем на свой адрес
byte message1[1] = {0x81}; byte message2[1] = {0x11}; byte message3[1] = {0xF1}; byte message4[1] = {0x81}; byte message5[1] = {0x04};
void setup() {
  Serial.begin(115200);
  pinMode(TX, OUTPUT);
       
}

void loop() {
   fastinit();
   sendrequest();
   recievedata();
}
//FAST INIT 5baud--------------------------------------
void fastinit(){
  if (!mode) {
    Serial.println("starting comunication (fastinit)");
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    Serial.println("starting serial comunication");
    mode++;
  }
}
void sendrequest(){
  sendrequest1();
  delay(5);
  sendrequest2();
  delay(5);
  sendrequest3();
  delay(5);
  sendrequest4();
  delay(5);
  sendrequest5();
  delay(5);
  delay(50);
  Serial.println("");
  }
//PAQUETE SEND INIT-----------------------------------------------------------
void sendrequest1() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message1[i]);
    Serial.print(message1[i],HEX);
  } 
}
void sendrequest2() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message2[i]);
    Serial.print(message2[i],HEX);
  } 
}
void sendrequest3() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message3[i]);
    Serial.print(message3[i],HEX);
  } 
}
void sendrequest4() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message4[i]);
    Serial.print(message4[i],HEX);
  } 
}
void sendrequest5() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message5[i]);
    Serial.print(message5[i],HEX);
  } 
}
//RESEBIR DATA---------------------------------------------------
void recievedata() {
  int i = 0;
  int dataok = 0;
  Serial.println("   waiting for data");
  while (!dataok) {
    int time = millis();
    if ((timeold + timeout) < time) {
      timeold = time;
      Serial.println("   TIMEOUT");
      mode = 0;
      mySerial.end();
      return;
      }
    if (mySerial.available()) {
      byte inByte = mySerial.read();
      Serial.print("");
      Serial.println(inByte,HEX);
      }
      if (Serial.available()) {
      byte inByte = Serial.read();
      mySerial.print("");
      mySerial.print(inByte,HEX);
    }
  }
}
  Если одна из инициализаций сработал, то пробуем увидеть температуру
  Fast init 5baud + present + температура (что такое present можно прочитать в 11 посте)
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;
//variables
int dotdelay = 1000;
int timeout = 1000;
int timeold;
int messagelength = 1;
int messagelength2 = 5;
int messagelength3 = 6;
 //в трех нижних строках сообщений 0x11 меняем на свой адрес и пересчитываем контрольную сумму
byte message1[1] = {0x81}; byte message2[1] = {0x11}; byte message3[1] = {0xF1}; byte message4[1] = {0x81}; byte message5[1] = {0x04};
byte message6[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A};
byte message7[5] = {0x81,0x11,0xF1,0x3E,0xC1};
void setup() {
    Serial.begin(115200);
  pinMode(TX, OUTPUT);
  
}

void loop() {
  fastinit();
  sendrequest1();
  delay(5);
  sendrequest2();
  delay(5);
  sendrequest3();
  delay(5);
  sendrequest4();
  delay(5);
  sendrequest5();
  delay(5);
  delay(50);
  Serial.println("");
  
  recievedata();   
  
}

void fastinit(){
  if (!mode) {
    Serial.println("starting comunication (fastinit)");
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    Serial.println("starting serial comunication");
    mode++;
  }
}
//-----------------------------------------------------------
void sendrequest1() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message1[i]);
    Serial.print(message1[i],HEX);
  } 
}
void sendrequest2() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message2[i]);
    Serial.print(message2[i],HEX);
  } 
}
void sendrequest3() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message3[i]);
    Serial.print(message3[i],HEX);
  } 
}
void sendrequest4() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message4[i]);
    Serial.print(message4[i],HEX);
  } 
}
void sendrequest5() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message5[i]);
    Serial.print(message5[i],HEX);
  } 
}
//---------------------------------------------------------------------
void pids() {
  for (int i = 0; ((i < messagelength3  ) & (mode == 1)); i++) {
    mySerial.write(message6[i]);
    Serial.print(message6[i],HEX);
  } 
}
void present() {
  for (int i = 0; ((i < messagelength2) & (mode == 1)); i++) {
    mySerial.write(message7[i]);
    Serial.print(message7[i],HEX);
  } 
}

void recievedata() {
      present();
      delay(55);
      Serial.println("");
  int i = 0;
  int dataok = 0;
  Serial.println("   waiting for data");
  while (!dataok) {
    int time = millis();
    if ((timeold + timeout) < time) {
      timeold = time;
      Serial.println("   TIMEOUT");
      
      pids();
      delay(55);
      Serial.println("");
      recievedata();
      return;
    }
    if (mySerial.available()) {
      byte inByte = mySerial.read();
      Serial.print("");
      Serial.print(inByte,HEX);
    }
  }
}
  Fast init + present + температура
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;
//variables
int dotdelay = 1000;
int timeout = 1000;
int timeold;
int messagelength = 1;
int messagelength2 = 5;
int messagelength3 = 6;
 //в трех нижних строках сообщений 0x11 меняем на свой адрес
byte message1[5] = {0x81,0x11,0xF1,0x81,0x04}; //0x11 меняем на свой адрес и пересчитываем контрольную суму
byte message2[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A};
byte message3[5] = {0x81,0x11,0xF1,0x3E,0xC1};
void setup() {
    Serial.begin(115200);
  pinMode(TX, OUTPUT);
  
}

void loop() {
  fastinit();
  sendrequest1();
  delay(5);
  delay(50);
  Serial.println("");
  
  recievedata();   
  
}

void fastinit(){
  if (!mode) {
    Serial.println("starting comunication (fastinit)");
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    Serial.println("starting serial comunication");
    mode++;
  }
}
//-----------------------------------------------------------
void sendrequest1() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message1[i]);
    Serial.print(message1[i],HEX);
  } 
}

//---------------------------------------------------------------------
void pids() {
  for (int i = 0; ((i < messagelength3  ) & (mode == 1)); i++) {
    mySerial.write(message2[i]);
    Serial.print(message2[i],HEX);
  } 
}
void present() {
  for (int i = 0; ((i < messagelength2) & (mode == 1)); i++) {
    mySerial.write(message3[i]);
    Serial.print(message3[i],HEX);
  } 
}

void recievedata() {
      present();
      delay(55);
      Serial.println("");
  int i = 0;
  int dataok = 0;
  Serial.println("   waiting for data");
  while (!dataok) {
    int time = millis();
    if ((timeold + timeout) < time) {
      timeold = time;
      Serial.println("   TIMEOUT");
      
      pids();
      delay(55);
      Serial.println("");
      recievedata();
      return;
    }
    if (mySerial.available()) {
      byte inByte = mySerial.read();
      Serial.print("");
      Serial.print(inByte,HEX);
    }
  }
}
  Надеюсь что у вас получилось и вы радуетесь как когда-то радовался я. Это значит что, одни из тружных моментов пройден.
  Переходим ко второй сложной части это запрос 2101. Суть получения сообщения в котором заложены все данные мотора. Пробуем запрос 2101. 
  Fast Init 5 Baud + 2101
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;
//variables
int dotdelay = 1000;
int timeout = 1000;
int timeold;
int messagelength = 1;
int messagelength2 = 5;
int messagelength3 = 6;
 //в трех нижних строках сообщений 0x11 меняем на свой адрес пересчитываем контрольную сумму
byte message1[1] = {0x81}; byte message2[1] = {0x11}; byte message3[1] = {0xF1}; byte message4[1] = {0x81}; byte message5[1] = {0x04};
byte message6[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};
byte message7[5] = {0x81,0x11,0xF1,0x3E,0xC1};
void setup() {
    Serial.begin(115200);
  pinMode(TX, OUTPUT);
  
}

void loop() {
  fastinit();
  sendrequest1();
  delay(5);
  sendrequest2();
  delay(5);
  sendrequest3();
  delay(5);
  sendrequest4();
  delay(5);
  sendrequest5();
  delay(5);
  delay(50);
  Serial.println("");
  
  recievedata();   
  
}

void fastinit(){
  if (!mode) {
    Serial.println("starting comunication (fastinit)");
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    Serial.println("starting serial comunication");
    mode++;
  }
}
//-----------------------------------------------------------
void sendrequest1() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message1[i]);
    Serial.print(message1[i],HEX);
  } 
}
void sendrequest2() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message2[i]);
    Serial.print(message2[i],HEX);
  } 
}
void sendrequest3() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message3[i]);
    Serial.print(message3[i],HEX);
  } 
}
void sendrequest4() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message4[i]);
    Serial.print(message4[i],HEX);
  } 
}
void sendrequest5() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message5[i]);
    Serial.print(message5[i],HEX);
  } 
}
//---------------------------------------------------------------------
void pids() {
  for (int i = 0; ((i < messagelength3  ) & (mode == 1)); i++) {
    mySerial.write(message6[i]);
    Serial.print(message6[i],HEX);
  } 
}
void present() {
  for (int i = 0; ((i < messagelength2) & (mode == 1)); i++) {
    mySerial.write(message7[i]);
    Serial.print(message7[i],HEX);
  } 
}

void recievedata() {
      present();
      delay(55);
      Serial.println("");
  int i = 0;
  int dataok = 0;
  Serial.println("   waiting for data");
  while (!dataok) {
    int time = millis();
    if ((timeold + timeout) < time) {
      timeold = time;
      Serial.println("   TIMEOUT");
      
      pids();
      delay(55);
      Serial.println("");
      recievedata();
      return;
    }
    if (mySerial.available()) {
      byte inByte = mySerial.read();
      Serial.print("");
      Serial.print(inByte,HEX);
    }
  }
}
  Fast Init + 2101
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;
//variables
int dotdelay = 1000;
int timeout = 1000;
int timeold;
int messagelength = 5;
int messagelength2 = 5;
int messagelength3 = 6;
 //в трех нижних строках сообщений 0x11 меняем на свой адрес и пересчитываем контрольную сумму
byte message1[5] = {0x81,0x11,0xF1,0x81,0x04};
byte message2[6] = {0x82,0x11,0xF1,0x21,0x01,0x8A};
byte message3[5] = {0x81,0x11,0xF1,0x3E,0xC1};
void setup() {
    Serial.begin(115200);
  pinMode(TX, OUTPUT);
  
}

void loop() {
  fastinit();
  sendrequest1();
  delay(50);
  Serial.println("");
  
  recievedata();   
  
}

void fastinit(){
  if (!mode) {
    Serial.println("starting comunication (fastinit)");
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    Serial.println("starting serial comunication");
    mode++;
  }
}
//-----------------------------------------------------------
void sendrequest1() {
  for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
    mySerial.write(message1[i]);
    Serial.print(message1[i],HEX);
  } 
}

//---------------------------------------------------------------------
void pids() {
  for (int i = 0; ((i < messagelength3  ) & (mode == 1)); i++) {
    mySerial.write(message2[i]);
    Serial.print(message2[i],HEX);
  } 
}
void present() {
  for (int i = 0; ((i < messagelength2) & (mode == 1)); i++) {
    mySerial.write(message3[i]);
    Serial.print(message3[i],HEX);
  } 
}

void recievedata() {
      present();
      delay(55);
      Serial.println("");
  int i = 0;
  int dataok = 0;
  Serial.println("   waiting for data");
  while (!dataok) {
    int time = millis();
    if ((timeold + timeout) < time) {
      timeold = time;
      Serial.println("   TIMEOUT");
      
      pids();
      delay(55);
      Serial.println("");
      recievedata();
      return;
    }
    if (mySerial.available()) {
      byte inByte = mySerial.read();
      Serial.print("");
      Serial.print(inByte,HEX);
    }
  }
}
  Надеюсь у вас все получилось и вы получили нужные ответы от блока мотора, длинное сообщение. Если вам повезло и у вас все ток же как и у меня, возможные исключение адреса блока и двух ключей то, можете все собирать и уже пробовать полный скетч, он в конце статьи, в нем все очень хорошо прокоментировано. Не забыввем подправить в скетче адрес блока и все что у вас отличается. 
  
  Для тех у кого ответ 21 01 отличается или вы попробовали уже готовый вариант и у вас не совпадают данные, значит вам
  нужно расщифровать за что и какие байты в ответе отвечают. Схема подсоединения эмулятора показана в 384 посте.
  Берем скетч эмулятор EMUL_MaksVV вот но
class BUTTON {
public:
//================================================================
static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 1200000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 1600; // длительность отслеживания нажатия и удержания.
//================================================================
boolean click_down;
boolean click_up;
boolean doubleclick;
boolean timer;
boolean retention;
//=================================
unsigned long m;
boolean  p;
boolean  b;
boolean dc;
byte     c;
boolean  t;
boolean  r;
//=================================
byte _pb;
//=================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//====
click_down      = 0;
click_up        = 0;
doubleclick     = 0;
timer           = 0;
retention       = 0;
//====
m  =      millis();
p  = digitalRead(_pb);
b  =                0;
dc =                0;
c  =                0;
t  =                0;
r  =                0;
//====
}

void read() {
//=======================================================
unsigned long nm =      millis();
boolean       np = digitalRead(_pb);
//=================
boolean nb  = 0;
boolean ndc = 0;
boolean nt  = 0;
boolean nr  = 0;
//================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//=================
if (np != p) {p = np; m = nm; }
//=======================================================
if (nm - m > bounce_) {nb = 1;}
if (nm - m > doubleclick_) {ndc = 1;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}
if (nb != b) {b = nb;
if (p == 0 && b == 0) {click_down = 1;
++c;      if (c == 2) {c = 0; doubleclick = 1;}
}
if (p == 1 && b == 1) {click_up = 1;}
}
//=======================================================
if (nm - m > timer_) {nt = 1;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {timer = 1;}
}
//=======================================================
if (nm - m > retention_) {nr = 1;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {retention = 1;}
}
//=======================================================
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






BUTTON button(10); // вход кнопки (digital pin arduino)

int bytenumber = 0;


///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
unsigned long prevTimedelay = 0; 

int length5 = 5;
int length7 = 7;
byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения

byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01};

int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};
                       //  A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03
                       //  92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69 
                       //  03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC 

int length100 = 100;

byte messageIDEN2[100] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37,
0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20,
0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D,
0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44,
0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07,
0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x031, 0x30, 0x32, 0x36, 0x38, 0xFF};


int length81 = 81;
byte messagePIDS[81] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x0C, //Coolant Temperature
0x37, //Coolant Temperature
0x01, //Actual injection start
0x92, //Actual injection start
0x0C, //Engine Oil Temperature
0xEB, //Engine Oil Temperature
0x00, //Accelerator Position Sensor Signal
0x00, //Accelerator Position Sensor Signal
0x02, //System Voltage
0xB3, //System Voltage
0x00, //High Pressure Diagnosis 1
0x00, //High Pressure Diagnosis 1
0x11, //Mass Air Flow Sensor
0x89, //Mass Air Flow Sensor
0x04, //Boost Pressure
0x30, //Boost Pressure
0x00, //High Pressure Diagnosis 2
0x00, //High Pressure Diagnosis 2
0x03, //Engine Speed
0x20, //Engine Speed
0x0B, //EGR Command (Exhaust-Gas Recirculation Command)
0x55, //EGR Command (Exhaust-Gas Recirculation Command)
0x03, //Barometer Sensor
0xA3, //Barometer Sensor
0x04, //Boost Pressure Command
0x2D, //Boost Pressure Command
0x03, //Desired Engine Idle Speed
0x20, //Desired Engine Idle Speed
0xEE, 
0xB9, 
0x00, //Vehicle Speed
0x00, //Vehicle Speed
0x00, //Vehicle Speed Command
0x00, //Vehicle Speed Command
0x0C, 
0x35, 
0x03, //Desired Injection Quantity
0x0A, //Desired Injection Quantity
0x02, //Injection Quantity
0xD9, //Injection Quantity
0x08, //Start of Delivery
0xA3, //Start of Delivery
0x01, //Pump Speed
0x90, //Pump Speed
0x0C, //Fuel Temperature
0x27, //Fuel Temperature
0xA0, 
0x00, 
0x01, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x5C, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x02, //Swirl Level Control Solenoid Valve Pulse Ratio
0x76, //Swirl Level Control Solenoid Valve Pulse Ratio
0xAD, 
0x08, 
0x01, 
0x30, 
0x00, //Pulse Ratio Boost Pressure Solenoid Valve
0x03, //Pulse Ratio Boost Pressure Solenoid Valve
0x01, //Desired Injection Start
0x7B, //Desired Injection Start
0x0B, //Intake Air Temperature
0xDB, //Intake Air Temperature
0x03, 
0xA3, 
0x00, 
0x02, 
0x1F};

int waitbyte=5;

unsigned long TimeLED, timerLED = 0;
bool timerenabledLED = 0;
#define TIMEREXPIRED_LED (TimeLED - timerLED)> 1200 // время включения светодиода если кнопка длительно нажата, мс

void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
pinMode (10, OUTPUT);
digitalWrite (10,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
}

void loop() {
button.read();
TimeLED = millis ();

if (button.click_down) { messagePIDS[bytenumber]++;  } // коротким нажатием на кнопку изменяем значение выбранного байта 
if (button.retention) { bytenumber++; digitalWrite (10,1) ; timerLED=TimeLED; timerenabledLED=1; 
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");} // длительным нажатием на кнопку изменяем номер байта, который будем менять

if (timerenabledLED){ if (TIMEREXPIRED_LED) {timerenabledLED=0;digitalWrite (10,0);}}



if (mySerial.available()) {
      delay(100);
     int k=0;
     byte inbyte=0;
     
  while( mySerial.available() && k < 100) {
     inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }

      Serial.print ("Recieve:   ");

    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");

if ((MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) {
  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
    Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
 
   }
if (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x3E && MessageRx[4]==0xC1) {
  Serial.println ("Prinyat zapros prisutstvia!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePRES[i]);
    Serial.print(messagePRES[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println ("");  
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
    Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
   Serial.print ("Otvechayu DEC:    ");
    for (int i = 0; i < length44; i++) {
   
    Serial.print(messageIDEN1[i]); Serial.print ("  ");
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
  Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println ("");  
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length100; i++) {
    mySerial.write(messageIDEN2[i]);
    Serial.print(messageIDEN2[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
  Serial.print ("Otvechayu DEC:    ");
 for (int i = 0; i < length100; i++) {
    
    Serial.print(messageIDEN2[i]); Serial.print ("  ");
    
   } 
   Serial.println("");
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
  Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length81; i++) {
    mySerial.write(messagePIDS[i]);
    if (i==31){  delay (113);Serial.println ("");}
    Serial.print(messagePIDS[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
 
   }
}
}
  что нужно подправлять в эмуляторе
строка в скетче//  строка      //описание
  в строке 108    //0x83, 0xF1, 0x11(ваш адрес блока), 0xC1, 0x6B, 0x8F, 0x40 // а keyword1 - 6B , keyword2 - 8F (заменяете на свои)
  в строке 109    //0x81, 0xF1, 0x11(ваш адрес блока), 0x7E, 0x01  //меняете на ваш адрес блока
  с 130 по 197    // указаны уже расшифромваные байты, вам нужно будет вставить просто через запятую весь ваш ответ на 2101 из снифера(сделаное ранее)
                     по примеру первого куска в 130 строке.
  112          // прописываем свои ответ IDEN1
  121          // прописываем свои ответ IDEN2
  241, 251,262,278,294    // 0х11 на свой адрес и свои контрольные суммы

Эмулятор для ОПКОМ+К лине адаптер от MaksVV обсуждается с поста 1150, читаем. 

  Когда запустите эмулятор то в ОПКОМе запишите все параметры на всех страницах. Есть два способа это смотреть в порт IDE и в ОПКОМ проги и нажатием кнопки на клавиатуре , стрелками вниз и в верх одним кликом перемещаемся по байтам в лево и в право по сообщению 2101, а дваойное нажатие этих кнопок меняет сам байт в большую сторону или в меньшую. Изменяя байт следим в ОПКОМе какой параметр меняется, записываем, байт такойто отвечает за то то. Сразу скажу что за каждый параметр отвечает 2 байта. И второй способ это в ручную менять в скетче эмулятора любой байт и загружать скетч и смотреть что поменялось и записывать. Я пользовался вторым способом. Ну вот и второй трудный шаг пройден. Теперь зная какие байты за что отвечают, то уже в готовом скетче подставляете формулы под свои байты. Все формулы и номера байтов есть в скетче. Подменяете в моем скетче: свои адреса, контрольные суммы, формулы к нужным байтам, заливаете и готово. Пробуем и радуемся. Конечный скетч, в нем все очень хорошо прокоментировано.
  /////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #include <UTouch.h>
  #include <UTFT.h>
  #include <SPI.h>
  #include <EEPROM.h>
  
  //pin 20 SCL , 21 SDA датчик реального времени
  #include <Wire.h>
  #include "RTClib.h"
  RTC_DS3231 rtc;       
  
  //датчик наружней температуры
  #include <OneWire.h>
  #define ONE_WIRE_BUS 8   
  OneWire oneWire(ONE_WIRE_BUS);
  #include <DallasTemperature.h>
  DallasTemperature sensors(&oneWire);
  
  //датчик внутринней температуры и влаги
  #include "DHT.h"
  #define DHTPIN 9   
  #define DHTTYPE DHT22 
  DHT dht(DHTPIN, DHTTYPE);
  
  ///////////////////////////////////////////////////////////////////////////////////
  //пины экрана и тача
  ///////////////////////////////////////////////////////////////////////////////////
  UTFT    myGLCD(31,38,39,40,41); 
  UTouch  myTouch(6,5,4,3,2);
  extern uint8_t GroteskBold16x32[];
  int x, y;
  char currentPage;
  float h;
  float t;
  bool Dvoet = 0;
  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  #define mySerial_gauge Serial2
  #define TX_gauge 16
  #define TX 13
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
  
  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  bool Init = 0;
  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool MessageParse = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
  
  int numberbyte = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 4;  
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100M = 0;           //расход на 100 км измеренный за поездку
  float L100 = 0;            //мгновенный расход литров на 100км
  float LHor = 0;           //мгновенный расход топлива литров в час
  float L100SR = 0;         //расход литров на 100км измеренный раз в интервал kmL  
  float L100SR_TFT = 0;     // самый средний из расходов на 100км, он выводится на экран

  int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};
  int FuelZamer[10]= {0};  // массив для измерения уровня (количества) топлива 
  int ZamerNumber = 0;     // номер замера уровня (количества) топлива 
  int n_eeprom = 0;        // текущий адрес ячейки еепром для записи расхода
  
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible
  
  //все что касается топлива
  float Fuel = 0;  //остаток топлива 
  float Fuel2 = 0;  //остаток мгновенного топлива байт 16 , датчика в баке
  int FuelIGN = 0;      // количество топлвива в баке на момент включения зажигания
  int Fuel_last = 0;   // для формул
  bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания 
  float FuelTrip = 0;     // количество литров топлива, израсходованное за один цикл включения зажигания
  
  //все что касается километража
  float kmAge = 0;             //пробег, полученный со щитка приборов
  int kmAgeIGN = 0;          //пробег который был в момент включения зажигания 
  int kmAge_last = 0;       // для формул
  bool flagkmAgeIGN = 0;     //флаг записан ли пробег в момент вкл. зажигания 
  float kmTrip = 0;            //пробег за один цикл включения зажигания
  int kmL = 10;               // интервал, через который будет происходить обновление среднего расхода на 100км
  int km = 0;              // переменная для расчетов
  int kmeeprom = 10;         // интервал, через который будет происходить подсчет среднеарифмитического расхода  L100SR_TFT
  int kmTFT =  0;     // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
  int kmREFUELING = 0;            // пробег до заправки на остатке топлива 
  
  int colerror = 0;           //количество ошибок в правом верхнем углу третьего экрана
  //float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {0};  // массив байтов принимаемого сообщения от щитка приборов
  
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок

  unsigned long prevPID = 0;
  unsigned long prevPIDgauge = 0;
  unsigned long prevTemperature = 0;
  unsigned long prevpres = 0;
  unsigned long prevWatch = 0;
  unsigned long prevDvoet = 0;
  unsigned long prevData = 0;
 
  unsigned long TimewaitPID, timerwaitPID = 0;
  bool timerenabledPID = 0;
  #define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 200 // здесь задержка на ожидание правильного ответа пидов, мс

  unsigned long TimewaitInit, timerwaitInit = 0;
  bool timerenabledInit = 0;
  #define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 500 // здесь задержка на ожидание ответа об удачной инициализации, мс

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
    myGLCD.setFont(GroteskBold16x32);   
    
    //загрузка стартовой страницы
    currentPage = '0';       
    drawHomeScreen();  

    //подсчет среднеарифметического усредненного расхода
    for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
    for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];
    L100SR_TFT = (float)L100SR_TFT/110.0;
    if (L100SR_TFT<0) L100SR_TFT = 0;
    if (L100SR_TFT>99) L100SR_TFT = 99;
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить времая и дату, залить в ардуино. в скетче закоментировать
    // обратно и залить еще раз, иначе каждый раз будет по новой выствлятся это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));

    Temperature ();
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {

    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) { if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
    else if (TIMEREXPIRED_Init) timerenabledInit=0;}
	  
    else { if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
    if (millis() - prevPID > PIDTime) { PIDs();  prevPID = millis(); }}
    else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
       
	if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     
    digitalWrite (TX_gauge, HIGH);  delay (500); 
    digitalWrite (TX_gauge, LOW);   delay (20);
    digitalWrite (TX_gauge, HIGH ); delay (15);
    digitalWrite (TX_gauge, LOW);   delay (5);
    digitalWrite (TX_gauge, HIGH);  delay (5);
    mySerial_gauge.begin(9600);}

    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis(); Trip ();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();}
	
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  //BOID TRIP//////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Trip () {
  
  if (flagkmAgeIGN){

  FuelTrip = FuelIGN - Fuel;                          
   if (kmAge>kmAgeIGN) kmTrip = kmAge - kmAgeIGN;
   if (kmAge<kmAgeIGN) kmTrip = 2000 - (kmAgeIGN - kmAge);  // 2000 это через сколько км у тебя суточный пробег сбрасывается на ноль, поменяй если другое число
   if (kmAge==kmAgeIGN) kmTrip = 0;
  
  //подсчет расхода на 100км за поездку
  L100M = ((float)FuelTrip*100.00)/(float)kmTrip;
   if (L100M<0) L100M = 0;
   if (L100M>99) L100M = 99;
 
  // ниже цикл считает среднеарифметический расход из еепром раз в пробег, указанный в переменной kmeeprom
   if (kmTrip-kmTFT>kmeeprom) {kmTFT = kmTrip; 

  // тут считаем среднеарифметический усредненного расход из ячеек еепром 
   for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
   for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];
   L100SR_TFT = (float)L100SR_TFT/110.00;
   if (L100SR_TFT<0) L100SR_TFT = 0;
   if (L100SR_TFT>99) L100SR_TFT = 99;}
  
  // ниже цикл считает расход топлива за пробег, указанный в переменной kmL, здесь же запись в ячейки еепром 
   if (kmTrip-km>kmL) {km=kmTrip; 

  L100SR = ((float)(Fuel_last-Fuel)*100.00)/(float)kmL; // расход/100км  - обновляется раз в 10км, меняется км в int kmL = 10;
  Fuel_last = Fuel;      // сохранение параметров с последнего измерениея 
   if (L100SR<0) L100SR = 0;
   if (L100SR>99) L100SR = 99;
 
  расчет остатка километров в баке, постоянно подстраеваемый под ваш стиль вождения
  if (L100SR>0) kmREFUELING=((float)Fuel*100.0)/(float)L100SR; //если средний расход больше нуля, то расчитывать км в баке из него
  else kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;    //если ноль или меньше то расчитывать км в баке с устредненного расхода
    //еще вариант расчета киломеров в баке от устредненного расхода L100SR_TFT, если он у вас уже вышел на стабильную цифру
	//kmREFUELING=((float)Fuel*100.0)/(float)L100SR_TFT;
    //еще вариант если вы знаете примерный средний расход за весь бак.  
	//kmREFUELING=((float)Fuel*100.0)/(float)6.7; //где 6.7 вош средний расход за бак
  
  // тут записываем  L100SR последовательно в одну из 11 ячеек еепром
  //EEPROM.write (12,n_eeprom);      // ЗДЕСЬ ВНИМАТЕЛЬНО. ЗАГРУЗИТЬ ПРОШИВКУ С ЭТОЙ СТРОКОЙ ОДИН РАЗ, ПОТОМ ЗАКОМЕНТИРОВАТЬ И ЕЩЁ РАЗ ЗАГРУЗИТЬ
  n_eeprom = EEPROM.read (12);    // в ячейке 12 хранится № текущей ячейки для записи расхода, чтобы где остановился при выкл питания, от туда и продолжил
  EEPROM.write(n_eeprom, L100SR*10); 
  n_eeprom++; if (n_eeprom>10) n_eeprom=0;
  EEPROM.write (12,n_eeprom); }}}
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  //BOID LCDDATAPRINT. прописываем данные и их расположение и цвет/////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
      myGLCD.setColor(255, 255, 255);      //цвет текста
      myGLCD.printNumI(Speed, 350, 0, 3);
   //----------------------------------------------------------
   //страниц HOME
   //----------------------------------------------------------
   if (currentPage == '0') { 
      myGLCD.printNumF(LHor, 1, 60, 40, '.',5);
      myGLCD.printNumF(L100, 1, 210, 40,'.',5 );
      myGLCD.printNumF(L100M, 1, 60, 75,'.',5 );
      myGLCD.printNumF(L100SR_TFT, 1, 210, 75,'.',5 );
      myGLCD.printNumI(kmREFUELING, 60, 110,5 ); 
      //if (Fuel<53) // чтобы при максимальном топливе выдавало на экране "MAX"
      myGLCD.printNumF(Fuel, 1, 210, 110,'.',5);
      //else myGLCD.print("MAX", 240, 110); // чтобы при максимальном топливе выдавало на экране "MAX"
      myGLCD.printNumF(kmTrip, 1, 60, 145,'.',5);
      myGLCD.printNumF(FuelTrip, 1, 210, 145,'.',5);
      myGLCD.printNumI(PumpRPM, 0, 180,5); //для вывода Fuel2 , который ниже поменяите на (PumpRPM, 210, 180,5)
      myGLCD.printNumI(RPM, 0, 215,5);     //для вывода L100SR, который ниже поменяите на  (RPM, 210, 215,5)
      //myGLCD.printNumF(Fuel2, 1, 0, 215,'.',5); //если хотите вывести в нижнем левом углу мгновенный литры в баке
      //myGLCD.printNumF(L100SR, 1, 0, 180,'.',5); //если хотите вывести в нижнем левом углу средний расход для подсчетов     
      myGLCD.printNumI(Temp, 415, 40, 3);
      myGLCD.printNumI(TempOil, 415, 75, 3);
      myGLCD.printNumI(TempFuel, 415, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3);
      myGLCD.printNumI(t, 415, 180, 3);
      myGLCD.printNumI(TempAir, 415, 215, 3); }
    //----------------------------------------------------------
    //страниц INF1
    //----------------------------------------------------------
    if (currentPage == '1') {
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(h, 1, 415, 215); }
    //----------------------------------------------------------
    //страниц INF2
    //----------------------------------------------------------
    if (currentPage == '2') {    
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); }
     prevData = millis(); }}
  
  ///////////////////////////////////////////////////////////////////////////
  //BOID PIDs//отправка запроса пид 2101/////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); }}
	
  ///////////////////////////////////////////////////////////////////////////
  //BOID PIDsGAUGR//отправка запроса на панель приборов//////////////////////
  ///////////////////////////////////////////////////////////////////////////
  void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13); }
  
  ///////////////////////////////////////////////////////////////////////////
  //BOID PIDsGAUGR//отправка запроса присутствия/////////////////////////////
  ///////////////////////////////////////////////////////////////////////////
  void present() {
   Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }}
  
  /////////////////////////////////////////////////////////////////////////////////////////////
  //получение данных от ЭБУ, разборка входящих сообщений
  /////////////////////////////////////////////////////////////////////////////////////////////
   void receive () {
   ///////////////////////////////////////////////////////////////////////
   ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)
   ///////////////////////////////////////////////////////////////////////
   while(!InitGauge){
    if (mySerial_gauge.available()) {
    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
   if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
   if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  }}}
   
   MessageParse = 0;
   while (InitGauge && !MessageParse) {
    if (!dataMessageOK) {   
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}
     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     numberbyte=0;}
     
	else { if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}  
     if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0; }}
      
   if (dataMessageEND) { 
    int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
    int CRC =200;
    for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

    Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}
 
   //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (CRC==crc) {Serial.println ("    OK!!!");
  
   Fuel2 = MessageRxGauge[16]/2.0; //мгновенное топливо в баке, для вывода на экран
   //стартовая запись литров в баке для подсчета затраченных литро. 
   if (!flagFuelIGN) {  Fuel = MessageRxGauge[16]/2.00;  kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;} 
   //else Fuel = MessageRxGauge[17]/2.0; 
   //для усреднения болтания топлива в баке, высчитывает среднее. без усреднения - закоментировать 6 строчек ниже и раскоментировать строчку выше
   else { FuelZamer[ZamerNumber] = MessageRxGauge[17]/2.00;
   if (ZamerNumber==9) {
   Fuel = 0 ;
   for (int i = 0; i < 10; i++) Fuel = Fuel + FuelZamer[i];
   Fuel = (float)Fuel/10.0;}
   ZamerNumber++; if (ZamerNumber>9) ZamerNumber = 0;}
 

   kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10.0; //суточный пробег с панели приборов

   //бак у меня на 59 литров, а датчик показывает максимально 53 литра. для этого эта формула
   //если у вас тоже датчик имеет лимит то подправте 53 на свой лимит. 
   //если ваш датчик показывает одинаково с полным баком то закоментировать три нижние строки. 
   if (Fuel<53){
   if (!flagkmAgeIGN) { kmAgeIGN = kmAge; flagkmAgeIGN =1;}
   if (!flagFuelIGN) { FuelIGN = Fuel; Fuel_last = Fuel; flagFuelIGN = 1; }}}
    
   else Serial.println ("    ERROR!!!");   
   dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();
   for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; }}  // очистка байтов массива 

    ////////////////////////////////////////////////////////////////////
    ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
    ////////////////////////////////////////////////////////////////////
    if (mySerial.available()) {
    delay(195);
    int k=0;
    byte inbyte=0;
     
    while( mySerial.available() && k < 110) {
    inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }
    
    Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");

   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  "); }

   if (currentPage == '3'){
     ///////////////////////////////////////////////////////////////////////////////////////////////////
     //Чтение и стирание ошибок
     ///////////////////////////////////////////////////////////////////////////////////////////////////
   //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
     myGLCD.clrScr();             
     drawscreen_three();      
     myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  "); }
     
   //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
     myGLCD.clrScr();             
     drawscreen_three();      
     myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  "); }
    
   // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
      myGLCD.clrScr();             
      drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (0,255,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (255,0,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный 
      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
      
   if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
   if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
   if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
   if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

   if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
   if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;} 
   if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); 
   else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y));
 
   if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
   if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;}
   if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
   else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));}}} 
   
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////
   //прописываем формулы к данным  ///////////////////////////////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    //Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    //ниже идут расчетные формулы более точные чем те что закоментированы выше
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; }} // очистка байтов массива

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    delay (5); } 
    delay (55); }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //стартовая инициализация 7 пина ОБД
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void fastinit() {
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400); } // baud rate of the OBD

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); }}
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); }}
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка тач кнопок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
     if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch(); }
     if (currentPage == '1') { 
      buttonHomeTouch();
      buttonINF2Touch();
      buttonCHECKTouch(); }
     if (currentPage == '2') { 
      buttonHomeTouch();
      buttonINF1Touch();
      buttonCHECKTouch(); }
     if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки и кнопки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(295,35,295,248); // линия вертикальная
     myGLCD.setColor(0, 255, 0); // цвет линии зеленый
     myGLCD.drawLine(145,35,145,178); // линия вертикальная
     myGLCD.drawLine(1,178,295,178); // линия горизонтальная
     myGLCD.print("L/H", 10, 40);
     myGLCD.print("L/A", 148, 40);
     myGLCD.print("L/V", 10, 75);
     myGLCD.print("L/M", 148, 75);
     myGLCD.print("D/K", 10, 110);
     myGLCD.print("D/L", 148, 110);
     myGLCD.print("V/K", 10, 145);
     myGLCD.print("V/L", 148, 145);
     myGLCD.print("PUMP RPM", 82, 180);
     myGLCD.print("Engi RPM", 82, 215);
     //myGLCD.print("D/La", 10, 180);
     myGLCD.print("Motor C", 300, 40);
     myGLCD.print("Oil   C", 300, 75);
     myGLCD.print("Fuel  C", 300, 110);
     myGLCD.print("Inter C", 300, 145);
     myGLCD.print("Exter C", 300, 180);
     myGLCD.print("IntAirC", 300, 215);
     buttonHome() ;                     //прорисовка кнопок
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     Watch ();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("MAF  mg/s:", 10, 215);
     myGLCD.print("Humedad %:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ; }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ; }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD(); }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void drawFrame(int x1, int y1, int x2, int y2) {
     myGLCD.setColor(255, 0, 0);
     myGLCD.drawRoundRect (x1, y1, x2, y2);
     while (myTouch.dataAvailable())
     myTouch.read();
     myGLCD.setColor(255, 255, 255); }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка кнопок и координат тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void buttonHome() {
     myGLCD.setColor(0,0,0); // цвет кнопки черный
     myGLCD.fillRoundRect (1, 1, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста белый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); }// центровка строки
  

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); }}

   void buttonINF1() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);  
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265); }
   
   void buttonINF1Touch() {
     if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one(); }}

   void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265); }
  
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
       drawFrame(180, 255, 300, 310); 
       currentPage = '2';           
       myGLCD.clrScr();             
       drawscreen_two(); }}
       
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);}
	 
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
       drawFrame(350, 255, 470, 310); 
       currentPage = '3';           
       myGLCD.clrScr();             
       drawscreen_three(); }}

    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265); }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
       drawFrame(10, 255, 120, 310); 
       Erase(); }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265); }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
       drawFrame(350, 255, 470, 310); 
       Read(); }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  void line() {
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,73,479,73); // линия горизонтальная
     myGLCD.drawLine(1,108,479,108); // линия горизонтальная
     myGLCD.drawLine(1,143,479,143); // линия горизонтальная
     myGLCD.drawLine(1,178,479,178); // линия горизонтальная
     myGLCD.drawLine(1,212,479,212); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); }// линия горизонтальная


  /////////////////////////////////////////////////////////////////////////////////////////////
  //верхняя часть экрана часы и дата отображается на всех экранах
  /////////////////////////////////////////////////////////////////////////////////////////////
  void Watch (){
    DateTime now = rtc.now();
    int m = now.minute(); 
    int hour = now.hour();
    int mon = now.month();
    int date = now.day();
  
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
  
    if (date<10) { 
    myGLCD.print("0", 85, 0); 
    myGLCD.printNumI(now.day(), 100, 0); } 
    else if (date >=10) {
    myGLCD.printNumI(now.day(), 85, 0); }
    myGLCD.print("/", 115, 0);
    if ( mon<10) {
    myGLCD.print("0", 130, 0); 
    myGLCD.printNumI(now.month(), 145, 0);} 
    else if (mon >=10) {
    myGLCD.printNumI(now.month(), 130, 0);}  
    myGLCD.print("/", 160, 0);
    myGLCD.printNumI(now.year(), 175, 0);
    if (hour<10) {
    myGLCD.print("0",255, 0); 
    myGLCD.printNumI(now.hour(), 270, 0); } 
    else if(hour>=10){ 
    myGLCD.printNumI(now.hour(), 255, 0); } 
    if (m<10) {
    myGLCD.print("0",300, 0); 
    myGLCD.printNumI(now.minute(), 315, 0); } 
    else if (m>=10){ 
    myGLCD.printNumI(now.minute(), 300, 0); }
    myGLCD.print("Km/h", 410, 0); }
 
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures(); }
 
  ВСЕМ УДАЧИ В ЭТОМ НЕ ЛЕГКОМ ДЕЛЕ
Inglor
Offline
Зарегистрирован: 20.09.2017

NoEnName_Null R3 доска 3.95 дюймов TFT ЖК-дисплей модуль Экран с сенсорным Панель ILI9488 R61581 Drive IC 400*320
http://s.aliexpress.com/Rjii2iA7
(from AliExpress Android) это оно или нет? А если взять 3.5 дюймовый? Много ли придется менять в скетче?

viki13viki
Offline
Зарегистрирован: 14.11.2016

Мои изображён выше. Главное размер 480х320, если другой размер то все координаты отображения прийдется переписывать. Как видешь и контакты отличаются. Но это не проблема, главное размер, просто в скетчах нужно будет указать пины экрана и тача( из мануала tft). И если контакты экрана попадут на занятые пины в ардуино, значит это перевести на другие пины, чтобы освободить для tft. В случае с 3.5 нужно будет перерасчитывать все что отображается на экране. Это размер шрифта, размер линий, все координаты которые выводят все на экран. Я сам удивлён, как будто эта модель вымерли, их было валом, пробуй все таки найти с такими же контактами, иначе тебе прийдется вникать в доки tft и очень ясно понимать что и где подключено в ардуино и что на что менять. Если все таки возьмёшь, попробуем разобраться, но на 3,95. На 3,5 много мороки, разве что сам разберёмся в смене координат отображения. Примерно так.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Inglor пишет:
Не работает программа оп-ком той версии с моей машиной,нет там нужного,более современного протокола, буду ждать адаптер опком с чайны для новых версий одноименной программы. Может пока к-лайн адаптер без юсб соберу, жаль лазерный принтер еще с отпуска не приехал(ну сосед всмысле). Можете пока хотя бы ссылку на дисплей свой или подобный дать? На Али рылся, дак только 3,5 дюйма нашел

в этой программе ОПКОМ, которая через к-лайн они ошиблись видать со скоростью.  проснифил  - реальный обмен  от опкома идёт на 9600, хотя вверху и написано 10400. Но байты отправляет не правильные если на 10400 щупать сниффером.  На 9600 байты совпадают с такими какие должны быть. Из-за этого и не коннектится. 

если есть ещё одна ардуина (первая используется для сниффера)  и ещё два к-лайн адаптера это легко исправить. один адаптер у нас это опком -  его K-линию соединяем с K-линией адаптера ардуино на железном порту Serial),  второй адаптер дуни - к SoftSerial. Его к-линию соединяем с 7 контактом ОБД.

Ну а третий - это наш сниффер на отдельной дуне.

скетч 

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {

  Serial.begin(9600); // сюда подключаем адаптер от опкома 

  mySerial.begin(10400); // сюда подключаем адаптер который подключаем к 7 контакту обд
  }

 
void loop() { // run over and over
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
}