Нашел на одном форуме.
Fast init 5 Baud (в строке 10 заменяем 0х11 на свой адрес и пересчитываем контрольную сумму)
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;
int dotdelay = 1000;
int timeout = 10100;
int timeold;
int messagelength = 1;
//0x11 меняем на свой адрес
byte message1[1] = {0x81}; byte message2[1] = {0x11}; byte message3[1] = {0xF1}; byte message4[1] = {0x81}; byte message5[1] = {0x04};
void setup() {
Serial.begin(115200);
pinMode(TX, OUTPUT);
}
void loop() {
fastinit();
sendrequest();
recievedata();
}
//FAST INIT 5baud--------------------------------------
void fastinit(){
if (!mode) {
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");
mode++;
}
}
void sendrequest(){
sendrequest1();
delay(5);
sendrequest2();
delay(5);
sendrequest3();
delay(5);
sendrequest4();
delay(5);
sendrequest5();
delay(5);
delay(50);
Serial.println("");
}
//PAQUETE SEND INIT-----------------------------------------------------------
void sendrequest1() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message1);
Serial.print(message1,HEX);
}
}
void sendrequest2() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message2);
Serial.print(message2,HEX);
}
}
void sendrequest3() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message3);
Serial.print(message3,HEX);
}
}
void sendrequest4() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message4);
Serial.print(message4,HEX);
}
}
void sendrequest5() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message5);
Serial.print(message5,HEX);
}
}
//RESEBIR DATA---------------------------------------------------
void recievedata() {
int i = 0;
int dataok = 0;
Serial.println(" waiting for data");
while (!dataok) {
int time = millis();
if ((timeold + timeout) < time) {
timeold = time;
Serial.println(" TIMEOUT");
mode = 0;
mySerial.end();
return;
}
if (mySerial.available()) {
byte inByte = mySerial.read();
Serial.print("");
Serial.println(inByte,HEX);
}
if (Serial.available()) {
byte inByte = Serial.read();
mySerial.print("");
mySerial.print(inByte,HEX);
}
}
}
Отправлено спустя 4 минуты 45 секунд:
Если одна из инициализаций сработала, то пробуем увидеть температуру
Fast init 5baud + present + температура
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //R,T
#define TX 13
int mode;
//variables
int dotdelay = 1000;
int timeout = 1000;
int timeold;
int messagelength = 1;
int messagelength2 = 5;
int messagelength3 = 6;
//в трех нижних строках сообщений 0x11 меняем на свой адрес и пересчитываем контрольную сумму
byte message1[1] = {0x81}; byte message2[1] = {0x11}; byte message3[1] = {0xF1}; byte message4[1] = {0x81}; byte message5[1] = {0x04};
byte message6[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A};
byte message7[5] = {0x81,0x11,0xF1,0x3E,0xC1};
void setup() {
Serial.begin(115200);
pinMode(TX, OUTPUT);
}
void loop() {
fastinit();
sendrequest1();
delay(5);
sendrequest2();
delay(5);
sendrequest3();
delay(5);
sendrequest4();
delay(5);
sendrequest5();
delay(5);
delay(50);
Serial.println("");
recievedata();
}
void fastinit(){
if (!mode) {
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");
mode++;
}
}
//-----------------------------------------------------------
void sendrequest1() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message1[i]);
Serial.print(message1[i],HEX);
}
}
void sendrequest2() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message2[i]);
Serial.print(message2[i],HEX);
}
}
void sendrequest3() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message3[i]);
Serial.print(message3[i],HEX);
}
}
void sendrequest4() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message4[i]);
Serial.print(message4[i],HEX);
}
}
void sendrequest5() {
for (int i = 0; ((i < messagelength) & (mode == 1)); i++) {
mySerial.write(message5[i]);
Serial.print(message5[i],HEX);
}
}
//---------------------------------------------------------------------
void pids() {
for (int i = 0; ((i < messagelength3 ) & (mode == 1)); i++) {
mySerial.write(message6[i]);
Serial.print(message6[i],HEX);
}
}
void present() {
for (int i = 0; ((i < messagelength2) & (mode == 1)); i++) {
mySerial.write(message7[i]);
Serial.print(message7[i],HEX);
}
}
void recievedata() {
present();
delay(55);
Serial.println("");
int i = 0;
int dataok = 0;
Serial.println(" waiting for data");
while (!dataok) {
int time = millis();
if ((timeold + timeout) < time) {
timeold = time;
Serial.println(" TIMEOUT");
pids();
delay(55);
Serial.println("");
recievedata();
return;
}
if (mySerial.available()) {
byte inByte = mySerial.read();
Serial.print("");
Serial.print(inByte,HEX);
}
}
}