summaryrefslogtreecommitdiff
path: root/lpo/lpo.ino
blob: 85a595b70f46fcae08610a085b09fbcc0af52312 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*************************************************************************
* Inpired from simple_obd_display.ino by Stanley Huang <stanley@freematics.com.au>
* (Simple OBD Data Display for Freematics OBD-II Adapter)
*************************************************************************/
#include "MyLCD.h"
#include "MyOBD.h"

MyLCD lcd;
MyOBD obd;

void setup()
{
  lcd.begin();
  lcd.print("obd.begin()");
  obd.begin();
  lcd.println(" done");
  reconnect();
  showDTC();
  initScreen();
}

void reconnect()
{
  lcd.setCursor(1,2);
  lcd.print("obd.init()                       ");
  lcd.setCursor(11,2);
  while (!obd.init()) {
    lcd.print(".");
  }
  lcd.println(" done");
}

void showDTC() {
  static char buf[10];
  static uint16_t codes[16];
  byte c, count = obd.readDTC(codes, 16);
  lcd.print("DTC: ");
  if ( count==0 ) {
    lcd.println("none");
  } else {
    for (c=0; c<count; c++) {
        sprintf(buf, "P%04u ", codes[c]);
        lcd.print(buf);
    }
    lcd.println();
  }
}

void loop()
{
  static byte pids[]= {PID_RPM, PID_SPEED, PID_ENGINE_LOAD, PID_THROTTLE};
  static byte index = 0, prev_err=obd.errors;
  byte pid = pids[index];
  int value;
  // send a query to OBD adapter for specified OBD-II pid
  if (obd.readPID(pid, value)) {
      showData(pid, value);
  }
  index = (index + 1) % sizeof(pids);

  if (obd.errors > prev_err) {
      showData(0, obd.errors);
  }
  if ( obd.errors > 10 ) {
    obd.errors=0;
    reconnect();
  }
}

void initScreen()
{
  lcd.setCursor(1,4);
  lcd.println("comm. errors:       ");
  lcd.println("         rpm:       ");
  lcd.println("       speed:        km/h");
  lcd.println("       throt:        %");
  lcd.println("        load:       ");
  showData(0, obd.errors);
}

void showData(byte pid, int value)
{
  static char buf[10];
  int res = sprintf(buf, "%6d", value);
  switch (pid) {
  case 0:               lcd.setCursor(15,4); lcd.print(buf); break;
  case PID_RPM:         lcd.setCursor(15,5); lcd.print(buf); break;
  case PID_SPEED:       lcd.setCursor(15,6); lcd.print(buf); break;
  case PID_THROTTLE:    lcd.setCursor(15,7); lcd.print(buf); break;
  case PID_ENGINE_LOAD: lcd.setCursor(15,8); lcd.print(buf); break;
  }
}