summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2021-06-12 00:42:19 +0200
committerLudovic Pouzenc <ludovic@pouzenc.fr>2021-06-12 00:42:19 +0200
commit7b6035179821fd7a7553ac3b60f36e84fc1cccd4 (patch)
tree45b98e634661fa1d9cc7efafacf892b5d5999d0f
parentc2d1ca81d9bcc4b5a1fbf93e61af1db14a7e5158 (diff)
download2021-arduino-obd-7b6035179821fd7a7553ac3b60f36e84fc1cccd4.tar.gz
2021-arduino-obd-7b6035179821fd7a7553ac3b60f36e84fc1cccd4.tar.bz2
2021-arduino-obd-7b6035179821fd7a7553ac3b60f36e84fc1cccd4.zip
Import inital sketch lpo pour dumper les DTC et des valeurs live
-rw-r--r--lpo/MyLCD.h51
-rw-r--r--lpo/MyOBD.h32
-rw-r--r--lpo/lpo.ino92
3 files changed, 175 insertions, 0 deletions
diff --git a/lpo/MyLCD.h b/lpo/MyLCD.h
new file mode 100644
index 0000000..565e110
--- /dev/null
+++ b/lpo/MyLCD.h
@@ -0,0 +1,51 @@
+#ifndef __MYLCD_H
+#define __MYLCD_H
+#undef PROGMEM
+#define PROGMEM
+#include <MultiLCD.h>
+class MyLCD : public LCD_ILI9325D {
+ /* 2.8" ILI9325 based LCD 320x240x16bpp*/
+ public:
+ uint8_t column, line;
+ MyLCD() {
+ LCD_ILI9325D::setFontSize(FONT_SIZE_SMALL);
+ this->clear();
+ }
+ byte getLines() { return 30; }
+ byte getCols() { return 53; }
+ void setCursor(uint8_t column, uint8_t line) {
+ /* column and line as in a terminal, start at line 1, col 1. each column is one character wide*/
+ this->column = (column==0)?1:column;
+ this->line = (column==0)?1:line;
+ LCD_ILI9325D::setCursor((column-1)*6, line-1);
+ }
+ void clear() {
+ LCD_ILI9325D::clear();
+ this->setCursor(1, 1);
+ }
+ size_t println() {
+ if ( this->line < this->getLines() ) {
+ this->setCursor(1, this->line+1);
+ } else {
+ this->clear();
+ }
+ }
+ void moveRight(size_t len) {
+ if ( this->column+len <= this->getCols() ) {
+ this->setCursor(this->column+len, this->line);
+ } else {
+ this->println();
+ }
+ }
+ size_t println(const String &s) {
+ size_t len = LCD_ILI9325D::print(s);
+ this->println();
+ return len;
+ }
+ size_t print(const String &s) {
+ size_t len = LCD_ILI9325D::print(s);
+ this->moveRight(len);
+ return len;
+ }
+};
+#endif
diff --git a/lpo/MyOBD.h b/lpo/MyOBD.h
new file mode 100644
index 0000000..ea143be
--- /dev/null
+++ b/lpo/MyOBD.h
@@ -0,0 +1,32 @@
+#ifndef __MYOBD_H
+#define __MYOBD_H
+#include <OBD.h>
+class MyOBD : public COBDI2C {
+ public:
+ /* Fake OBD for testing
+ int i;
+ MyOBD() {
+ i=0;
+ }
+ byte begin() {
+ delay(500);
+ return 1;
+ }
+ bool init() {
+ delay(500);
+ return ++i>4;
+ }
+ bool readPID(byte pid, int& result) {
+ result=millis();
+ if ( result%1000 == 0 ) { this->errors++; }
+ return true;
+ }
+ byte readDTC(uint16_t codes[], byte maxCodes = 1) {
+ codes[0]=6002;
+ codes[1]=6032;
+ codes[2]=12;
+ return 4;
+ }
+ */
+};
+#endif
diff --git a/lpo/lpo.ino b/lpo/lpo.ino
new file mode 100644
index 0000000..85a595b
--- /dev/null
+++ b/lpo/lpo.ino
@@ -0,0 +1,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;
+ }
+}