Тема: CITROEN-ARDUINO
Показать сообщение отдельно
Старый 07.10.2015, 12:28   #35
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Итак.
Добрался до машины, подключился и снял два лога.
Первый это лог с включённым зажиганием, а второй просто магнитола.

На готовых логах мне кто объяснит как прочитать сообщение на экране от магнитолы? В логе сверху написано что было на дисплее в этот момент.

Лог снят скетчем из сообщения 7 http://www.pccar.ru/showpost.php?p=332906&postcount=7
(первое число ID а далее сообщение)


autowp За табличку отдельное спасибо!

Ловите скетч который я правлю и пишу. Там всё передаётся в сериал порт и соответственно всё подписано.

Цитата:
#include <SPI.h>
#include "mcp_can.h"
MCP_CAN CAN(10);
unsigned char len = 0;
unsigned char buf[8];
INT32U canId = 0x000; // идентификаторы могут быть 11-ти или 29-битные
int incomingByte = 0;
int Y = 1;

//Все проверенные параметры
float Themperature = 0;
int RPM = 0;
int ARCFL = 0;
float Speed = 0;
float ILPK = 0;
int Odometr = 0;

//Кнопки на руле
char* SEERINGWHILEMESSAGE[] = {"All release","VOLUME DOWN","VOLUME UP","VOLUME MUTE","TRACK FORWARD"};
int SWK = 0;
int SWSV = 0;

//Кнопки на магнитоле
char* RADIOKEY[] = {"All release","MENU","MODE","DARK","ESC","UP","DOWN","L EFT","RIGHT"};
int RK = 0;

//Частота и бэнды
char* RADIOBAND[] = {"FM1","FM2","FM AST","AM"};
int RB = 0;
float RFR = 0;

//Магнитола ON/OFF
char* RADIOPOWER[] = {"OFF","ON"};
int RP = 0;

//Источник радио
char* RADIOSOURCE[] = {"Radio","CD","CD Changer"};
int RS = 0;

//Громкость
int VOL = 0;

void setup()
{
Serial.begin(115200);

START_INIT:

if(CAN_OK == CAN.begin(CAN_125KBPS,MCP_8MHz))
{
Serial.println("Init OK!");
}
else
{
Serial.println("Init fail");
delay(100);
goto START_INIT;
}
Serial.println("a = All mesage");
Serial.println("b = Speed");
Serial.println("c = RPM");
Serial.println("d = Instant fuel consumption /100Km");
Serial.println("e = Run on current fuel level");
Serial.println("f = Themperature");
Serial.println("g = Steering while Scroll value");
Serial.println("h = Steering while");
Serial.println("i = Radio key");
Serial.println("j = Radio ON/OFF");
Serial.println("k = Radio source");
Serial.println("l = Radio band and frequency");
Serial.println("m = Volume");
}


void loop()
{
if (Serial.available() > 0)
{incomingByte = Serial.read();}

if (incomingByte == 97)
{
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf);
canId = CAN.getCanId();
Serial.print("<");
Serial.print(canId);
Serial.print(",");
for(int i = 0; i<len; i++)
{
Serial.print(buf[i]);
Serial.print(",");
}
Serial.println(">");
}
}


else
{
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf);
canId = CAN.getCanId();

if(canId == 246) //0F6
{
Themperature = buf[6];
Themperature = (Themperature / 2) - 39.5;

Odometr = ((int)buf[2] * 256 | buf[3]);
Odometr = ((int)Odometr * 256 | buf[4]);

if (Odometr != Y)
{
Serial.print("Odometr: ");
Serial.print(Odometr);
Serial.print(" ");
Serial.print(buf[2]);
Serial.print(" ");
Serial.print(buf[3]);
Serial.print(" ");
Serial.println(buf[4]);
Y = Odometr;
}
}

//Обороты и скорость
if(canId == 182) //0B6
{
RPM = (int)buf[0] << 5 | buf[1] >> 3;
Speed = ((int)buf[2] << 8 | buf[3]);
Speed = Speed / 100;
}

//Километры на остатке топлива и моментальный расход
if(canId == 545) //221
{
ARCFL = (int)buf[3] << 8 | buf[4];
ILPK = ((int)buf[1] << 8 | buf[2]);
ILPK = ILPK / 10; // Если -1 то показаний нет

// Serial.print("Rest of run to finish: ");
// Serial.println((int)buf[5] << 8 | buf[6]);
}

//Кнопки на руле справа
if(canId == 543) //21F
{
SWSV = buf[1];
if(buf[0] == 0){SWK = 0;}
if(buf[0] == 4){SWK = 1;}
if(buf[0] == 8){SWK = 2;}
if(buf[0] == 12){SWK = 3;}
if(buf[0] == 128){SWK = 4;}
}

//Кнопки магнитолы
//последнии два байта какой-то мусор
//проподает при выключении магнитолы
if(canId == 997) //3E5
{
if(buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[5] == 0){RK = 0;}
if(buf[0] == 64){RK = 1;} //Menu 64
if(buf[1] == 16){RK = 2;} //Mode 16
if(buf[2] == 4){RK = 3;} //Dark 4
if(buf[2] == 16){RK = 4;} //Esc 16
if(buf[5] == 64){RK = 5;} //UP 64
if(buf[5] == 16){RK = 6;} //DOWN 16
if(buf[5] == 1){RK = 7;} //LEFT 1
if(buf[5] == 4){RK = 8;} //RIGHT 4
}

//Включено или нет радио, источник на радио
if(canId == 357) //165
{
if (buf[0] == 192){RP = 1;} else {RP = 0;}
if (buf[2] == 16){RS = 0;}
if (buf[2] == 32){RS = 1;}
if (buf[2] == 48){RS = 2;}
}

//Банды и частота радио
//первые 2 меняются иногда, последнии 3 незнамо что (мусор или уровень сигнала),
//частота и мусор не пропадают при отключении магнитолы
if(canId == 549) //225
{
if(buf[2] == 16){RB = 0; RFR = buf[3] * 256 + buf[4];RFR = RFR / 20 + 50;}//FM1
if(buf[2] == 32){RB = 1; RFR = buf[3] * 256 + buf[4];RFR = RFR / 20 + 50;}//FM2
if(buf[2] == 64){RB = 2; RFR = buf[3] * 256 + buf[4];RFR = RFR / 20 + 50;}//FM AST
if(buf[2] == 80){RB = 3; RFR = buf[3] * 256 + buf[4];} //AM
}

if(canId == 421) //1A5
{
VOL = buf[0];
}

//Выводим данные.
if (incomingByte == 98){;Serial.print("Speed: "); Serial.println(Speed);}
if (incomingByte == 99){Serial.print("RPM: "); Serial.println(RPM);}
if (incomingByte == 100){Serial.print("Instant fuel consumption /100Km: "); Serial.println(ILPK);}
if (incomingByte == 101){Serial.print("Run on current fuel level: "); Serial.println(ARCFL);}
if (incomingByte == 102){Serial.print("Themperature: "); Serial.println(Themperature);}
if (incomingByte == 103){Serial.print("Steering while Scroll value: "); Serial.println(SWSV);}
if (incomingByte == 104){Serial.print("Steering while: "); Serial.println(SEERINGWHILEMESSAGE[SWK]);}
if (incomingByte == 105){Serial.print("Radio key: "); Serial.println(RADIOKEY[RK]);}
if (incomingByte == 106){Serial.print("Radio ON/OFF: "); Serial.println(RADIOPOWER[RP]);}
if (incomingByte == 107){Serial.print("Radio source: "); Serial.println(RADIOSOURCE[RS]);}
if (incomingByte == 108){Serial.print("Radio band and frequency: "); Serial.print(RADIOBAND[RB]); Serial.print(" "); Serial.println(RFR);}
if (incomingByte == 109){Serial.print("Volume: "); Serial.println(VOL);}
}
}
}
Вложения
Тип файла: rar log.rar (4.7 Кб, 439 просмотров)

Последний раз редактировалось T_r_D; 11.10.2015 в 12:50.
T_r_D вне форума   Ответить с цитированием