а я нашел программу клевую для связи с ком портом. Просто стандратный сериал монитор у ардуино ide корявый. Программа называется Terminal 1.9 . Просто хотел напрямую байты с терминала отправлять (по умолчанию при отправлении переводиться в символ по таблице Asсii), не понял как сделать в других терммналах. В этом например хотим отправить байт BF нужно написать $BF - удобный термнал. Если на дуине reset на массу посадить, то можно с эбу через этот терминал разговаривать. В этом терминале можно сообщения настраивать и все задержки.
МакsVV еще вопросик . как прописать чтобы если не произошла комуникация с первого раза, то запустится сново инит из сетупа? хочу прописать на всякий случай, да и щас пытаюсь соеденить скетч меню и обд. глаяну что получится. надо глянуть этот терминал, имеешь ссыльку на скачку?
набрал в яндексе "терминал байты" - первая ссылка. В сетапе всё что после fastinit(); сделай в отдельную функцию или же в этот fastinit() и запихать, а потом вызывать её когда надо.
за прослушку спасибо. за инит спасибо, думаю задержку для ответа можно уменьшить с 1000 до 50 или 100, везде хватает 50 м/с для ответа. да и ожидание ответова пидов тоже думаю можно урезать с 500 до 50 или 100. для того чтобы этот скетч был идеальным, не хватает одной вещи, если вдруг во время сеанса оборвалась связь и он начал получать порожняк , то он должен вернутся сново на fastinit();. тогда будет все в идеале и можно считать со скетчем покончино. останется выкинуть все на экран и выложить готовый проэкт.
а зачем тебе ты же уже знаешь адрес 10, у меня в ней нашло только 28 и 31 это блоки АБС и вроде коробки. а 11 мой не находил, прога испльзует fast init а у меня fast init 5boud. в моем посте 12 есть скетч для проверки всех возможных адросов но он только для fast init. если не найдет твой 10 , значит у тебя тоже 5boud. в сериале будет видно по правильному ответу на какие блоки подцепился
Я уже забил, не находит ничего на 10, я склоняюсь что у меня 5бод, ты писал что сообщение о коммуникации нужно будет сделать в простой блок сообщения. Не подскажешь как?
этот из 174 работат. но если закрыть монитор и снова открыть идут сплошные нули на запрос инита, снова перезапускаешь и все сново работает. думаю потому что ссесия не закрыта а даешь снова запрос на инит, при втором перезапуске по ходу ебу ссесию закрывает и все снова работает.....
Надо последний гвоздь в скет забить это если ссесия оборвется во время работы и чтобы он прыгнул на fastinit();
вот скетч меню я там правда нагородил. есть проблем тач медленно реагирует. по ходу пока все функции пройдет.... надо чтобы тач как то отдельно обновлялся по заданному времени а не после всего
этот из 174 работат. но если закрыть монитор и снова открыть идут сплошные нули на запрос инита, снова перезапускаешь и все сново работает. думаю потому что ссесия не закрыта а даешь снова запрос на инит, при втором перезапуске по ходу ебу ссесию закрывает и все снова работает.....
Надо последний гвоздь в скет забить это если ссесия оборвется во время работы и чтобы он прыгнул на fastinit();
т.е. кроме запроса инициализвации ещё и fastinit() перед этим всё время делать? Тут есть один момент. Если сессия уже открыта и сделать fastinit() я так понял блок перейлёт на следующий режим, т.к. fastinit() не только открывает сессию но и устанавливает режим 1 , т.е. считываение диагностических параметров (пиды текущих параметров), а если опять сделать fastinit() при открытой сессии, то будет уже режим 2 и т.д. что кстати и происходит когда сериал монитор закрываешь и сразу отвкрываешь, он переходит на режим 2, где не принимает эти пиды
Он шлет FF-ки и нули. Посмот не правильно ответ, прописать что в случае такого ответа перейти на fastidia():. Ладно не будем на этом зацикливатся. Это мелочь. Скетч меню видел выше?
Убирал её совсем, она там по идее не нужно. Но без неё двоеточие часов моргает бешано. Хотя ч пробовал без трех датчиков а оно глючит. Подключаешь и глюки исчезают. Надо будет попробывать
да без задержки все работает норм. только кнопку надо держать 2 секунды и тогда она реагирует. иногда быстрее иногда сразу. видать в каком месте всего цикла находится ближе или дальше
ниче так симпатично, меня интересует частота вызова функции drawHomeScreen(), я так понял она вызвается один раз в сетап и потом только! после нажатия на сенсор
Спасибо за приложение для андроид
незачто. очень удобное и HEX DEC BIN. долго им пользуюсь, доволен, да и окна в компе не нужно сворачивать и разворачивать
а я нашел программу клевую для связи с ком портом. Просто стандратный сериал монитор у ардуино ide корявый. Программа называется Terminal 1.9 . Просто хотел напрямую байты с терминала отправлять (по умолчанию при отправлении переводиться в символ по таблице Asсii), не понял как сделать в других терммналах. В этом например хотим отправить байт BF нужно написать $BF - удобный термнал. Если на дуине reset на массу посадить, то можно с эбу через этот терминал разговаривать. В этом терминале можно сообщения настраивать и все задержки.
МакsVV еще вопросик . как прописать чтобы если не произошла комуникация с первого раза, то запустится сново инит из сетупа? хочу прописать на всякий случай, да и щас пытаюсь соеденить скетч меню и обд. глаяну что получится. надо глянуть этот терминал, имеешь ссыльку на скачку?
набрал в яндексе "терминал байты" - первая ссылка. В сетапе всё что после 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("");}понял. сенкс. блин не очень получается склеить два сектча. синий уже ошибки и ошибки и ошибки......
вот скетч, запрос инита будет слаться до тех пор пока блок не ответит правильным сообщением, если ответил таким сообщением - начинают слаться пиды
#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"); }вот более правильный скетч прослушки
#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); } } }за прослушку спасибо. за инит спасибо, думаю задержку для ответа можно уменьшить с 1000 до 50 или 100, везде хватает 50 м/с для ответа. да и ожидание ответова пидов тоже думаю можно урезать с 500 до 50 или 100. для того чтобы этот скетч был идеальным, не хватает одной вещи, если вдруг во время сеанса оборвалась связь и он начал получать порожняк , то он должен вернутся сново на fastinit();. тогда будет все в идеале и можно считать со скетчем покончино. останется выкинуть все на экран и выложить готовый проэкт.
вот более правильный скетч прослушки
#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); } } }С этим скетчем у меня пусто в мониторе порта,загрузил предыдущий,работает.
значит пользуйся предылущим. ведь он тебе показывает мясо в сериале. а большего и не нужно.
Ради интереса решил найти эбу через findECU, пока не находит
а зачем тебе ты же уже знаешь адрес 10, у меня в ней нашло только 28 и 31 это блоки АБС и вроде коробки. а 11 мой не находил, прога испльзует fast init а у меня fast init 5boud. в моем посте 12 есть скетч для проверки всех возможных адросов но он только для fast init. если не найдет твой 10 , значит у тебя тоже 5boud. в сериале будет видно по правильному ответу на какие блоки подцепился
Я уже забил, не находит ничего на 10, я склоняюсь что у меня 5бод, ты писал что сообщение о коммуникации нужно будет сделать в простой блок сообщения. Не подскажешь как?
Хотя не заморачивайся,щас сам додумаю,спасибо
если у тебя 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 м/с
Спасибо, попробую!
С этим скетчем у меня пусто в мониторе порта,загрузил предыдущий,работает.
потому что надо так
#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); } } }Здорово. viki13viki, скетч из #157 не пробовал ?
ПРИВЕТ. сейчас спущусь и попробую и отпишусь. я целый день скрещиваю слона с носорогом, типа скетч меню и скетч обд. щас отпишусь
значит так. он дает запрос инит получает ответ но к пидам не переходит , запрос инит ответ инит и так до бесконечности
скинь что отвечает, я сделал такую проверку по байтам входящего сообщения
if(MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0xC1 && MessageRx[7]==0x6B && MessageRx[8]==0x8F)а вижу косяк, щас
вот
#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"); }starting comunication (fastinit)
да всё, я думал во входящем сначала три раза FF а тут два. Исправил см выше #174
скидывай потом сюда скетч своего меню-бортовика
этот из 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 поста у тебя есть :)
этот из 174 работат. но если закрыть монитор и снова открыть идут сплошные нули на запрос инита, снова перезапускаешь и все сново работает. думаю потому что ссесия не закрыта а даешь снова запрос на инит, при втором перезапуске по ходу ебу ссесию закрывает и все снова работает.....
Надо последний гвоздь в скет забить это если ссесия оборвется во время работы и чтобы он прыгнул на fastinit();
т.е. кроме запроса инициализвации ещё и fastinit() перед этим всё время делать? Тут есть один момент. Если сессия уже открыта и сделать fastinit() я так понял блок перейлёт на следующий режим, т.к. fastinit() не только открывает сессию но и устанавливает режим 1 , т.е. считываение диагностических параметров (пиды текущих параметров), а если опять сделать fastinit() при открытой сессии, то будет уже режим 2 и т.д. что кстати и происходит когда сериал монитор закрываешь и сразу отвкрываешь, он переходит на режим 2, где не принимает эти пиды
вопрос в том, как узнать оборвалась ли сессия, то бишь открыта она в данный момент времени или закрыта
Он шлет FF-ки и нули. Посмот не правильно ответ, прописать что в случае такого ответа перейти на fastidia():. Ладно не будем на этом зацикливатся. Это мелочь. Скетч меню видел выше?
задержку делай 1000 убери или меньше сделай, из за неё тормозит
Убирал её совсем, она там по идее не нужно. Но без неё двоеточие часов моргает бешано. Хотя ч пробовал без трех датчиков а оно глючит. Подключаешь и глюки исчезают. Надо будет попробывать
что подключаешь, задержку ? и исчезают глюки?
вот так попробуй, ну двоеточае конечно мигать не будет, но его отдельно можно сделать
#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); }да без задержки все работает норм. только кнопку надо держать 2 секунды и тогда она реагирует. иногда быстрее иногда сразу. видать в каком месте всего цикла находится ближе или дальше
а кнопка сенсор? ну всмысле нарисованная на экране?
да
ну тут видать корявость библы либо скетча по меню и кнопкам
опиши логику скетча, что в начале на экране, как меняется от чего и т.д.
да . как в песне , я тебя слепила из того что было, а потом что было то и полюбила. вот фото моей будуще красотульки
давно лепил, щас попробую разложить что к чему.
ниче так симпатично, меня интересует частота вызова функции drawHomeScreen(), я так понял она вызвается один раз в сетап и потом только! после нажатия на сенсор
Да. Она погружается в сетапе, а в лупе уже крутятся время дата температура влажность и функции тач кнопок.
напиши координату написания символа данных после двоеточия , 250 норм будет? на фото у тебя там число 29 (температура)
а не для первого столбца где то 120 а второго где 365
это датчики два но они не правильно прописаны, они отображаются на всех экран. а надо только на этом
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
я еще не дошел до прописки что куда
395, 40
395, 75
395, 110
395, 145
395, 180
395, 210 вроде так
хз, скомпилиться или нет, у меня библиотек нет на экран , может ещё на что
#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); }щас закину на обменник 3.95-2560-9488.rar и будешь из него компилить. он не компилится у меня.
понятно что правильно появление параметров двс на экране надо допиливать, но хотя бы так заработало бы