Sz_Insper
/
OBD2_Nucleo_1602
obd + elm327 + lcd1602
Diff: main.cpp
- Revision:
- 0:81f7d0ea45b6
- Child:
- 1:7fa61b250083
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jun 01 20:26:10 2020 +0000 @@ -0,0 +1,496 @@ +#include "mbed.h" +#include "ssd1306.h" +#include "codes.h" + +DigitalOut myled(LED1); + +Serial pc(USBTX,USBRX); + +Serial device(PA_11, PA_12); + +Ticker flipper; + +SSD1306 lcd (D14, D15); // assumes default I2C address of 0x78 + +void flip(void); +void OBDInit(void); +void read_serial(void); + +void ask_intake_pressure_absolute(void); +void ask_engine_rpm(void); +void ask_vehile_speed(void); +void ask_intake_air_temperature(void); +void ask_throttle_position(void); +void ask_oxygen_sensor(void); +void ask_fuel_rail_pressure(void); + +char RESPONSE_INTAKE_PRESSURE_ABSOLUTE[64]; +char RESPONSE_ENGINE_RPM[64]; +char RESPONSE_VEHILE_SPEED[64]; +char RESPONSE_INTAKE_AIR_TEMPERATURE[64]; +char RESPONSE_THROTTLE_POSITION[64]; +char RESPONSE_OXYGEN_SENSOR[64]; +char RESPONSE_FUEL_RAIL_PRESSURE[64]; + +char c[64]; + +float INTAKE_PRESSURE_ABSOLUTE; +int ENGINE_RPM; +int VEHILE_SPEED; +int INTAKE_AIR_TEMPERATURE; +float THROTTLE_POSITION; +float SHORT_TERM_FUEL_TRIM; +float OXYGEN_SENSOR; +float FUEL_RAIL_PRESSURE; + +int main() +{ + flipper.attach(&flip, 1.0); + pc.baud(115200); + + lcd.speed (SSD1306::Medium); // set working frequency + lcd.init(); // initialize SSD1306 + lcd.set_contrast(255); + lcd.cls(); // clear frame buffer + lcd.locate (3,2); // set text cursor to line 3, column 1 + lcd.printf ("Starting up"); // print to frame buffer + + pc.printf("OBD STM32 v1.1.002"); + pc.printf("\r\n"); + + device.baud(38400); + OBDInit(); + + pc.printf("OBD Inicializado"); + pc.printf("\r\n"); + + lcd.cls(); + lcd.locate(3,0); + lcd.printf("OBD Inicializado"); + lcd.redraw(); + + wait_ms(1500); + lcd.cls(); + lcd.redraw(); + + int FREQ = 600; + + while(1) + { + ask_intake_pressure_absolute(); + wait_ms(FREQ); + ask_engine_rpm(); + wait_ms(FREQ); + //ask_vehile_speed(); + //wait_ms(FREQ); + ask_intake_air_temperature(); + wait_ms(FREQ); + ask_throttle_position(); + wait_ms(FREQ); + ask_oxygen_sensor(); + wait_ms(FREQ); + ask_fuel_rail_pressure(); + wait_ms(FREQ); + + lcd.locate(0,0); + lcd.printf("%03.2f bar",INTAKE_PRESSURE_ABSOLUTE); + lcd.locate(1,0); + lcd.printf("%04i RPM",ENGINE_RPM); + lcd.locate(2,0); + lcd.printf("%03i Km/h",VEHILE_SPEED); + lcd.locate(3,0); + lcd.printf("%03i C",INTAKE_AIR_TEMPERATURE); + lcd.locate(4,0); + lcd.printf("%05.2f pc",THROTTLE_POSITION); + lcd.locate(5,0); + lcd.printf("%04.3f mV",OXYGEN_SENSOR); + lcd.locate(6,0); + lcd.printf("%06.2f bar",FUEL_RAIL_PRESSURE); + lcd.redraw(); + + //lcd.cls(); + + + } +} + +void flip() +{ + myled = !myled; +} + +void ask_intake_pressure_absolute() +{ + int i = 0; + + device.printf(PID_INTAKE_PRESSURE_ABSOLUTE); + device.printf(CR); + while(!device.readable()){} //fica esperando chegar algo na serial + while(RESPONSE_INTAKE_PRESSURE_ABSOLUTE[i-1]!= '\r') //chegou algo! vamos ler até o CR + { + RESPONSE_INTAKE_PRESSURE_ABSOLUTE[i] = device.getc(); + i++; + } + + char DATA_A[2]; + char DATA_B[2]; + char DATA_C[2]; + char DATA_D[2]; + + DATA_A[0] = RESPONSE_INTAKE_PRESSURE_ABSOLUTE[i-3]; + DATA_A[1] = RESPONSE_INTAKE_PRESSURE_ABSOLUTE[i-2]; + + int VAL_A = strtol(DATA_A,NULL,16); + + //pc.printf("%i\r",VAL_A); + + INTAKE_PRESSURE_ABSOLUTE = (VAL_A * 0.01f) - 1.0f; + + pc.printf("pressao %i\r",INTAKE_AIR_TEMPERATURE); + + for(int j = 0; j < i; j++) + { + pc.printf("%c",RESPONSE_INTAKE_PRESSURE_ABSOLUTE[j]); + } +} + +void ask_engine_rpm() +{ + int i = 0; + + device.printf(PID_ENGINE_RPM); + device.printf(CR); + while(!device.readable()){} //fica esperando chegar algo na serial + while(RESPONSE_ENGINE_RPM[i-1]!= '\r') //chegou algo! vamos ler até o CR + { + RESPONSE_ENGINE_RPM[i] = device.getc(); + i++; + } + + char DATA_A[2]; + char DATA_B[2]; + char DATA_C[2]; + char DATA_D[2]; + + DATA_A[0] = RESPONSE_ENGINE_RPM[i-5]; + DATA_A[1] = RESPONSE_ENGINE_RPM[i-4]; + + DATA_B[0] = RESPONSE_ENGINE_RPM[i-3]; + DATA_B[1] = RESPONSE_ENGINE_RPM[i-2]; + + int VAL_A = strtol(DATA_A,NULL,16); + int VAL_B = strtol(DATA_B,NULL,16); + + //pc.printf("%i\r",VAL_A); + //pc.printf("%i\r",VAL_B); + + ENGINE_RPM = ((VAL_A * 256) + VAL_B) / 4; + + pc.printf("rpm %i\r",ENGINE_RPM); + + for(int j = 0; j < i; j++) + { + pc.printf("%c",RESPONSE_ENGINE_RPM[j]); + } +} + +void ask_vehile_speed() +{ + int i = 0; + + device.printf(PID_VEHILE_SPEED); + device.printf(CR); + while(!device.readable()){} //fica esperando chegar algo na serial + while(c[i-1]!= '\r') //chegou algo! vamos ler até o CR + { + RESPONSE_VEHILE_SPEED[i] = device.getc(); + i++; + } + + char DATA_A[2]; + char DATA_B[2]; + char DATA_C[2]; + char DATA_D[2]; + + DATA_A[0] = RESPONSE_VEHILE_SPEED[i-3]; + DATA_A[1] = RESPONSE_VEHILE_SPEED[i-2]; + + int VAL_A = strtol(DATA_A,NULL,16); + + //pc.printf("%i\r",VAL_A); + + VEHILE_SPEED = VAL_A; + + pc.printf("%i kmh\r",VEHILE_SPEED); + + for(int j = 0; j < i; j++) + { + pc.printf("%c",RESPONSE_VEHILE_SPEED[j]); + } +} + +void ask_intake_air_temperature() +{ + int i = 0; + + device.printf(PID_INTAKE_AIR_TEMPERATURE); + device.printf(CR); + while(!device.readable()){} //fica esperando chegar algo na serial + while(RESPONSE_INTAKE_AIR_TEMPERATURE[i-1]!= '\r') //chegou algo! vamos ler até o CR + { + RESPONSE_INTAKE_AIR_TEMPERATURE[i] = device.getc(); + i++; + } + + char DATA_A[2]; + char DATA_B[2]; + char DATA_C[2]; + char DATA_D[2]; + + DATA_A[0] = RESPONSE_INTAKE_AIR_TEMPERATURE[i-3]; + DATA_A[1] = RESPONSE_INTAKE_AIR_TEMPERATURE[i-2]; + + int VAL_A = strtol(DATA_A,NULL,16); + + //pc.printf("%i\r",VAL_A); + + INTAKE_AIR_TEMPERATURE = VAL_A - 40;; + + pc.printf("temp ar %i\r",INTAKE_AIR_TEMPERATURE); + + for(int j = 0; j < i; j++) + { + pc.printf("%c",RESPONSE_INTAKE_AIR_TEMPERATURE[j]); + } +} + +void ask_throttle_position() +{ + int i = 0; + + device.printf(PID_THROTTLE_POSITION); + device.printf(CR); + while(!device.readable()){} //fica esperando chegar algo na serial + while(RESPONSE_THROTTLE_POSITION[i-1]!= '\r') //chegou algo! vamos ler até o CR + { + RESPONSE_THROTTLE_POSITION[i] = device.getc(); + i++; + } + + char DATA_A[2]; + char DATA_B[2]; + char DATA_C[2]; + char DATA_D[2]; + + DATA_A[0] = RESPONSE_THROTTLE_POSITION[i-3]; + DATA_A[1] = RESPONSE_THROTTLE_POSITION[i-2]; + + int VAL_A = strtol(DATA_A,NULL,16); + + //pc.printf("%i\r",VAL_A); + + THROTTLE_POSITION = 100.0f/255.0f; + THROTTLE_POSITION = THROTTLE_POSITION * VAL_A; + + pc.printf("tbi %.2f\r",THROTTLE_POSITION); + + for(int j = 0; j < i; j++) + { + pc.printf("%c",RESPONSE_THROTTLE_POSITION[j]); + } +} + +void ask_oxygen_sensor() +{ + int i = 0; + + device.printf(PID_OXYGEN_SENSOR); + device.printf(CR); + while(!device.readable()){} //fica esperando chegar algo na serial + while(RESPONSE_OXYGEN_SENSOR[i-1]!= '\r') //chegou algo! vamos ler até o CR + { + RESPONSE_OXYGEN_SENSOR[i] = device.getc(); + i++; + } + + char DATA_A[2]; + char DATA_B[2]; + char DATA_C[2]; + char DATA_D[2]; + + DATA_A[0] = RESPONSE_OXYGEN_SENSOR[i-5]; + DATA_A[1] = RESPONSE_OXYGEN_SENSOR[i-4]; + + DATA_B[0] = RESPONSE_OXYGEN_SENSOR[i-3]; + DATA_B[1] = RESPONSE_OXYGEN_SENSOR[i-2]; + + int VAL_A = strtol(DATA_A,NULL,16); + int VAL_B = strtol(DATA_B,NULL,16); + + //pc.printf("%i\r",VAL_A); + //pc.printf("%i\r",VAL_B); + + OXYGEN_SENSOR = VAL_A / 200.0f; + + SHORT_TERM_FUEL_TRIM = ((100.0f / 128.0f) * VAL_B) - 100.0f; + + pc.printf("sonda %f\r",OXYGEN_SENSOR); + pc.printf("trim %f\r",SHORT_TERM_FUEL_TRIM); + + for(int j = 0; j < i; j++) + { + pc.printf("%c",RESPONSE_OXYGEN_SENSOR[j]); + } +} + +void ask_fuel_rail_pressure() +{ + int i = 0; + + device.printf(PID_FUEL_RAIL_PRESSURE); + device.printf(CR); + while(!device.readable()){} //fica esperando chegar algo na serial + while(RESPONSE_FUEL_RAIL_PRESSURE[i-1]!= '\r') //chegou algo! vamos ler até o CR + { + RESPONSE_FUEL_RAIL_PRESSURE[i] = device.getc(); + i++; + } + + char DATA_A[2]; + char DATA_B[2]; + char DATA_C[2]; + char DATA_D[2]; + + DATA_A[0] = RESPONSE_FUEL_RAIL_PRESSURE[i-5]; + DATA_A[1] = RESPONSE_FUEL_RAIL_PRESSURE[i-4]; + + DATA_B[0] = RESPONSE_FUEL_RAIL_PRESSURE[i-3]; + DATA_B[1] = RESPONSE_FUEL_RAIL_PRESSURE[i-2]; + + int VAL_A = strtol(DATA_A,NULL,16); + int VAL_B = strtol(DATA_B,NULL,16); + + //pc.printf("%i\r",VAL_A); + + FUEL_RAIL_PRESSURE = ((VAL_A * 256) + VAL_B) * 0.1f; + + pc.printf("alta %f\r",FUEL_RAIL_PRESSURE); + + for(int j = 0; j < i; j++) + { + pc.printf("%c",RESPONSE_FUEL_RAIL_PRESSURE[j]); + } +} + +void read_serial() +{ + int i = 0; + + while(!device.readable()){} //fica esperando chegar algo na serial + while(c[i-1]!= '\r') //chegou algo! vamos ler até o CR + { + c[i] = device.getc(); + //pc.printf("%c",c[i]); + i++; + } + for(int j = 0; j < i; j++) + { + pc.printf("%c",c[j]); + } + i=0; //zeramos o contador de posicao +} + +void OBDInit() +{ + lcd.locate (4,0); + lcd.printf ("."); + lcd.redraw(); + device.printf(SET_ALL_TO_DEFAULT); + device.printf(CR); + wait_ms(500); + lcd.locate (4,1); + lcd.printf ("."); + lcd.redraw(); + wait_ms(500); + + lcd.locate (4,2); + lcd.printf ("."); + lcd.redraw(); + device.printf(RESET_ALL); + device.printf(CR); + wait_ms(500); + lcd.locate (4,3); + lcd.printf ("."); + lcd.redraw(); + wait_ms(500); + + lcd.locate (4,4); + lcd.printf ("."); + lcd.redraw(); + device.printf(LINEFEED_OFF); + device.printf(CR); + wait_ms(500); + lcd.locate (4,5); + lcd.printf ("."); + lcd.redraw(); + wait_ms(500); + + lcd.locate (4,6); + lcd.printf ("."); + lcd.redraw(); + device.printf(PRINTING_SPACES_OFF); + device.printf(CR); + wait_ms(500); + lcd.locate (4,7); + lcd.printf ("."); + lcd.redraw(); + wait_ms(500); + + lcd.locate (4,8); + lcd.printf ("."); + lcd.redraw(); + device.printf(MEMORY_OFF); + device.printf(CR); + wait_ms(500); + lcd.locate (4,9); + lcd.printf ("."); + lcd.redraw(); + wait_ms(500); + + lcd.locate (4,10); + lcd.printf ("."); + lcd.redraw(); + device.printf(SET_TIMEOUT_256); + device.printf(CR); + wait_ms(500); + lcd.locate (4,11); + lcd.printf ("."); + lcd.redraw(); + wait_ms(500); + + lcd.locate (4,12); + lcd.printf ("."); + lcd.redraw(); + device.printf(TRY_PROTOCOL_0); + device.printf(CR); + wait_ms(500); + lcd.locate (4,13); + lcd.printf ("."); + lcd.redraw(); + wait_ms(500); + + lcd.locate (4,14); + lcd.printf ("."); + lcd.redraw(); + device.printf(ECHO_OFF); + device.printf(CR); + wait_ms(500); + lcd.locate (4,15); + lcd.printf ("."); + lcd.redraw(); + wait_ms(500); + + device.printf("ATLP"); + device.printf(CR); + wait_ms(500); +} \ No newline at end of file