Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********* Pleasedontcode.com **********
- Pleasedontcode thanks you for automatic code generation! Enjoy your code!
- - Terms and Conditions:
- You have a non-exclusive, revocable, worldwide, royalty-free license
- for personal and commercial use. Attribution is optional; modifications
- are allowed, but you're responsible for code maintenance. We're not
- liable for any loss or damage. For full terms,
- please visit pleasedontcode.com/termsandconditions.
- - Project: Vehicle Data
- - Source Code NOT compiled for: Arduino Mega
- - Source Code created on: 2025-07-11 21:59:29
- ********* Pleasedontcode.com **********/
- /****** SYSTEM REQUIREMENTS *****/
- /****** SYSTEM REQUIREMENT 1 *****/
- /* send data from bluetooth to android */
- /****** END SYSTEM REQUIREMENTS *****/
- /* START CODE */
- /****** DEFINITION OF LIBRARIES *****/
- #include <SoftwareSerial.h>
- /****** FUNCTION PROTOTYPES *****/
- void setup(void);
- void loop(void);
- float T_interpolate(byte DS_Temp);
- void sendDataToAndroid(float RPM, float TPS, float MAF, int BLCELL, int BLM, int INTEGRATOR, float InjPW, float O2mv, float MAT, unsigned int Runtime);
- /***** DEFINITION OF Software Serial *****/
- const uint8_t HC05_BluetoothModule_HC05_mySerial_PIN_SERIAL_TX_A0 = A0;
- const uint8_t HC05_BluetoothModule_HC05_mySerial_PIN_SERIAL_RX_A1 = A1;
- SoftwareSerial HC05_BluetoothModule_HC05_mySerial(HC05_BluetoothModule_HC05_mySerial_PIN_SERIAL_RX_A1, HC05_BluetoothModule_HC05_mySerial_PIN_SERIAL_TX_A0);
- // Define pins and variables used in the code
- const int ALDLTestPin = 2; // Example pin, set accordingly
- const int DecodeDataOutputPin = 3; // Example pin, set accordingly
- const int HexDataOutputPin = 4; // Example pin, set accordingly
- const byte M1Cmd[4] = {0x01, 0x02, 0x03, 0x04}; // Example command, set accordingly
- const int ByteCount = 64; // Example byte count, set accordingly
- const int linecount = 16; // Example line count for hex output
- int DataBytes[65]; // Buffer for data bytes
- bool SilenceFound = false;
- bool PreambleFound = false;
- unsigned long PreambleTimer = 0;
- unsigned long PreambleTimerStart = 0;
- int ALDLbyte = 0;
- int bytecounter = 0;
- // Placeholder variables for undefined identifiers
- int linecount = 16; // For hex output line length
- void setup(void)
- {
- // put your setup code here, to run once:
- HC05_BluetoothModule_HC05_mySerial.begin(9600);
- Serial.begin(115200); // Initialize Serial for debugging/output
- pinMode(ALDLTestPin, INPUT); // ALDL activity listen pin
- pinMode(DecodeDataOutputPin, INPUT_PULLUP); // Decoded data output control
- pinMode(HexDataOutputPin, INPUT_PULLUP); // Hex data output control
- delay(1500);
- Serial.println("Ready for data capture");
- }
- void loop() {
- // Wait for silence period on the ALDL
- Serial.print("wait for silence ");
- SilenceFound = false; // Reset silence flag
- unsigned long StartTime = micros(); // Initialize timer
- while ((micros() - StartTime) < 15000) { // Wait for 15 ms silence
- if (digitalRead(ALDLTestPin) == 0) { // Any line activity resets timer
- StartTime = micros();
- }
- }
- SilenceFound = true; // Silence detected
- while (SilenceFound == true) { // While silence detected, request and process data
- PreambleFound = false; // Reset preamble flag
- // Send Mode 1 command to request data
- while (PreambleFound == false) {
- Serial.print(" M1 cmd ");
- for (int i = 0; i < 4; i++) {
- Serial1.write(M1Cmd[i]);
- }
- Serial.println(" Finding Preamble ");
- int i = 0;
- PreambleTimer = millis();
- while ((millis() - PreambleTimer) < 100 && PreambleFound == false) {
- if (Serial1.available() > 0) {
- ALDLbyte = Serial1.read();
- if (ALDLbyte == Preamble[i]) {
- i++;
- if (i > 2) PreambleFound = true;
- } else {
- PreambleFound = false;
- i = 0;
- }
- }
- }
- }
- // Read data stream after preamble
- int DataStreamIndex = 1;
- while (DataStreamIndex < 65) {
- if (Serial1.available() > 0) {
- DataBytes[DataStreamIndex] = Serial1.read();
- DataStreamIndex++;
- }
- }
- // Calculate checksum
- int i = 1;
- unsigned long CheckTotal = 0x80 + 0x95 + 0x01; // Sum preamble bytes
- while (i < ByteCount) {
- CheckTotal += DataBytes[i];
- i++;
- }
- byte CheckSum = 0x200 - CheckTotal; // Two's complement
- // Verify checksum and output data
- if (digitalRead(DecodeDataOutputPin) == LOW) {
- Serial.print("New Data Stream received at ");
- Serial.print(millis());
- Serial.print(" Calc CHECKSUM: ");
- Serial.print(CheckSum, HEX);
- Serial.print(" Transmitted CHECKSUM: ");
- Serial.print(DataBytes[ByteCount], HEX);
- if (CheckSum == DataBytes[ByteCount]) {
- Serial.println(" Checksum GOOD - Decoded Data as follows: (Page 1) ");
- } else {
- Serial.println(" Checksum *** ERROR *** - Decoded Data as follows: (Page 1) ");
- }
- // Extract and convert data
- float RPM = DataBytes[11] * 25; // Engine RPM
- float TPS = DataBytes[10] * 0.019608; // Throttle position in volts
- float MAF = ((DataBytes[36] * 256) + DataBytes[37]) * 0.003906; // Mass Air Flow
- int BLCELL = DataBytes[21]; // Block learn cell
- int BLM = DataBytes[20]; // Block learn value
- int INTEGRATOR = DataBytes[22]; // Fuel trim
- float InjPW = ((DataBytes[45] * 256) + DataBytes[46]) * 0.015259; // Injector pulse width
- float O2mv = DataBytes[17] * 4.44; // O2 sensor in mV
- float MAT = T_interpolate(DataBytes[30]); // Intake temp
- unsigned int Runtime = (DataBytes[52] * 256) + DataBytes[53]; // Runtime seconds
- // Send data over Bluetooth to Android
- sendDataToAndroid(RPM, TPS, MAF, BLCELL, BLM, INTEGRATOR, InjPW, O2mv, MAT, Runtime);
- // Print data locally for debugging
- Serial.print("Engine Speed : ");
- Serial.print(RPM);
- Serial.println(" RPM");
- Serial.print("Throttle Position: ");
- Serial.print(TPS);
- Serial.println(" Volts");
- Serial.print("Mass Air Flow : ");
- Serial.print(MAF);
- Serial.println(" Grams/Sec");
- Serial.print("Current BLM Cell: ");
- Serial.print(BLCELL);
- Serial.print(" BLM Value: ");
- Serial.print(BLM);
- Serial.print(" Current Fuel Integrator: ");
- Serial.println(INTEGRATOR);
- Serial.print("Injector Pulse : ");
- Serial.print(InjPW);
- Serial.println(" Milliseconds");
- Serial.print("O2 Sensor Voltage: ");
- Serial.print(O2mv);
- Serial.println(" Millivolts");
- Serial.print("Intake Air Temp : ");
- Serial.print(MAT);
- Serial.println(" Deg C");
- Serial.print("Engine Run Time : ");
- Serial.print(Runtime);
- Serial.println(" Seconds");
- // Delay for readability
- unsigned long StartTimeDelay = millis();
- while (millis() < StartTimeDelay + 3000) {
- if (Serial1.available() > 0) ALDLbyte = Serial1.read(); // Flush buffer
- }
- } else if (digitalRead(HexDataOutputPin) == LOW) {
- // Output hex data
- Serial.print("New Data Stream received at ");
- Serial.print(millis());
- Serial.print(" Calc CHECKSUM: ");
- Serial.print(CheckSum, HEX);
- Serial.print(" Transmitted CHECKSUM: ");
- Serial.print(DataBytes[ByteCount], HEX);
- if (CheckSum == DataBytes[ByteCount]) {
- Serial.println(" Checksum GOOD - Data as follows: ");
- } else {
- Serial.println(" Checksum *** ERROR *** - Data as follows: ");
- }
- // Print hex data
- int j = 1;
- bytebytecounter = 0;
- while (j < ByteCount + 1) {
- Serial.print(DataBytes[j], HEX);
- j++;
- bytecounter++;
- if (bytecounter >= linecount) {
- bytecounter = 0;
- Serial.println();
- } else {
- Serial.print(" ");
- }
- }
- Serial.println();
- } else {
- // Send raw data stream
- Serial.write(0x80);
- Serial.write(0x95);
- Serial.write(0x01);
- for (int j = 1; j < ByteCount + 1; j++) {
- Serial.write(DataBytes[j]);
- }
- }
- }
- }
- // Implementation of T_interpolate function
- float T_interpolate(byte DS_Temp) {
- const float TempScale[38] = {1,5,6,9,11,15,19,25,31,38,47,57,67,79,91,104,117,130,142,154,164,175,184,192,200,206,212,217,222,226,230,233,235,238,240,242,244,256};
- const float TempValue[38] = {-40,-30,-25,-20,-15,-10,-5,0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,200};
- float T_Range, T_Diff, TempRange, Temperature;
- int i = 0;
- while (i < 38) {
- if (TempScale[i] > DS_Temp) break;
- i++;
- }
- if (i > 0) {
- T_Range = TempScale[i] - TempScale[i - 1];
- T_Diff = DS_Temp - TempScale[i - 1];
- TempRange = TempValue[i] - TempValue[i - 1];
- Temperature = TempValue[i - 1] + (T_Diff / T_Range) * TempRange;
- } else {
- Temperature = TempValue[0];
- }
- return Temperature;
- }
- // Function to send data over Bluetooth to Android
- void sendDataToAndroid(float RPM, float TPS, float MAF, int BLCELL, int BLM, int INTEGRATOR, float InjPW, float O2mv, float MAT, unsigned int Runtime) {
- // Format data as a comma-separated string
- String dataString = String(RPM, 0) + "," +
- String(TPS, 3) + "," +
- String(MAF, 3) + "," +
- String(BLCELL) + "," +
- String(BLM) + "," +
- String(INTEGRATOR) + "," +
- String(InjPW, 3) + "," +
- String(O2mv, 1) + "," +
- String(MAT, 1) + "," +
- String(Runtime);
- // Send over Bluetooth
- HC05_BluetoothModule_HC05_mySerial.println(dataString);
- }
Advertisement
Add Comment
Please, Sign In to add comment