summaryrefslogtreecommitdiff
path: root/samples/test_obd_i2c/test_obd_i2c.ino
blob: 7d780046b5a8172c5a0052900dcfad471a68340e (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <Arduino.h>
#include <Wire.h>
#include <OBD.h>
#include <MPU6050.h>
#include <SPI.h>

#define CON Serial

bool hasAAC = false;

COBDI2C obd;

bool initACC()
{
    if (MPU6050_init() != 0)
        return false;
    return true;

}
void processACC()
{
    accel_t_gyro_union data;
    MPU6050_readout(&data);
    CON.print('[');
    CON.print(millis());
    CON.print(']');
    // log x/y/z of accelerometer
    CON.print(" AX=");
    CON.print(data.value.x_accel);
    CON.print(" AY=");
    CON.print(data.value.y_accel);
    CON.print(" AZ=");
    CON.println(data.value.z_accel);
    // log x/y/z of gyro meter
    CON.print('[');
    CON.print(millis());
    CON.print(']');
    CON.print(" GX=");
    CON.print(data.value.x_gyro);
    CON.print(" GY=");
    CON.print(data.value.y_gyro);
    CON.print(" GZ=");
    CON.println(data.value.z_gyro);
}

void setup()
{
    CON.begin(115200);
    //lcd.begin();

    CON.println("OBD TESTER");

    obd.begin();

    hasAAC = initACC();
    if (hasAAC)
        CON.println("MPU6050 detected");

    for (;;) {
        CON.println("Connecting...");
        if (obd.init()) break;
        delay(1000);
    }
    CON.println("Connected");

    obd.gpsStart(38400);

    //obd.btInit(9600);
}

byte getChecksum(char* buffer, byte len)
{
    uint8_t checksum = 0;
    for (byte i = 0; i < len; i++) {
      checksum ^= buffer[i];
    }
    return checksum;
}

typedef struct {
    uint32_t time;
    uint16_t pid;
    uint8_t flags;
    uint8_t checksum;
    float value;
} LOG_DATA;

void sendData(uint16_t pid, int value)
{
    LOG_DATA ld = {millis(), pid, 1, 0, value};
    ld.checksum = getChecksum((char*)&ld, sizeof(LOG_DATA));
    obd.btSend((byte*)&ld, sizeof(LOG_DATA));
}

void loop()
{
    int value;

    //lcd.setCursor(0, 8);

    CON.print('[');
    CON.print(millis());
    CON.print(']');
    if (obd.read(PID_RPM, value, false)) {
        //sendData(0x100 | PID_RPM, value);
        CON.print(" RPM:");
        CON.print(value);
    }
    if (obd.read(PID_SPEED, value, false)) {
        //sendData(0x100 | PID_SPEED, value);
        CON.print(" SPD:");
        CON.print(value);
    }
    if (obd.read(PID_THROTTLE, value, false)) {
        //sendData(0x100 | PID_THROTTLE, value);
        CON.print(" THR:");
        CON.print(value);
    }
    CON.println("");
    if (hasAAC) {
        processACC();
    }
    //delay(500);

    GPS_DATA gpsdata;
    if (obd.gpsQuery(&gpsdata)) {
        CON.print('[');
        CON.print(millis());
        CON.print(']');
        CON.print(" LAT:");
        CON.print(gpsdata.lat, 6);
        CON.print(" LON:");
        CON.print(gpsdata.lon, 6);
        CON.print(" ALT:");
        CON.print(gpsdata.alt, 1);
        CON.print(" SAT:");
        CON.print(gpsdata.sat);
        CON.print(" AGE:");
        CON.print(gpsdata.age);
        CON.print(" TIME:");
        CON.println(gpsdata.time);
    }
    //delay(500);
}