когда мотор четырёх тактный, за 2 оборота, происходит один рабочий ход (только этот такт нас интересует), т.е. если 1000 об/мин до будет 500 тактов за минуту, ну и если 4 цилинровый мотор то умножаем на 4 ,т.е. 2000 тактов в минуту
да. пасиве активе работает, координаты отображения угнал в право, так как было видно только .ve, но все четко работает, проверил несколько раз. расход в час вроде показывает корректно, качит гдето 0.8 -0.9 даешь газку поднимается . расход на 100 тронулся во дворе на первой метров 8 и тоже показывает 25 литров, примерно. завтра поеду на работу и уже точно скажу как работет расход. ТЫ ВЕЛИКИЙ ИЗ ВЕЛИКИХ. остался бак. завтра гляну вотльы на датчике. а вот с затираниями хоть с пробелом хоть с квадратом, тоже самое. почти финишная, завтра узнаем.
создаем массив переменных среднего расхода , например 100 шт.
int L100sr[100];
int L;
раз в 5 сек пишем мгновенный расход каждый раз в следующую ячейку массива среднего расхода
когда записывается последняя 100-я ячейка считаем среднее арифметическое между ячейками.
и записываем в одну из 10 ячеек еепром причём выбор ячейки еепром рандомно.
Раз в 5 мин считаем среднее арифметическое между 10 ячейками еепром, это и будет средний расход топлива, который заносим тоже в свою ячейку еепром. Параметр среднего расхода будет запоминаться даже при пропадании питания ардуины
это не проблема так как есть расход в час. кстати все работает супер. на горячую на холостых в час 0,7 и во время хода показывает рассход как положено и на ходу расход в час и на 100 выравниваются, что есть логично. затирания попробовал на rpm все супер, щас отстальные подкоректирую. вопрос если расход например от 0,7 и допустим 12,7 как правильно прописать затирание? затирание нужно от третьего символа, тое есть от 12,_ ? if (L100<10) и координаты третьей позиции так ?
поставь координаты левее чтоб наезжало на предыдущие показания, помоему если через String он не будет наезжать, а сам сдвинет вправо до последнего символа
вопрос. поставил обновление экрана с 100 на 50, вроде чаще обновляется. или это уже нагрузка на проц и лучше оставить 100? второе, есть маленький косяк, надпись ошибка стерта и нет ошибок выводит на экран но может и на пятое нажати вывести может на десятое, где собака порылась?
посмотрю завтра че выдаст сериал. оставлю 50. ты не думал както по плавнее расход на 100, а то больше похоже на мгновенный расход. хотя не принцепиально, на скорости при монотонной езде примерно видишь расход, уже гуд. так же интересная штука
MaksVV пишет:
формула пробег до заправки
S = 1.00/(float)L100*Fuel*100
где Fuel количество топлива, л
только L100 надо средний высчитывать
Fuel- это средний расход на 100, как я понял, который нужно выщитать.
я там написал же : Fuel - количество оставшегося топлива в баке. Средний расход в формуле это L100. ну да, надо было написать L100SR . А как поплавнее, это и есть мгновенный расход. Ну можно поплавнее, например сделать вывод на экран раз в полсекунды. А так то , читай про библиотекуу еепром, учись туда в ячейки данные записывать и считывать. там легко. Потом будем средний расход мучать.
все четко.......... а на экране не пишет NO DTC и DTC BORRADO. может что то очищает сразу с экрана? вот скетч, все байты вроде правильно прописаны, может я чета не вижу?
/////////////////////////////////////////////////////////////////////////////////////////
//библиотеки
///////////////////////////////////////////////////////////////////////////////////////////
#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;
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);
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
drawHomeScreen();
currentPage = '0';
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
// строка ниже используется для настройки даты и времени часов
// раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
// обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
// (год, месяц, день, часы, минуты, секунды)
//rtc.adjust(DateTime(2017, 7, 19, 15, 24, 0));
Watch();
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();
}
//-----------------------------------------------------------------------------
//прописываем где и какие данные мы хотим видеть
//-----------------------------------------------------------------------------
//страница HOME
//-------------------------------------------------------
void LCDDataPrint(){
unsigned long curData = millis();
if (curData - prevData > Datadelay){
if (currentPage == '0') {
Watch ();
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0);
if (Speed<10) myGLCD.print(String(' '), 365,0);
if (Speed<100) myGLCD.print(String(' '), 380,0);
myGLCD.setColor(0, 0, 0);
myGLCD.fillRect (332, 33, 349, 0);
//колонка с лева
myGLCD.setColor(255, 255, 255);
myGLCD.printNumF(LHor, 1, 165, 40);
if (LHor<10) myGLCD.print(String(' '), 215,40);
if (LHor<100&&LHor>=10) myGLCD.print(String(' '), 230,40);
myGLCD.printNumF(L100, 1, 165, 75);
if (L100<10) myGLCD.print(String(' '), 215,75);
if (L100<100) myGLCD.print(String(' '), 230,75);
// myGLCD.printNumI(LFuel, 165, 110);
//if (LFuuel<100) myGLCD.print(String('-'), 199,110);
myGLCD.printNumI(h, 165, 145);
if (h<100) myGLCD.print(String(' '), 199,145);
myGLCD.printNumI(PumpRPM, 165, 180);
if (PumpRPM<1000) myGLCD.print(String(' '), 212,180);
myGLCD.printNumI(RPM, 165, 215);
if (RPM<1000) myGLCD.print(String(' '), 212,215);
//-------------------------------------------
//колока с права
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Temp, 410, 40);
if (Temp<100) myGLCD.print(String(' '), 440,40);
myGLCD.printNumI(TempOil, 410, 75);
if (TempOil<100) myGLCD.print(String(' '), 440,75);
myGLCD.printNumI(TempFuel, 410, 110);
if (TempFuel<100) myGLCD.print(String(' '), 440,110);
myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
if (sensors.getTempCByIndex(0)<100) myGLCD.print(String(' '), 440,145);
myGLCD.printNumI(t, 410, 180);
if (t<100) myGLCD.print(String(' '), 440,180);
myGLCD.printNumI(TempAir, 410, 215);
if (TempAir<100) myGLCD.print(String(' '), 440,215);
}
//----------------------------------------------------------
//страниц INF1
//----------------------------------------------------------
if (currentPage == '1') {
Watch ();
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0);
if (Speed<10) myGLCD.print(String(' '), 365,0);
if (Speed<100) myGLCD.print(String(' '), 380,0);
myGLCD.setColor(0, 0, 0);
myGLCD.fillRect (332, 33, 349, 0);
myGLCD.setColor(255, 255, 255);
myGLCD.printNumF(StaDaliv,1, 395, 40);
if (StaDaliv<10) myGLCD.print(String(' '), 443,40);
myGLCD.printNumF(DesInj,1, 395, 75);
if (DesInj<10) myGLCD.print(String(' '), 443,75);
myGLCD.printNumF(ActInj,1, 395, 110);
if (DesInj<10) myGLCD.print(String(' '), 443,110);
myGLCD.printNumF(DesaInjQua,1, 395, 145);
if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);
myGLCD.printNumF(InjQua,1, 395, 180);
if (InjQua<10) myGLCD.print(String(' '), 443,180);
myGLCD.printNumI(MAF, 170, 215);
if (MAF<1000) myGLCD.print(String(' '), 221,215);
myGLCD.printNumF(Barom, 1, 415, 215);
if (Barom<10) myGLCD.print(String(' '), 463,215);
}
//----------------------------------------------------------
//страниц INF2
//----------------------------------------------------------
if (currentPage == '2') {
Watch ();
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0);
if (Speed<10) myGLCD.print(String(' '), 365,0);
if (Speed<100) myGLCD.print(String(' '), 380,0);
myGLCD.setColor(0, 0, 0);
myGLCD.fillRect (332, 33, 349, 0);
myGLCD.setColor(255, 255, 255);
myGLCD.printNumF(BoostPres,1, 395, 40);
if (BoostPres<10) myGLCD.print(String(' '), 443,40);
myGLCD.printNumF(BoostPresCom,1, 395, 75);
if (BoostPresCom<10) myGLCD.print(String(' '), 443,75);
myGLCD.printNumI(EGRmg, 395, 110);
if (EGRmg<1000) myGLCD.print(String(' '), 443,110);
myGLCD.printNumF(DesaInjQua,1, 395, 145);
if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);
myGLCD.printNumF(SolenPul, 1, 395, 180);
if (SolenPul<10) myGLCD.print(String(' '), 443,180);
myGLCD.printNumF(SolenPre, 0, 395, 215);
if (SolenPre<10) myGLCD.print(String(' '), 443,215);
}
//----------------------------------------------------------
//страниц CHECK
//----------------------------------------------------------
if (currentPage == '3') {
Watch ();
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0);
if (Speed<10) myGLCD.print(String(' '), 365,0);
if (Speed<100) myGLCD.print(String(' '), 380,0);
myGLCD.setColor(0, 0, 0);
myGLCD.fillRect (332, 33, 349, 0);
}
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.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.print("DTC BORRADO", 165, 145);
Serial.println (" DTC BORRADO ");
}
// при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){
Serial.println ("DTC is found!");
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() ;
vista();
//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() ;
vista();
//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() ;
vista();
//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() {
vista();
//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.setFont(GroteskBold16x32); // размер шрифта
myGLCD.setBackColor(0,0,0); // цвет фона области где будет надпись и кнопки
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.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
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.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
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.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
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.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
myGLCD.print("ERASE", 25, 265);
}
void buttonERASETouch () {
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
Erase(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
}}
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.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
myGLCD.print("READ", 375, 265);
}
void buttonREADTouch() {
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
Read(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
}}
////////////////////////////////////////////////////////////////////////////////////////
//прорисовка линий
///////////////////////////////////////////////////////////////////////////////////////
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 (){
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);
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); }
}
void Temperature (){
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.setFont(GroteskBold16x32);
h = dht.readHumidity();
t = dht.readTemperature();
sensors.requestTemperatures();
}
обнанужил косяк с часами. каждый раз при запуске показывает то время и дату которую я запрограмировал последний раз. едешь часы идут. заглушил и включаешь стново время и дата таже что при настройке. чеза .... непонятка.
мало того что условие в двух случаях одно и тоже, дак и делают строки одно и тоже, вставляют по одному пробелу. Смысл то был если число однозначное - вставлять два пробела, двухзначное - один пробел, трехзначное - ничё не вставлять, типа такого. А тут хз что.
по часам просто , батарейка стоит, но уже месяцев 7-8, может подссела? скорее всего что подсела, я всегда подключал только на мгновение во время разработки и без подзарязки она все время стояла в плате, по ходу она и ссела, в скетче не закоментировал строчку настройки когда выкидывал в пост. исправил в скетче выше. это строка для настройки времени и даты, раскоментировал, выставил, залил, закоментировал. залили с закоментирваными и готово. должно быть так
136
// раскоментировать, выставить времая и дату, залить в ардуино. в скетче закоментировать
137
// обратно. иначе каждый раз будет по новой выствлятся это же время и дата
138
// (год, месяц, день, часы, минуты, секунды)
139
// rtc.adjust(DateTime(2017, 7, 18, 17, 41, 0));
по поводу пробелов. если я не ошибаюсб ставил два пробела и были глюки. щас проверю еще раз.
извеняюсь не подправил в скетче, должно быть так. уже подправил в скетче выше
итог ,вот о каких глюках я тебе говорил. появляется какие то 8224
с часами решено, батарейка ссела. на замену. заменил, не помогло. может пережал когда крепил. и перекосил плату, читал о таком. короче закажу новый и поменяю, тогда будет видно в чем косяк.
Просто я к чему говорю, у тебя есть строка If (L100<10) надо чтоб ты понимал что ты делаешь. в этой строке ты добавляешь пробел.
Смысл вставлять вторую строку типа If (L100<100) если ты там опять добавляешь один же пробел. Т.е. во-первых условие неправильное, если уж вставляешь вторую строку надо диапазон значния правильно выбирать типа (меньше ста и больше или равно 10) ну и во-вторых вставлять другое количество пробелов. Просто не люблю когда пргограмма работет абы как, только не так как задумано. Понятно если глюк какойто, надо чето решать. Ну тогда вообще убрать эту строку и всё. Не думаю, что у тебя расход более 99 л/100км будет показывать.
Изначально задумывалось так.
расход от 0...9 л ставим два пробела
расход 10...99 ставим одим пробел
расход >99 не ставим пробелов вообще
А чё за глюк с двумя пробелами это вообще хз. Может два раза распечатывать один пробел?
if (L100<10) myGLCD.print {(String(' '), 215,75); myGLCD.print (String(' '), 230,75);}
if (L100>=10 && L100<100) myGLCD.print (String(' '), 215,75);
И не забывай что когда ты проверяешь в if диапазон числа таким образом
if (L100<10)
if (L100>10)
то подумай, если число будет 10 равно? правильно, в этом случае ни одна из строчек не выполнится. Соответственно надо так
if (L100<10) .....
if (L100>=10) ....
или так
if (L100<10) ....
else .....
хотя щас подумал, по твоему наверное тоже программа будет праивльно работать. у тебя же в каждой строчке пробелы в разных местах печатаются.
типа число меньше 10 обе строчки выполняются и печатаются оба пробела каждый в своем месте.
типа число от 10 до 99 одна строчка выполняется и печатаются только один (правый) пробел.
с часами у меня также было вроде. не помню что сделал. может библиотеку другую попробовать, там ещё какая то была. В которой можно ещё датчик температуры встроенной в часы опрашивать, тогда в салоне датчик t не нужен будет.
поехали. это единственная конфигурация которая у меня работет корректно
myGLCD.printNumF(LHor, 1, 165, 40);
if (LHor<10) myGLCD.print(String(' '), 215,40);
if (LHor<100&&LHor>=10) myGLCD.print(String(' '), 230,40);
myGLCD.printNumF(L100, 1, 165, 75);
if (L100<10) myGLCD.print(String(' '), 215,75);
if (L100<100&&L100>=10) myGLCD.print(String(' '), 230,75);
с "нет ошибок" "стерты ошибки" сработало. но идет как бы двойная очистка, нажимаешь читать и идет одна прорисовка пустого экрана и после вторая прорисовка с "нет ошибок". происходит быстро. думаю косяк в том что гдето сначало выводится ответ и сразу очистка, поэтому и не выводило, может я и ошибаюсь. но сейчас все выводит, стабильно на вторую прорисовку.
по хорошему вообще мне кажется не надо постоянно очищать экран и заново прорисовывать экраны. Можно стирать инфу локально, рисовав черный прмоугольник в нужном месте и нужного размера, а то очистка экрана делается медленно, всё мигает при этом.
подожди я ж убрал строчки 703, 704 и 685, 686. Короче у нас миллион проблем из-за того, что я переделываю скетч, начинаю думать что допустим что-то исправил, ты без палева возвращаешь всё на место по тем или иным причинам, потом из за этого соответсвенно появляются всё новые и новые косяки, я уже на это не думаю т.к. вроде исправил, потом смотрю дак там опять ничё не исправлено потому что.
когда мотор четырёх тактный, за 2 оборота, происходит один рабочий ход (только этот такт нас интересует), т.е. если 1000 об/мин до будет 500 тактов за минуту, ну и если 4 цилинровый мотор то умножаем на 4 ,т.е. 2000 тактов в минуту
вот формулы примерно такие
ок. а то чета я запутался. иду попробую пасивный активный и расход
потом отпишись как заработал расход и активный пассивный DTC
10 мнут и отпишусь
да. пасиве активе работает, координаты отображения угнал в право, так как было видно только .ve, но все четко работает, проверил несколько раз. расход в час вроде показывает корректно, качит гдето 0.8 -0.9 даешь газку поднимается . расход на 100 тронулся во дворе на первой метров 8 и тоже показывает 25 литров, примерно. завтра поеду на работу и уже точно скажу как работет расход. ТЫ ВЕЛИКИЙ ИЗ ВЕЛИКИХ. остался бак. завтра гляну вотльы на датчике. а вот с затираниями хоть с пробелом хоть с квадратом, тоже самое. почти финишная, завтра узнаем.
круто. щас попробую. и не мерцает?
неа, всё ништяк
ok :)
формула пробег до заправки
S = 1.00/(float)L100*Fuel*100
где Fuel количество топлива, л
только L100 надо средний высчитывать
типа сколько км до следующей заправки? как можно высчитать средний L100?
средний расход можно делать так:
создаем массив переменных среднего расхода , например 100 шт.
int L100sr[100];
int L;
раз в 5 сек пишем мгновенный расход каждый раз в следующую ячейку массива среднего расхода
когда записывается последняя 100-я ячейка считаем среднее арифметическое между ячейками.
и записываем в одну из 10 ячеек еепром причём выбор ячейки еепром рандомно.
Раз в 5 мин считаем среднее арифметическое между 10 ячейками еепром, это и будет средний расход топлива, который заносим тоже в свою ячейку еепром. Параметр среднего расхода будет запоминаться даже при пропадании питания ардуины
попробую потом это раскурить. если смогу.
проблема в том что мой метод будет считать средний расход на 100км только в движении, не учитывая расход на ХХ, в пробках и и т.д.
Надо думать алгоритм или искать готовый
это не проблема так как есть расход в час. кстати все работает супер. на горячую на холостых в час 0,7 и во время хода показывает рассход как положено и на ходу расход в час и на 100 выравниваются, что есть логично. затирания попробовал на rpm все супер, щас отстальные подкоректирую. вопрос если расход например от 0,7 и допустим 12,7 как правильно прописать затирание? затирание нужно от третьего символа, тое есть от 12,_ ? if (L100<10) и координаты третьей позиции так ?
поставь координаты левее чтоб наезжало на предыдущие показания, помоему если через String он не будет наезжать, а сам сдвинет вправо до последнего символа
с этим уже разобрался, все ништяк. дорабатываю остальные.
понял. вроде и так работает, но если так правильно то уже исправляю
просто например когда расход равен 9 у тебя обе строчки выполняются, т.к. 9 это и <10 и <100
логично
активный выдавало на пасивынй , пасивный на активный, так правильно
вопрос. поставил обновление экрана с 100 на 50, вроде чаще обновляется. или это уже нагрузка на проц и лучше оставить 100? второе, есть маленький косяк, надпись ошибка стерта и нет ошибок выводит на экран но может и на пятое нажати вывести может на десятое, где собака порылась?
Оставь 50
Надо смотреть что в шине на момент когда не отреагировало на нажатие. Может блок не ответил а может косяк с выводом на lcd
посмотрю завтра че выдаст сериал. оставлю 50. ты не думал както по плавнее расход на 100, а то больше похоже на мгновенный расход. хотя не принцепиально, на скорости при монотонной езде примерно видишь расход, уже гуд. так же интересная штука
формула пробег до заправки
S = 1.00/(float)L100*Fuel*100
где Fuel количество топлива, л
только L100 надо средний высчитывать
Fuel- это средний расход на 100, как я понял, который нужно выщитать.
я там написал же : Fuel - количество оставшегося топлива в баке. Средний расход в формуле это L100. ну да, надо было написать L100SR . А как поплавнее, это и есть мгновенный расход. Ну можно поплавнее, например сделать вывод на экран раз в полсекунды. А так то , читай про библиотекуу еепром, учись туда в ячейки данные записывать и считывать. там легко. Потом будем средний расход мучать.
понял. буду вытягивать остаток в баке с датчика для начала, потом посмотрю с формулой пробега.
короче проверил я в сериале. выдает вот это
обнанужил косяк с часами. каждый раз при запуске показывает то время и дату которую я запрограмировал последний раз. едешь часы идут. заглушил и включаешь стново время и дата таже что при настройке. чеза .... непонятка.
про часы у тебя написано
// строка ниже используется для настройки даты и времени часов
136
// раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
137
// обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
138
// (год, месяц, день, часы, минуты, секунды)
139
rtc.adjust(DateTime(2017, 7, 118, 17, 41, 0));
а батарейка то вставлена в часы ?
я никак не пойму вот этих строк
190
if
(Speed<10) myGLCD.print(String(
' '
), 365,0);
191
if
(Speed<10) myGLCD.print(String(
' '
), 380,0);
198
if
(LHor<10) myGLCD.print(String(
' '
), 215,40);
199
if
(LHor<100&&LHor>=10) myGLCD.print(String(
' '
), 230,40);
201
if
(L100<10) myGLCD.print(String(
' '
), 215,75);
202
if
(L100<10) myGLCD.print(String(
' '
), 230,75);
мало того что условие в двух случаях одно и тоже, дак и делают строки одно и тоже, вставляют по одному пробелу. Смысл то был если число однозначное - вставлять два пробела, двухзначное - один пробел, трехзначное - ничё не вставлять, типа такого. А тут хз что.
по часам просто , батарейка стоит, но уже месяцев 7-8, может подссела? скорее всего что подсела, я всегда подключал только на мгновение во время разработки и без подзарязки она все время стояла в плате, по ходу она и ссела, в скетче не закоментировал строчку настройки когда выкидывал в пост. исправил в скетче выше. это строка для настройки времени и даты, раскоментировал, выставил, залил, закоментировал. залили с закоментирваными и готово. должно быть так
136
// раскоментировать, выставить времая и дату, залить в ардуино. в скетче закоментировать
137
// обратно. иначе каждый раз будет по новой выствлятся это же время и дата
138
// (год, месяц, день, часы, минуты, секунды)
139
//
rtc.adjust(DateTime(2017, 7, 18, 17, 41, 0));
по поводу пробелов. если я не ошибаюсб ставил два пробела и были глюки. щас проверю еще раз.
извеняюсь не подправил в скетче, должно быть так. уже подправил в скетче выше
190
if
(Speed<10) myGLCD.print(String(
' '
), 365,0);
191
if
(Speed<100) myGLCD.print(String(
' '
), 380,0);
198
if
(LHor<10) myGLCD.print(String(
' '
), 215,40);
199
if
(LHor<100&&LHor>=10) myGLCD.print(String(
' '
), 230,40);
201
if
(L100<10) myGLCD.print(String(
' '
), 215,75);
202
if
(L100<100) myGLCD.print(String(
' '
), 230,75);
выставил так как ты сказал
190
if
(Speed<10) myGLCD.print(String(
' '
), 365,0);
198
if
(LHor<10) myGLCD.print(String(
' '
), 215,40);
201
if
(L100<10) myGLCD.print(String(
' '
), 215,75);
итог ,вот о каких глюках я тебе говорил. появляется какие то 8224
с часами решено, батарейка ссела. на замену. заменил, не помогло. может пережал когда крепил. и перекосил плату, читал о таком. короче закажу новый и поменяю, тогда будет видно в чем косяк.
Смысл вставлять вторую строку типа If (L100<100) если ты там опять добавляешь один же пробел. Т.е. во-первых условие неправильное, если уж вставляешь вторую строку надо диапазон значния правильно выбирать типа (меньше ста и больше или равно 10) ну и во-вторых вставлять другое количество пробелов. Просто не люблю когда пргограмма работет абы как, только не так как задумано. Понятно если глюк какойто, надо чето решать. Ну тогда вообще убрать эту строку и всё. Не думаю, что у тебя расход более 99 л/100км будет показывать.
Изначально задумывалось так.
расход от 0...9 л ставим два пробела
расход 10...99 ставим одим пробел
расход >99 не ставим пробелов вообще
А чё за глюк с двумя пробелами это вообще хз. Может два раза распечатывать один пробел?
И не забывай что когда ты проверяешь в if диапазон числа таким образом
то подумай, если число будет 10 равно? правильно, в этом случае ни одна из строчек не выполнится. Соответственно надо так
хотя щас подумал, по твоему наверное тоже программа будет праивльно работать. у тебя же в каждой строчке пробелы в разных местах печатаются.
типа число меньше 10 обе строчки выполняются и печатаются оба пробела каждый в своем месте.
типа число от 10 до 99 одна строчка выполняется и печатаются только один (правый) пробел.
ну оставь по своему.
с часами у меня также было вроде. не помню что сделал. может библиотеку другую попробовать, там ещё какая то была. В которой можно ещё датчик температуры встроенной в часы опрашивать, тогда в салоне датчик t не нужен будет.
как я рад тебя слышать.
сейчас попробую так
1
if
(L100<10) myGLCD.print {(String(
' '
), 215,75); (String(
' '
), 230,75);}
2
if
(L100>=10 && L100<100) myGLCD.print (String(
' '
), 215,75);
сейчас и библу для часов попробую другую. я пропаял микрухи, может заработает, сейчас буду знать.
пропайка не помогла. ищу библу.
библиотеку брал RTClib или конкретно под свой модуль?
с часами попробуй чисто пример из библиотеки. может заработает. Там поправил я строчку с распечаткой последовательно по одному пробелу, ошибка была
ок, сейчас........
по поводу, что не с первого раза Borrado и NO DTC на экран выводится, попробуй так
поехали. это единственная конфигурация которая у меня работет корректно
Т.е. все таки со второго нажатия выводит? Или с одного нажатия но с двумя прорисовками?
Щас посмотрел, у тебя опять цикл Watch () в находится в цикле распечатки параметров на экран. Я ж убирал его оттуда.
с одного нажатия две прорисовки. watch кидал его туда сюда искал че не работает. вот последняя версия скетча. watch там где ты его и прописал.
попробуй закоментировать строчки с 278 по 288 (вывод скорости на экран), и проверь как выводиться NO DTC
по хорошему вообще мне кажется не надо постоянно очищать экран и заново прорисовывать экраны. Можно стирать инфу локально, рисовав черный прмоугольник в нужном месте и нужного размера, а то очистка экрана делается медленно, всё мигает при этом.
результат тотже. одно нажати на вторую прорисовку.
подожди я ж убрал строчки 703, 704 и 685, 686. Короче у нас миллион проблем из-за того, что я переделываю скетч, начинаю думать что допустим что-то исправил, ты без палева возвращаешь всё на место по тем или иным причинам, потом из за этого соответсвенно появляются всё новые и новые косяки, я уже на это не думаю т.к. вроде исправил, потом смотрю дак там опять ничё не исправлено потому что.
вот эту строчку я так сделал,
if
(MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
а она у тебя опять такая прежняя стала
if
(MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){
я их там вроде не ставил, мне кажется они всегда там были, у меня была идея закоментировать их, что мол они может и очещают