В vspd просто наживаешь справа Add pair для добавления 2 виртуальных ком портов, советуют брать полсе com10, прогу не закрываешь.
Запускаешь KWP и указываешь один из портов которые добавил, я еще галочку echo ставил, без нее не работает, жмешь start. Запускаешь програму для диагностики и ставишь в настройках другой порт. И пробуешь подключиться как бы к эбу.
В описании к KWP написано:"Вышла финальная версия программы эмуляции диагностического протокола ЭБУ Январь 5/7 - KWPTest".
У меня эбу bosch m1.5.4, хз возможно они взаимозамеяемы и этот эмулятор только для тазов, да и что это за диагностический протокол ЭБУ Январь 5/7 ? В моем понимании диагностическим протоколом к примеру можно назвать KWP2000 или OBD, а не как не название самих мозгов.
предлагаю сделать задержки, такие же как в при сниффе. Т.е. там задержка внутри сообщения ident_2 : 114 мс, в районе байта как раз где надпись "BD". Ну и дальше там ещё задержка одна. Вот скетч твой с этими задержками
короче пришли две микрухи. L9637D Собрал два адаптера, один USB-K_Line Второй : Arduino-K_Line
вот по этим схемам
Соединил к-лайны, подал на пины "+12V" питание от адаптера 12В, соединил все массы. Скачалал программу опком для адаптера KKL, короче нифига не заработало. Прога опком вроде как видит адаптер. А вот в мониторе ардуины ни одит байт не приходит. хз может ошибки в подключении где-то, надо адаптер на ВАЗе опробовать.
Пнятно, но я и прогой вазовской попробовал - тоже не идут байты в ардуино. Видать в ардуинском адаптере косяк. Т.к. опком и вазгаз сканер видят адаптер, значит усб л9637д работает
1. прогу что ты скачал для опкома она либо для своего гаджета либо для порта com1 компа, нужна схема на мах232 из моего поста 1, адаптер нометр 1.
2. USB TTL тебе нужна схема типа этой, где присутсвует чип конвертирующий в usb порт
3. да, Пин 10 это rx адаптера. 11 это тх адаптера.
4. твоя схема чуток отличается от моей из 8-го поста, попробуй собрать по моей схеме.
примерно так, так же продолжаю работать над нашим скетчем по стандартным пидам. чуток позже выложу результаты и скетч, наши труды не бросаю. щас попробую с задержками последний скетч из поста 315.
Скетч из поста 315 выдает это
avrdude: stk500v2_getsync(): can't communicate with device: resp=0x01
попробовал засунуть это задержки в другие скетчи
if (i==31) delay (113);
if (i==92) delay (113);
Не помогает.
это номер байта в ответет или конкретный байт 0x31 0x92, туплю уже наверно. Надо идти спать.....
Это номер байта в сообщении. Переведи все байты в ASCII в нех редакторе ( например НхD) и поймешь что и где в сообщении. А эту ошибку опком пишет или компилятор ардуины?
компилятор пишет ошибку, попробовал с версией 1.8, мои скетчи почти все выдаеют в компиляторе ошибки. в 1.0.3 все компилятся. кроме последнего твоего о котором я говорил выше.
странно у меня всё компилируется. Я же только добавил эти две строки с delay. Попробуй их закоментировать , будет ли удачная компиляция? Может так прокатит:
этот скомпилися на 1.8. но в программе опкома все таже шняга, срезает что не влазиет в строчку и пихает в другое место. обрати внимание там где заголовок коротки влезает все значение , а где заголовок длинный, что влезает хорошо а что нет срезает. сделал эксеперимент я добавил пробел перед (тут)24417169 было так
vehicleManufacturerECUHardwareNumber: 24417169
systemSupplierECUHardwareNumber: PDBOS 0105
стало
vehicleManufacturerECUHardwareNumber 2441716
systemSupplierECUHardwareNumber: 9PDBOS 010
он сместил вниз 9-ку и снез в другое место 5-ку.
а если убираю два байта цифры 69 то становится так
vehicleManufacturerECUHardwareNumber: 244171PD //PD смещается на верх вместо 69
systemSupplierECUHardwareNumber: BOS 010505 // в эту срочку подымется второе 05 и становится правильно
вот как он видит мой скетч где я подправил байты данных ебу, за слешами как должно быть
это только завтра смогу проверить, ооооочень сомневаюс. гдето косяк в том что, чтото задает длинну строки заголовк+дата. завтра попробую, идеи уже кончились у меня. на счет нашего скетч с стандартными пидами...... вынес на первый экран все пиды что есть, задал затирание цифр, все работает, но..... наблюдаю две проблемы. первая это мерцание затираемых цифр хотел в сетуп закинуть, не канает и второе не достаточно быстрое обновление данных, в скетче поставил сначало затирание а потом пид, если на оборот то пустоту больше времени видно чем цифры. может завтоа в ютюб выкину чтобы ты в живую увидел. вот скетч, может че увидишь.
#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 Acceler = 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 ();
///////if (rpm) {myGLCD.print(" ", 150, 215); delay (1000);};
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);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (--<10) {myGLCD.print(" ", 166, 40); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру
//myGLCD.printNumI(--, 150, 40);
//if (--<10) {myGLCD.print(" ", 166, 75); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
//myGLCD.printNumI(--, 150, 75);
myGLCD.printNumI(h, 150, 110);
if (Acceler<10) {myGLCD.print(" ", 166, 145); }; //затираем вторую цифру и третью
if (Acceler>10) {myGLCD.print(" ", 182, 145); }; //затирает третюю цифру
myGLCD.printNumI(Acceler, 150, 145);
if (MAF<10) {myGLCD.print(" ", 166, 180); }; //затираем вторую цифру и третью
if (MAF>10) {myGLCD.print(" ", 182, 180); }; //затирает третюю цифру
myGLCD.printNumI(MAF, 150, 180);
if (rpm>100) {myGLCD.print(" ", 198, 215);}; //затираем четвертую цифру
myGLCD.printNumI(rpm, 150, 215);
//-------------------------------------------
if (Temp<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
if (Temp>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumI(Temp, 395, 40);
if (tempair<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
if (tempair>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumI(tempair, 395, 75);
myGLCD.printNumI(sensors.getTempCByIndex(0), 395, 110);
myGLCD.printNumI(t, 395, 145);
if (MAP<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
if (MAP>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumI(MAP, 395, 180);
if (load<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
if (load>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumI(load, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '1') {if (curWatch - prevWatch > 200){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//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.printNumI(tempair, 360, 215);
//if (tempair>10) {myGLCD.print(" ", 376, 215); };
//if (tempair<10) {myGLCD.print(" ", 392, 215); };
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '2') {
if (curWatch - prevWatch > 200){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//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);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '3') {if (curWatch - prevWatch > 200){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
prevData = curData;
}
}
}
///////////////////////////////////////////////////////////////////////////
//отправка запросов пидов
void PIDs() {
if (pid==1){
for (int i = 0; i < length6; i++) {
mySerial.write(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) {Acceler = 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("Humed %:", 10, 110);
myGLCD.print("Accel %:", 10, 145);
myGLCD.print("MAF g/s:", 10, 180);
myGLCD.print("Eng RPM:", 10, 215);
myGLCD.print("Engin C:", 255, 40);
myGLCD.print("AirTemC:", 255, 75);
myGLCD.print("Exter C:", 255, 110);
myGLCD.print("Inter C:", 255, 145);
myGLCD.print("MAP %:", 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();
}
опком почему-то воспринимает аппаратный номер ЭБУ в 5 символов, а надо 8 символов - на 3 меньше (кстати байты 68 и 6B как раз на 3 отличаются, может поможет всё таки?) Ну давай по балабасу, сделаем аппаратный номер 5 символьным, можем опкому пофиг на это, зато всё остальное будет правильно показывать. Примерно так:
я делал по балабасу , он и другие чатси не правильно определяет . например здесь systemSupplierECUHardwareVersionNumber: 30 //255 только два символа а должно быть три. здесь systemSupplierECUSoftwareVersionNumber: 3430 //6 должен одни а определяет четыре т.д но если как ты думаешь что может первое сообщение определяет размеры..... то завтра выясним
не, 255 это он из НЕХ переводит, тобишь это один байт всего и на это место должен FF попасть, он как раз там рядом. и 6 тоже скорее всего это байт, он тоже рядом причём там рядом как раз два байта 00 и 06, что и будет 6
Короче первое сообщение только неправильно он видит, а дальше просто всё сдвигается, если первое исправить, остальное должно тоже выправиться
чета както не додумал, действительно FF это 255. а на счет 6 понятно что это 1 байт, не понятно почему он на местн где должна быть одна цифра , вписывает четыре, как и где должно быть три цифры(255) а вписывает только две (30). чтото должно определять длинну дванных в каждой строке, буду надеятся что твоя идея проканает.
стоп, подожи, он же переводит байты в текст а не DEC, в DEC FF будет 255, по этому он FF в ASCII как "ÿ", в проге он же выдает в ASCII . или я чета не догоняю?
вписывает четыре потому что там опрос двух байт. А надо чтоб стояли байты 00 06 и тогда будет "6". Точно также и с 255 он переводит из HEX в DEC, если бы стояло FF он написал бы 255, а там сдвинулось и показывает байт который соотвествует 30
капризный однака попался. завтра попробую. когда будет желание просмотришь свежим глазом скетч из поста 336. а то я уже от него устал и возможно не все вижу
короче первое ID1 сообщение совсем не просто так, оно как раз похоже распределяет сколько байт считывать в каждой строке идентификаторов и устанавливает считывать ли их байтами или ASCII. Я перевел байты сообщения ID1 в DEC вот что получилось
курсив это байты, что запрос принят. Жирным номера строчек идентификаторов. Далее после номера, например если "107" то это понимать семь байт + ещё четыре байта в ASCII (зачем-то еще четыре, непонятно почему, но так оно есть, хотя понял, вон какая-то четверка после курсива стоит, наверное это оно), а если например "02" то понимать два байта напрямую без ASCII, 3 это разделитель просто походу
Вот взять например строку 153 это дата. она в сообщении ID2 представлена напрямую байтами. т.е. 20 07 07 25
и в сообщении ID1 указано 153 68 3, т.е. 68 это без единички в начале значит понимает напрямую байтами без ASCII, а 68 это 4 в DEC то есть надо понимать 4 байта напрямую, что и есть 20 07 07 25 )))))
Утром у меня была мысль что оно отвечает за распределение данных. И когда ты говоришь ох должно получится, обычно получается. Надо пересмотреть и перекроить все сообщение.
Не, твой блок должен поддерживаться програмой диагностики которой ты подключишься к KWPTest
ну ка распиши, попробую пока MaksVV не глянет мои последние исследование.
щас проверю кое что и отпишусь
надо поставить vspd и скачать kwptest.zip и найти несколько программ для диагностики твоего эбу, для твоей машины в общем.
В vspd просто наживаешь справа Add pair для добавления 2 виртуальных ком портов, советуют брать полсе com10, прогу не закрываешь.
Запускаешь KWP и указываешь один из портов которые добавил, я еще галочку echo ставил, без нее не работает, жмешь start. Запускаешь програму для диагностики и ставишь в настройках другой порт. И пробуешь подключиться как бы к эбу.
уже все скачал иду пробовать.
какой движок у тебя, и какие програмы диагностики скачал,я у себя попробую.
пока эти для пробы https://vagcom.com.ua/programmy/programmy-dlya-diagnostiki-opel/
Дизел 2.0 (Y20DTH) 2001
вот куча прог , седьмая для тебя, для себя пока ничего не нашел http://avtodevice.narod.ru/programm.htm
я правильно понял? нужно создать файл protocol,txt засунуть в него все ответы и запросы и кинуть в папку kwptest так? а потом подобрать программу.
Нет, в KWP есть кнопка reverse, если нажать выходит окно в котором можно вводить заголовок запроса и ответа, длинну ответа и даные ответа.
скрин
Половина програм то ли глючные, то ли вообще не рабочие, просто падают с ошибкой и все,некоторые не совместимы 64 разрядной виндой
В описании к KWP написано:"Вышла финальная версия программы эмуляции диагностического протокола ЭБУ Январь 5/7 - KWPTest".
У меня эбу bosch m1.5.4, хз возможно они взаимозамеяемы и этот эмулятор только для тазов, да и что это за диагностический протокол ЭБУ Январь 5/7 ? В моем понимании диагностическим протоколом к примеру можно назвать KWP2000 или OBD, а не как не название самих мозгов.
согласен, бред. похоже тлько для тазов, выставлял в Reverse ставлю свой адрес 11 а он зараза пересчитывает и шлет 10 адрес
8110F18103 -> 83F110C16B8F3F
Буду ждать ВЕЛИКОГО ИЗ ВЕЛИКИХ, что он скажет на счет моих последних доводов и экспериментов
предлагаю сделать задержки, такие же как в при сниффе. Т.е. там задержка внутри сообщения ident_2 : 114 мс, в районе байта как раз где надпись "BD". Ну и дальше там ещё задержка одна. Вот скетч твой с этими задержками
Рад тебя слышать, иду с детьми в парк, позже попробую и отпишусь. я тоже думал об этих задержках
короче пришли две микрухи. L9637D Собрал два адаптера, один USB-K_Line Второй : Arduino-K_Line
вот по этим схемам
Соединил к-лайны, подал на пины "+12V" питание от адаптера 12В, соединил все массы. Скачалал программу опком для адаптера KKL, короче нифига не заработало. Прога опком вроде как видит адаптер. А вот в мониторе ардуины ни одит байт не приходит. хз может ошибки в подключении где-то, надо адаптер на ВАЗе опробовать.
Опком видео только свои гаджет. Адаптер к-лине нет. Проверено мной.
вопрос в адаптере ардуино K-line Rx цепляем к RX, а Tx к Tx? ну и в USB - K-line думаю также Rx цепляем к RX, а Tx к Tx?
ну я который скачал - видит адаптер, там в настройках можно выбрать - K-line либо свой гаджет
качал отсюда https://www.drive2.ru/l/5209582/ там в середине текста ссылка на опком
Пин 10 это rx адаптера. 11 это тх адаптера. Если не ошибаюсь. Дом гляну потом.
На мобиле не вижу файлы. Но похоже что он.
это понятно просто чаще подключается крест на крест то есть Rx к Tx, а здесь вроде как надо Rx к Rx
Здесь как мы в скетче определим output input. Это если цеплять на сериал 0, сериал 1 и т.д, то это важно.
а какой адаптер для опкома ты используешь?
Я купил опком чина, его и использую. Извени, не поставил в известность. Что использую опком для сниффера. А для проэкта ардуино к -линие. Мои косяк.
Пнятно, но я и прогой вазовской попробовал - тоже не идут байты в ардуино. Видать в ардуинском адаптере косяк. Т.к. опком и вазгаз сканер видят адаптер, значит усб л9637д работает
Дома гляну, что у меня и куда. И скажу.
MaksVV
1. прогу что ты скачал для опкома она либо для своего гаджета либо для порта com1 компа, нужна схема на мах232 из моего поста 1, адаптер нометр 1.
2. USB TTL тебе нужна схема типа этой, где присутсвует чип конвертирующий в usb порт
3. да, Пин 10 это rx адаптера. 11 это тх адаптера.
4. твоя схема чуток отличается от моей из 8-го поста, попробуй собрать по моей схеме.
примерно так, так же продолжаю работать над нашим скетчем по стандартным пидам. чуток позже выложу результаты и скетч, наши труды не бросаю. щас попробую с задержками последний скетч из поста 315.
Скетч из поста 315 выдает это
avrdude: stk500v2_getsync(): can't communicate with device: resp=0x01
попробовал засунуть это задержки в другие скетчи
if (i==31) delay (113);
if (i==92) delay (113);
Не помогает.
это номер байта в ответет или конкретный байт 0x31 0x92, туплю уже наверно. Надо идти спать.....
Это номер байта в сообщении. Переведи все байты в ASCII в нех редакторе ( например НхD) и поймешь что и где в сообщении. А эту ошибку опком пишет или компилятор ардуины?
компилятор пишет ошибку, попробовал с версией 1.8, мои скетчи почти все выдаеют в компиляторе ошибки. в 1.0.3 все компилятся. кроме последнего твоего о котором я говорил выше.
странно у меня всё компилируется. Я же только добавил эти две строки с delay. Попробуй их закоментировать , будет ли удачная компиляция? Может так прокатит:
этот скомпилися на 1.8. но в программе опкома все таже шняга, срезает что не влазиет в строчку и пихает в другое место. обрати внимание там где заголовок коротки влезает все значение , а где заголовок длинный, что влезает хорошо а что нет срезает. сделал эксеперимент я добавил пробел перед (тут)24417169 было так
вот как он видит мой скетч где я подправил байты данных ебу, за слешами как должно быть
все, блин, крыша едет полностью. застопорился.
короче есть ошибка одного байта №11 в сообщении ID1 - ответ на 1А81. Там ты поставил 68 а надо 6B. Может в этом косяк
вот скетч
это только завтра смогу проверить, ооооочень сомневаюс. гдето косяк в том что, чтото задает длинну строки заголовк+дата. завтра попробую, идеи уже кончились у меня. на счет нашего скетч с стандартными пидами...... вынес на первый экран все пиды что есть, задал затирание цифр, все работает, но..... наблюдаю две проблемы. первая это мерцание затираемых цифр хотел в сетуп закинуть, не канает и второе не достаточно быстрое обновление данных, в скетче поставил сначало затирание а потом пид, если на оборот то пустоту больше времени видно чем цифры. может завтоа в ютюб выкину чтобы ты в живую увидел. вот скетч, может че увидишь.
опком почему-то воспринимает аппаратный номер ЭБУ в 5 символов, а надо 8 символов - на 3 меньше (кстати байты 68 и 6B как раз на 3 отличаются, может поможет всё таки?) Ну давай по балабасу, сделаем аппаратный номер 5 символьным, можем опкому пофиг на это, зато всё остальное будет правильно показывать. Примерно так:
иду с машины вытащу все. и щас попробую
нет, завтра. блок питания и зажими на работе оставил. завтра это проверю
я делал по балабасу , он и другие чатси не правильно определяет . например здесь systemSupplierECUHardwareVersionNumber: 30 //255 только два символа а должно быть три. здесь systemSupplierECUSoftwareVersionNumber: 3430 //6 должен одни а определяет четыре т.д но если как ты думаешь что может первое сообщение определяет размеры..... то завтра выясним
не, 255 это он из НЕХ переводит, тобишь это один байт всего и на это место должен FF попасть, он как раз там рядом. и 6 тоже скорее всего это байт, он тоже рядом причём там рядом как раз два байта 00 и 06, что и будет 6
Короче первое сообщение только неправильно он видит, а дальше просто всё сдвигается, если первое исправить, остальное должно тоже выправиться
чета както не додумал, действительно FF это 255. а на счет 6 понятно что это 1 байт, не понятно почему он на местн где должна быть одна цифра , вписывает четыре, как и где должно быть три цифры(255) а вписывает только две (30). чтото должно определять длинну дванных в каждой строке, буду надеятся что твоя идея проканает.
стоп, подожи, он же переводит байты в текст а не DEC, в DEC FF будет 255, по этому он FF в ASCII как "ÿ", в проге он же выдает в ASCII . или я чета не догоняю?
вписывает четыре потому что там опрос двух байт. А надо чтоб стояли байты 00 06 и тогда будет "6". Точно также и с 255 он переводит из HEX в DEC, если бы стояло FF он написал бы 255, а там сдвинулось и показывает байт который соотвествует 30
он не во всех параметрах ASCII использует
понял, завтра проверим, очень похоже на правду, да бы так было. весь мозг сьел себе.
так то да, вредный ссука опком попался
капризный однака попался. завтра попробую. когда будет желание просмотришь свежим глазом скетч из поста 336. а то я уже от него устал и возможно не все вижу
короче первое ID1 сообщение совсем не просто так, оно как раз похоже распределяет сколько байт считывать в каждой строке идентификаторов и устанавливает считывать ли их байтами или ASCII. Я перевел байты сообщения ID1 в DEC вот что получилось
курсив это байты, что запрос принят. Жирным номера строчек идентификаторов. Далее после номера, например если "107" то это понимать семь байт + ещё четыре байта в ASCII (зачем-то еще четыре, непонятно почему, но так оно есть, хотя понял, вон какая-то четверка после курсива стоит, наверное это оно), а если например "02" то понимать два байта напрямую без ASCII, 3 это разделитель просто походу
168 241 17 90 129 4 144 111 98 3 145 107 3 146 107 3 147 1 3 148 106 3 149 2 3 150 102 3 151 105 3 152 106 3 153 68 3 154 2 3 159 106 255 172
Вот взять например строку 153 это дата. она в сообщении ID2 представлена напрямую байтами. т.е. 20 07 07 25
и в сообщении ID1 указано 153 68 3, т.е. 68 это без единички в начале значит понимает напрямую байтами без ASCII, а 68 это 4 в DEC то есть надо понимать 4 байта напрямую, что и есть 20 07 07 25 )))))
Ох должно получиться....
Утром у меня была мысль что оно отвечает за распределение данных. И когда ты говоришь ох должно получится, обычно получается. Надо пересмотреть и перекроить все сообщение.