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

uu4juw
Offline
Зарегистрирован: 17.01.2017

Спасибо за приложение для андроид

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

незачто. очень удобное и HEX DEC BIN. долго им пользуюсь, доволен, да и окна в компе не нужно сворачивать и разворачивать

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

а я нашел программу клевую для связи с ком портом. Просто стандратный сериал монитор у ардуино ide корявый. Программа называется Terminal 1.9 . Просто хотел напрямую байты с терминала отправлять (по умолчанию при отправлении переводиться в символ по таблице Asсii), не понял как сделать в других терммналах. В этом например хотим отправить байт BF нужно написать $BF - удобный термнал. Если на дуине reset на массу посадить, то можно с эбу через этот терминал разговаривать. В этом терминале можно сообщения настраивать и все задержки. 

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

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

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

набрал в яндексе "терминал байты" - первая ссылка. В сетапе всё что после fastinit(); сделай в отдельную функцию или же в этот fastinit() и запихать, а потом вызывать её когда надо. 

void setup() {
    Serial.begin(115200);
  pinMode(TX, OUTPUT);
 fastinit();
 Init(); 
  
}

void Init() {
Serial.print ("Zapros Initialization:  ");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    Serial.print(messageInit[i],HEX); Serial.print ("  ");
    delay (5);
      } 
      delay (55);
   Serial.println("");
   Serial.println("FAST INIT OK");
  Serial.println("");
  Serial.print ("PID delay:  "); Serial.print(PIDTime);  Serial.println("ms");
  Serial.print ("Present delay:  "); Serial.print(PresTime);  Serial.println("ms");
    Serial.println("");}

 

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

понял. сенкс. блин не очень получается склеить два сектча. синий уже ошибки и ошибки и ошибки......

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

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

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
#define TX 11


int length5 = 5;
int length6 = 6;

int pid = 1; // очередность пида
bool Init = 0;

int PIDTime = 150;    // задержка между посылками запросов температуры, мс
int PresTime = 9000;    // задержка между посылками запросов присутствия, мс 
int waitbyte = 1;       // задержка между отправкой байт в сообщении, мс

int Temp = 0;    // температура 
int rpm = 0;     // обороты
int load = 0;    // нагрузка
int tempair = 0; // температура входного воздуха
int Speed = 0;   // скорость
int MAP = 0;     // давление впускного коллектора
int gaz = 0;     // положение педали
int MAF = 0;     // сассовый расход воздуха


byte MessageRx[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};  // массив байтов принимаемого сообщения

byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
byte messageTemp[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A};    // запрос температуры 1
byte messageRPM[6] = {0x82,0x11,0xF1,0x01,0x0C,0x91};     // запрос оборотов ДВС 2
byte messageLoad[6] = {0x82,0x11,0xF1,0x01,0x04,0x89};    // запрос нагрузки на ДВС 3
byte messageAirTemp[6] = {0x82,0x11,0xF1,0x01,0x0F,0x94}; // запрос температура впускного воздуха 4
byte messageSpeed[6]= {0x82,0x11,0xF1,0x01,0x0D,0x92};    // запрос скорости а/м 5
byte messageMAP[6] = {0x82,0x11,0xF1,0x01,0x0B,0x90};     // запрос абсолютное давление во впускном коллекторе (MAP) 6
byte messageAcceler[6] = {0x82,0x11,0xF1,0x01,0x11,0x96}; // положения педали газа, % 7
byte messageMAF[6] = {0x82,0x11,0xF1,0x01,0x10,0x95};     // массовый расход воздуха, г/cек  8

unsigned long prevPID = 0;
unsigned long prevpres = 0;


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

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

void setup() {
    Serial.begin(115200);
  pinMode(TX, OUTPUT);
  fastinit();

  
  
}

void loop() {

unsigned long curPID = millis ();
unsigned long curpres = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();

if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
           else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {
if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
     }
receive ();
   
  }



void PIDs() {

  if (pid==1){
  Serial.print ("Zapros Temp:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageTemp[i]);
    Serial.print(messageTemp[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==2){
  Serial.print ("Zapros RPM:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageRPM[i]);
    Serial.print(messageRPM[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==3){
  Serial.print ("Zapros Load:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageLoad[i]);
    Serial.print(messageLoad[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==4){
  Serial.print ("Zapros AirTemp:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageAirTemp[i]);
    Serial.print(messageAirTemp[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

    if (pid==5){
  Serial.print ("Zapros Speed:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageSpeed[i]);
    Serial.print(messageSpeed[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==6){
  Serial.print ("Zapros MAP:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageMAP[i]);
    Serial.print(messageMAP[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==7){
  Serial.print ("Zapros Accelerate:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageAcceler[i]);
    Serial.print(messageAcceler[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==8){
  Serial.print ("Zapros MAF:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageMAF[i]);
    Serial.print(messageMAF[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }
  
 pid++; if (pid>8) {pid = 1; Serial.println ("");}
  Serial.println ("");
 
}

void present() {
  Serial.print ("Zapros prisutstviya:   ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    Serial.print(messagePresent[i],HEX); Serial.print ("  ");
     delay (waitbyte); } 
  Serial.print("       "); Serial.print(PresTime); Serial.println("ms");
}

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

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

if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0xC1 && MessageRx[7]==0x6B && MessageRx[8]==0x8F) {Init=1;
 timerenabledInit=0; Serial.println ("                                                            Initialization OK!:  "); 
   Serial.println("");
  Serial.print ("PID delay:  "); Serial.print(PIDTime);  Serial.println("ms");
  Serial.print ("Present delay:  "); Serial.print(PresTime);  Serial.println("ms");
    Serial.println("");}
 
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x05) {Temp = MessageRx[8]-40;
 timerenabledPID=0; Serial.print ("                                                            Temperature:  "); 
    Serial.print (Temp);  Serial.println (" *C");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0C) {rpm = ((MessageRx[8]*256) + MessageRx[9]) / 4;
timerenabledPID=0; Serial.print ("                                                            RPM:  "); 
    Serial.print (rpm);  Serial.println (" /min");}
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x04){ load = MessageRx[8]*100/255;
timerenabledPID=0; Serial.print ("                                                            Load:  "); 
    Serial.print (load);  Serial.println (" %");}
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0F) {tempair = MessageRx[8]-40;
timerenabledPID=0; Serial.print ("                                                            AirTemp:  "); 
    Serial.print (tempair);  Serial.println (" *C");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0D){ Speed = MessageRx[8];
timerenabledPID=0; Serial.print ("                                                            Speed:  "); 
    Serial.print (Speed);  Serial.println (" km/h");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0B){ MAP = MessageRx[8];
timerenabledPID=0; Serial.print ("                                                            MAP:  "); 
    Serial.print (MAP);  Serial.println (" kPa");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x11) {gaz = MessageRx[8]*100/255;
timerenabledPID=0; Serial.print ("                                                            Accelerate:  "); 
    Serial.print (gaz);  Serial.println (" %");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x10) { MAF = ((MessageRx[8]*256) + MessageRx[9]) / 100;
timerenabledPID=0; Serial.print ("                                                            MAF:  "); 
    Serial.print (MAF);  Serial.println (" g/sec");}
  
     for (int i = 0; i < 12; i++) MessageRx[i]=0;
     }
   }

void initialization() {

Serial.print ("Zapros Initialization:  ");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    Serial.print(messageInit[i],HEX); Serial.print ("  ");
    delay (5);
      } 
      delay (55);
   Serial.println("");
  

}

void fastinit() {
  
    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");
                }

 

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

вот более правильный скетч прослушки

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 
int Delay = 0;
void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
}

void loop() {

if (Serial.available()) {
unsigned long curTimedelay = millis ();
   Delay = curTimedelay-prevTimedelay;
Serial.println (""); Serial.print (Delay); Serial.println ("ms");
prevTimedelay = millis();  
while( Serial.available()) {
    byte inByte = Serial.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
   }
     
    }
}

 

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

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

vsrgv
Offline
Зарегистрирован: 20.06.2017

MaksVV пишет:

вот более правильный скетч прослушки

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 
int Delay = 0;
void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
}

void loop() {

if (Serial.available()) {
unsigned long curTimedelay = millis ();
   Delay = curTimedelay-prevTimedelay;
Serial.println (""); Serial.print (Delay); Serial.println ("ms");
prevTimedelay = millis();  
while( Serial.available()) {
    byte inByte = Serial.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
   }
     
    }
}

 

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

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

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

vsrgv
Offline
Зарегистрирован: 20.06.2017

Ради интереса решил найти эбу через findECU, пока не находит

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

а зачем тебе ты же уже знаешь адрес 10, у меня в ней нашло только 28 и 31 это блоки АБС и вроде коробки. а 11 мой не находил, прога испльзует fast init а у меня fast init 5boud. в моем посте 12 есть скетч для проверки всех возможных адросов но он только для fast init. если не найдет твой 10 , значит у тебя тоже 5boud. в сериале будет видно по правильному ответу на какие блоки подцепился

 

vsrgv
Offline
Зарегистрирован: 20.06.2017

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

vsrgv
Offline
Зарегистрирован: 20.06.2017

Хотя не заморачивайся,щас сам додумаю,спасибо

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

если у тебя 5боуд, то это мой случай и мой(MaksVV) скетч. а если просто fast init то разница вот в чем......

fast init это отправка на комуникацию блоком тоесть

byte messageInit[5] = {0x81,0x11,0xF1,0x81,0x04};    // запрос инициализации

а если fast init 5boud то

byte message1[1] = {0x81};
byte message2[1] = {0x11};
byte message3[1] = {0xF1};
byte message4[1] = {0x81};
byte message5[1] = {0x04};

и при отправке каждый байт отправляется отдельно с задержкой в 5-10м/с

вот скетч просто комуникации 5 боуд

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
#define TX 11
int mode;
int dotdelay = 1000;
int timeout = 10100;
int timeold;
int messagelength = 1;

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);
    }
  }
}

попробуй сначало только комуникацию. только замени адрес на 10 и перещитай сумму. щас начеркаю на fast init

вот уже под твой 10 адрес просто fast init

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
#define TX 11
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,0x10,0xF1,0x81,0x03};             //COMUNICACION// 


//-----------------------------------------------------------------------------------
void setup() {
    Serial.begin(57600);
  pinMode(TX, OUTPUT);
}
//-----------------------------------------------------------------------------------
void loop() {
  fastinit();
  comunicacion1();
  delay(50);
  recievedata();
  
}

//-----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);
  } 
}



//-----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);
      
    }
  }
}

да еще, бывает что милисекунда играет роль. попробуй в fastinit(); поиграть с секундами например варианты

24 25 или 24 26 или 25 24 или 26 24 ........ но в общей сложности должно быть 50 м/с. и поиграйся с задержками между байтами от 5 до 10 м/с

vsrgv
Offline
Зарегистрирован: 20.06.2017

Спасибо, попробую!

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

vsrgv пишет:

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

потому что надо так

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //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);
   }
     
    }
}

 

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

Здорово. viki13viki, скетч из #157 не пробовал ? 

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

ПРИВЕТ. сейчас спущусь и попробую и отпишусь. я целый день скрещиваю слона с носорогом, типа скетч меню и скетч обд. щас отпишусь

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

значит так. он дает запрос инит получает ответ но к пидам не переходит , запрос инит ответ инит и так до бесконечности

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

скинь что отвечает, я сделал такую проверку по байтам входящего сообщения

if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0xC1 && MessageRx[7]==0x6B && MessageRx[8]==0x8F) 

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

а вижу косяк, щас

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

вот 

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
#define TX 11


int length5 = 5;
int length6 = 6;

int pid = 1; // очередность пида
bool Init = 0;

int PIDTime = 150;    // задержка между посылками запросов температуры, мс
int PresTime = 9000;    // задержка между посылками запросов присутствия, мс 
int waitbyte = 1;       // задержка между отправкой байт в сообщении, мс

int Temp = 0;    // температура 
int rpm = 0;     // обороты
int load = 0;    // нагрузка
int tempair = 0; // температура входного воздуха
int Speed = 0;   // скорость
int MAP = 0;     // давление впускного коллектора
int gaz = 0;     // положение педали
int MAF = 0;     // сассовый расход воздуха


byte MessageRx[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};  // массив байтов принимаемого сообщения

byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
byte messageTemp[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A};    // запрос температуры 1
byte messageRPM[6] = {0x82,0x11,0xF1,0x01,0x0C,0x91};     // запрос оборотов ДВС 2
byte messageLoad[6] = {0x82,0x11,0xF1,0x01,0x04,0x89};    // запрос нагрузки на ДВС 3
byte messageAirTemp[6] = {0x82,0x11,0xF1,0x01,0x0F,0x94}; // запрос температура впускного воздуха 4
byte messageSpeed[6]= {0x82,0x11,0xF1,0x01,0x0D,0x92};    // запрос скорости а/м 5
byte messageMAP[6] = {0x82,0x11,0xF1,0x01,0x0B,0x90};     // запрос абсолютное давление во впускном коллекторе (MAP) 6
byte messageAcceler[6] = {0x82,0x11,0xF1,0x01,0x11,0x96}; // положения педали газа, % 7
byte messageMAF[6] = {0x82,0x11,0xF1,0x01,0x10,0x95};     // массовый расход воздуха, г/cек  8

unsigned long prevPID = 0;
unsigned long prevpres = 0;


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

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

void setup() {
    Serial.begin(115200);
  pinMode(TX, OUTPUT);
  fastinit();

  
  
}

void loop() {

unsigned long curPID = millis ();
unsigned long curpres = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();

if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
           else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {
if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
     }
receive ();
   
  }



void PIDs() {

  if (pid==1){
  Serial.print ("Zapros Temp:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageTemp[i]);
    Serial.print(messageTemp[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==2){
  Serial.print ("Zapros RPM:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageRPM[i]);
    Serial.print(messageRPM[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==3){
  Serial.print ("Zapros Load:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageLoad[i]);
    Serial.print(messageLoad[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==4){
  Serial.print ("Zapros AirTemp:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageAirTemp[i]);
    Serial.print(messageAirTemp[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

    if (pid==5){
  Serial.print ("Zapros Speed:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageSpeed[i]);
    Serial.print(messageSpeed[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==6){
  Serial.print ("Zapros MAP:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageMAP[i]);
    Serial.print(messageMAP[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==7){
  Serial.print ("Zapros Accelerate:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageAcceler[i]);
    Serial.print(messageAcceler[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==8){
  Serial.print ("Zapros MAF:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageMAF[i]);
    Serial.print(messageMAF[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }
  
 pid++; if (pid>8) {pid = 1; Serial.println ("");}
  Serial.println ("");
 
}

void present() {
  Serial.print ("Zapros prisutstviya:   ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    Serial.print(messagePresent[i],HEX); Serial.print ("  ");
     delay (waitbyte); } 
  Serial.print("       "); Serial.print(PresTime); Serial.println("ms");
}

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

      Serial.print ("                                                            Recieve:   ");
    
    for (int i = 0; i < 12; 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) {Init=1;
 timerenabledInit=0; Serial.println ("                                                            Initialization OK!:  "); 
   Serial.println("");
  Serial.print ("PID delay:  "); Serial.print(PIDTime);  Serial.println("ms");
  Serial.print ("Present delay:  "); Serial.print(PresTime);  Serial.println("ms");
    Serial.println("");}
 
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x05) {Temp = MessageRx[8]-40;
 timerenabledPID=0; Serial.print ("                                                            Temperature:  "); 
    Serial.print (Temp);  Serial.println (" *C");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0C) {rpm = ((MessageRx[8]*256) + MessageRx[9]) / 4;
timerenabledPID=0; Serial.print ("                                                            RPM:  "); 
    Serial.print (rpm);  Serial.println (" /min");}
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x04){ load = MessageRx[8]*100/255;
timerenabledPID=0; Serial.print ("                                                            Load:  "); 
    Serial.print (load);  Serial.println (" %");}
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0F) {tempair = MessageRx[8]-40;
timerenabledPID=0; Serial.print ("                                                            AirTemp:  "); 
    Serial.print (tempair);  Serial.println (" *C");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0D){ Speed = MessageRx[8];
timerenabledPID=0; Serial.print ("                                                            Speed:  "); 
    Serial.print (Speed);  Serial.println (" km/h");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0B){ MAP = MessageRx[8];
timerenabledPID=0; Serial.print ("                                                            MAP:  "); 
    Serial.print (MAP);  Serial.println (" kPa");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x11) {gaz = MessageRx[8]*100/255;
timerenabledPID=0; Serial.print ("                                                            Accelerate:  "); 
    Serial.print (gaz);  Serial.println (" %");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x10) { MAF = ((MessageRx[8]*256) + MessageRx[9]) / 100;
timerenabledPID=0; Serial.print ("                                                            MAF:  "); 
    Serial.print (MAF);  Serial.println (" g/sec");}
  
     for (int i = 0; i < 12; i++) MessageRx[i]=0;
     }
   }

void initialization() {

Serial.print ("Zapros Initialization:  ");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    Serial.print(messageInit[i],HEX); Serial.print ("  ");
    delay (5);
      } 
      delay (55);
   Serial.println("");
  

}

void fastinit() {
  
    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");
                }

 

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

starting comunication (fastinit)

starting serial comunication
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
Zapros Initialization:  81  11  F1  81  4  
                                                            Recieve:   FF FF 83 F1 11 C1 6B 8F 40 0 0 0 
 
MaksVV
Offline
Зарегистрирован: 06.08.2015

да всё, я думал во входящем сначала три раза FF а тут два. Исправил см выше #174

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

скидывай потом сюда  скетч своего меню-бортовика

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

этот из 174 работат. но если закрыть монитор и снова открыть идут сплошные нули на запрос инита, снова перезапускаешь и все сново работает. думаю потому что ссесия не закрыта а даешь снова запрос на инит, при втором перезапуске по ходу ебу ссесию закрывает и все снова работает.....

Надо последний гвоздь в скет забить это если ссесия оборвется во время работы и чтобы он прыгнул на fastinit();

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

  #include <UTouch.h>
  #include <UTFT.h>
  #include <SPI.h>
  
  #include <Wire.h>
  #include "RTClib.h"
  RTC_DS3231 rtc;       //pin 20 SCL , 21 SDA
  
  #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 SmallFont[];
  extern uint8_t BigFont[];
  extern uint8_t SevenSegNumFont[];
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage, selectedUnit;
//-------------------------------------------------------------
  void setup() {
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
 
    drawHomeScreen();  
    currentPage = '0'; 
    selectedUnit = '0'; 
    Serial.begin(9600);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    // строка ниже используется для настройки даты и времени часов
    //rtc.adjust(DateTime(2017, 6, 23, 18, 0, 0));
}
//--------------------------------------------------------------------
void loop() { 
  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); //зеленый цвет цифры
  myGLCD.setFont(GroteskBold16x32);
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);
  myGLCD.setColor(255, 255, 255);
if (hour<10) {
  myGLCD.print("0",255, 0); 
  myGLCD.printNumI(now.hour(), 270, 0); } 
else if(hour>=10){ 
  myGLCD.printNumI(now.hour(), 255, 0); } 
  myGLCD.print(":", 285, 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); }
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  myGLCD.setColor(0, 255, 0); //белый цвет цифры
  myGLCD.printNumI(h, 350, 0);
  myGLCD.print("% ", 380, 0); 
  myGLCD.printNumI(t, 410, 0);
  myGLCD.print("C", 440, 0);
  myGLCD.print(" ", 285, 0);
  
  myGLCD.setColor(255, 255, 255);
  myGLCD.printNumI(t, 395, 145);
    
    sensors.requestTemperatures();
    myGLCD.setColor(255, 255, 255);
    myGLCD.printNumI(sensors.getTempCByIndex(0), 395, 110); 
  
  
  
  delay(1000);
 //-------------------------------------------------------------------  
   //Page 0 (home)
   if (currentPage == '0') { 
     if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
   // Button home
   if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
       
   // Button INF1
   if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
        drawFrame(10, 275, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
      } 
      
    // Button INF2
    if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        drawFrame(180, 275, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
     }
    }
   
//----------------------------------------------------------------------------------------------------------------------------------
    //Page 1
    if (currentPage == '1') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
       
    // Button INF2
    if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        drawFrame(180, 275, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
     }
    }
   

//-----------------------------------------------------
    //Page 2
    if (currentPage == '2') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
      
    // Button INF1
    if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
        drawFrame(10, 275, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
    }
  }
//------------------------------------------------------------------------------
    //Page 3
    if (currentPage == '3') { 
       if (myTouch.dataAvailable()) {
       myTouch.read();
       x=myTouch.getX(); 
       y=myTouch.getY();
      
    //Button ERASE
    //if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        //drawFrame(180, 275, 300, 310); 
        //currentPage = '3';  //потом заменить на дейсвие         
        //myGLCD.clrScr();             
        //drawscreen_three();   //потом заменить на дейсвие                                                                   
      //} 
  
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }    
     }
    }
  }  
//-----------------------------------------------------------------------------------
   void drawHomeScreen() {
    // линии
     line() ;
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     
     vista();
     myGLCD.print("Ltr/Hor:", 10, 40);
     
     vista();
     myGLCD.print("Ltr/100:", 10, 75);
     
     vista();
     myGLCD.print("Ult  Km:", 10, 110);
     
     vista();
     myGLCD.print("Ult Ltr:", 10, 145);
     
     vista();
     myGLCD.print("Fuel Km:", 10, 180);
     
     vista();
     myGLCD.print("Eng RPM:", 10, 215);
     
     
     
     vista();
     myGLCD.print("Engin C:", 255, 40);
     
     vista();
     myGLCD.print("Oil   C:", 255, 75);
     
     vista();
     myGLCD.print("Exter C:", 255, 110);
     
     vista();
     myGLCD.print("Inter C:", 255, 145);
     
     vista();
     myGLCD.print("Fuel  C:", 255, 180);
     
     vista();
     myGLCD.print("Load  %:", 255, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
//-----------------------------------------------------------------------------------
    void drawscreen_one() {
     line() ;
     
     vista();
     myGLCD.print("Start of Delivery  C:", 10, 40);
     
     vista();
     myGLCD.print("Desir inject Start C:", 10, 75);
     
     vista();
     myGLCD.print("Actua Inject Start C:", 10, 110);
     
     vista();
     myGLCD.print("Desir Inject Quan mg:", 10, 145);
     
     vista();
     myGLCD.print("Actu Inject Quant mg:", 10, 180);
     
     vista();
     myGLCD.print("Mass Air Flow     mg:", 10, 215);
 
  
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
}
//----------------------------------------------------------------------------------------
    void drawscreen_two() {
     // линии
     line() ;
     vista();
     myGLCD.print("EGR Pulse Ratio  :", 10, 40);
     
     vista();
     myGLCD.print("Boost Pressure   :", 10, 75);
     
     vista();
     myGLCD.print("Fuel Valve       :", 10, 110);
     
     vista();
     myGLCD.print("Pump Speed       :", 10, 145);
     
     vista();
     myGLCD.print("Glow Time        :", 10, 180);
     
     vista();
     myGLCD.print("A/C Pressure     :", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
//----------------------------------------------------------------------------
    void drawscreen_three() {
     // линии
     myGLCD.setColor(255, 0, 0); // цвет линии -зеленый
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     
    buttonHome();
  
     //Button - ERASE
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 275, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 275, 300, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("ERASE", 200, 285);
    }
   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, 65, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(0, 255, 0); // цвет текста оранжево-красный
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.setFont(BigFont);                      // размер шрифта
     myGLCD.setBackColor(0,0,0);            // цвет фона области где будет надпись и кнопки
     myGLCD.print("HOME", 1, 10); // центровка строки
     }
 void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 275, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 275, 120, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("INF 1", 25, 285);
     }
 void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 275, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 275, 300, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("INF 2", 200, 285);
     }
 void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 275, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 275, 470, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("CHECK", 375, 285);
     }
 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 vista(){
     myGLCD.setFont(GroteskBold16x32);
     myGLCD.setColor(255, 0, 0);
     myGLCD.setBackColor(0,0,0); 
 }
  

скетч из 147 поста у тебя есть :)

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

viki13viki пишет:

этот из 174 работат. но если закрыть монитор и снова открыть идут сплошные нули на запрос инита, снова перезапускаешь и все сново работает. думаю потому что ссесия не закрыта а даешь снова запрос на инит, при втором перезапуске по ходу ебу ссесию закрывает и все снова работает.....

Надо последний гвоздь в скет забить это если ссесия оборвется во время работы и чтобы он прыгнул на fastinit();

 

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

 

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

вопрос в том, как узнать оборвалась ли сессия, то бишь открыта она в данный момент времени или закрыта

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

Он шлет FF-ки и нули. Посмот не правильно ответ, прописать что в случае такого ответа перейти на fastidia():. Ладно не будем на этом зацикливатся. Это мелочь. Скетч меню видел выше?

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

задержку делай 1000 убери или меньше сделай, из за неё тормозит

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

Убирал её совсем, она там по идее не нужно. Но без неё двоеточие часов моргает бешано. Хотя ч пробовал без трех датчиков а оно глючит. Подключаешь и глюки исчезают. Надо будет попробывать

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

что подключаешь, задержку ? и исчезают глюки?

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

  #include <UTouch.h>
  #include <UTFT.h>
  #include <SPI.h>
  
  #include <Wire.h>
  #include "RTClib.h"
  RTC_DS3231 rtc;       //pin 20 SCL , 21 SDA
  
  #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 SmallFont[];
  extern uint8_t BigFont[];
  extern uint8_t SevenSegNumFont[];
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage, selectedUnit;

unsigned long prevWatch = 0;
  
//-------------------------------------------------------------
  void setup() {
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
 
    drawHomeScreen();  
    currentPage = '0'; 
    selectedUnit = '0'; 
    Serial.begin(9600);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    // строка ниже используется для настройки даты и времени часов
    //rtc.adjust(DateTime(2017, 6, 23, 18, 0, 0));
}


void loop() { 
unsigned long curWatch = millis();  
if (curWatch - prevWatch > 10000)  { Watch&Temperature (); prevWatch = curWatch}
  Menu();
}
 
 

   
   
   void Menu {
   //Page 0 (home)
      if (currentPage == '0') { 
     if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
   // Button home
   if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
       
   // Button INF1
   if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
        drawFrame(10, 275, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
      } 
      
    // Button INF2
    if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        drawFrame(180, 275, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
     }
    }
   
//----------------------------------------------------------------------------------------------------------------------------------
    //Page 1
    if (currentPage == '1') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
       
    // Button INF2
    if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        drawFrame(180, 275, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
     }
    }
   

//-----------------------------------------------------
    //Page 2
    if (currentPage == '2') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
      
    // Button INF1
    if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
        drawFrame(10, 275, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
    }
  }
//------------------------------------------------------------------------------
    //Page 3
    if (currentPage == '3') { 
       if (myTouch.dataAvailable()) {
       myTouch.read();
       x=myTouch.getX(); 
       y=myTouch.getY();
      
    //Button ERASE
    //if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        //drawFrame(180, 275, 300, 310); 
        //currentPage = '3';  //потом заменить на дейсвие         
        //myGLCD.clrScr();             
        //drawscreen_three();   //потом заменить на дейсвие                                                                   
      //} 
  
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }    
     }
    }
  }
  
//-----------------------------------------------------------------------------------
   void drawHomeScreen() {
    // линии
     line() ;
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     
     vista();
     myGLCD.print("Ltr/Hor:", 10, 40);
     
     vista();
     myGLCD.print("Ltr/100:", 10, 75);
     
     vista();
     myGLCD.print("Ult  Km:", 10, 110);
     
     vista();
     myGLCD.print("Ult Ltr:", 10, 145);
     
     vista();
     myGLCD.print("Fuel Km:", 10, 180);
     
     vista();
     myGLCD.print("Eng RPM:", 10, 215);
     
     
     
     vista();
     myGLCD.print("Engin C:", 255, 40);
     
     vista();
     myGLCD.print("Oil   C:", 255, 75);
     
     vista();
     myGLCD.print("Exter C:", 255, 110);
     
     vista();
     myGLCD.print("Inter C:", 255, 145);
     
     vista();
     myGLCD.print("Fuel  C:", 255, 180);
     
     vista();
     myGLCD.print("Load  %:", 255, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
//-----------------------------------------------------------------------------------
    void drawscreen_one() {
     line() ;
     
     vista();
     myGLCD.print("Start of Delivery  C:", 10, 40);
     
     vista();
     myGLCD.print("Desir inject Start C:", 10, 75);
     
     vista();
     myGLCD.print("Actua Inject Start C:", 10, 110);
     
     vista();
     myGLCD.print("Desir Inject Quan mg:", 10, 145);
     
     vista();
     myGLCD.print("Actu Inject Quant mg:", 10, 180);
     
     vista();
     myGLCD.print("Mass Air Flow     mg:", 10, 215);
 
  
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
}
//----------------------------------------------------------------------------------------
    void drawscreen_two() {
     // линии
     line() ;
     vista();
     myGLCD.print("EGR Pulse Ratio  :", 10, 40);
     
     vista();
     myGLCD.print("Boost Pressure   :", 10, 75);
     
     vista();
     myGLCD.print("Fuel Valve       :", 10, 110);
     
     vista();
     myGLCD.print("Pump Speed       :", 10, 145);
     
     vista();
     myGLCD.print("Glow Time        :", 10, 180);
     
     vista();
     myGLCD.print("A/C Pressure     :", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
//----------------------------------------------------------------------------
    void drawscreen_three() {
     // линии
     myGLCD.setColor(255, 0, 0); // цвет линии -зеленый
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     
    buttonHome();
  
     //Button - ERASE
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 275, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 275, 300, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("ERASE", 200, 285);
    }
   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, 65, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(0, 255, 0); // цвет текста оранжево-красный
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.setFont(BigFont);                      // размер шрифта
     myGLCD.setBackColor(0,0,0);            // цвет фона области где будет надпись и кнопки
     myGLCD.print("HOME", 1, 10); // центровка строки
     }
 void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 275, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 275, 120, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("INF 1", 25, 285);
     }
 void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 275, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 275, 300, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("INF 2", 200, 285);
     }
 void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 275, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 275, 470, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("CHECK", 375, 285);
     }
 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 vista(){
     myGLCD.setFont(GroteskBold16x32);
     myGLCD.setColor(255, 0, 0);
     myGLCD.setBackColor(0,0,0); 
 }

  void Watch&Temperature (){
  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); //зеленый цвет цифры
  myGLCD.setFont(GroteskBold16x32);
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);
  myGLCD.setColor(255, 255, 255);
if (hour<10) {
  myGLCD.print("0",255, 0); 
  myGLCD.printNumI(now.hour(), 270, 0); } 
else if(hour>=10){ 
  myGLCD.printNumI(now.hour(), 255, 0); } 
  myGLCD.print(":", 285, 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); }
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  myGLCD.setColor(0, 255, 0); //белый цвет цифры
  myGLCD.printNumI(h, 350, 0);
  myGLCD.print("% ", 380, 0); 
  myGLCD.printNumI(t, 410, 0);
  myGLCD.print("C", 440, 0);
  myGLCD.print(" ", 285, 0);
  
  myGLCD.setColor(255, 255, 255);
  myGLCD.printNumI(t, 395, 145);
    
    sensors.requestTemperatures();
    myGLCD.setColor(255, 255, 255);
    myGLCD.printNumI(sensors.getTempCByIndex(0), 395, 110); 
  }

 

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

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

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

а кнопка сенсор? ну всмысле нарисованная на экране?

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

да

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

ну тут видать корявость библы либо скетча по меню и кнопкам

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

опиши логику скетча, что в начале на экране, как меняется от чего и т.д.

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

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

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

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

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

ниче так симпатично, меня интересует частота вызова функции drawHomeScreen(), я так понял она вызвается один раз в сетап и потом только! после нажатия на сенсор

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

Да. Она погружается в сетапе, а в лупе уже крутятся время дата температура влажность и функции тач кнопок.

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

напиши координату написания символа данных после двоеточия , 250 норм будет? на фото у тебя там число 29 (температура)

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

а не для первого столбца где то 120 а второго где 365

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

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

myGLCD.setColor(255, 255, 255);
  myGLCD.printNumI(t, 395, 145);    /////395, 145
    
    sensors.requestTemperatures();
    myGLCD.setColor(255, 255, 255);
    myGLCD.printNumI(sensors.getTempCByIndex(0), 395, 110);  ///////395, 110

я еще не дошел до прописки что куда

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

395, 40

395, 75

395, 110

395, 145

395, 180

395, 210 вроде так

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

хз, скомпилиться или нет, у меня библиотек нет на экран , может ещё на что

#include <UTouch.h>
  #include <UTFT.h>
  #include <SPI.h>
  
  #include <Wire.h>
  #include "RTClib.h"
  RTC_DS3231 rtc;       //pin 20 SCL , 21 SDA
  
  #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 SmallFont[];
  extern uint8_t BigFont[];
  extern uint8_t SevenSegNumFont[];
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage, selectedUnit;

unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
bool Dvoet = 0;

/////////////////////////////




#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
#define TX 11


int length5 = 5;
int length6 = 6;

int pid = 1; // очередность пида
bool Init = 0;

int PIDTime = 150;    // задержка между посылками запросов температуры, мс
int PresTime = 9000;    // задержка между посылками запросов присутствия, мс 
int waitbyte = 1;       // задержка между отправкой байт в сообщении, мс

int Temp = 0;    // температура 
int rpm = 0;     // обороты
int load = 0;    // нагрузка
int tempair = 0; // температура входного воздуха
int Speed = 0;   // скорость
int MAP = 0;     // давление впускного коллектора
int gaz = 0;     // положение педали
int MAF = 0;     // сассовый расход воздуха


byte MessageRx[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};  // массив байтов принимаемого сообщения

byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
byte messageTemp[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A};    // запрос температуры 1
byte messageRPM[6] = {0x82,0x11,0xF1,0x01,0x0C,0x91};     // запрос оборотов ДВС 2
byte messageLoad[6] = {0x82,0x11,0xF1,0x01,0x04,0x89};    // запрос нагрузки на ДВС 3
byte messageAirTemp[6] = {0x82,0x11,0xF1,0x01,0x0F,0x94}; // запрос температура впускного воздуха 4
byte messageSpeed[6]= {0x82,0x11,0xF1,0x01,0x0D,0x92};    // запрос скорости а/м 5
byte messageMAP[6] = {0x82,0x11,0xF1,0x01,0x0B,0x90};     // запрос абсолютное давление во впускном коллекторе (MAP) 6
byte messageAcceler[6] = {0x82,0x11,0xF1,0x01,0x11,0x96}; // положения педали газа, % 7
byte messageMAF[6] = {0x82,0x11,0xF1,0x01,0x10,0x95};     // массовый расход воздуха, г/cек  8

unsigned long prevPID = 0;
unsigned long prevpres = 0;


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

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

void setup() {
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
 
    drawHomeScreen();  
    currentPage = '0'; 
    selectedUnit = '0'; 
  
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    // строка ниже используется для настройки даты и времени часов
    //rtc.adjust(DateTime(2017, 6, 23, 18, 0, 0));
  
  
  Serial.begin(115200);
  pinMode(TX, OUTPUT);
  fastinit();

  
  
}

void loop() {

unsigned long curPID = millis ();
unsigned long curpres = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();

if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
           else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {
if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
     }
receive ();
/////////////
unsigned long curWatch = millis();  
unsigned long curDvoet = millis();  
unsigned long curData = millis();  
if (curWatch - prevWatch > 10000)  { Watch&Temperature (); prevWatch = curWatch;}
if (curDvoet - prevDvoet > 500)  { 
  if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
  Menu();
   if (currentPage == '0') {if (curWatch - prevWatch > 200){
//        myGLCD.print("Ltr/Hor:", 10, 40);
  //      myGLCD.print("Ltr/100:", 10, 75);
  //    myGLCD.print("Ult  Km:", 10, 110);
 //       myGLCD.print("Ult Ltr:", 10, 145);
 //      myGLCD.print("Fuel Km:", 10, 180);
        myGLCD.printNumI(rpm, 120, 215);
        myGLCD.printNumI(Temp, 385, 40);
 //       myGLCD.print("Oil   C:", 255, 75);
 //       myGLCD.print("Exter C:", 255, 110);
        myGLCD.printNumI(t, 385, 145);
 //       myGLCD.print("Fuel  C:", 255, 180);
        myGLCD.printNumI(load, 385, 215);
     prevData = curData;   }}

   
  }



void PIDs() {

  if (pid==1){
  Serial.print ("Zapros Temp:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageTemp[i]);
    Serial.print(messageTemp[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==2){
  Serial.print ("Zapros RPM:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageRPM[i]);
    Serial.print(messageRPM[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==3){
  Serial.print ("Zapros Load:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageLoad[i]);
    Serial.print(messageLoad[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==4){
  Serial.print ("Zapros AirTemp:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageAirTemp[i]);
    Serial.print(messageAirTemp[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

    if (pid==5){
  Serial.print ("Zapros Speed:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageSpeed[i]);
    Serial.print(messageSpeed[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==6){
  Serial.print ("Zapros MAP:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageMAP[i]);
    Serial.print(messageMAP[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==7){
  Serial.print ("Zapros Accelerate:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageAcceler[i]);
    Serial.print(messageAcceler[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }

   if (pid==8){
  Serial.print ("Zapros MAF:   ");
  for (int i = 0; i < length6; i++) {
    mySerial.write(messageMAF[i]);
    Serial.print(messageMAF[i],HEX); Serial.print ("  ");
    delay (waitbyte); } 
   }
  
 pid++; if (pid>8) {pid = 1; Serial.println ("");}
  Serial.println ("");
 
}

void present() {
  Serial.print ("Zapros prisutstviya:   ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    Serial.print(messagePresent[i],HEX); Serial.print ("  ");
     delay (waitbyte); } 
  Serial.print("       "); Serial.print(PresTime); Serial.println("ms");
}

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

      Serial.print ("                                                            Recieve:   ");
    
    for (int i = 0; i < 12; 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) {Init=1;
 timerenabledInit=0; Serial.println ("                                                            Initialization OK!  "); 
   Serial.println("");
  Serial.print ("PID delay:  "); Serial.print(PIDTime);  Serial.println("ms");
  Serial.print ("Present delay:  "); Serial.print(PresTime);  Serial.println("ms");
    Serial.println("");}
 
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x05) {Temp = MessageRx[8]-40;
 timerenabledPID=0; Serial.print ("                                                            Temperature:  "); 
    Serial.print (Temp);  Serial.println (" *C");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0C) {rpm = ((MessageRx[8]*256) + MessageRx[9]) / 4;
timerenabledPID=0; Serial.print ("                                                            RPM:  "); 
    Serial.print (rpm);  Serial.println (" /min");}
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x04){ load = MessageRx[8]*100/255;
timerenabledPID=0; Serial.print ("                                                            Load:  "); 
    Serial.print (load);  Serial.println (" %");}
    
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0F) {tempair = MessageRx[8]-40;
timerenabledPID=0; Serial.print ("                                                            AirTemp:  "); 
    Serial.print (tempair);  Serial.println (" *C");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0D){ Speed = MessageRx[8];
timerenabledPID=0; Serial.print ("                                                            Speed:  "); 
    Serial.print (Speed);  Serial.println (" km/h");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0B){ MAP = MessageRx[8];
timerenabledPID=0; Serial.print ("                                                            MAP:  "); 
    Serial.print (MAP);  Serial.println (" kPa");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x11) {gaz = MessageRx[8]*100/255;
timerenabledPID=0; Serial.print ("                                                            Accelerate:  "); 
    Serial.print (gaz);  Serial.println (" %");}

if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x10) { MAF = ((MessageRx[8]*256) + MessageRx[9]) / 100;
timerenabledPID=0; Serial.print ("                                                            MAF:  "); 
    Serial.print (MAF);  Serial.println (" g/sec");}
  
     for (int i = 0; i < 12; i++) MessageRx[i]=0;
     }
   }

void initialization() {

Serial.print ("Zapros Initialization:  ");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    Serial.print(messageInit[i],HEX); Serial.print ("  ");
    delay (5);
      } 
      delay (55);
   Serial.println("");
  

}

void fastinit() {
  
    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");
                }






                ///////////////////////////////





                 void Menu {
   //Page 0 (home)
      if (currentPage == '0') { 
     if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
   // Button home
   if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
       
   // Button INF1
   if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
        drawFrame(10, 275, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
      } 
      
    // Button INF2
    if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        drawFrame(180, 275, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
     }
    }
   
//----------------------------------------------------------------------------------------------------------------------------------
    //Page 1
    if (currentPage == '1') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
       
    // Button INF2
    if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        drawFrame(180, 275, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
     }
    }
   

//-----------------------------------------------------
    //Page 2
    if (currentPage == '2') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }
      
    // Button INF1
    if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
        drawFrame(10, 275, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();                                                                      
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();                                                                      
      } 
    }
  }
//------------------------------------------------------------------------------
    //Page 3
    if (currentPage == '3') { 
       if (myTouch.dataAvailable()) {
       myTouch.read();
       x=myTouch.getX(); 
       y=myTouch.getY();
      
    //Button ERASE
    //if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        //drawFrame(180, 275, 300, 310); 
        //currentPage = '3';  //потом заменить на дейсвие         
        //myGLCD.clrScr();             
        //drawscreen_three();   //потом заменить на дейсвие                                                                   
      //} 
  
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
      }    
     }
    }
  }
  
//-----------------------------------------------------------------------------------
   void drawHomeScreen() {
    // линии
     line() ;
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     
     vista();
     myGLCD.print("Ltr/Hor:", 10, 40);
          
     vista();
     myGLCD.print("Ltr/100:", 10, 75);
     
     vista();
     myGLCD.print("Ult  Km:", 10, 110);
     
     vista();
     myGLCD.print("Ult Ltr:", 10, 145);
     
     vista();
     myGLCD.print("Fuel Km:", 10, 180);
     
     vista();
     myGLCD.print("Eng RPM:", 10, 215);
     
     
     
     vista();
     myGLCD.print("Engin C:", 255, 40);
     
     vista();
     myGLCD.print("Oil   C:", 255, 75);
     
     vista();
     myGLCD.print("Exter C:", 255, 110);
     
     vista();
     myGLCD.print("Inter C:", 255, 145);
     
     vista();
     myGLCD.print("Fuel  C:", 255, 180);
     
     vista();
     myGLCD.print("Load  %:", 255, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
//-----------------------------------------------------------------------------------
    void drawscreen_one() {
     line() ;
     
     vista();
     myGLCD.print("Start of Delivery  C:", 10, 40);
     
     vista();
     myGLCD.print("Desir inject Start C:", 10, 75);
     
     vista();
     myGLCD.print("Actua Inject Start C:", 10, 110);
     
     vista();
     myGLCD.print("Desir Inject Quan mg:", 10, 145);
     
     vista();
     myGLCD.print("Actu Inject Quant mg:", 10, 180);
     
     vista();
     myGLCD.print("Mass Air Flow     mg:", 10, 215);
 
  
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
}
//----------------------------------------------------------------------------------------
    void drawscreen_two() {
     // линии
     line() ;
     vista();
     myGLCD.print("EGR Pulse Ratio  :", 10, 40);
     
     vista();
     myGLCD.print("Boost Pressure   :", 10, 75);
     
     vista();
     myGLCD.print("Fuel Valve       :", 10, 110);
     
     vista();
     myGLCD.print("Pump Speed       :", 10, 145);
     
     vista();
     myGLCD.print("Glow Time        :", 10, 180);
     
     vista();
     myGLCD.print("A/C Pressure     :", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
//----------------------------------------------------------------------------
    void drawscreen_three() {
     // линии
     myGLCD.setColor(255, 0, 0); // цвет линии -зеленый
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     
    buttonHome();
  
     //Button - ERASE
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 275, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 275, 300, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("ERASE", 200, 285);
    }
   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, 65, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(0, 255, 0); // цвет текста оранжево-красный
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.setFont(BigFont);                      // размер шрифта
     myGLCD.setBackColor(0,0,0);            // цвет фона области где будет надпись и кнопки
     myGLCD.print("HOME", 1, 10); // центровка строки
     }
 void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 275, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 275, 120, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("INF 1", 25, 285);
     }
 void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 275, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 275, 300, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("INF 2", 200, 285);
     }
 void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 275, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 275, 470, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("CHECK", 375, 285);
     }
 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 vista(){
     myGLCD.setFont(GroteskBold16x32);
     myGLCD.setColor(255, 0, 0);
     myGLCD.setBackColor(0,0,0); 
 }

  void Watch&Temperature (){
  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); //зеленый цвет цифры
  myGLCD.setFont(GroteskBold16x32);
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);
  myGLCD.setColor(255, 255, 255);
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); }
  
  h = dht.readHumidity();
   t = dht.readTemperature();
 
  myGLCD.setColor(0, 255, 0); //белый цвет цифры
  myGLCD.printNumI(h, 350, 0);
  myGLCD.print("% ", 380, 0); 
  myGLCD.printNumI(t, 410, 0);
  myGLCD.print("C", 440, 0);
  myGLCD.print(" ", 285, 0);
  
  myGLCD.setColor(255, 255, 255);
  myGLCD.printNumI(t, 395, 145);
    
    sensors.requestTemperatures();
    myGLCD.setColor(255, 255, 255);
    myGLCD.printNumI(sensors.getTempCByIndex(0), 395, 110); 
  }

 

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

щас закину на обменник 3.95-2560-9488.rar и будешь из него компилить. он не компилится у меня.

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

понятно что правильно появление параметров двс на экране надо допиливать, но хотя бы так заработало бы