я сюда не добавлял, так как если есть ошибк то при нажатии на check переходит на 3 страницу и выдает ошибку без проблем. завтра точно проверю и скжу. по этому сюда не добавлял.
я их там вроде не ставил, мне кажется они всегда там были, у меня была идея закоментировать их, что мол они может и очещают
дак потому что , когда в моей очередной новой версии что-то не работает, ты берешь старую рабочую мучаешь по своему, выкладываешь как последнюю. Я то думаю, что там мои последние новые изменения, а раз ты старую взял, понятно что этих изменений там нет. Вот так эти строчки и поменялись назад как было.
я сюда не добавлял, так как если есть ошибк то при нажатии на check переходит на 3 страницу и выдает ошибку без проблем. завтра точно проверю и скжу. по этому сюда не добавлял.
да ты прав. делал такое. виноват. работаю теперь только с этой версией и твоими изменениями. обещаю. просто нервничаю, в воскресенье выезжаю, вот и в спешеке творю чудеса.
Заметь, ещё в скетче из сообщения #636 проверка по байтам правильная была, потом эта проверка сначала у тебя назад исправилась в "последних" версиях, потом и Watch() опять куда то убежал.
короче бери скетч из сообщения #740. Ставь как надо Watch(). Сделай рабочую "затирку" при распечатке параметров на экран и больше НИЧЕГО не меняй.
Я ведь там взял убрал из функций чтения кнопок Erase и Read
очистку экрана;
прорисовку экрана №3
и поставил эти строки в момент когда приходят сообщения об ошибке , либо нет ошибок, оибо стерты ошибки и поправил затирание.
Ты т.к.затирание не работало, берёш правишь затирание и зачемто правишь (или потому что берешь из старого скетча и уже неправильно вставляешь) то что я исправил с кнопками. В итоге у тебя два раза происходила
#include <RTC.h>
RTC time;
void setup() {
delay(300);
Serial.begin(9600);
// инициализация модуля RTC
time.begin(RTC_DS3231); } // на базе чипа DS3231 модуль подключается к аппаратным выводам I2C
void loop(){
if(millis()%1000==0){ // если прошла 1 секунда
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
}
}
обнанужил косяк с часами. каждый раз при запуске показывает то время и дату которую я запрограмировал последний раз. едешь часы идут. заглушил и включаешь стново время и дата таже что при настройке. чеза .... непонятка.
короче я вспомнил чё у меня было. я не убрал строку настройки часов, у тебя она тоже была всё время раскомментирована. Ты один раз её оставь чтоб часы настроить, потом закоментируй (можешь вообще убрать) и ещё раз скетч залей, а то при каждом старте ардуины у тебя часы настроиваются заново на то время которое указано в той строке. Хех вот даже в скетче у тебя ответ на вопрос ))))
// строка ниже используется для настройки даты и времени часов
// раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
// обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
// (год, месяц, день, часы, минуты, секунды)
//rtc.adjust(DateTime(2017, 7, 19, 15, 24, 0));
да я это знаю. я писал что выкидывая скетч в пост забыл закоментировать. по ходу у меня что то другое. чесно говоря даже не помню при пробах время и дата были в норме или нет. может с самого начала косячный модуль. но еще проверю все.
да я это знаю. я писал что выкидывая скетч в пост забыл закоментировать. по ходу у меня что то другое. чесно говоря даже не помню при пробах время и дата были в норме или нет. может с самого начала косячный модуль. но еще проверю все.
да нет, стопудняк просто надо сначала залить с этой строкой (настроить время), потом строку убрать и ЕЩЁ РАЗ залить скетч без этой строки, заработает, вот увидишь
MaksVV отчитываюсь. с часами вопрос решен, будешь смеятся, сегодня вспонил поговорку , доверяй но проверяй. проверил новую батарейку, а она всего 2.7 вольта , поехал в магазин с тестером, показал, поменяли , новая имеет 3.4 вольта. поставил в бортовик и все заработало. вопрос не нужно ли задержку curWatch - prevWatch > 3000 поставить на 1000? дальше.... новый скетч сработал на УРА!!! подстроил остальные страницы как первая. все выровнял , подогнал и теперь все выранивается с правой сторорны а при увеличении уходит в лево. КРАСОТА....... ошибки все четко стирание, чтение, посивная, активная. единственное что добавил это в Watch(): строки
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
так как пропала надпись Km/h. больше ничего не трогал. вот скетч
/////////////////////////////////////////////////////////////////////////////////////////
//библиотеки
///////////////////////////////////////////////////////////////////////////////////////////
#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);
extern uint8_t GroteskBold16x32[];
int x, y;
char currentPage;
float h;
float t;
bool Dvoet = 0;
//////////////////////////////////////////////////////////////////////////////
//все что касается OBD2
///////////////////////////////////////////////////////////////////////////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //RХ,TХ
#define TX 11
int length5 = 5;
int length6 = 6;
int length8 = 8;
int length7 = 7;
bool Init = 0;
int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс
int PresTime = 8000; // задержка между посылками запросов присутствия, мс
int waitbyte = 1; // задержка между отправкой байт в сообщении, мс
int Datadelay = 50; // задержка между отрисовкой данных на LCD, мс
float L100 = 0; //расход литров на 100км
float LHor = 0; //расход топлива литров в час
int MAF = 0; //26,27 байты Sensor de flujo de aire en masa
float BoostPres = 0; //28,29 байты Presión de refuerzo
int RPM = 0; //32,33 байты Velocidad del motor
int EGRmg = 0; //34,35 байты Comando EGR (Comando de recirculación de gases de escape)
float BoostPresCom = 0; //38,39 байты Comando de presión de refuerzo
int Speed = 0; //44,45 байты Velocidad del vehículo
float DesaInjQua = 0; //50,51 байты Cantidad de inyección deseada
float InjQua = 0; //52,53 байты Cantidad de la inyección
float StaDaliv = 0; //54,55 байты Inicio de la entrega
int PumpRPM = 0; //56,57 байты Velocidad de la bomba
float EGRPul = 0; //62,63 байты Relación de impulsos EGR (recirculación de gases de escape
float SolenPul = 0; //64,65 байты Velocidad de solenoide de control de nivel de remolino Relación de impulsos
float SolenPre = 0; //70,71 байты Relación de impulsos Presión Electroválvula de presión
float DesInj = 0; //72,73 байты Inyección deseada Inicio
float ActInj = 0; //16,17 байты Inicio de la inyección real
int TempAir = 0; //74,75 байты Temperatura del aire de admisión
int Temp = 0; //14,15 байты Temperatura del refrigerante
int TempOil = 0; //18,19 байты Temperatura del aceite del motor
int TempFuel = 0; //58,59 байты Temperatura del combustible
int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана
float Barom = 0; // барометр
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}; // запрос пид 2101
byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D}; // запрос ошибок
byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98}; // стирание ошибок
unsigned long prevPID = 0;
unsigned long prevTemperature = 0;
unsigned long prevpres = 0;
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
unsigned long TimewaitPID, timerwaitPID = 0;
bool timerenabledPID = 0;
#define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 200 // здесь задержка на ожидание правильного ответа пидов, мс
unsigned long TimewaitInit, timerwaitInit = 0;
bool timerenabledInit = 0;
#define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 500 // здесь задержка на ожидание ответа об удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SETUP
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
mySerial.begin(10400);
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
myGLCD.setFont(GroteskBold16x32);
currentPage = '0';
drawHomeScreen();
// строка ниже используется для настройки даты и времени часов
// раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
// обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
// (год, месяц, день, часы, минуты, секунды)
//rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
Temperature ();
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SETUP FIN
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//LOOP
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
unsigned long curpres = millis ();
unsigned long curTemperature = millis();
unsigned long curWatch = millis();
unsigned long curDvoet = millis();
TimewaitPID = millis ();
TimewaitInit = millis ();
if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
else if (TIMEREXPIRED_Init) timerenabledInit=0;}
else {
if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 - шлем запрос присутствия
if (curPID - prevPID > PIDTime) {PIDs(); prevPID = curPID;}}
else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}
if (curWatch - prevWatch > 3000) { Watch (); prevWatch = curWatch;}
if (curTemperature - prevTemperature > 60000) { Temperature (); prevTemperature = curTemperature;}
if (curDvoet - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
receive ();
Menu();
LCDDataPrint();
}
void LCDDataPrint(){
unsigned long curData = millis();
if (curData - prevData > Datadelay){
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0, 3);
if (currentPage == '0') {
myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
myGLCD.printNumI(h, 165, 145, 5 );
myGLCD.printNumI(PumpRPM, 165, 180,5);
myGLCD.printNumI(RPM, 165, 215,5);
myGLCD.printNumI(Temp, 410, 40, 3);
myGLCD.printNumI(TempOil, 410, 75, 3);
myGLCD.printNumI(TempFuel, 410, 110,3);
myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
myGLCD.printNumI(t, 410, 180, 3);
myGLCD.printNumI(TempAir, 410, 215, 3);
}
if (currentPage == '1') {
myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
myGLCD.printNumF(ActInj,1, 395, 110,'.', 4);
myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);
myGLCD.printNumF(InjQua,1, 395, 180,'.', 4);
myGLCD.printNumI(MAF, 170, 215, 4);
myGLCD.printNumF(Barom, 1, 415, 215);
}
//----------------------------------------------------------
//страниц INF2
//----------------------------------------------------------
if (currentPage == '2') {
myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);
myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4);
myGLCD.printNumI(EGRmg, 395, 110, 4);
myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);
myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);
myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
}
prevData = curData;
}
}
///////////////////////////////////////////////////////////////////////////
//отправка запроса пид 2101
void PIDs() {
Serial.println ("Otpravil zapros 21 01");
for (int i = 0; i < length6; i++) {
mySerial.write(messagePids[i]);
delay (waitbyte); }
}
//отправка запроса присутствия
void present() {
Serial.println ("Otpravil zapros Present");
for (int i = 0; i < length5; i++) {
mySerial.write(messagePresent[i]);
delay (waitbyte); }
}
/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
void receive () {
if (mySerial.available()) {
delay(190);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 110) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
Serial.print ("Receive: ");
for (int i = 0; i < k; i++) {
Serial.print(MessageRx[i],HEX); Serial.print (" ");}
Serial.println ("");
if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
timerenabledInit=0;
Serial.println (" Initialization OK!!!!: ");
}
if (currentPage == '3'){
//при получении этого сообщения выдавать на третий экран "NO ERROR"
if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
myGLCD.clrScr();
drawscreen_three();
myGLCD.print("NO DTC", 165, 145);
Serial.println (" NO DTC ");
}
//при получении этого сообщения выдавать на третий экран "DTC BORRADO"
if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
myGLCD.clrScr();
drawscreen_three();
myGLCD.print("DTC BORRADO", 165, 145);
Serial.println (" DTC BORRADO ");
}
// при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
Serial.println ("DTC is found!");
myGLCD.clrScr();
drawscreen_three();
for (int i=0; i<MessageRx[8]; i++ ) {
int y = i*35;
bool nolA=0; bool nolB =0;
if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный
if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);
myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый
myGLCD.print("ERROR ", 50, (75+y));
myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));
if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y));
else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
}
}
//прописываем формулы к данным
else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) {
Barom = MessageRx[39];
L100 = (float)LHor*100.0/(float)Speed;
LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
MAF = ((MessageRx[29]*256)+MessageRx[30])/10;
BoostPres = ((MessageRx[31]*256)+MessageRx[32])/1000.0;
RPM = (MessageRx[35]*256)+MessageRx[36];
EGRmg = ((MessageRx[37]*256)+MessageRx[38])/10.0;
BoostPresCom = ((MessageRx[41]*256)+MessageRx[42])/1000.0;
Speed = ((MessageRx[47]*256)+MessageRx[48])/100;
DesaInjQua = ((MessageRx[53]*256)+MessageRx[54])/100.0;
InjQua = ((MessageRx[55]*256)+MessageRx[56])/100.0;
StaDaliv = ((MessageRx[57]*256)+MessageRx[58])/100.0;
PumpRPM = (MessageRx[59]*256)+MessageRx[60];
EGRPul = ((MessageRx[65]*256)+MessageRx[66])/100.0;
SolenPul = ((MessageRx[67]*256)+MessageRx[68])/100.0;
SolenPre = ((MessageRx[73]*256)+MessageRx[74])/100.0;
DesInj = ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
ActInj = ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
//TempAir = ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
//Temp = ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
//TempOil = ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
//TempFuel = ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
int A = 0;
if (MessageRx[77]<=0x0A) A = 277;
if (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
if (MessageRx[77]>=0x0D) A = 279;
double B = MessageRx[78]/10.0;
double cel , drob ;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempAir = ((MessageRx[77]*26)-A)+cel;
if (MessageRx[17]<=0x0A) A = 277;
if (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
if (MessageRx[17]>=0x0D) A = 279;
B = MessageRx[18]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
Temp = ((MessageRx[17]*26)-A)+cel;
if (MessageRx[21]<=0x0A) A = 277;
if (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
if (MessageRx[21]>=0x0D) A = 279;
B = MessageRx[22]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempOil = ((MessageRx[21]*26)-A)+cel;
if (MessageRx[61]<=0x0A) A = 277;
if (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
if (MessageRx[61]>=0x0D) A = 279;
B = MessageRx[62]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempFuel = ((MessageRx[61]*26)-A)+cel;
timerenabledPID=0;
}
for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отправка запроса на диагностическое соединение
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void initialization() {
Serial.println ("Otpravil zapros Init");
for (int i = 0; i < length5; i++) {
mySerial.write(messageInit[i]);
delay (5);
}
delay (55);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//стартовая инициализация
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void fastinit() {
digitalWrite (TX, HIGH); // makes K-line high 3
delay(360); // wait for K-line to be clear 3
digitalWrite (TX, LOW); // makes K-line low 3
delay(25);
digitalWrite (TX, HIGH); // makes K-line high 3
delay(25); //last delay before first message
mySerial.begin(10400); // baud rate of the OBD
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
//запрос чтения и стирания ошибок
///////////////////////////////////////////////////////////////////////////////////////////////////////
void Read() {
Serial.println ("Zapros error; ");
for (int i = 0; i < length8; i++) {
mySerial.write(messageREAD[i]);
delay (waitbyte); }
}
void Erase() {
Serial.println ("Zapros erase; ");
for (int i = 0; i < length7; i++) {
mySerial.write(messageERASE[i]);
delay (waitbyte); }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//прорисовка экранов и работа тачскрина
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Menu () {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
if (currentPage == '0') {
buttonHomeTouch();
buttonINF1Touch();
buttonINF2Touch();
buttonCHECKTouch(); }
if (currentPage == '1') {
buttonHomeTouch();
buttonINF2Touch();
buttonCHECKTouch(); }
if (currentPage == '2') {
buttonHomeTouch();
buttonINF1Touch();
buttonCHECKTouch(); }
if (currentPage == '3') {
buttonHomeTouch();
buttonREADTouch();
buttonERASETouch(); }}}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//прописывает заголовки на страницах
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void drawHomeScreen() {
line() ;
Watch ();
myGLCD.drawLine(250,35,250,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() ;
Watch ();
myGLCD.print("Start of Delivery *CA:", 10, 40);
myGLCD.print("Desir inject Start *CA:", 10, 75);
myGLCD.print("Actua Inject Start *CA:", 10, 110);
myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
myGLCD.print("MAF mg/s:", 10, 215);
myGLCD.print("Barom kPa:", 255, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
Watch ();
myGLCD.print("Boost Press Bar:", 10, 40);
myGLCD.print("Boost Press Com Bar:", 10, 75);
myGLCD.print("EGR command mg/s:", 10, 110);
myGLCD.print("EGR Pulse Ratio %:", 10, 145);
myGLCD.print("Solenoide Pulse %:", 10, 180);
myGLCD.print("Solenoide Boost %:", 10, 215);
buttonHome() ;
buttonINF1() ;
buttonCHECK() ;
}
//----------------------------------------------------------------------------
void drawscreen_three() {
Watch ();
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
buttonHome();
buttonERASE();
buttonREAD();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//координаты тача
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void drawFrame(int x1, int y1, int x2, int y2) {
myGLCD.setColor(255, 0, 0);
myGLCD.drawRoundRect (x1, y1, x2, y2);
while (myTouch.dataAvailable())
myTouch.read();
myGLCD.setColor(255, 255, 255);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//прорисовка кнопок и координат тача
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void buttonHome() {
myGLCD.setColor(0,0,0); // цвет кнопки -серый
myGLCD.fillRoundRect (1, 1, 80, 33); // расположение кнопки прямоугольника
myGLCD.setColor(255, 255,255); // цвет текста зеленый
myGLCD.drawRoundRect (1, 1, 65, 33); // кнопка будет рамкой
myGLCD.print("HOME", 1, 0); // центровка строки
}
void buttonHomeTouch(){
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
myGLCD.clrScr();
drawHomeScreen();
}}
void buttonINF1() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (10, 255, 120, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (10, 255, 120, 310);
myGLCD.print("INF 1", 25, 265);
}
void buttonINF1Touch() {
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
} }
void buttonINF2() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (180, 255, 300, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (180, 255, 300, 310);
myGLCD.print("INF 2", 200, 265);
}
void buttonINF2Touch() {
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
}}
void buttonCHECK() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (350, 255, 470, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (350, 255, 470, 310);
myGLCD.print("CHECK", 375, 265);
}
void buttonCHECKTouch() {
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
} }
void buttonERASE() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (10, 255, 120, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (10, 255, 120, 310);
myGLCD.print("ERASE", 25, 265);
}
void buttonERASETouch () {
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
Erase(); //потом заменить на дейсвие
}}
void buttonREAD() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (350, 255, 470, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (350, 255, 470, 310);
myGLCD.print("READ", 375, 265);
}
void buttonREADTouch() {
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
Read(); //потом заменить на дейсвие
}}
////////////////////////////////////////////////////////////////////////////////////////
//прорисовка линий
///////////////////////////////////////////////////////////////////////////////////////
void line() {
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,73,479,73); // линия горизонтальная
myGLCD.drawLine(1,108,479,108); // линия горизонтальная
myGLCD.drawLine(1,143,479,143); // линия горизонтальная
myGLCD.drawLine(1,178,479,178); // линия горизонтальная
myGLCD.drawLine(1,212,479,212); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
}
/////////////////////////////////////////////////////////////////////////////////////////////
//верхняя часть экрана часы и дата отображается на всех экранах
/////////////////////////////////////////////////////////////////////////////////////////////
void Watch (){
DateTime now = rtc.now();
int m = now.minute();
int hour = now.hour();
int mon = now.month();
int date = now.day();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
if (date<10) {
myGLCD.print("0", 85, 0);
myGLCD.printNumI(now.day(), 100, 0); }
else if (date >=10) {
myGLCD.printNumI(now.day(), 85, 0); }
myGLCD.print("/", 115, 0);
if ( mon<10) {
myGLCD.print("0", 130, 0);
myGLCD.printNumI(now.month(), 145, 0);}
else if (mon >=10) {
myGLCD.printNumI(now.month(), 130, 0);}
myGLCD.print("/", 160, 0);
myGLCD.printNumI(now.year(), 175, 0);
if (hour<10) {
myGLCD.print("0",255, 0);
myGLCD.printNumI(now.hour(), 270, 0); }
else if(hour>=10){
myGLCD.printNumI(now.hour(), 255, 0); }
if (m<10) {
myGLCD.print("0",300, 0);
myGLCD.printNumI(now.minute(), 315, 0); }
else if (m>=10){
myGLCD.printNumI(now.minute(), 300, 0); }
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
}
void Temperature (){
h = dht.readHumidity();
t = dht.readTemperature();
sensors.requestTemperatures();
}
думаю все проблемы решены. осталось только остаток в баке, провод от датчика уже выкинут на ружу, надо сделать пару замерова на проводе и смотреть в это время сколько литров показывает опком, и найти расчет, и прописать в скетч.
В watch() можешь убрать выбор зел цвета в строках которые ты добавил. Там выше итак зеленый выбирается. А км/ч я видать снес когда шашкой махал )) на напряжению сделай замеры при вкл. Зажигании ( когда 12в в сети ) и когда двс работает (когда 14в сети) надо понять отличаются ли показания при этих двух режимах.
Блин не охото так городить огород с аналоговым замером топлива. Как опком все таки инфу получает о остатке топлива, ты подключи опком не в разъем , а проводками, плюс минус и к.лайн. свяжется ли он со щитком приборов? Мне кажется там отдельная шина какая нибудь которая сидит на другом пине обд2
блин с часами рано порадовался. отстают. сейчас поставлю в 20.00 правильно и завтра в 8.00 посмотрю на сколько отстанут. посталю задержку на 1000 а не на 3000. может из за этого....
логику по измерения аналогу можно сделать такую. Подключаем датчик через делитель напряжения
Делаем несколько контрольных точек. Получаем несколько диапазонов. В процессе работы мереем. Если значение попадает между контрольными точками (а оно естесственно так в большинтсве случаев и будет) то через функцию map преобразуем количество литров опираясь на значения рядом контрольных точек. Чем больше точек, тем выше точность.
Единственная засада, наше подключение может повлиять на штатные показания датчика (то есть при нашем подключении напруга на проводе поменяется и датчик начнет врать)
кстати если научишься определять остаток топлива, то можно средний расход никак не завязывать на мгновенный. А считать как это делает водитель. Тупо делить потраченные литры на километры и умножать на 100.
часы утром сбились как при первом подключении, думаю всетаки косяк в модуле. приеду с отпуска закажу новый, копейки стоит. по поводу топлива, действительно опком берет с 12 контакта, в опкоме показывает протокол KW 82. даже если прослушать и изучить этот протокол то, не думаю что можно будет одновременно прослушивать две линии. иначе бы это было бы реализовано в опкоме а он действует так. при переходе на закладку приборки, он заканчивает сессию kwp2000 и делает новую инициализацию по протоколу kw 82. хотя можно будет прослушать и посмотреть инит и запросы и ответы, пробовать добавить в скетче инит и запрос на 7 , и посмотреть не будет ли конфликта. вот такие пироги.
и так... проехал 3600 км. бортовик проработал всю дорогу без проблем. спас меня в дороге. как ? а вот так, я по дороге через германию ехал в люксембург погулять, в инете посмотрел по чем соляра в люксембурге 0.95 центов а в германии 1.65 евро. я заправился еще в испании по 1.04 ерво. жалко было тарится по немецким тарифам и у меня оставалось в притык до люксембурга где дешевка. и вот я контролируя расход чтобы он не привешал 5-6.5 литров на сто доехал до люксембурга и залили дешево. без этого контроля расхода я бы не доехал, не зная какой расход, и пришлось бы у немцев тарится. вот так то...
Неплохо. поофтопим. Цены на топливо конечно не гуманны. В Германии если на наши деньги 115 руб. За Литр. Это ппц. Конечно у них и з/п другие, но горючка все равно дорогая. У нас литр 40 руб стоит. А можно и по 36 найти. Рад что бортовик у тебя работает. У меня мондео 4 универсал дизель на классическом автомате.Штатный бортовик показывает 6.8 средний по трассе. Седня 1200 км ездил.
Средний расход за 3600 км. Гружен под завязку, 5 чемоданов и куча мелочи, жена, двое детей и теща, постоянно 130 км/ч. Расход 6,2 л/100. Считаю хороший результат. :)
Результат конечно отл, особенно если учесть как валит дизель при полной загрузке на обгонах. Насчет среднего расхода без учета расхода на хх, будет время напишу код. Там добавить то несколько строчек.
Буду рад глянуть твоё очередное волшебство. Если не буду есть шашлык и пить водку то возьмусь за замеры бака, это то чего не хватает в дороге для уверенности, остаток в баке. Или прослушаю опком, как он это делает. Это последнее что осталось и буду готовить проект для выкладки здесь.
Доброе время суток. Я вернулся. Продолжаем. Как изветсно нам отсталось остаток топлива . Как мы помним опком берет с приборной панели по 12 линии ОБД и является протоколом KW82. Сегодня я просулшал 12 линию, по ходу она может работать не зависимо от 7 линии, по которой у нас идет вся диагностика. У меня есть еще один К-линия адатер, его и буду использовать для 12 линии ОБД. Но для начала нужно разобраться в прослушаных данных. Использовал все туже нашу прослушку, вот она
понятно что первые двенадцать кусков это инициализация и идентификация блока, дальше с цифры 23 ровные сообщения, являющиеся данными панели .
Теперь нужно понять как происходит инициализация KW82, потом прописать это все в наш эмулятор и найти байт отвечающий за топливо. В обкоме есть два значения топлива , моментальное и среднее. Вот наш эмулятор
class BUTTON {
public:
//================================================================
static const byte bounce_ = 50; // длительность отслеживания дребезга.
static const byte doubleclick_ = 200; // длительность отслеживания двойного клика.
static const unsigned long timer_ = 1200000; // длительность отслеживания неактивности.
static const unsigned int retention_ = 1600; // длительность отслеживания нажатия и удержания.
//================================================================
boolean click_down;
boolean click_up;
boolean doubleclick;
boolean timer;
boolean retention;
//=================================
unsigned long m;
boolean p;
boolean b;
boolean dc;
byte c;
boolean t;
boolean r;
//=================================
byte _pb;
//=================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//====
click_down = 0;
click_up = 0;
doubleclick = 0;
timer = 0;
retention = 0;
//====
m = millis();
p = digitalRead(_pb);
b = 0;
dc = 0;
c = 0;
t = 0;
r = 0;
//====
}
void read() {
//=======================================================
unsigned long nm = millis();
boolean np = digitalRead(_pb);
//=================
boolean nb = 0;
boolean ndc = 0;
boolean nt = 0;
boolean nr = 0;
//================
click_down = 0;
click_up = 0;
doubleclick = 0;
timer = 0;
retention = 0;
//=================
if (np != p) {p = np; m = nm; }
//=======================================================
if (nm - m > bounce_) {nb = 1;}
if (nm - m > doubleclick_) {ndc = 1;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}
if (nb != b) {b = nb;
if (p == 0 && b == 0) {click_down = 1;
++c; if (c == 2) {c = 0; doubleclick = 1;}
}
if (p == 1 && b == 1) {click_up = 1;}
}
//=======================================================
if (nm - m > timer_) {nt = 1;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {timer = 1;}
}
//=======================================================
if (nm - m > retention_) {nr = 1;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {retention = 1;}
}
//=======================================================
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BUTTON button(12); // вход кнопки (digital pin arduino)
int bytenumber = 0;
///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0;
int length5 = 5;
int length7 = 7;
byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения
byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01};
int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69,
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};
// A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03
// 92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69
// 03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC
int length100 = 100;
byte messageIDEN2[100] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37,
0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20,
0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D,
0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44,
0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07,
0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x031, 0x30, 0x32, 0x36, 0x38, 0xFF};
int length81 = 81;
byte messagePIDS[81] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0C, //Coolant Temperature
0x37, //Coolant Temperature
0x01, //Actual injection start
0x92, //Actual injection start
0x0C, //Engine Oil Temperature
0xEB, //Engine Oil Temperature
0x00, //Accelerator Position Sensor Signal
0x00, //Accelerator Position Sensor Signal
0x02, //System Voltage
0xB3, //System Voltage
0x00, //High Pressure Diagnosis 1
0x00, //High Pressure Diagnosis 1
0x11, //Mass Air Flow Sensor
0x89, //Mass Air Flow Sensor
0x04, //Boost Pressure
0x30, //Boost Pressure
0x00, //High Pressure Diagnosis 2
0x00, //High Pressure Diagnosis 2
0x03, //Engine Speed
0x20, //Engine Speed
0x0B, //EGR Command (Exhaust-Gas Recirculation Command)
0x55, //EGR Command (Exhaust-Gas Recirculation Command)
0x03, //Barometer Sensor
0xA3, //Barometer Sensor
0x04, //Boost Pressure Command
0x2D, //Boost Pressure Command
0x03, //Desired Engine Idle Speed
0x20, //Desired Engine Idle Speed
0xEE,
0xB9,
0x00, //Vehicle Speed
0x00, //Vehicle Speed
0x00, //Vehicle Speed Command
0x00, //Vehicle Speed Command
0x0C,
0x35,
0x03, //Desired Injection Quantity
0x0A, //Desired Injection Quantity
0x02, //Injection Quantity
0xD9, //Injection Quantity
0x08, //Start of Delivery
0xA3, //Start of Delivery
0x01, //Pump Speed
0x90, //Pump Speed
0x0C, //Fuel Temperature
0x27, //Fuel Temperature
0xA0,
0x00,
0x01, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x5C, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x02, //Swirl Level Control Solenoid Valve Pulse Ratio
0x76, //Swirl Level Control Solenoid Valve Pulse Ratio
0xAD,
0x08,
0x01,
0x30,
0x00, //Pulse Ratio Boost Pressure Solenoid Valve
0x03, //Pulse Ratio Boost Pressure Solenoid Valve
0x01, //Desired Injection Start
0x7B, //Desired Injection Start
0x0B, //Intake Air Temperature
0xDB, //Intake Air Temperature
0x03,
0xA3,
0x00,
0x02,
0x1F};
int waitbyte=5;
unsigned long TimeLED, timerLED = 0;
bool timerenabledLED = 0;
#define TIMEREXPIRED_LED (TimeLED - timerLED)> 1200 // время включения светодиода если кнопка длительно нажата, мс
void setup() {
Serial.begin (115200);
mySerial.begin (10400);
pinMode (13, OUTPUT);
digitalWrite (13,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println ("");
}
void loop() {
button.read();
TimeLED = millis ();
if (button.click_down) { messagePIDS[bytenumber]++; } // коротким нажатием на кнопку изменяем значение выбранного байта
if (button.retention) { bytenumber++; digitalWrite (13,1) ; timerLED=TimeLED; timerenabledLED=1;
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println ("");} // длительным нажатием на кнопку изменяем номер байта, который будем менять
if (timerenabledLED){ if (TIMEREXPIRED_LED) {timerenabledLED=0;digitalWrite (13,0);}}
if (mySerial.available()) {
delay(100);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 100) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
Serial.print ("Recieve: ");
for (int i = 0; i < k; i++) {
Serial.print(MessageRx[i],HEX); Serial.print (" ");}
Serial.println ("");
if ((MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) {
Serial.println ("Prinyat zapros init! "); Serial.println ("");
Serial.print ("Otvechayu: ");
for (int i = 0; i < length7; i++) {
mySerial.write(messageCOMUN[i]);
Serial.print(messageCOMUN[i],HEX); Serial.print (" ");
}
Serial.println("");
}
if (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x3E && MessageRx[4]==0xC1) {
Serial.println ("Prinyat zapros prisutstvia! "); Serial.println ("");
// Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println ("");
Serial.print ("Otvechayu: ");
for (int i = 0; i < length5; i++) {
mySerial.write(messagePRES[i]);
Serial.print(messagePRES[i],HEX); Serial.print (" ");
}
Serial.println("");
}
if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
Serial.println ("Prinyat zapros identificacion 1! "); Serial.println ("");
Serial.print ("Otvechayu: ");
for (int i = 0; i < length44; i++) {
mySerial.write(messageIDEN1[i]);
Serial.print(messageIDEN1[i],HEX); Serial.print (" ");
}
Serial.println("");
Serial.print ("Otvechayu DEC: ");
for (int i = 0; i < length44; i++) {
Serial.print(messageIDEN1[i]); Serial.print (" ");
}
Serial.println("");
}
if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
Serial.println ("Prinyat zapros identificacion 2! "); Serial.println ("");
Serial.print ("Otvechayu: ");
for (int i = 0; i < length100; i++) {
mySerial.write(messageIDEN2[i]);
Serial.print(messageIDEN2[i],HEX); Serial.print (" ");
}
Serial.println("");
Serial.print ("Otvechayu DEC: ");
for (int i = 0; i < length100; i++) {
Serial.print(messageIDEN2[i]); Serial.print (" ");
}
Serial.println("");
}
if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
Serial.println ("Prinyat zapros datos! "); Serial.println ("");
Serial.print ("Otvechayu: ");
for (int i = 0; i < length81; i++) {
mySerial.write(messagePIDS[i]);
if (i==31){ delay (113);Serial.println ("");}
Serial.print(messagePIDS[i],HEX); Serial.print (" ");
}
Serial.println("");
}
}
}
Может MaksVV появится и поможет в этой каше разобраться. Очень на это надеюсь так-как голова у него гениальная. А пока пробую разобраться сам.
попробую убрать их и там где я добавил новиые в проверке нет ошибок и ошибки стерты. может в них и косяк. уже завтра проверю. еду домой.
короче ппц как у тебя скетч загадочно меняется. ещё куда то две строчки делись вот здесь
if
(currentPage ==
'3'
){
334
//при получении этого сообщения выдавать на третий экран "NO DTC"
335
if
(MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
336
myGLCD.clrScr();
337
drawscreen_three();
338
myGLCD.print(
"NO DTC"
, 165, 145);
339
Serial
.println (
" NO DTC "
);
340
}
341
//при получении этого сообщения выдавать на третий экран "DTC BORRADO"
342
if
(MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
343
myGLCD.clrScr();
344
drawscreen_three();
345
myGLCD.print(
"DTC BORRADO"
, 165, 145);
346
Serial
.println (
" DTC BORRADO "
);
347
}
348
// при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
349
if
(MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){
350
Serial
.println (
"DTC is found!"
);
351
352
for
(
int
i=0; i<MessageRx[8]; i++ ) {
353
int
y = i*35;
354
bool
nolA=0;
bool
nolB =0;
355
if
(!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
356
myGLCD.print(
" -Passive-"
, 300, (75+y));}
// если DTC пасивныый делаем цвет красный
357
if
(bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);
358
myGLCD.print(
" -Active-"
, 300, (75+y));}
// если DTC активный, делаем цвет зеленый
359
360
myGLCD.print(
"ERROR "
, 50, (75+y));
361
myGLCD.printNumI((i+1), 150, (75+y));
362
if
(!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(
": P"
, 170, (75+y));
363
if
(bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(
": C"
, 170, (75+y));
364
if
(!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(
": B"
, 170, (75+y));
365
if
(bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(
": U"
, 170, (75+y));
366
367
if
(MessageRx[9+(i*3)]==0x00) {myGLCD.print(
"00"
, 230, (75+y)); nolA = 1;}
368
if
(MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print(
"0"
, 230, (75+y)); nolA = 1;}
369
if
(nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y));
370
else
myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y));
371
372
if
(MessageRx[10+(i*3)]==0x00) {myGLCD.print(
"00"
, 262, (75+y)); nolB = 1;}
373
if
(MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print(
"0"
, 262, (75+y)); nolB = 1;}
374
if
(nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y));
375
else
myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));}
376
}
377
}
в строке 351 где вот это ?
myGLCD.clrScr();
drawscreen_three();
я сюда не добавлял, так как если есть ошибк то при нажатии на check переходит на 3 страницу и выдает ошибку без проблем. завтра точно проверю и скжу. по этому сюда не добавлял.
я их там вроде не ставил, мне кажется они всегда там были, у меня была идея закоментировать их, что мол они может и очещают
дак потому что , когда в моей очередной новой версии что-то не работает, ты берешь старую рабочую мучаешь по своему, выкладываешь как последнюю. Я то думаю, что там мои последние новые изменения, а раз ты старую взял, понятно что этих изменений там нет. Вот так эти строчки и поменялись назад как было.
я сюда не добавлял, так как если есть ошибк то при нажатии на check переходит на 3 страницу и выдает ошибку без проблем. завтра точно проверю и скжу. по этому сюда не добавлял.
потому что я туда их добавил, а ты убрал зачем то
да ты прав. делал такое. виноват. работаю теперь только с этой версией и твоими изменениями. обещаю. просто нервничаю, в воскресенье выезжаю, вот и в спешеке творю чудеса.
Заметь, ещё в скетче из сообщения #636 проверка по байтам правильная была, потом эта проверка сначала у тебя назад исправилась в "последних" версиях, потом и Watch() опять куда то убежал.
Ты пропал на долго я и закипешевал, запутался во всем.
надо исправляться, а то мы так бесконечно "доводить до ума" проект будем.
Исправлюсь. Должен. У меня суббота и воскресенье закончить максимально.
Посмотри пожалуйста все, поправь что нужно а я завтра испытаю. Спасибо что не бросаешь.
короче бери скетч из сообщения #740. Ставь как надо Watch(). Сделай рабочую "затирку" при распечатке параметров на экран и больше НИЧЕГО не меняй.
Я ведь там взял убрал из функций чтения кнопок Erase и Read
очистку экрана;
прорисовку экрана №3
и поставил эти строки в момент когда приходят сообщения об ошибке , либо нет ошибок, оибо стерты ошибки и поправил затирание.
Ты т.к.затирание не работало, берёш правишь затирание и зачемто правишь (или потому что берешь из старого скетча и уже неправильно вставляешь) то что я исправил с кнопками. В итоге у тебя два раза происходила
очистку экрана;
прорисовка экрана №3
Понял.
вот простой скетч для проверки часов
библиотека RTC https://yadi.sk/d/6yVyfrrw3LExcD
Ок. Сенкс.
взял скетч из 740. вернул watch на место. успел только что проверить. да с ошибками все идеально. затирания завтра сделаю. больше ничего не трогал.
обнанужил косяк с часами. каждый раз при запуске показывает то время и дату которую я запрограмировал последний раз. едешь часы идут. заглушил и включаешь стново время и дата таже что при настройке. чеза .... непонятка.
короче я вспомнил чё у меня было. я не убрал строку настройки часов, у тебя она тоже была всё время раскомментирована. Ты один раз её оставь чтоб часы настроить, потом закоментируй (можешь вообще убрать) и ещё раз скетч залей, а то при каждом старте ардуины у тебя часы настроиваются заново на то время которое указано в той строке. Хех вот даже в скетче у тебя ответ на вопрос ))))
да я это знаю. я писал что выкидывая скетч в пост забыл закоментировать. по ходу у меня что то другое. чесно говоря даже не помню при пробах время и дата были в норме или нет. может с самого начала косячный модуль. но еще проверю все.
вот такой скетч попробуй, я конечно тут ппц всего навырезал, может ниче не заработает ))
Вобщем изменил затирания на странице home. Сделал по новому принципу, типа как должно быть, ну и скетч попилил конкретно
да я это знаю. я писал что выкидывая скетч в пост забыл закоментировать. по ходу у меня что то другое. чесно говоря даже не помню при пробах время и дата были в норме или нет. может с самого начала косячный модуль. но еще проверю все.
да нет, стопудняк просто надо сначала залить с этой строкой (настроить время), потом строку убрать и ЕЩЁ РАЗ залить скетч без этой строки, заработает, вот увидишь
Ок. Завтра попробую. Новый скетч и часы.
MaksVV отчитываюсь. с часами вопрос решен, будешь смеятся, сегодня вспонил поговорку , доверяй но проверяй. проверил новую батарейку, а она всего 2.7 вольта , поехал в магазин с тестером, показал, поменяли , новая имеет 3.4 вольта. поставил в бортовик и все заработало. вопрос не нужно ли задержку curWatch - prevWatch > 3000 поставить на 1000? дальше.... новый скетч сработал на УРА!!! подстроил остальные страницы как первая. все выровнял , подогнал и теперь все выранивается с правой сторорны а при увеличении уходит в лево. КРАСОТА....... ошибки все четко стирание, чтение, посивная, активная. единственное что добавил это в Watch(): строки
думаю все проблемы решены. осталось только остаток в баке, провод от датчика уже выкинут на ружу, надо сделать пару замерова на проводе и смотреть в это время сколько литров показывает опком, и найти расчет, и прописать в скетч.
показания датчика топлива такие.
15.5 ltr = 5.65 v , здесь литер получается 0.36 v
24 ltr = 4.68 v , здесь литер получается 0.19 v
35 ltr = 3.9 v , здесь литер получается 0.11 v
завтра еще раз замеряю.
В watch() можешь убрать выбор зел цвета в строках которые ты добавил. Там выше итак зеленый выбирается. А км/ч я видать снес когда шашкой махал )) на напряжению сделай замеры при вкл. Зажигании ( когда 12в в сети ) и когда двс работает (когда 14в сети) надо понять отличаются ли показания при этих двух режимах.
понял. одну минуту
показания датчика топлива такие.
15.5 ltr = 5.65 v , здесь литер получается 0.36 v
24 ltr = 4.68 v , здесь литер получается 0.19 v
35 ltr = 3.9 v , здесь литер получается 0.11 v
завтра еще раз замеряю.
Это вроде как геометрическая прогрессия? Эх плохо помню математику.
Скорее всего при 0л будет напряжение 12в
Блин не охото так городить огород с аналоговым замером топлива. Как опком все таки инфу получает о остатке топлива, ты подключи опком не в разъем , а проводками, плюс минус и к.лайн. свяжется ли он со щитком приборов? Мне кажется там отдельная шина какая нибудь которая сидит на другом пине обд2
заведен 24 лит 5 в ........... 17 литр 5.9 в
не заведен 24 лит 4.7 в.......17 литр 5.4 в
примерно так. немного меняется. это по опкому я кабель на сегодня спрятал за магнитолу
по ходу датчик на 12в. у меня есть еще одни рабочий к-лине адаптер, можно его использовать как корвертер.
завтра попробую опком на проводатх. но опком опрашивает 7 пин. но в сериале тишина.
блин с часами рано порадовался. отстают. сейчас поставлю в 20.00 правильно и завтра в 8.00 посмотрю на сколько отстанут. посталю задержку на 1000 а не на 3000. может из за этого....
Какая модель часов у тебя?
Да не из-за этого. Эта задержка вывода значения часов на экран. То бишь было раз в 3 сек а ты хочешь раз в 1 сек. Ниче не поменяется
DS3231 AT24C32 IIC
Блин не должны они отставать. Эти считаются точные.
Завтра утром увидем
логику по измерения аналогу можно сделать такую. Подключаем датчик через делитель напряжения
Делаем несколько контрольных точек. Получаем несколько диапазонов. В процессе работы мереем. Если значение попадает между контрольными точками (а оно естесственно так в большинтсве случаев и будет) то через функцию map преобразуем количество литров опираясь на значения рядом контрольных точек. Чем больше точек, тем выше точность.
Единственная засада, наше подключение может повлиять на штатные показания датчика (то есть при нашем подключении напруга на проводе поменяется и датчик начнет врать)
вот например по первой ссылке гугла. Т.е к лайн приборки может висеть на 12 контакте
кстати если научишься определять остаток топлива, то можно средний расход никак не завязывать на мгновенный. А считать как это делает водитель. Тупо делить потраченные литры на километры и умножать на 100.
Тоже мысль. Посмотрю завтра как опком вытягивает. Было бы легче.
часы утром сбились как при первом подключении, думаю всетаки косяк в модуле. приеду с отпуска закажу новый, копейки стоит. по поводу топлива, действительно опком берет с 12 контакта, в опкоме показывает протокол KW 82. даже если прослушать и изучить этот протокол то, не думаю что можно будет одновременно прослушивать две линии. иначе бы это было бы реализовано в опкоме а он действует так. при переходе на закладку приборки, он заканчивает сессию kwp2000 и делает новую инициализацию по протоколу kw 82. хотя можно будет прослушать и посмотреть инит и запросы и ответы, пробовать добавить в скетче инит и запрос на 7 , и посмотреть не будет ли конфликта. вот такие пироги.
в опкоме может быть один адаптер к-лайн. А переключение между пинами осуществляет реле. Поэтому он так себя ведёт.
Привет. Уже дома. Посплю После с дороги. Потом я Отпишусь о работе бортового в течении трех суток и 3600км.
и так... проехал 3600 км. бортовик проработал всю дорогу без проблем. спас меня в дороге. как ? а вот так, я по дороге через германию ехал в люксембург погулять, в инете посмотрел по чем соляра в люксембурге 0.95 центов а в германии 1.65 евро. я заправился еще в испании по 1.04 ерво. жалко было тарится по немецким тарифам и у меня оставалось в притык до люксембурга где дешевка. и вот я контролируя расход чтобы он не привешал 5-6.5 литров на сто доехал до люксембурга и залили дешево. без этого контроля расхода я бы не доехал, не зная какой расход, и пришлось бы у немцев тарится. вот так то...
Неплохо. поофтопим. Цены на топливо конечно не гуманны. В Германии если на наши деньги 115 руб. За Литр. Это ппц. Конечно у них и з/п другие, но горючка все равно дорогая. У нас литр 40 руб стоит. А можно и по 36 найти. Рад что бортовик у тебя работает. У меня мондео 4 универсал дизель на классическом автомате.Штатный бортовик показывает 6.8 средний по трассе. Седня 1200 км ездил.
Средний расход за 3600 км. Гружен под завязку, 5 чемоданов и куча мелочи, жена, двое детей и теща, постоянно 130 км/ч. Расход 6,2 л/100. Считаю хороший результат. :)
Результат конечно отл, особенно если учесть как валит дизель при полной загрузке на обгонах. Насчет среднего расхода без учета расхода на хх, будет время напишу код. Там добавить то несколько строчек.
Буду рад глянуть твоё очередное волшебство. Если не буду есть шашлык и пить водку то возьмусь за замеры бака, это то чего не хватает в дороге для уверенности, остаток в баке. Или прослушаю опком, как он это делает. Это последнее что осталось и буду готовить проект для выкладки здесь.
Доброе время суток. Я вернулся. Продолжаем. Как изветсно нам отсталось остаток топлива . Как мы помним опком берет с приборной панели по 12 линии ОБД и является протоколом KW82. Сегодня я просулшал 12 линию, по ходу она может работать не зависимо от 7 линии, по которой у нас идет вся диагностика. У меня есть еще один К-линия адатер, его и буду использовать для 12 линии ОБД. Но для начала нужно разобраться в прослушаных данных. Использовал все туже нашу прослушку, вот она
но задержку изменил с 51 на 60 мс, так как рвало сообщения не правильно. Вот результат прослушки 12 линии ОБД
понятно что первые двенадцать кусков это инициализация и идентификация блока, дальше с цифры 23 ровные сообщения, являющиеся данными панели .
Теперь нужно понять как происходит инициализация KW82, потом прописать это все в наш эмулятор и найти байт отвечающий за топливо. В обкоме есть два значения топлива , моментальное и среднее. Вот наш эмулятор
Может MaksVV появится и поможет в этой каше разобраться. Очень на это надеюсь так-как голова у него гениальная. А пока пробую разобраться сам.