Тема: CITROEN-ARDUINO
Показать сообщение отдельно
Старый 15.07.2015, 23:28   #5
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
И если не сложно объясните мне как при помощи ардуины OBD II запросы слать и принимать ответы.
Для тех кому лень читать WIKI (а там всё очень подробно описано), вот пример как запрашивать скорость автомобиля по OBDII

Код:
#include <mcp_can.h>
#include <SPI.h>

INT32U canId = 0x000;

unsigned char len = 0;
unsigned char buf[8];
char str[20];
boolean IsSend = false;

unsigned long IsSend_millis = 0;

unsigned char vspeed[8] = {2, 1, 13, 0, 0, 0, 0, 0};

unsigned char count = 0;

MCP_CAN CAN0(10);

void setup()
{
  Serial.begin(9600);
 
START_INIT:

  if(CAN0.begin(CAN_500KBPS) == CAN_OK)
    {
      Serial.println("CAN BUS Shield init ok!");
    }
    else
    {
            Serial.println("CAN BUS Shield init fail");
            Serial.println("Init CAN BUS Shield again");
            delay(100);
            goto START_INIT;
    }
   
  pinMode(18, INPUT);
 
}

void loop()
{
    if(!IsSend)
    {
      CAN0.sendMsgBuf(0x7DF, 0, 8, vspeed);
      IsSend = true;
      IsSend_millis = millis();
    } 
    if(!digitalRead(18))                        
    {
      CAN0.readMsgBuf(&len, buf);             
      canId = CAN0.getCanId();

      if( (canId == 0x7E8) && (buf[0] == 3) && (buf[1] == 0x41) && (buf[2] == 0xD))
      {
        Serial.println(buf[3]);
        IsSend_millis = millis()-2500;
          Serial.print("Speed: ");
          Serial.println(buf[3]);
      }
    }
    if( IsSend )
    {
      if( IsSend_millis + 3000 < millis() )
      {
        Serial.print("----");
        IsSend = false;
        IsSend_millis = millis();
      }
    }
}
Скетч посылает запросы раз в три секунды, пока не придёт первый ответ. После этого посылается два запроса в секунду.

Только номера пинов надо задать свои.
Bersenev вне форума   Ответить с цитированием