Во всех температурах второй байт обычно от 00 до 99 это и есть от 1 до 10 гр. Единственный байт из температу не цифровой EB это масло. Но я посмотрю , может не правильно скопировал.
первый байт он использует только значения из поста 401. например 0x1B 0x00 дает 417гр
вот значение температуры масла
0x0C, //Engine Oil Temperature // 57гр
0xEB, //Engine Oil Temperature
0x0c= DEC 12 c нулевым вторым байтом он выдает 34гр
0xEB= DEC 235 превращаются в остальные 23 гр
в формуле возможно что второй байт делится на 10, 235/10=23,5 понятно что он округляет до 23 и прибавляется уже к 12 переведенном в 34гр
меняем на F
0x0C, //Engine Oil Temperature // 59гр
0xFB, //Engine Oil Temperature
0xFB= DEC 251 превращаются в остальные 25 гр здесь тоже, 251/10=25,1
еще пример 0x0F c нулевым байто это 111гр
0x0F ,0xFB выдает 136. тут опять видно что FB добавил тех же 25гр 251/10=25,1
уже есть какаято закономерность
но если такая фича
0x0С, //Coolant Temperature (с нулевым вторым байтом байтом это 34гр)
0x37, //Coolant Temperature с этим байтом имеем 39гр тоесть 0x37 превратились в 5гр
0x0С, //Coolant Temperature (с нулевым вторым байтом байтом это 34гр)
0x76, //Coolant Temperature с этим байтом имеем 46гр тоесть 0x76 превратились в12гр
0x0D, //Coolant Temperature (с нулевым вторым байтом байтом это 59гр)
0x37, //Coolant Temperature с этим байтом имеем 59гр тоесть 0x37 превратились в 6гр
0x0D, //Coolant Temperature (с нулевым вторым байтом байтом это 59гр)
0x37, //Coolant Temperature с этим байтом имеем 71гр тоесть 0x37 превратились в 2гр
все я запутался, тихо медля неспеша, крыша едет с чердака
Что разгадано
0x0A,0x00, 25,6 % //Accelerator Position Sensor Signal // ((256*A)+B)/100 0k
0x11,0x89, 499 mg/strk //Mass Air Flow Sensor // ((256*A)+B)/10 0k
0x04,0x30, 1,1 bar //Boost Pressure // ((256*A)+B)/1000 0k
0x03,0x20, 800 rpm //Engine Speed // (256*A)+B ok
0x0B,0x55, 290 mg/strk //EGR Command (Exhaust-Gas Recirculation Command)// ((256*A)+B)/10 0k
0x03,0xA3, 0,9 bar //Barometer Sensor //((256*A)+B)/1000 0k
0x04,0x2D, 1,1 bar //Boost Pressure Command // ((256*A)+B)/1000 0k
0x03,0x20, 800 rpm //Desired Engine Idle Speed // (256*A)+B ok
0x0C,0x36 31 km/h //Vehicle Speed // (256*A)+B ok
0x0C,0x36 31 km/h //Vehicle Speed Command // (256*A)+B ok
0x03,0x0A, 7,8 mg/strk //Desired Injection Quantity // ((256*A)+B)/100 0k
0x02,0xD9, 7,3 mg/strk //Injection Quantity // ((256*A)+B)/100 0k
0x08,0xA3, 22,1 *CA //Start of Delivery // ((256*A)+B)/100 0k
0x01,0x90, 400 rpm //Pump Speed // (A*255)+B ok
0x01,0x5C, 3 % //EGR Pulse Ratio (Exhaust Gas Recirculation) // ((256*A)+B)/100 0k
0x02,0x76, 6,3 % //Swirl Level Control Solenoid Valve Pulse Ratio // ((256*A)+B)/100 0k
0x12,0x03, 46,1 % //Pulse Ratio Boost Pressure Solenoid Valve // ((256*A)+B)/100 0k
что не разгадано
0x01,0x7B, 4,4 *CA //Desired Injection Start
0x01,0x92, 4,7 *CA //Actual injection start
0x0B,0xDB, 30 *C //Intake Air Temperature
0x0C,0x37, 39 *C //Coolant Temperature
0x0C,0xEB, 57 *C //Engine Oil Temperature
0x0C,0x27, 38 *C //Fuel Temperature
все формулы одинаковые, единственное различие, это всею формулу (А*256)+В либо не делишь вообще либо на 10,100 или 1000. это чуток пугает или удивляет, не знаю. по идеи и к *CA и к *C должно было подойти , но увы не выходит. вот такие вот пироги. шифрую дальше, хотя нет, спать, мозги уже не варят.
дело в том что там четыре температуры , масло, двеигатель, входящего воздуха, и топлива. жалко упускать. надо немного отключится от этого, попробую скетч сообразить, а потом свежим взглядом опять шифровать
"a" послал, это значит выбран байт A для изменения отправкой + или -. Т.е. послал "b" далее посылаешь "+" например. байт B изменяется на +0x01. Не обязательно каждый раз "b" отправлять. Один раз выбрал b и далее шлешь плюсы или минусы, потом опять можно "a" выбрать и т.д.
по идее ошибка должна быть не более 1 градуса, так как округление нада настраивать, ну где то может 2 градуса из-за суммы ошибок преобразования первого байта и корявого округленгия второго
просто округление вообще не настроено - апример число 13,9 он воспринимает как 13. Надо учиться программировать, там через double делается или float. Все не сложно, надо почитать просто. А так то хорошая точность
измени мой скетч под байты этого параметра, и сделай статистику побольше, чтоб 0 был байт А потом 0 байт B, потом вместе изменяеются. С моим скетчем проще статистику собирать
0x01,0x00 = -247гр
0x0A,0x00 = -17гр
0x0B,0x00 = 8гр
0x0C,0x00 = 34гр
0x0D,0x00 = 59гр
0x0E,0x00 = 85гр
0x0F,0x00 = 111гр
со вторым байтом я разобрался
у тебя странно на втором байте порядок с шагом 0х05 - 0х10 0х15 0х20 0х25 а надо вроде как 0х10 0х15 0х1А 0х1F 0х24
Если начинать с 0А, то тоже по градуса прибавляет.
Надо с первым разобраться а потом прибавлять второй.
странно что шаг у первого байта, то 25 то 26, может там десятичное число, например 25,25 и за четыре набегает 26
Я просто вводил 0D а мог ввести допустим 5С и было бы какое то среднее значение между 0C и 0D примерно 49гр.дома проверю.
Во всех температурах второй байт обычно от 00 до 99 это и есть от 1 до 10 гр. Единственный байт из температу не цифровой EB это масло. Но я посмотрю , может не правильно скопировал.
первый байт он использует только значения из поста 401. например 0x1B 0x00 дает 417гр
вот значение температуры масла
0x0C, //Engine Oil Temperature // 57гр
0xEB, //Engine Oil Temperature
0x0c= DEC 12 c нулевым вторым байтом он выдает 34гр
0xEB= DEC 235 превращаются в остальные 23 гр
в формуле возможно что второй байт делится на 10, 235/10=23,5 понятно что он округляет до 23 и прибавляется уже к 12 переведенном в 34гр
меняем на F
0x0C, //Engine Oil Temperature // 59гр
0xFB, //Engine Oil Temperature
0xFB= DEC 251 превращаются в остальные 25 гр здесь тоже, 251/10=25,1
еще пример 0x0F c нулевым байто это 111гр
0x0F ,0xFB выдает 136. тут опять видно что FB добавил тех же 25гр 251/10=25,1
уже есть какаято закономерность
но если такая фича
0x0С, //Coolant Temperature (с нулевым вторым байтом байтом это 34гр)
0x37, //Coolant Temperature с этим байтом имеем 39гр тоесть 0x37 превратились в 5гр
0x0С, //Coolant Temperature (с нулевым вторым байтом байтом это 34гр)
0x76, //Coolant Temperature с этим байтом имеем 46гр тоесть 0x76 превратились в12гр
0x0D, //Coolant Temperature (с нулевым вторым байтом байтом это 59гр)
0x37, //Coolant Temperature с этим байтом имеем 59гр тоесть 0x37 превратились в 6гр
0x0D, //Coolant Temperature (с нулевым вторым байтом байтом это 59гр)
0x37, //Coolant Temperature с этим байтом имеем 71гр тоесть 0x37 превратились в 2гр
все я запутался, тихо медля неспеша, крыша едет с чердака
Что разгадано
0x0A,0x00, 25,6 % //Accelerator Position Sensor Signal // ((256*A)+B)/100 0k
0x11,0x89, 499 mg/strk //Mass Air Flow Sensor // ((256*A)+B)/10 0k
0x04,0x30, 1,1 bar //Boost Pressure // ((256*A)+B)/1000 0k
0x03,0x20, 800 rpm //Engine Speed // (256*A)+B ok
0x0B,0x55, 290 mg/strk //EGR Command (Exhaust-Gas Recirculation Command)// ((256*A)+B)/10 0k
0x03,0xA3, 0,9 bar //Barometer Sensor //((256*A)+B)/1000 0k
0x04,0x2D, 1,1 bar //Boost Pressure Command // ((256*A)+B)/1000 0k
0x03,0x20, 800 rpm //Desired Engine Idle Speed // (256*A)+B ok
0x0C,0x36 31 km/h //Vehicle Speed // (256*A)+B ok
0x0C,0x36 31 km/h //Vehicle Speed Command // (256*A)+B ok
0x03,0x0A, 7,8 mg/strk //Desired Injection Quantity // ((256*A)+B)/100 0k
0x02,0xD9, 7,3 mg/strk //Injection Quantity // ((256*A)+B)/100 0k
0x08,0xA3, 22,1 *CA //Start of Delivery // ((256*A)+B)/100 0k
0x01,0x90, 400 rpm //Pump Speed // (A*255)+B ok
0x01,0x5C, 3 % //EGR Pulse Ratio (Exhaust Gas Recirculation) // ((256*A)+B)/100 0k
0x02,0x76, 6,3 % //Swirl Level Control Solenoid Valve Pulse Ratio // ((256*A)+B)/100 0k
0x12,0x03, 46,1 % //Pulse Ratio Boost Pressure Solenoid Valve // ((256*A)+B)/100 0k
что не разгадано
0x01,0x7B, 4,4 *CA //Desired Injection Start
0x01,0x92, 4,7 *CA //Actual injection start
0x0B,0xDB, 30 *C //Intake Air Temperature
0x0C,0x37, 39 *C //Coolant Temperature
0x0C,0xEB, 57 *C //Engine Oil Temperature
0x0C,0x27, 38 *C //Fuel Temperature
все формулы одинаковые, единственное различие, это всею формулу (А*256)+В либо не делишь вообще либо на 10,100 или 1000. это чуток пугает или удивляет, не знаю. по идеи и к *CA и к *C должно было подойти , но увы не выходит. вот такие вот пироги. шифрую дальше, хотя нет, спать, мозги уже не варят.
может температуру все таки стандартным пидом запрашивать? ))
дело в том что там четыре температуры , масло, двеигатель, входящего воздуха, и топлива. жалко упускать. надо немного отключится от этого, попробую скетч сообразить, а потом свежим взглядом опять шифровать
может по поводу температуры охл. жидости такая формула? A*26-278+B/5
все таки если ты понял как второй байт себя ведет, напиши все байты прибавляющие от 1 до 10
ок. секунду, щас
хотя второй байт всё таки больше 10 тоже может прибавлять . Вот ещё такая формула кое где подходит масла или входящего воздуха)) A*26-278+B/10
B/5 кстати вообще не катит
A*26-278+B/10 короче вот эта формула и округлять B/10 после 0,6 это 1
щас проверю
блин, вроде канает. :). осталась это
0x01,0x7B, 4,4 *CA //Desired Injection Start
0x01,0x92, 4,7 *CA //Actual injection start
и кряк кwp закончин, Хе Хе Хе......
так правильно ((A*26)-278)+B/10 или так ((A*26)-278)+(B/10) ?
единственное для если первый байт 0x0B или 0x0C то такая формула A*26-278+B/10
если 0х0А или меньше A*26-277+B/10
если 0х0D или больше A*26-279+B/10
получается до 0A 277 после до 0D 278 и поле 279. на трех этапах 1 градус разница. я думаю можно оставить среднее 278
так правильно ((A*26)-278)+B/10 или так ((A*26)-278)+(B/10) ?
и что думаешь по последнему гвоздю в гроб KWP ? с этой формулой
0x01,0x7B, 4,4 *CA //Desired Injection Start
0x01,0x92, 4,7 *CA //Actual injection start
да зачем сделаем все три так точнее
щас скетч для проверки сделаю
ок, как скажишь ты у нас шеф повор а я поворешка
вот накидал то что мне нужно
тока нужно глянуть или байты правильно подсчитал, вроде правильно, считал от "0"
вот скетч, отсылает в сериал температуру двигала и значения байтов, отправляешь с сериал порта + или - для изменения значение байта
Только в мониторе сериал порта установи "Нет конца строки" справа внизу.
Выбор байта для изменения значение осуществляется отправкой символа "a" или "b"
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); //R,T unsigned long prevTimedelay = 0; int length5 = 5; int length7 = 7; byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения int bytenumber = 14; // номер изменяемого байта в сообщении 21 01 bool Print = 0; // настройка вывода логов сообщений в сериал 1 - да, 0 - нет bool Bytenumber = 0; // флаг начала опроса номера байта byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40}; byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01}; int length44 = 44; byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03, 0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC}; // A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03 // 92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69 // 03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC int length100 = 100; byte messageIDEN2[100] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37, 0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20, 0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D, 0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44, 0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07, 0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, 0x38, 0xFF}; int length81 = 81; byte messagePIDS[81] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //Coolant Temperature 0x00, //Coolant Temperature 0x01, //Actual injection start 0x92, //Actual injection start 0x0C, //Engine Oil Temperature 0xEB, //Engine Oil Temperature 0x00, //Accelerator Position Sensor Signal 0x00, //Accelerator Position Sensor Signal 0x02, //System Voltage 0xB3, //System Voltage 0x00, //High Pressure Diagnosis 1 0x00, //High Pressure Diagnosis 1 0x11, //Mass Air Flow Sensor 0x89, //Mass Air Flow Sensor 0x04, //Boost Pressure 0x30, //Boost Pressure 0x00, //High Pressure Diagnosis 2 0x00, //High Pressure Diagnosis 2 0x03, //Engine Speed 0x20, //Engine Speed 0x0B, //EGR Command (Exhaust-Gas Recirculation Command) 0x55, //EGR Command (Exhaust-Gas Recirculation Command) 0x03, //Barometer Sensor 0xA3, //Barometer Sensor 0x04, //Boost Pressure Command 0x2D, //Boost Pressure Command 0x03, //Desired Engine Idle Speed 0x20, //Desired Engine Idle Speed 0xEE, 0xB9, 0x00, //Vehicle Speed 0x00, //Vehicle Speed 0x00, //Vehicle Speed Command 0x00, //Vehicle Speed Command 0x0C, 0x35, 0x03, //Desired Injection Quantity 0x0A, //Desired Injection Quantity 0x02, //Injection Quantity 0xD9, //Injection Quantity 0x08, //Start of Delivery 0xA3, //Start of Delivery 0x01, //Pump Speed 0x90, //Pump Speed 0x0C, //Fuel Temperature 0x27, //Fuel Temperature 0xA0, 0x00, 0x01, //EGR Pulse Ratio (Exhaust Gas Recirculation) 0x5C, //EGR Pulse Ratio (Exhaust Gas Recirculation) 0x02, //Swirl Level Control Solenoid Valve Pulse Ratio 0x76, //Swirl Level Control Solenoid Valve Pulse Ratio 0xAD, 0x08, 0x01, 0x30, 0x00, //Pulse Ratio Boost Pressure Solenoid Valve 0x03, //Pulse Ratio Boost Pressure Solenoid Valve 0x01, //Desired Injection Start 0x7B, //Desired Injection Start 0x0B, //Intake Air Temperature 0xDB, //Intake Air Temperature 0x03, 0xA3, 0x00, 0x02, 0x1F}; int waitbyte=5; long prev=0; int temp=0; void setup() { Serial.begin (115200); mySerial.begin (10400); //Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println (""); //Serial.println ("Please input byte in HEX... "); Serial.println (""); } void loop() { long cur = millis(); if (Serial.available()) { delay(30); byte inbyte=0; inbyte = Serial.read(); if (inbyte == 0x61) bytenumber = 14; if (inbyte == 0x62) bytenumber = 15; if (inbyte == 0x2B) messagePIDS[bytenumber]++; if (inbyte == 0x2D) messagePIDS[bytenumber]--; if (bytenumber == 14) {if (messagePIDS[bytenumber]>0x0F) messagePIDS[bytenumber]==0;} if (messagePIDS[14]<=0x0A) temp = ((messagePIDS[14]*26)-277)+messagePIDS[15]/10; if (messagePIDS[14]==0x0B||messagePIDS[14]==0x0C) temp = ((messagePIDS[14]*26)-278)+messagePIDS[15]/10; if (messagePIDS[14]>0x0C) temp = ((messagePIDS[14]*26)-279)+messagePIDS[15]/10; Serial.flush(); return;} // if (cur-prev>1000) {Serial.print (messagePIDS[14]); Serial.print(" ") ; Serial.print (messagePIDS[15]); // Serial.print (messagePIDS[16]); Serial.print(" ") ; Serial.print (messagePIDS[17]); //Serial.print (messagePIDS[18]); Serial.print(" ") ; Serial.println (messagePIDS[18]); prev=cur;} if (cur-prev>2000) { Serial.print ("A: 0x"); if (messagePIDS[14]<0x10){ Serial.print("0"); } Serial.print (messagePIDS[14], HEX); Serial.print (" "); Serial.print ("B: 0x"); if (messagePIDS[15]<0x10){ Serial.print("0"); } Serial.println (messagePIDS[15], HEX); Serial.println (""); Serial.print ("Coolant Temp: "); Serial.println (temp); Serial.println ("");prev=cur;} if (mySerial.available()) { delay(100); int k=0; byte inbyte=0; while( mySerial.available() && k < 100) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } if (Print){ Serial.print ("Recieve: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println ("");} if ((MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) { if (Print){ Serial.println ("Prinyat zapros init! "); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length7; i++) { mySerial.write(messageCOMUN[i]); if (Print) { Serial.print(messageCOMUN[i],HEX); Serial.print (" ");} } if (Print) Serial.println(""); } if (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x3E && MessageRx[4]==0xC1) { if (Print) { Serial.println ("Prinyat zapros prisutstvia! "); Serial.println (""); // Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length5; i++) { mySerial.write(messagePRES[i]); if (Print) { Serial.print(messagePRES[i],HEX); Serial.print (" ");} } if (Print) Serial.println(""); } if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) { if (Print) { Serial.println ("Prinyat zapros identificacion 1! "); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length44; i++) { mySerial.write(messageIDEN1[i]); if (Print) { Serial.print(messageIDEN1[i],HEX); Serial.print (" ");} } if (Print) { Serial.println(""); Serial.print ("Otvechayu DEC: "); for (int i = 0; i < length44; i++) { Serial.print(messageIDEN1[i]); Serial.print (" "); } Serial.println("");} } if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) { if (Print) { Serial.println ("Prinyat zapros identificacion 2! "); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length100; i++) { mySerial.write(messageIDEN2[i]); if (Print) {Serial.print(messageIDEN2[i],HEX); Serial.print (" ");} } if (Print) {Serial.println(""); Serial.print ("Otvechayu DEC: "); for (int i = 0; i < length100; i++) { Serial.print(messageIDEN2[i]); Serial.print (" "); } Serial.println("");} } if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) { if (Print) { Serial.println ("Prinyat zapros datos! "); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length81; i++) { mySerial.write(messagePIDS[i]); if (i==31){ delay (113); if (Print) {Serial.println ("");}} if (Print) { Serial.print(messagePIDS[i],HEX); Serial.print (" ");} } if (Print) Serial.println(""); } } }ну и сравниваешь температуру в сериал порте с опкомом, узнаешь точность нашего измерения))
ок. щас попробую
а как изменять байт. сразу скажу что в опкоме -273 а сериале -277
послать а и ввести значение?
отправляешь с сериал порта "+" или "-". как в сериале -277 ? у меня в сериал сначала 0 температура пока байты не начнешь менять.
на температуру ниже -40 не стоит обращать внимания, там точность нас не интересует
"a" послал, это значит выбран байт A для изменения отправкой + или -. Т.е. послал "b" далее посылаешь "+" например. байт B изменяется на +0x01. Не обязательно каждый раз "b" отправлять. Один раз выбрал b и далее шлешь плюсы или минусы, потом опять можно "a" выбрать и т.д.
по идее ошибка должна быть не более 1 градуса, так как округление нада настраивать, ну где то может 2 градуса из-за суммы ошибок преобразования первого байта и корявого округленгия второго
первый байт меняет и совпадения идеальные. меняя воторой байт такое
до 8E... serial 21 opcom 22
после serial 22 opcom 22
от 98... serial 23 opcom 23
после 99... serial 23 opcom 24
от 9A... serial 23 opcom 24
от A0... serial 24 opcom 24
от A3... serial 24 opcom 25
от AA... serial 25 opcom 25
гдето так.
просто округление вообще не настроено - апример число 13,9 он воспринимает как 13. Надо учиться программировать, там через double делается или float. Все не сложно, надо почитать просто. А так то хорошая точность
да. точность супер. глаянь последнюю формулу. я уже тут ее мучаю, никак не дается.
0x01,0x7B, 4,4 *CA //Desired Injection Start
0x01,0x92, 4,7 *CA //Actual injection start если есть желание и возможность, конечно.
у меня выходит что то в этом роде (((A*256)+B)+70)/100 щас проверю на других показаниях
измени мой скетч под байты этого параметра, и сделай статистику побольше, чтоб 0 был байт А потом 0 байт B, потом вместе изменяеются. С моим скетчем проще статистику собирать
ок. потом буду щарапать скетч для этого
вот скетч actual inj с твоей формулой
#include <math.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); //R,T unsigned long prevTimedelay = 0; int length5 = 5; int length7 = 7; byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения int bytenumber = 16; // номер изменяемого байта в сообщении 21 01 bool Print = 0; // настройка вывода логов сообщений в сериал 1 - да, 0 - нет bool Bytenumber = 0; // флаг начала опроса номера байта byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40}; byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01}; int length44 = 44; byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03, 0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC}; // A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03 // 92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69 // 03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC int length100 = 100; byte messageIDEN2[100] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37, 0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20, 0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D, 0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44, 0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07, 0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, 0x38, 0xFF}; int length81 = 81; byte messagePIDS[81] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //Coolant Temperature 0x00, //Coolant Temperature 0x01, //Actual injection start 0x92, //Actual injection start 0x0C, //Engine Oil Temperature 0xEB, //Engine Oil Temperature 0x00, //Accelerator Position Sensor Signal 0x00, //Accelerator Position Sensor Signal 0x02, //System Voltage 0xB3, //System Voltage 0x00, //High Pressure Diagnosis 1 0x00, //High Pressure Diagnosis 1 0x11, //Mass Air Flow Sensor 0x89, //Mass Air Flow Sensor 0x04, //Boost Pressure 0x30, //Boost Pressure 0x00, //High Pressure Diagnosis 2 0x00, //High Pressure Diagnosis 2 0x03, //Engine Speed 0x20, //Engine Speed 0x0B, //EGR Command (Exhaust-Gas Recirculation Command) 0x55, //EGR Command (Exhaust-Gas Recirculation Command) 0x03, //Barometer Sensor 0xA3, //Barometer Sensor 0x04, //Boost Pressure Command 0x2D, //Boost Pressure Command 0x03, //Desired Engine Idle Speed 0x20, //Desired Engine Idle Speed 0xEE, 0xB9, 0x00, //Vehicle Speed 0x00, //Vehicle Speed 0x00, //Vehicle Speed Command 0x00, //Vehicle Speed Command 0x0C, 0x35, 0x03, //Desired Injection Quantity 0x0A, //Desired Injection Quantity 0x02, //Injection Quantity 0xD9, //Injection Quantity 0x08, //Start of Delivery 0xA3, //Start of Delivery 0x01, //Pump Speed 0x90, //Pump Speed 0x0C, //Fuel Temperature 0x27, //Fuel Temperature 0xA0, 0x00, 0x01, //EGR Pulse Ratio (Exhaust Gas Recirculation) 0x5C, //EGR Pulse Ratio (Exhaust Gas Recirculation) 0x02, //Swirl Level Control Solenoid Valve Pulse Ratio 0x76, //Swirl Level Control Solenoid Valve Pulse Ratio 0xAD, 0x08, 0x01, 0x30, 0x00, //Pulse Ratio Boost Pressure Solenoid Valve 0x03, //Pulse Ratio Boost Pressure Solenoid Valve 0x01, //Desired Injection Start 0x7B, //Desired Injection Start 0x0B, //Intake Air Temperature 0xDB, //Intake Air Temperature 0x03, 0xA3, 0x00, 0x02, 0x1F}; int waitbyte=5; long prev=0; float temp=0.0; //double B = 2.71; //double x, y; //y = std::modf(B, &x); // целая часть запишется в x, дробная - в y void setup() { Serial.begin (115200); mySerial.begin (10400); //Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println (""); //Serial.println ("Please input byte in HEX... "); Serial.println (""); } void loop() { long cur = millis(); if (Serial.available()) { delay(30); byte inbyte=0; inbyte = Serial.read(); if (inbyte == 0x61) bytenumber = 16; if (inbyte == 0x62) bytenumber = 17; if (inbyte == 0x2B) messagePIDS[bytenumber]++; if (inbyte == 0x2D) messagePIDS[bytenumber]--; //B = messagePIDS[15]; //y = std::modf(B, &x); //if (messagePIDS[14]<=0x0A) temp = ((messagePIDS[14]*26)-277)+messagePIDS[15]/10; //if (messagePIDS[14]==0x0B||messagePIDS[14]==0x0C) temp = ((messagePIDS[14]*26)-278)+messagePIDS[15]/10; //if (messagePIDS[14]>0x0C) temp = ((messagePIDS[14]*26)-279)+messagePIDS[15]/10; Serial.flush(); return;} temp = (((messagePIDS[16]*256)+messagePIDS[17])+70)/100.0; if (cur-prev>2000) {Serial.print ("A: 0x"); if (messagePIDS[16]<0x10){ Serial.print("0"); } Serial.print (messagePIDS[16], HEX); Serial.print (" "); Serial.print ("B: 0x"); if (messagePIDS[17]<0x10){ Serial.print("0"); } Serial.println (messagePIDS[17], HEX); Serial.println (""); Serial.print ("Actual Injection: "); Serial.println (temp); Serial.println ("");prev=cur;} if (mySerial.available()) { delay(100); int k=0; byte inbyte=0; while( mySerial.available() && k < 100) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } if (Print){ Serial.print ("Recieve: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println ("");} if ((MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) { if (Print){ Serial.println ("Prinyat zapros init! "); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length7; i++) { mySerial.write(messageCOMUN[i]); if (Print) { Serial.print(messageCOMUN[i],HEX); Serial.print (" ");} } if (Print) Serial.println(""); } if (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x3E && MessageRx[4]==0xC1) { if (Print) { Serial.println ("Prinyat zapros prisutstvia! "); Serial.println (""); // Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length5; i++) { mySerial.write(messagePRES[i]); if (Print) { Serial.print(messagePRES[i],HEX); Serial.print (" ");} } if (Print) Serial.println(""); } if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) { if (Print) { Serial.println ("Prinyat zapros identificacion 1! "); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length44; i++) { mySerial.write(messageIDEN1[i]); if (Print) { Serial.print(messageIDEN1[i],HEX); Serial.print (" ");} } if (Print) { Serial.println(""); Serial.print ("Otvechayu DEC: "); for (int i = 0; i < length44; i++) { Serial.print(messageIDEN1[i]); Serial.print (" "); } Serial.println("");} } if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) { if (Print) { Serial.println ("Prinyat zapros identificacion 2! "); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length100; i++) { mySerial.write(messageIDEN2[i]); if (Print) {Serial.print(messageIDEN2[i],HEX); Serial.print (" ");} } if (Print) {Serial.println(""); Serial.print ("Otvechayu DEC: "); for (int i = 0; i < length100; i++) { Serial.print(messageIDEN2[i]); Serial.print (" "); } Serial.println("");} } if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) { if (Print) { Serial.println ("Prinyat zapros datos! "); Serial.println (""); Serial.print ("Otvechayu: ");} for (int i = 0; i < length81; i++) { mySerial.write(messagePIDS[i]); if (i==31){ delay (113); if (Print) {Serial.println ("");}} if (Print) { Serial.print(messagePIDS[i],HEX); Serial.print (" ");} } if (Print) Serial.println(""); } } }формула для actinj неправильная A: 0x04 B: 0x92 Actual Injection: 12.40 а должно быть 13,7
да , подбераю по скетчу, блин очень удобно
подобрал вроде формулу. есть проблема
0x01(DEC=1), 0x95(DEC=149) отображение 4,7 *CA
формула такая ((A*3)+B/100)+0.3 получаем ((1*3)+149/100)+0.2 итог 3+1.49+0.2 = 4.69
проблема такая что в мониторе показывает 4.2 тоесть 0.49 гдето теряется. если делать без +0.2
(A*3)+B/100 получает (1*3)+149/100 итог 3+1.49 = 4.49 но отображает в сериале 4.00 , где засада?
Там где 149/100 попробуй 149/100.00
да сработало. формула работает. берусь за скетч
(A*3)+(B/100.00)+0.30;
MaksVV накидал сетч, что то не так, глянь пожалуйста.
#include <UTouch.h> #include <UTFT.h> #include <SPI.h> //pin 20 SCL , 21 SDA датчик реального времени #include <Wire.h> #include "RTClib.h" RTC_DS3231 rtc; //датчик наружней температуры #include <OneWire.h> #define ONE_WIRE_BUS 8 OneWire oneWire(ONE_WIRE_BUS); #include <DallasTemperature.h> DallasTemperature sensors(&oneWire); //датчик внутринней температуры и влаги #include "DHT.h" #define DHTPIN 9 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); //пины экрана и тача UTFT myGLCD(31,38,39,40,41); UTouch myTouch(6,5,4,3,2); //шрифты + не стандартный шрифт GroteskBold16x32.с extern uint8_t SmallFont[]; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFont[]; extern uint8_t GroteskBold16x32[]; int x, y; char currentPage, selectedUnit; float h; float t; unsigned long prevWatch = 0; unsigned long prevDvoet = 0; unsigned long prevData = 0; bool Dvoet = 0; ////////////////////////////////////////////////////////////////////////////// //все что касается OBD2 #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 MAF = 0; //26,27 байты int BoostPres = 0; //28,29 байты int RPM = 0; //32,33 байты int EGRmg = 0; //34,35 байты int BoostPresCom = 0; //38,39 байты int Speed = 0; //44,45 байты int DesaInjQua = 0; //50,51 байты int InjQua = 0; //52,53 байты int StaDaliv = 0; //54,55 байты int PumpRPM = 0; //56,57 байты int EGRPul = 0; //62,63 байты int SolenPul = 0; //64,65 байты int SolenPre = 0; //70,71 байты int DesInj = 0; //72,73 байты int ActInj = 0; //16,17 байты int TempAir = 0; //74,75 байты int Temp = 0; //14,15 байты int TempOil = 0; //18,19 байты int TempFuel = 0; //58,59 байты // массив байтов принимаемого сообщения byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения //массивы сообщений (пидов) byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04}; // запрос инициализации byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1}; // запрос присутствия byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6}; // запрос температуры 1 unsigned long prevPID = 0; unsigned long prevpres = 0; unsigned long TimewaitPID, timerwaitPID = 0; bool timerenabledPID = 0; #define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 60 // здесь задержка на ожидание правильного ответа пидов, мс unsigned long TimewaitInit, timerwaitInit = 0; bool timerenabledInit = 0; #define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 500 // здесь задержка на ожидание ответа об удачной инициализации, мс ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 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, 7, 6, 17, 35, 0)); Watch_Temperature (); pinMode(TX, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { MAF = ((messagePids[26]*256)+messagePids[27])/10; BoostPres = ((messagePids[28]*256)+messagePids[29])/1000; RPM = (messagePids[32]*256)+messagePids[33]; EGRmg = ((messagePids[34]*256)+messagePids[35])/10; BoostPresCom = ((messagePids[38]*256)+messagePids[39])/1000; Speed = (messagePids[44]*256)+messagePids[45]; DesaInjQua = ((messagePids[50]*256)+messagePids[51])/100; InjQua = ((messagePids[52]*256)+messagePids[53])/100; StaDaliv = ((messagePids[54]*256)+messagePids[55])/100; PumpRPM = (messagePids[56]*256)+messagePids[57]; EGRPul = ((messagePids[62]*256)+messagePids[63])/100; SolenPul = ((messagePids[64]*256)+messagePids[65])/100; SolenPre = ((messagePids[70]*256)+messagePids[71])/100; DesInj = ((messagePids[72]*3)+(messagePids[73])/100.00)+0.3; ActInj = ((messagePids[16]*3)+(messagePids[17])/100.00)+0.3; TempAir = ((messagePids[74]*26)-278)+messagePids[75]/10; Temp = ((messagePids[14]*26)-278)+messagePids[15]/10; TempOil = ((messagePids[18]*26)-278)+messagePids[19]/10; TempFuel = ((messagePids[58]*26)-278)+messagePids[59]/10; 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.setColor(0, 255, 0); if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру myGLCD.printNumI(Speed, 350, 0); myGLCD.setColor(255, 255, 255); //if (--<10) {myGLCD.print(" ", 166, 40); }; //затираем вторую цифру и третью //if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру //myGLCD.printNumI(--, 165, 40); //if (--<10) {myGLCD.print(" ", 166, 75); }; //затираем вторую цифру и третью //if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру //myGLCD.printNumI(--, 165, 75); //if (--<10) {myGLCD.print(" ", 166, 110); }; //затираем вторую цифру и третью //if (-->10) {myGLCD.print(" ", 182, 110); }; //затирает третюю цифру //myGLCD.printNumI(--, 165, 110); //if (--<10) {myGLCD.print(" ", 166, 145); }; //затираем вторую цифру и третью //if (-->10) {myGLCD.print(" ", 182, 145); }; //затирает третюю цифру myGLCD.printNumI(h, 165, 145); //if (MAF<10) {myGLCD.print(" ", 166, 180); }; //затираем вторую цифру и третью if (PumpRPM>10) {myGLCD.print(" ", 198, 180); }; //затираем четвертую цифру myGLCD.printNumI(PumpRPM, 165, 180); if (RPM>100) {myGLCD.print(" ", 198, 215);}; //затираем четвертую цифру myGLCD.printNumI(RPM, 165, 215); //------------------------------------------- if (Temp<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью if (Temp>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру myGLCD.printNumI(Temp, 410, 40); if (TempOil<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью if (TempOil>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру myGLCD.printNumI(TempOil, 410, 75); if (TempFuel<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью if (TempFuel>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру myGLCD.printNumI(TempFuel, 410, 110); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145); myGLCD.printNumI(t, 410, 180); if (TempAir<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью if (TempAir>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру myGLCD.printNumI(TempAir, 410, 215); prevData = curData; } } //---------------------------------------------------------- if (currentPage == '1') {if (curWatch - prevWatch > 200){ myGLCD.setColor(0, 255, 0); if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру myGLCD.printNumI(Speed, 350, 0); myGLCD.setColor(255, 255, 255); if (StaDaliv<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью if (StaDaliv>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру myGLCD.printNumI(StaDaliv, 395, 40); if (DesInj<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью if (DesInj>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру myGLCD.printNumI(DesInj, 395, 75); if (ActInj<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью if (ActInj>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру myGLCD.printNumI(ActInj, 395, 110); if (DesaInjQua<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью if (DesaInjQua>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру myGLCD.printNumI(DesaInjQua, 395, 145); if (InjQua<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью if (InjQua>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру myGLCD.printNumI(InjQua, 395, 180); if (TempAir<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью if (TempAir>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру myGLCD.printNumI(TempAir, 395, 215); prevData = curData; } } //---------------------------------------------------------- if (currentPage == '2') { if (curWatch - prevWatch > 200){ myGLCD.setColor(0, 255, 0); if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру myGLCD.printNumI(Speed, 350, 0); myGLCD.setColor(255, 255, 255); if (BoostPres<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью if (BoostPres>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру myGLCD.printNumI(BoostPres, 395, 40); if (BoostPresCom<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью if (BoostPresCom>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру myGLCD.printNumI(BoostPresCom, 395, 75); if (EGRmg<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью if (EGRmg>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру myGLCD.printNumI(EGRmg, 395, 110); if (EGRPul<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью if (EGRPul>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру myGLCD.printNumI(DesaInjQua, 395, 145); if (SolenPul<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью if (SolenPul>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру myGLCD.printNumI(SolenPul, 395, 180); if (SolenPre<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью if (SolenPre>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру myGLCD.printNumI(SolenPre, 395, 215); prevData = curData; } } //---------------------------------------------------------- if (currentPage == '3') {if (curWatch - prevWatch > 200){ myGLCD.setColor(0, 255, 0); if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру myGLCD.printNumI(Speed, 350, 0); myGLCD.setColor(255, 255, 255); prevData = curData; } } } /////////////////////////////////////////////////////////////////////////// //отправка запросов пидов void PIDs() { if (pid==1){ for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } } void present() { for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных из конкретных ответо, конкретные байты void receive () { if (mySerial.available()) { delay(51); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } for (int i = 0; i < 110; i++) { } if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F) {Init=1; timerenabledInit=0; } for (int i = 0; i < 110; i++) MessageRx[i]=0; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //отправка запроса на диагностическое соединение void initialization() { for (int i = 0; i < length5; i++) { mySerial.write(messageInit[i]); delay (5); } delay (55); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //стартовая инициализация void fastinit() { digitalWrite (TX, HIGH); // makes K-line high 3 delay(360); // wait for K-line to be clear 3 digitalWrite (TX, LOW); // makes K-line low 3 delay(25); digitalWrite (TX, HIGH); // makes K-line high 3 delay(25); //last delay before first message mySerial.begin(10400); // baud rate of the OBD } /////////////////////////////////////////////////////////////////////////////////////////////////////// //прорисовка координат тач кнопок void 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(); Watch_Temperature (); } // Button INF1 if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) { drawFrame(10, 275, 120, 310); currentPage = '1'; myGLCD.clrScr(); drawscreen_one(); Watch_Temperature (); } // Button INF2 if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) { drawFrame(180, 275, 300, 310); currentPage = '2'; myGLCD.clrScr(); drawscreen_two(); Watch_Temperature (); } // Button CHECK if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) { drawFrame(350, 275, 470, 310); currentPage = '3'; myGLCD.clrScr(); drawscreen_three(); Watch_Temperature (); } } } //---------------------------------------------------------------------------------------------------------------------------------- //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(); Watch_Temperature (); } // Button INF2 if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) { drawFrame(180, 275, 300, 310); currentPage = '2'; myGLCD.clrScr(); drawscreen_two(); Watch_Temperature (); } // Button CHECK if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) { drawFrame(350, 275, 470, 310); currentPage = '3'; myGLCD.clrScr(); drawscreen_three(); Watch_Temperature (); } } } //--------------------------------------------------------------------------------------------------- //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(); Watch_Temperature (); } // Button INF1 if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) { drawFrame(10, 275, 120, 310); currentPage = '1'; myGLCD.clrScr(); drawscreen_one(); Watch_Temperature (); } // Button CHECK if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) { drawFrame(350, 275, 470, 310); currentPage = '3'; myGLCD.clrScr(); drawscreen_three(); Watch_Temperature (); } } } //---------------------------------------------------------- //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(); Watch_Temperature (); } } } } //-------------------------------------------------------- //прописывает заголовки на всех страницах void drawHomeScreen() { line() ; vista(); myGLCD.drawLine(239,35,239,248); // линия вертикальная myGLCD.print("Ltr/Hor :", 10, 40); myGLCD.print("Ltr/100 :", 10, 75); myGLCD.print("Fuel L :", 10, 110); myGLCD.print("Humed %:", 10, 145); myGLCD.print("PUMP RPM:", 10, 180); myGLCD.print("Engi RPM:", 10, 215); myGLCD.print("Motor *C:", 255, 40); myGLCD.print("Oil *C:", 255, 75); myGLCD.print("Fuel *C:", 255, 110); myGLCD.print("Inter *C:", 255, 145); myGLCD.print("Exter *C:", 255, 180); myGLCD.print("IntAir*C:", 255, 215); buttonHome() ; buttonINF1() ; buttonINF2() ; buttonCHECK() ; } //------------------------------------------------- void drawscreen_one() { line() ; vista(); myGLCD.print("Start of Delivery *CA:", 10, 40); myGLCD.print("Desir inject Start *CA:", 10, 75); myGLCD.print("Actua Inject Start *CA:", 10, 110); myGLCD.print("Desir Inject Quan mg/s:", 10, 145); myGLCD.print("Actu Inject Quant mg/s:", 10, 180); myGLCD.print("Mass Air Flow mg/s:", 10, 215); buttonHome() ; buttonINF2() ; buttonCHECK() ; } //------------------------------------------------- void drawscreen_two() { line() ; vista(); myGLCD.print("Boost Press Bar:", 10, 40); myGLCD.print("Boost Press Com Bar:", 10, 75); myGLCD.print("EGR command mg/s:", 10, 110); myGLCD.print("EGR Pulse Ratio %:", 10, 145); myGLCD.print("Solenoide Pulse %:", 10, 180); myGLCD.print("Solenoide Boost %:", 10, 215); buttonHome() ; buttonINF1() ; buttonCHECK() ; } //---------------------------------------------------------------------------- void drawscreen_three() { vista(); 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(0, 255, 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.print("Km/h", 410, 0); sensors.requestTemperatures(); }у меня не компилится, из за конфликта библиотек походу
у меня компилится. такое ощущение что он не читает сообщение и не пересчитывает, на мониторчике бред, по ходу пересчитаный из ноля что ли
вот что у меня на экране
дак конечно, где у тебя проверка на принятое сообщение 2101? щас поправлю
блин , вот я лапух. да еще глянь может там че можно выкинуть лишнее, так будет красивее.