Go Down

Topic: Read OBD2 sensor (Read 850 times) previous topic - next topic

marcin_i

Hi,
I'm trying to modyfi my OBD2 data logger which is based on http://www.arduinodev.com/hardware/obd-kit/. Everything works fine, that means all data are correctly gater and displaying on LCD, but when I try log them to a file, then I've got only empty file. Can you help mi how can I get all of those data using this OBD library?
Here is my code:
Code: [Select]
//include libraries
#include <arduino.h>
#include <LCD4Bit_mod.h>
#include <OBD.h>
#include <SdFat.h>
//create object to control LCD
LCD4Bit_mod lcd = LCD4Bit_mod(2);

//create object to control OBD
COBD obd;
SdFat sd;

//key message
unsigned int adc_key_val[5] = {30, 150, 360, 535, 760};
int NUM_KEYS = 5;
int adc_key_in;
char key =- 1;
char oldkey =- 1;
unsigned long lastTick = millis();
uint8_t modes[2] = {0, 2};
const int chipSelect = 3;
ArduinoOutStream cout(Serial);
#define error(s) sd.errorHalt_P(PSTR(s))

const char modePids[] = {PID_RPM, PID_SPEED, PID_THROTTLE, PID_ENGINE_LOAD,
PID_COOLANT_TEMP, PID_INTAKE_TEMP, PID_AMBIENT_TEMP, PID_MAF_FLOW,
PID_ABS_ENGINE_LOAD, PID_FUEL_PRESSURE, PID_INTAKE_PRESSURE, PID_BAROMETRIC,
PID_TIMING_ADVANCE, PID_FUEL_LEVEL, PID_RUNTIME, PID_DISTANCE};

const char* modeLabels[] = {
"Engine       rpm", "Speed       km/h", "Throttle       %", "Engine Load    %",
"Coolant        C", "Intake Air     C", "Env. Temp      C", "MAF Flow     kpa",
"Abs. Load      %", "Fuel         kpa", "Intake       kpa", "Barometer    kpa",
"Timing Adv.     ", "Fuel Level     %", "Run Time", "Distance      km"};

const char modePos[] = {8, 8, 11, 12,
11, 11, 11, 9,
11, 9, 9, 10,
12, 11, 8, 10};

const char* modeFmts[] = {"%4u", "%3u", "%3u", "%u",
"%3d", "%3d", "%3d", "%3u",
"%3u", "%3u", "%3u", "%u",
"%3d", "%3u", "%4u:%02u", "%04u"};

#define TOTAL_PIDS (sizeof(modePids) / sizeof(modePids[0]))

//functions
void updateMode()
{
lcd.cursorTo(1, 0);
lcd.printIn((char*)modeLabels[modes[0]]);//wyswietla nazwe parametru
lcd.cursorTo(2, 0);
lcd.printIn((char*)modeLabels[modes[1]]);//wyswietla nazwe parametru
}

bool showData(int index)
{
char buf[16];
int value;
uint8_t mode = modes[index];
uint8_t pid = modePids[mode];
digitalWrite(13, HIGH);   // set the LED on
if (!obd.ReadSensor(pid, value)) {
                // display received data on error
lcd.cursorTo(index + 1, 0);
lcd.printIn("Error");
delay(2000);
updateMode();
return false;
}
digitalWrite(13, LOW);   // set the LED off

if (pid == PID_RUNTIME) {
sprintf(buf, modeFmts[mode], (unsigned int)value / 60, (unsigned int)value % 60); // zapisuje do buf wartosc z pomiaru
} else {
sprintf(buf, modeFmts[mode], value); // zapisuje do buf wartosc z pomiaru
}
lcd.cursorTo(index + 1, modePos[mode]); // pozycjonuje kursor na wybranej pozycji
lcd.printIn(buf); // wysietla buf
return true;
}

void saveData()
{
  char buf[16];
  int value;
  uint8_t pomiar;
  char name[] = "logs.txt";
  // open stream for append
    ofstream sdout(name, ios::out | ios::app);
    if (!sdout) error("open failed");
 
    String linia = "PID_RPM:";
    pomiar = obd.ReadSensor(PID_RPM, value);
    sprintf(buf, "%4u", pomiar); // PID_RPM
    linia += buf;
   
    linia += ";PID_SPEED:"; // PID_SPPEED
    pomiar = obd.ReadSensor(PID_SPEED, value);
    sprintf(buf, "%3u", pomiar);
    linia += buf;
   
    linia += ";PID_THROTTLE:"; // PID_THROTTLE
    pomiar = obd.ReadSensor(PID_THROTTLE, value);
    sprintf(buf, "%3u", pomiar);
    linia += buf;
   
    linia += ";PID_ENGINE_LOAD:"; // PID_ENGINE_LOAD
    pomiar = obd.ReadSensor(PID_ENGINE_LOAD, value);
    sprintf(buf, "%u", pomiar);
    linia += buf;
   
    linia += ";PID_ABS_ENGINE_LOAD:"; // PID_ABS_ENGINE_LOAD
    pomiar = obd.ReadSensor(PID_ABS_ENGINE_LOAD, value);
    sprintf(buf, "%3u", pomiar);
    linia += buf;
   
    linia += ";PID_FUEL_LEVEL:"; // PID_FUEL_LEVEL
    pomiar = obd.ReadSensor(PID_FUEL_LEVEL, value);
    sprintf(buf, "%3u", pomiar);
    linia += buf;
   
    linia += ";PID_DISTANCE:"; // PID_DISTANCE
    pomiar = obd.ReadSensor(PID_DISTANCE, value);
    sprintf(buf, "%04u", pomiar);
    linia += buf;
   
    sdout << linia << endl;
    Serial.println(linia);
    sdout.close();

}

bool setupConnection()
{
  uint8_t errors = 0;
  char buf[16];
  lcd.clear();
  lcd.printIn("Connecting...");
  while (!obd.Init())
  {
  lcd.cursorTo(2, 0);
  sprintf(buf, "Attempts #%d", ++errors);
  lcd.printIn(buf);
  }
  lcd.clear();
  lcd.printIn("Connected!");
  lcd.cursorTo(2, 0);
  sprintf(buf, "Rev. %d", obd.revision);
  lcd.printIn(buf);
  delay(1000);
  updateMode();
  return true;
}

void setup()
{
  pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat
  lcd.init();
  Serial.begin(OBD_SERIAL_BAUDRATE);
  setupConnection(); // ustanawia polaczeniz z obd
 
  Serial.begin(9600); // polacznei serial
  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
 
  // see if the card is present and can be initialized:
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
}

void loop()
{
  adc_key_in = analogRead(0);    // read the value from the sensor
  key = get_key(adc_key_in);         // convert into key press
  if (key != oldkey)
        {
delay(50); // wait for debounce time
adc_key_in = analogRead(0);    // read the value from the sensor
key = get_key(adc_key_in);         // convert into key press
if (key != oldkey)
{
oldkey = key;
if (key >=0)
                        {
switch (key)
                                {
case 3: // left key
do
                                        {
modes[0] = modes[0] > 0 ? modes[0] - 1 : TOTAL_PIDS - 1;
} while (modes[0] == modes[1]);
break;
case 0: // right key
do
                                        {
modes[0] = modes[0] < TOTAL_PIDS - 1 ? modes[0] + 1 : 0;
} while (modes[0] == modes[1]);
break;
case 1: // up key
do
                                        {
modes[1] = modes[1] > 0 ? modes[1] - 1 : TOTAL_PIDS - 1;
} while (modes[0] == modes[1]);
break;
case 2: // down key
do
                                        {
modes[1] = modes[1] < TOTAL_PIDS - 1 ? modes[1] + 1 : 0;
} while (modes[0] == modes[1]);
break;
}
updateMode();
}
}
}

unsigned long curTick = millis();
        if (curTick - lastTick > 500)
        {
showData(0);
showData(1);
                saveData();

                if (obd.errors > 10)
                {
setupConnection();
}
lastTick = curTick;
}
 
}

// Convert ADC value to key number
char get_key(unsigned int input)
{
  char k;
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
      return k;
  }
  return -1;
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy