кнопи реагируют супер, точки мегают супер, rpm engine load отображают ноли(я же не подключен к машине). единственное при переходе на другую страницу часы время и температура прописовывается через 5 секунд и в это время все данные в таблице имеет маленькие цифры, когда прорисовалась верхняя часть часы время и температура в таблиц все становится нормального размера. блин ништяк. и чуток щас сдвину цифры в таблице в право
мне как раз такой же дисплей подойдет для одно проекта. Разбили на форде родной дисплей щитка приборов. Фиг где отдельно купишь, только панель - дорогая она, а этот по размерам вроде подходит. А на штатном дисплей информации то было, надпись форд, время и положение селектора АКПП и всё. А тут можно красиво все сделать
неа. все запортачилось. точи мигают не правильно и меняют размер свой но только на пером экране, цифры в таблице остаются маленькими. испытаю завтра предедущий. спокойной ночи
Я тут спецификацию автоваза читаю для KWP2000 и там написано
4.2.2 Байт адреса приемника.
В реализации данного протокола используется физическая адресация.
Поэтому, под адресом приемника сообщения подразумевается физический адрес блока управления, которому предназначено конкретное сообщение.
Байт адреса приемника всегда используется совместно с байтом адреса источника.
Согласно стандарту SAE J2178, физический адрес контроллера системы управления двигателем назначен равным 10h.
4.2.3 Байт адреса источника.
Для диагностического тестера физический адрес принят равным F1h, для иммобилизатора C0h. Иные адреса, данной реализацией не поддерживаются.
это значит что адрес мозгов моей тачки не 10 а 10h?
Еще написано Контроллер Motronic M1.5.4 поддерживает только “быструю” инициализацию. у меня как раз такой
в запросах не дается такой адрес 10h . прослушка линии тебе же показала четко что твой адрес запроса это 10. а что иниты не пошли ни один ни другой? обрати внимание что в доке и F1h но задается как F1
вопрос в том, как узнать оборвалась ли сессия, то бишь открыта она в данный момент времени или закрыта
Функция startCommunication.
Данная функция инициализирует процесс обмена данными между диагностическим тестером и контроллером. На запрос startCommunication не может быть получен отрицательный ответ. В случае успешного завершения, сеанс обмена данными всегда заканчивается функцией stopCommunication.
это понятно . мы чуток о другом говорили. например мой блок через 10 секунд закрывает сесию если не шлеш запросы и присутсвие. когда я влючал комуникацию получал положительный ответ а потом перезагружал сериал, то ответыов небыло так как ебу еще был в ссесии, нужно было бы закрыть ссесию stopCommunication и снова дать инит и он бы сразу подхватилбы , не зависимо через какой период секунд или минут. мы говорили если вдруг ссесия оборвется по какимто причинам во время работы, то вернутся автоматом на инит
смотри в проге кажется называется comtest все данные выводит в сериал через h. хотя у меня в скетче все без h. я не спец но подозреваю что это как разделитель символов, ну и возможно что как определение HEX байта. например у меня в скетче прописано вывадить в сериал 8111F18104,а в comtest он выводит как 81h11hF1h81h04h. тоесть хочу сказать не зацикливайся на h.
Так MaksVV, отчитываюсь. все работает. но...... первая поблема обновляются данные с торможением гдето в 2 секунды, иногда как в 4 секунды но это возможно потому что он поймал два раза одинаковое значение и по этому кажется что задержка в 4 секунды. вторая проблема при старте например обороты 800 об/м, потом даю газу и показывает например 1238 об/м , убираю ногу с газа и происходит такое показвывает 8008 об/м, тоесть последнаяя цифра 8 не исчезает а продолжает висесть пока не поменяется на другую если дам гаду. тоесть не происходит очистка данных. Вот как то так. Но уже приятный ништяк. вот фотка, солнце лупило видно не очень, просто хотел чтобы ты видел на фото холостые обороты , цифра 5 осталась после последней подгазовки.
вот скетч с которым нужно работать. в остальных то лажа с точками мигание, то с размером данных в таблице. да и я решил проблему первичной загрузки с маленькими цифрами и через 7 секунд с прорисовкой верхней части часов и температруры, прописал в сетуп Watch_Temperature (); и все чики, прогружается сразу и верх и размер шрифта данных. вот скетч
#include <UTouch.h>
#include <UTFT.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc; //pin 20 SCL , 21 SDA
#include <OneWire.h>
#define ONE_WIRE_BUS 8 //наружняя температура
OneWire oneWire(ONE_WIRE_BUS);
#include <DallasTemperature.h>
DallasTemperature sensors(&oneWire);
#include "DHT.h"
#define DHTPIN 9 //внутринняя температура и влага
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
UTFT myGLCD(31,38,39,40,41);
UTouch myTouch(6,5,4,3,2);
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern uint8_t GroteskBold16x32[];
int x, y;
char currentPage, selectedUnit;
float h;
float t;
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
bool Dvoet = 0;
//////////////////////////////////////////////////////////////////////////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
#define TX 11
int length5 = 5;
int length6 = 6;
int pid = 1; // очередность пида
bool Init = 0;
int PIDTime = 150; // задержка между посылками запросов температуры, мс
int PresTime = 9000; // задержка между посылками запросов присутствия, мс
int waitbyte = 1; // задержка между отправкой байт в сообщении, мс
int Temp = 0; // температура
int rpm = 0; // обороты
int load = 0; // нагрузка
int tempair = 0; // температура входного воздуха
int Speed = 0; // скорость
int MAP = 0; // давление впускного коллектора
int gaz = 0; // положение педали
int MAF = 0; // сассовый расход воздуха
byte MessageRx[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // массив байтов принимаемого сообщения
byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04}; // запрос инициализации
byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1}; // запрос присутствия
byte messageTemp[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A}; // запрос температуры 1
byte messageRPM[6] = {0x82,0x11,0xF1,0x01,0x0C,0x91}; // запрос оборотов ДВС 2
byte messageLoad[6] = {0x82,0x11,0xF1,0x01,0x04,0x89}; // запрос нагрузки на ДВС 3
byte messageAirTemp[6] = {0x82,0x11,0xF1,0x01,0x0F,0x94}; // запрос температура впускного воздуха 4
byte messageSpeed[6]= {0x82,0x11,0xF1,0x01,0x0D,0x92}; // запрос скорости а/м 5
byte messageMAP[6] = {0x82,0x11,0xF1,0x01,0x0B,0x90}; // запрос абсолютное давление во впускном коллекторе (MAP) 6
byte messageAcceler[6] = {0x82,0x11,0xF1,0x01,0x11,0x96}; // положения педали газа, % 7
byte messageMAF[6] = {0x82,0x11,0xF1,0x01,0x10,0x95}; // массовый расход воздуха, г/cек 8
unsigned long prevPID = 0;
unsigned long prevpres = 0;
unsigned long TimewaitPID, timerwaitPID = 0;
bool timerenabledPID = 0;
#define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 500 // здесь задержка на ожидание правильного ответа, мс
unsigned long TimewaitInit, timerwaitInit = 0;
bool timerenabledInit = 0;
#define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 1000 // здесь задержка на ожидание ответа удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
drawHomeScreen();
currentPage = '0';
selectedUnit = '0';
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
// строка ниже используется для настройки даты и времени часов
//rtc.adjust(DateTime(2017, 6, 23, 18, 0, 0));
Watch_Temperature ();
Serial.begin(115200);
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
unsigned long curpres = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();
if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {
if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
}
receive ();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned long curWatch = millis();
unsigned long curDvoet = millis();
unsigned long curData = millis();
if (curWatch - prevWatch > 10000) { Watch_Temperature (); prevWatch = curWatch;}
if (curDvoet - prevDvoet > 500) {
if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
Menu();
if (currentPage == '0') {if (curWatch - prevWatch > 200){
myGLCD.setColor(255, 255, 255);
// myGLCD.print("Ltr/Hor:", 10, 40);
// myGLCD.print("Ltr/100:", 10, 75);
// myGLCD.print("Ult Km:", 10, 110);
// myGLCD.print("Ult Ltr:", 10, 145);
// myGLCD.print("Fuel Km:", 10, 180);
myGLCD.printNumI(rpm, 150, 215);
myGLCD.printNumI(Temp, 395, 40);
// myGLCD.print("Oil C:", 255, 75);
myGLCD.printNumI(sensors.getTempCByIndex(0), 395, 110);
myGLCD.printNumI(t, 395, 145);
// myGLCD.print("Fuel C:", 255, 180);
myGLCD.printNumI(load, 395, 215);
prevData = curData;
}
}
}
///////////////////////////////////////////////////////////////////////////
void PIDs() {
if (pid==1){
Serial.print ("Zapros Temp: ");
for (int i = 0; i < length6; i++) {
mySerial.write(messageTemp[i]);
Serial.print(messageTemp[i],HEX); Serial.print (" ");
delay (waitbyte); }
}
if (pid==2){
Serial.print ("Zapros RPM: ");
for (int i = 0; i < length6; i++) {
mySerial.write(messageRPM[i]);
Serial.print(messageRPM[i],HEX); Serial.print (" ");
delay (waitbyte); }
}
if (pid==3){
Serial.print ("Zapros Load: ");
for (int i = 0; i < length6; i++) {
mySerial.write(messageLoad[i]);
Serial.print(messageLoad[i],HEX); Serial.print (" ");
delay (waitbyte); }
}
if (pid==4){
Serial.print ("Zapros AirTemp: ");
for (int i = 0; i < length6; i++) {
mySerial.write(messageAirTemp[i]);
Serial.print(messageAirTemp[i],HEX); Serial.print (" ");
delay (waitbyte); }
}
if (pid==5){
Serial.print ("Zapros Speed: ");
for (int i = 0; i < length6; i++) {
mySerial.write(messageSpeed[i]);
Serial.print(messageSpeed[i],HEX); Serial.print (" ");
delay (waitbyte); }
}
if (pid==6){
Serial.print ("Zapros MAP: ");
for (int i = 0; i < length6; i++) {
mySerial.write(messageMAP[i]);
Serial.print(messageMAP[i],HEX); Serial.print (" ");
delay (waitbyte); }
}
if (pid==7){
Serial.print ("Zapros Accelerate: ");
for (int i = 0; i < length6; i++) {
mySerial.write(messageAcceler[i]);
Serial.print(messageAcceler[i],HEX); Serial.print (" ");
delay (waitbyte); }
}
if (pid==8){
Serial.print ("Zapros MAF: ");
for (int i = 0; i < length6; i++) {
mySerial.write(messageMAF[i]);
Serial.print(messageMAF[i],HEX); Serial.print (" ");
delay (waitbyte); }
}
pid++; if (pid>8) {pid = 1; Serial.println ("");}
Serial.println ("");
}
void present() {
Serial.print ("Zapros prisutstviya: ");
for (int i = 0; i < length5; i++) {
mySerial.write(messagePresent[i]);
Serial.print(messagePresent[i],HEX); Serial.print (" ");
delay (waitbyte); }
Serial.print(" "); Serial.print(PresTime); Serial.println("ms");
}
/////////////////////////////////////////////////////////////////////////////////////////////
void receive () {
if (mySerial.available()) {
delay(100);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 12) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
Serial.print (" Recieve: ");
for (int i = 0; i < 12; i++) {
Serial.print(MessageRx[i],HEX); Serial.print (" ");}
Serial.println ("");
if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F) {Init=1;
timerenabledInit=0; Serial.println (" Initialization OK! ");
Serial.println("");
Serial.print ("PID delay: "); Serial.print(PIDTime); Serial.println("ms");
Serial.print ("Present delay: "); Serial.print(PresTime); Serial.println("ms");
Serial.println("");}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x05) {Temp = MessageRx[8]-40;
timerenabledPID=0; Serial.print (" Temperature: ");
Serial.print (Temp); Serial.println (" *C");}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0C) {rpm = ((MessageRx[8]*256) + MessageRx[9]) / 4;
timerenabledPID=0; Serial.print (" RPM: ");
Serial.print (rpm); Serial.println (" /min");}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x04){ load = MessageRx[8]*100/255;
timerenabledPID=0; Serial.print (" Load: ");
Serial.print (load); Serial.println (" %");}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0F) {tempair = MessageRx[8]-40;
timerenabledPID=0; Serial.print (" AirTemp: ");
Serial.print (tempair); Serial.println (" *C");}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0D){ Speed = MessageRx[8];
timerenabledPID=0; Serial.print (" Speed: ");
Serial.print (Speed); Serial.println (" km/h");}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0B){ MAP = MessageRx[8];
timerenabledPID=0; Serial.print (" MAP: ");
Serial.print (MAP); Serial.println (" kPa");}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x11) {gaz = MessageRx[8]*100/255;
timerenabledPID=0; Serial.print (" Accelerate: ");
Serial.print (gaz); Serial.println (" %");}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x10) { MAF = ((MessageRx[8]*256) + MessageRx[9]) / 100;
timerenabledPID=0; Serial.print (" MAF: ");
Serial.print (MAF); Serial.println (" g/sec");}
for (int i = 0; i < 12; i++) MessageRx[i]=0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void initialization() {
Serial.print ("Zapros Initialization: ");
for (int i = 0; i < length5; i++) {
mySerial.write(messageInit[i]);
Serial.print(messageInit[i],HEX); Serial.print (" ");
delay (5);
}
delay (55);
Serial.println("");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void fastinit() {
Serial.println("starting comunication (fastinit)");
digitalWrite (TX, HIGH); // makes K-line high 3
delay(360); // wait for K-line to be clear 3
digitalWrite (TX, LOW); // makes K-line low 3
delay(25);
digitalWrite (TX, HIGH); // makes K-line high 3
delay(25); //last delay before first message
mySerial.begin(10400); // baud rate of the OBD
Serial.println("starting serial comunication");
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
void Menu () {
//Page 0 (home)
if (currentPage == '0') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
drawFrame(10, 275, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
drawFrame(180, 275, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
drawFrame(350, 275, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
//Page 1
if (currentPage == '1') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
drawFrame(180, 275, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
drawFrame(350, 275, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//---------------------------------------------------------------------------------------------------
//Page 2
if (currentPage == '2') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
drawFrame(10, 275, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
drawFrame(350, 275, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//------------------------------------------------------------------------------
//Page 3
if (currentPage == '3') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
//Button ERASE
//if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
//drawFrame(180, 275, 300, 310);
//currentPage = '3'; //потом заменить на дейсвие
//myGLCD.clrScr();
//drawscreen_three(); //потом заменить на дейсвие
//}
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
}
}
}
//-----------------------------------------------------------------------------------
void drawHomeScreen() {
line() ;
vista();
myGLCD.drawLine(239,35,239,248); // линия вертикальная
myGLCD.print("Ltr/Hor:", 10, 40);
myGLCD.print("Ltr/100:", 10, 75);
myGLCD.print("Ult Km:", 10, 110);
myGLCD.print("Ult Ltr:", 10, 145);
myGLCD.print("Fuel Km:", 10, 180);
myGLCD.print("Eng RPM:", 10, 215);
myGLCD.print("Engin C:", 255, 40);
myGLCD.print("Oil C:", 255, 75);
myGLCD.print("Exter C:", 255, 110);
myGLCD.print("Inter C:", 255, 145);
myGLCD.print("Fuel C:", 255, 180);
myGLCD.print("Load %:", 255, 215);
buttonHome() ;
buttonINF1() ;
buttonINF2() ;
buttonCHECK() ;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void drawscreen_one() {
line() ;
vista();
myGLCD.print("Start of Delivery C:", 10, 40);
myGLCD.print("Desir inject Start C:", 10, 75);
myGLCD.print("Actua Inject Start C:", 10, 110);
myGLCD.print("Desir Inject Quan mg:", 10, 145);
myGLCD.print("Actu Inject Quant mg:", 10, 180);
myGLCD.print("Mass Air Flow mg:", 10, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//----------------------------------------------------------------------------------------
void drawscreen_two() {
line() ;
vista();
myGLCD.print("EGR Pulse Ratio :", 10, 40);
myGLCD.print("Boost Pressure :", 10, 75);
myGLCD.print("Fuel Valve :", 10, 110);
myGLCD.print("Pump Speed :", 10, 145);
myGLCD.print("Glow Time :", 10, 180);
myGLCD.print("A/C Pressure :", 10, 215);
buttonHome() ;
buttonINF1() ;
buttonCHECK() ;
}
//----------------------------------------------------------------------------
void drawscreen_three() {
vista();
myGLCD.setColor(255, 0, 0); // цвет линии -зеленый
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
buttonHome();
//Button - ERASE
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (180, 275, 300, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (180, 275, 300, 310);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0,0,0);
myGLCD.print("ERASE", 200, 285);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
void drawFrame(int x1, int y1, int x2, int y2) {
myGLCD.setColor(255, 0, 0);
myGLCD.drawRoundRect (x1, y1, x2, y2);
while (myTouch.dataAvailable())
myTouch.read();
myGLCD.setColor(255, 255, 255);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void buttonHome() {
myGLCD.setColor(0,0,0); // цвет кнопки -серый
myGLCD.fillRoundRect (1, 1, 65, 33); // расположение кнопки прямоугольника
myGLCD.setColor(0, 255, 0); // цвет текста оранжево-красный
myGLCD.drawRoundRect (1, 1, 65, 33); // кнопка будет рамкой
myGLCD.setFont(BigFont); // размер шрифта
myGLCD.setBackColor(0,0,0); // цвет фона области где будет надпись и кнопки
myGLCD.print("HOME", 1, 10); // центровка строки
}
void buttonINF1() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (10, 275, 120, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (10, 275, 120, 310);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0,0,0);
myGLCD.print("INF 1", 25, 285);
}
void buttonINF2() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (180, 275, 300, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (180, 275, 300, 310);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0,0,0);
myGLCD.print("INF 2", 200, 285);
}
void buttonCHECK() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (350, 275, 470, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (350, 275, 470, 310);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0,0,0);
myGLCD.print("CHECK", 375, 285);
}
////////////////////////////////////////////////////////////////////////////////////////
void line() {
myGLCD.setColor(255, 0, 0); // цвет линии -зеленый
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,73,479,73); // линия горизонтальная
myGLCD.drawLine(1,108,479,108); // линия горизонтальная
myGLCD.drawLine(1,143,479,143); // линия горизонтальная
myGLCD.drawLine(1,178,479,178); // линия горизонтальная
myGLCD.drawLine(1,212,479,212); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
}
////////////////////////////////////////////////////////////////////////////////////////////
void vista(){
myGLCD.setFont(GroteskBold16x32);
myGLCD.setColor(255, 0, 0);
myGLCD.setBackColor(0,0,0);
}
/////////////////////////////////////////////////////////////////////////////////////////////
void Watch_Temperature (){
DateTime now = rtc.now();
int m = now.minute();
int hour = now.hour();
int mon = now.month();
int date = now.day();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.setFont(GroteskBold16x32);
if (date<10) {
myGLCD.print("0", 85, 0);
myGLCD.printNumI(now.day(), 100, 0); }
else if (date >=10) {
myGLCD.printNumI(now.day(), 85, 0); }
myGLCD.print("/", 115, 0);
if ( mon<10) {
myGLCD.print("0", 130, 0);
myGLCD.printNumI(now.month(), 145, 0);}
else if (mon >=10) {
myGLCD.printNumI(now.month(), 130, 0);}
myGLCD.print("/", 160, 0);
myGLCD.printNumI(now.year(), 175, 0);
myGLCD.setColor(255, 255, 255);
if (hour<10) {
myGLCD.print("0",255, 0);
myGLCD.printNumI(now.hour(), 270, 0); }
else if(hour>=10){
myGLCD.printNumI(now.hour(), 255, 0); }
if (m<10) {
myGLCD.print("0",300, 0);
myGLCD.printNumI(now.minute(), 315, 0); }
else if (m>=10){
myGLCD.printNumI(now.minute(), 300, 0); }
h = dht.readHumidity();
t = dht.readTemperature();
myGLCD.setColor(0, 255, 0); //белый цвет цифры
myGLCD.printNumI(h, 350, 0);
myGLCD.print("% ", 380, 0);
myGLCD.printNumI(t, 410, 0);
myGLCD.print("C", 440, 0);
myGLCD.print(" ", 285, 0);
sensors.requestTemperatures();
}
Думаю нужно поставить очистку скрина после каждого проиденого цикла.
FF FF FF В начале это лишние байты. Так как массив у нас прописан на 12 байт а ответ мы получаем только 5 - 6 байт то он и подставляет пустые байты. По поводу эпоса 21 01 он выдаёт кучу байт в которых тоже закрыты ответы, каждый байт отвечает за определённую вещь. Например обычно по 10 адресу, если считать от 61 ( это будет первый байт) то одиннадцатый байт отвечает за температуру. Пересчитай его в DEC и отнеми 40, получишь температуру. И так далее. Проблема узнать за что отвечает каждый байт. У меня 11 байт не совпадает с температурой. Если у тебя совпало то ищи в нете расшифровку ответа на 21 01. А потом можно каждый байт выдергивать, перечитывать по формуле и выводить в сериал. Где то так. Если в ответе есть 7F значит не потдерживается.
После 61 у тебя 11 байт это 75. 75=117(DEC)-40=77град. Если у тебя такая температура то гуд. Ищи расшифровку на запрос 21 00. Когда будешь знать расшифровку то можно выводить нужные пересчитаные байты в сериал
Ищи расшифровки где 11 байт отвечает за температуру. Мне попадались много форумов с расшифровка, именно на 11 байт. Но так как у меня не совпало, другая специфика ебу, то я и не запоминал эти форумы. Ищи. Легче из одного ответа ловить все чем из кучи разное.
вторая проблема при старте например обороты 800 об/м, потом даю газу и показывает например 1238 об/м , убираю ногу с газа и происходит такое показвывает 8008 об/м, тоесть последнаяя цифра 8 не исчезает а продолжает висесть пока не поменяется на другую если дам газу. тоесть не происходит очистка данных.
это проблема была мне известна, ждал пока ты спросишь. Нужно делать проверку после напечатки каждого параметра. Например:
печатаем параметр далее:
if (rpm<10) {напечатать три пробела};
if (rpm>=10 && rpm<100) {напечатать два пробела};
if (rpm>=100 && rpm<1000) {напечатать один пробел};
так пробелы будут задирать предыдущие данные. А если обновлять (стирать все данные с экрана?) каждый раз возможно будет мерцать, хотя попробуй и с обновлением экрана, я просто с таким LCD не работал
при вет. попробовал встунть в лупе myGLCD.clrScr(); происходит страшная дрянь. по первой проблеме, думаю нужно очиситить от всех Serial скетч и искать лишние задержки. щас вычещу лишнее потом проверю и буду делать выводы. еще одно эту функцию можно сделать для всех отображаемых параметров?
if (rpm<10) {напечатать три пробела};
if (rpm>=10 && rpm<100) {напечатать два пробела};
if (rpm>=100 && rpm<1000) {напечатать один пробел};
продолжаю вычистил весь скетч от сериалаов и всего лишнего. заменил в верху влажность и температуру на скорость км/ч. похоже после очистки обновляется быстрее, думаю надо смотреть все задержки и пробовать их минимализировать. функцию которую ты MaksVV предложил нужно делать для всех параметров общаком, так как с Load % происходит тоже самое при нагрузке 1% вторая цифра остается до изменения. да в сериале быстро изменяется , но там нет столько функци и циклов как с экраном. буду смотреть задержки.
наткнулся на статью на драйве, человек расшифровал параметры ответа
Ну так вот программа CE может сохранять данные в файл и потом их оттуда считывать и рисовать графики, и открыв этот бинарный файл в winhex-у я вдруг увидел, что Юрий ничего не кодирует а напрямую просто пишет весь обмен туда с временами пакетов! Ну чтож — вот оно решение проблемы, в том же хекс редакторе я начал в одном из пакетов по очереди заменять значения в разделе данных сначала на 00 потом на FF, сохранять, загружать этот откорректированный лог в программу CE и наблюдать значение какого параметра изменилось и как ))) таким образом были расшифрованы почти все параметры.
протоколы вроде совпвдают, завтра возьму у приятеля ELM и попробую произвести тоже самое. Надеюсь получится... хотя прога посылает запрос на связь с мозгом на адрес 11....
да я читал про это . потом тоже хочу попробовать таким образом свои ответы разкодить на запрос 21 01. если поймешь как и получится, обьясниш мне.
теперь MaksVV поигрался с задержками. уменьшил задержку ожидания правильного ответа на пиды до 60 м/с надо будет попробовать на 51 м/с, задержку на ответ инита до 500 м/с, значит нашел такой прикол вот здесь
void receive () {
if (mySerial.available()) {
delay(100);
уменьшил задержку до 51 м/с. на 50 м/с глюки. теперь почти каждую секунду обновляется. пока все, шуршу дальше вот переделаный скетч
#include <UTouch.h>
#include <UTFT.h>
#include <SPI.h>
//pin 20 SCL , 21 SDA датчик реального времени
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
//датчик наружней температуры
#include <OneWire.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
#include <DallasTemperature.h>
DallasTemperature sensors(&oneWire);
//датчик внутринней температуры и влаги
#include "DHT.h"
#define DHTPIN 9
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//пины экрана и тача
UTFT myGLCD(31,38,39,40,41);
UTouch myTouch(6,5,4,3,2);
//шрифты + не стандартный шрифт GroteskBold16x32.с
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern uint8_t GroteskBold16x32[];
int x, y;
char currentPage, selectedUnit;
float h;
float t;
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
bool Dvoet = 0;
//////////////////////////////////////////////////////////////////////////////
//все что касается OBD2
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //RХ,TХ
#define TX 11
int length5 = 5;
int length6 = 6;
int pid = 1; // очередность пида
bool Init = 0;
int PIDTime = 150; // задержка между посылками запросов пидов, мс
int PresTime = 9000; // задержка между посылками запросов присутствия, мс
int waitbyte = 1; // задержка между отправкой байт в сообщении, мс
int Temp = 0; // температура
int rpm = 0; // обороты
int load = 0; // нагрузка
int tempair = 0; // температура входного воздуха
int Speed = 0; // скорость
int MAP = 0; // давление впускного коллектора
int gaz = 0; // положение педали
int MAF = 0; // массовый расход воздуха
// массив байтов принимаемого сообщения
byte MessageRx[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//массивы сообщений (пидов)
byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04}; // запрос инициализации
byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1}; // запрос присутствия
byte messageTemp[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A}; // запрос температуры 1
byte messageRPM[6] = {0x82,0x11,0xF1,0x01,0x0C,0x91}; // запрос оборотов ДВС 2
byte messageLoad[6] = {0x82,0x11,0xF1,0x01,0x04,0x89}; // запрос нагрузки на ДВС 3
byte messageAirTemp[6] = {0x82,0x11,0xF1,0x01,0x0F,0x94}; // запрос температура впускного воздуха 4
byte messageSpeed[6]= {0x82,0x11,0xF1,0x01,0x0D,0x92}; // запрос скорости а/м 5
byte messageMAP[6] = {0x82,0x11,0xF1,0x01,0x0B,0x90}; // запрос абсолютное давление во впускном коллекторе (MAP) 6
byte messageAcceler[6] = {0x82,0x11,0xF1,0x01,0x11,0x96}; // положения педали газа, % 7
byte messageMAF[6] = {0x82,0x11,0xF1,0x01,0x10,0x95}; // массовый расход воздуха, г/cек 8
unsigned long prevPID = 0;
unsigned long prevpres = 0;
unsigned long TimewaitPID, timerwaitPID = 0;
bool timerenabledPID = 0;
#define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 60 // здесь задержка на ожидание правильного ответа пидов, мс
unsigned long TimewaitInit, timerwaitInit = 0;
bool timerenabledInit = 0;
#define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 500 // здесь задержка на ожидание ответа об удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
drawHomeScreen();
currentPage = '0';
selectedUnit = '0';
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
// строка ниже используется для настройки даты и времени часов (год, месяц, день, часы, минуты, секунды)
//rtc.adjust(DateTime(2017, 6, 23, 18, 0, 0));
Watch_Temperature ();
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
unsigned long curpres = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();
if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {
if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
}
receive ();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned long curWatch = millis();
unsigned long curDvoet = millis();
unsigned long curData = millis();
if (curWatch - prevWatch > 10000) { Watch_Temperature (); prevWatch = curWatch;}
if (curDvoet - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
Menu();
//---------------------------------------------------------
//прописываем где и что мы хотим видеть (пиды)
if (currentPage == '0') {if (curWatch - prevWatch > 200){
myGLCD.setColor(0, 255, 0);
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
// myGLCD.print("Ltr/Hor:", 10, 40);
// myGLCD.print("Ltr/100:", 10, 75);
// myGLCD.print("Ult Km:", 10, 110);
// myGLCD.print("Ult Ltr:", 10, 145);
// myGLCD.print("Fuel Km:", 10, 180);
myGLCD.printNumI(rpm, 150, 215);
myGLCD.printNumI(Temp, 395, 40);
// myGLCD.print("Oil C:", 255, 75);
myGLCD.printNumI(sensors.getTempCByIndex(0), 395, 110);
myGLCD.printNumI(t, 395, 145);
// myGLCD.print("Fuel C:", 255, 180);
myGLCD.printNumI(load, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '1') {if (curWatch - prevWatch > 200){
myGLCD.setColor(0, 255, 0);
myGLCD.printNumI(Speed, 350, 0);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '2') {
if (curWatch - prevWatch > 200){
myGLCD.setColor(0, 255, 0);
myGLCD.printNumI(Speed, 350, 0);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '3') {if (curWatch - prevWatch > 200){
myGLCD.setColor(0, 255, 0);
myGLCD.printNumI(Speed, 350, 0);
prevData = curData;
}
}
}
///////////////////////////////////////////////////////////////////////////
//отправка запросов пидов
void PIDs() {
if (pid==1){
for (int i = 0; i < length6; i++) {
mySerial.write(messageTemp[i]);
delay (waitbyte); }
}
if (pid==2){
for (int i = 0; i < length6; i++) {
mySerial.write(messageRPM[i]);
delay (waitbyte); }
}
if (pid==3){
for (int i = 0; i < length6; i++) {
mySerial.write(messageLoad[i]);
delay (waitbyte); }
}
if (pid==4){
for (int i = 0; i < length6; i++) {
mySerial.write(messageAirTemp[i]);
delay (waitbyte); }
}
if (pid==5){
for (int i = 0; i < length6; i++) {
mySerial.write(messageSpeed[i]);
delay (waitbyte); }
}
if (pid==6){
for (int i = 0; i < length6; i++) {
mySerial.write(messageMAP[i]);
delay (waitbyte); }
}
if (pid==7){
for (int i = 0; i < length6; i++) {
mySerial.write(messageAcceler[i]);
delay (waitbyte); }
}
if (pid==8){
for (int i = 0; i < length6; i++) {
mySerial.write(messageMAF[i]);
delay (waitbyte); }
}
pid++; if (pid>8) {pid = 1; }
}
void present() {
for (int i = 0; i < length5; i++) {
mySerial.write(messagePresent[i]);
delay (waitbyte); }
}
/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных из конкретных ответо, конкретные байты
void receive () {
if (mySerial.available()) {
delay(51);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 12) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
for (int i = 0; i < 12; i++) {
}
if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F) {Init=1;
timerenabledInit=0;
}
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x05) {Temp = MessageRx[8]-40;
timerenabledPID=0; }
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0C) {rpm = ((MessageRx[8]*256) + MessageRx[9]) / 4;
timerenabledPID=0; }
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x04){ load = MessageRx[8]*100/255;
timerenabledPID=0; }
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0F) {tempair = MessageRx[8]-40;
timerenabledPID=0; }
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0D){ Speed = MessageRx[8];
timerenabledPID=0; }
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0B){ MAP = MessageRx[8];
timerenabledPID=0; }
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x11) {gaz = MessageRx[8]*100/255;
timerenabledPID=0; }
if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x10) { MAF = ((MessageRx[8]*256) + MessageRx[9]) / 100;
timerenabledPID=0; }
for (int i = 0; i < 12; i++) MessageRx[i]=0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отправка запроса на диагностическое соединение
void initialization() {
for (int i = 0; i < length5; i++) {
mySerial.write(messageInit[i]);
delay (5);
}
delay (55);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//стартовая инициализация
void fastinit() {
digitalWrite (TX, HIGH); // makes K-line high 3
delay(360); // wait for K-line to be clear 3
digitalWrite (TX, LOW); // makes K-line low 3
delay(25);
digitalWrite (TX, HIGH); // makes K-line high 3
delay(25); //last delay before first message
mySerial.begin(10400); // baud rate of the OBD
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
//прорисовка координат тач кнопок
void Menu () {
//Page 0 (home)
if (currentPage == '0') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
drawFrame(10, 275, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
drawFrame(180, 275, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
drawFrame(350, 275, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
//Page 1
if (currentPage == '1') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
drawFrame(180, 275, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
drawFrame(350, 275, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//---------------------------------------------------------------------------------------------------
//Page 2
if (currentPage == '2') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
drawFrame(10, 275, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
drawFrame(350, 275, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------
//Page 3
if (currentPage == '3') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
//Button ERASE
//if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
//drawFrame(180, 275, 300, 310);
//currentPage = '3'; //потом заменить на дейсвие
//myGLCD.clrScr();
//drawscreen_three(); //потом заменить на дейсвие
//}
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
}
}
}
//--------------------------------------------------------
//прописывает заголовки на всех страницах
void drawHomeScreen() {
line() ;
vista();
myGLCD.drawLine(239,35,239,248); // линия вертикальная
myGLCD.print("Ltr/Hor:", 10, 40);
myGLCD.print("Ltr/100:", 10, 75);
myGLCD.print("Ult Km:", 10, 110);
myGLCD.print("Ult Ltr:", 10, 145);
myGLCD.print("Fuel Km:", 10, 180);
myGLCD.print("Eng RPM:", 10, 215);
myGLCD.print("Engin C:", 255, 40);
myGLCD.print("Oil C:", 255, 75);
myGLCD.print("Exter C:", 255, 110);
myGLCD.print("Inter C:", 255, 145);
myGLCD.print("Fuel C:", 255, 180);
myGLCD.print("Load %:", 255, 215);
buttonHome() ;
buttonINF1() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_one() {
line() ;
vista();
myGLCD.print("Start of Delivery C:", 10, 40);
myGLCD.print("Desir inject Start C:", 10, 75);
myGLCD.print("Actua Inject Start C:", 10, 110);
myGLCD.print("Desir Inject Quan mg:", 10, 145);
myGLCD.print("Actu Inject Quant mg:", 10, 180);
myGLCD.print("Mass Air Flow mg:", 10, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
vista();
myGLCD.print("EGR Pulse Ratio :", 10, 40);
myGLCD.print("Boost Pressure :", 10, 75);
myGLCD.print("Fuel Valve :", 10, 110);
myGLCD.print("Pump Speed :", 10, 145);
myGLCD.print("Glow Time :", 10, 180);
myGLCD.print("A/C Pressure :", 10, 215);
buttonHome() ;
buttonINF1() ;
buttonCHECK() ;
}
//----------------------------------------------------------------------------
void drawscreen_three() {
vista();
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
buttonHome();
//Button - ERASE
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (180, 275, 300, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (180, 275, 300, 310);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0,0,0);
myGLCD.print("ERASE", 200, 285);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//координаты тача
void drawFrame(int x1, int y1, int x2, int y2) {
myGLCD.setColor(255, 0, 0);
myGLCD.drawRoundRect (x1, y1, x2, y2);
while (myTouch.dataAvailable())
myTouch.read();
myGLCD.setColor(255, 255, 255);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//прорисовка кнопок
void buttonHome() {
myGLCD.setColor(0,0,0); // цвет кнопки -серый
myGLCD.fillRoundRect (1, 1, 65, 33); // расположение кнопки прямоугольника
myGLCD.setColor(0, 255, 0); // цвет текста оранжево-красный
myGLCD.drawRoundRect (1, 1, 65, 33); // кнопка будет рамкой
myGLCD.setFont(BigFont); // размер шрифта
myGLCD.setBackColor(0,0,0); // цвет фона области где будет надпись и кнопки
myGLCD.print("HOME", 1, 10); // центровка строки
}
void buttonINF1() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (10, 275, 120, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (10, 275, 120, 310);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0,0,0);
myGLCD.print("INF 1", 25, 285);
}
void buttonINF2() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (180, 275, 300, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (180, 275, 300, 310);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0,0,0);
myGLCD.print("INF 2", 200, 285);
}
void buttonCHECK() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (350, 275, 470, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (350, 275, 470, 310);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0,0,0);
myGLCD.print("CHECK", 375, 285);
}
////////////////////////////////////////////////////////////////////////////////////////
//прорисовка линий
void line() {
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,73,479,73); // линия горизонтальная
myGLCD.drawLine(1,108,479,108); // линия горизонтальная
myGLCD.drawLine(1,143,479,143); // линия горизонтальная
myGLCD.drawLine(1,178,479,178); // линия горизонтальная
myGLCD.drawLine(1,212,479,212); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
}
////////////////////////////////////////////////////////////////////////////////////////////
//отображение щрифта
void vista(){
myGLCD.setFont(GroteskBold16x32);
myGLCD.setColor(255, 0, 0);
myGLCD.setBackColor(0,0,0);
}
/////////////////////////////////////////////////////////////////////////////////////////////
//верхняя часть экрана часы и дата отображается на всех экранах
void Watch_Temperature (){
DateTime now = rtc.now();
int m = now.minute();
int hour = now.hour();
int mon = now.month();
int date = now.day();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.setFont(GroteskBold16x32);
if (date<10) {
myGLCD.print("0", 85, 0);
myGLCD.printNumI(now.day(), 100, 0); }
else if (date >=10) {
myGLCD.printNumI(now.day(), 85, 0); }
myGLCD.print("/", 115, 0);
if ( mon<10) {
myGLCD.print("0", 130, 0);
myGLCD.printNumI(now.month(), 145, 0);}
else if (mon >=10) {
myGLCD.printNumI(now.month(), 130, 0);}
myGLCD.print("/", 160, 0);
myGLCD.printNumI(now.year(), 175, 0);
myGLCD.setColor(255, 255, 255);
if (hour<10) {
myGLCD.print("0",255, 0);
myGLCD.printNumI(now.hour(), 270, 0); }
else if(hour>=10){
myGLCD.printNumI(now.hour(), 255, 0); }
if (m<10) {
myGLCD.print("0",300, 0);
myGLCD.printNumI(now.minute(), 315, 0); }
else if (m>=10){
myGLCD.printNumI(now.minute(), 300, 0); }
h = dht.readHumidity();
t = dht.readTemperature();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
sensors.requestTemperatures();
}
лови http://dropmefiles.com/1Lv89
так попробуй, скачал библыно они конфликтуют с другими моими библами, не компилится, попробуй ты
кнопи реагируют супер, точки мегают супер, rpm engine load отображают ноли(я же не подключен к машине). единственное при переходе на другую страницу часы время и температура прописовывается через 5 секунд и в это время все данные в таблице имеет маленькие цифры, когда прорисовалась верхняя часть часы время и температура в таблиц все становится нормального размера. блин ништяк. и чуток щас сдвину цифры в таблице в право
хех круто че, ща поправлю немного
щас я поставлю правельные координаты и ты будешь знать точно
вот подправил те что уже есть
myGLCD.print("Ltr/Hor:", 10, 40);
// myGLCD.print("Ltr/100:", 10, 75);
// myGLCD.print("Ult Km:", 10, 110);
// myGLCD.print("Ult Ltr:", 10, 145);
// myGLCD.print("Fuel Km:", 10, 180);
myGLCD.printNumI(rpm, 150, 215);
myGLCD.printNumI(Temp, 395, 40);
// myGLCD.print("Oil C:", 255, 75);
// myGLCD.print("Exter C:", 255, 110);
myGLCD.printNumI(t, 395, 145);
// myGLCD.print("Fuel C:", 255, 180);
myGLCD.printNumI(load, 395, 215);
теперь прорисовка перха не через 5 секунд а через 7 секунд. и все так же пока не прорисует верх цифры в таблице маленькие
и там на 150 myGLCD.printNumI(rpm, 150, 215);
мне как раз такой же дисплей подойдет для одно проекта. Разбили на форде родной дисплей щитка приборов. Фиг где отдельно купишь, только панель - дорогая она, а этот по размерам вроде подходит. А на штатном дисплей информации то было, надпись форд, время и положение селектора АКПП и всё. А тут можно красиво все сделать
ага. факт
хочу тебе скадать что это происходит только при первом запуске потом при переключениях все норм и размер и прорисовка
ну вот так с размером должно быть гуд сразу а с прорисовкой хз
ну всё я спать, завтра попробуй с авто. Как часть скетча обд работает, отпишись
ок. завтра отпишусь О ВЕЛИКИЙ ИЗ ВЕЛИКИХ. спасибо за очередную магию
неа. все запортачилось. точи мигают не правильно и меняют размер свой но только на пером экране, цифры в таблице остаются маленькими. испытаю завтра предедущий. спокойной ночи
Я тут спецификацию автоваза читаю для KWP2000 и там написано
это значит что адрес мозгов моей тачки не 10 а 10h?
Еще написано Контроллер Motronic M1.5.4 поддерживает только “быструю” инициализацию. у меня как раз такой
да быстрая единственное быстрая или быстаря 5 боуд
январи и bosch, последний как раз и есть Motronic
с твоими мозгами ты свою быстро раскусиш и еще и стаким опытом как сдесь
Ты наверно меня с MaksVV спутал))) я пока еще не совсем все понимаю.
блин. прости думал что с ним продолжаю. щас раскурю что ты до этого сказал
в запросах не дается такой адрес 10h . прослушка линии тебе же показала четко что твой адрес запроса это 10. а что иниты не пошли ни один ни другой? обрати внимание что в доке и F1h но задается как F1
сегодня не получилось на практике попробовать, сижу пока теорию курю
нет твой это 10. 10h он распечатет так в какомто порт тесте программе. но это 10 и F1 и никак иначе
вопрос в том, как узнать оборвалась ли сессия, то бишь открыта она в данный момент времени или закрыта
Функция startCommunication.
Данная функция инициализирует процесс обмена данными между диагностическим тестером и контроллером. На запрос startCommunication не может быть получен отрицательный ответ. В случае успешного завершения, сеанс обмена данными всегда заканчивается функцией stopCommunication.
Не поможет эта инфа?
это понятно . мы чуток о другом говорили. например мой блок через 10 секунд закрывает сесию если не шлеш запросы и присутсвие. когда я влючал комуникацию получал положительный ответ а потом перезагружал сериал, то ответыов небыло так как ебу еще был в ссесии, нужно было бы закрыть ссесию stopCommunication и снова дать инит и он бы сразу подхватилбы , не зависимо через какой период секунд или минут. мы говорили если вдруг ссесия оборвется по какимто причинам во время работы, то вернутся автоматом на инит
В общем незнаю надо или нет здесь это, но пожалуй оставлю http://chiptuner.ru/download/docs/kwp2000r.zip
сенкс. комуто пригодится. я имею .
Подозреваю что 10h или там F1h. h это значит понимать число в НЕХ
смотри в проге кажется называется comtest все данные выводит в сериал через h. хотя у меня в скетче все без h. я не спец но подозреваю что это как разделитель символов, ну и возможно что как определение HEX байта. например у меня в скетче прописано вывадить в сериал 8111F18104,а в comtest он выводит как 81h11hF1h81h04h. тоесть хочу сказать не зацикливайся на h.
скоро пойду инициализацию попробую сделать
Так MaksVV, отчитываюсь. все работает. но...... первая поблема обновляются данные с торможением гдето в 2 секунды, иногда как в 4 секунды но это возможно потому что он поймал два раза одинаковое значение и по этому кажется что задержка в 4 секунды. вторая проблема при старте например обороты 800 об/м, потом даю газу и показывает например 1238 об/м , убираю ногу с газа и происходит такое показвывает 8008 об/м, тоесть последнаяя цифра 8 не исчезает а продолжает висесть пока не поменяется на другую если дам гаду. тоесть не происходит очистка данных. Вот как то так. Но уже приятный ништяк. вот фотка, солнце лупило видно не очень, просто хотел чтобы ты видел на фото холостые обороты , цифра 5 осталась после последней подгазовки.
вот скетч с которым нужно работать. в остальных то лажа с точками мигание, то с размером данных в таблице. да и я решил проблему первичной загрузки с маленькими цифрами и через 7 секунд с прорисовкой верхней части часов и температруры, прописал в сетуп Watch_Temperature (); и все чики, прогружается сразу и верх и размер шрифта данных. вот скетч
Думаю нужно поставить очистку скрина после каждого проиденого цикла.
ок vsrgv. давай. ждемссссс. но я сейчас на работу. вечером спишемся.
взял скетч из 140 сообщения, пересчитал суммы и вот что получилось
так так у меня нет датчика во впускном коллекторе то и показывает нули, а что означают первый три F в начале ответа буду сейчас искать.
И инетересен еще вопрос, при прослушке К линии на запрос параметров 82 10 F1 21 01 A5 выдавался ответ
что значат эти данные? 1 8 35 1 4 0 0 0 0 75 13 0 0 0 78 78 80 2 0 87 0 0 0 0 0 0 0 0 0 FF FF 0 0
FF FF FF В начале это лишние байты. Так как массив у нас прописан на 12 байт а ответ мы получаем только 5 - 6 байт то он и подставляет пустые байты. По поводу эпоса 21 01 он выдаёт кучу байт в которых тоже закрыты ответы, каждый байт отвечает за определённую вещь. Например обычно по 10 адресу, если считать от 61 ( это будет первый байт) то одиннадцатый байт отвечает за температуру. Пересчитай его в DEC и отнеми 40, получишь температуру. И так далее. Проблема узнать за что отвечает каждый байт. У меня 11 байт не совпадает с температурой. Если у тебя совпало то ищи в нете расшифровку ответа на 21 01. А потом можно каждый байт выдергивать, перечитывать по формуле и выводить в сериал. Где то так. Если в ответе есть 7F значит не потдерживается.
Искал,пока ничего вразумительного не увидел
Что конкретно?
После 61 у тебя 11 байт это 75. 75=117(DEC)-40=77град. Если у тебя такая температура то гуд. Ищи расшифровку на запрос 21 00. Когда будешь знать расшифровку то можно выводить нужные пересчитаные байты в сериал
Скорее всего 11 байт это и есть температура, пока недолго искал про расшифровку ответа
Ищи расшифровки где 11 байт отвечает за температуру. Мне попадались много форумов с расшифровка, именно на 11 байт. Но так как у меня не совпало, другая специфика ебу, то я и не запоминал эти форумы. Ищи. Легче из одного ответа ловить все чем из кучи разное.
Понял,дома буду поищу, на ходу не очень получается)
В поиске забей типа: 11 байт это температура. И рыскай по этим сайтам.
вторая проблема при старте например обороты 800 об/м, потом даю газу и показывает например 1238 об/м , убираю ногу с газа и происходит такое показвывает 8008 об/м, тоесть последнаяя цифра 8 не исчезает а продолжает висесть пока не поменяется на другую если дам газу. тоесть не происходит очистка данных.
это проблема была мне известна, ждал пока ты спросишь. Нужно делать проверку после напечатки каждого параметра. Например:
печатаем параметр далее:
if (rpm<10) {напечатать три пробела};
if (rpm>=10 && rpm<100) {напечатать два пробела};
if (rpm>=100 && rpm<1000) {напечатать один пробел};
так пробелы будут задирать предыдущие данные. А если обновлять (стирать все данные с экрана?) каждый раз возможно будет мерцать, хотя попробуй и с обновлением экрана, я просто с таким LCD не работал
а по первой проблеме, в сериале то быстро обновляет?
.
при вет. попробовал встунть в лупе myGLCD.clrScr(); происходит страшная дрянь. по первой проблеме, думаю нужно очиситить от всех Serial скетч и искать лишние задержки. щас вычещу лишнее потом проверю и буду делать выводы. еще одно эту функцию можно сделать для всех отображаемых параметров?
if (rpm<10) {напечатать три пробела};
if (rpm>=10 && rpm<100) {напечатать два пробела};
if (rpm>=100 && rpm<1000) {напечатать один пробел};
чтобы не возникло подобного с другими пидами
продолжаю вычистил весь скетч от сериалаов и всего лишнего. заменил в верху влажность и температуру на скорость км/ч. похоже после очистки обновляется быстрее, думаю надо смотреть все задержки и пробовать их минимализировать. функцию которую ты MaksVV предложил нужно делать для всех параметров общаком, так как с Load % происходит тоже самое при нагрузке 1% вторая цифра остается до изменения. да в сериале быстро изменяется , но там нет столько функци и циклов как с экраном. буду смотреть задержки.
мозг плывет уже, никак не могу найти расшифровку ответа, только про температуру и написано везде
наткнулся на статью на драйве, человек расшифровал параметры ответа
протоколы вроде совпвдают, завтра возьму у приятеля ELM и попробую произвести тоже самое. Надеюсь получится... хотя прога посылает запрос на связь с мозгом на адрес 11....
да я читал про это . потом тоже хочу попробовать таким образом свои ответы разкодить на запрос 21 01. если поймешь как и получится, обьясниш мне.
теперь MaksVV поигрался с задержками. уменьшил задержку ожидания правильного ответа на пиды до 60 м/с надо будет попробовать на 51 м/с, задержку на ответ инита до 500 м/с, значит нашел такой прикол вот здесь
void receive () {
if (mySerial.available()) {
delay(100);
уменьшил задержку до 51 м/с. на 50 м/с глюки. теперь почти каждую секунду обновляется. пока все, шуршу дальше вот переделаный скетч