DIY data collection (with link to working code for Arduino and Bluetooth )



  • I am trying to build a Arduino Uno data device for measuring RPM and pedal position so that we can better select individual gear ratios for a Hewland gearbox to suit different circuits.
    The Racechrono sees the HT-05 module as the OBD-II and says
    Bluetooth OBD-II Reader, Connecting...(waiting). Connected, 0.0kbits/s
    Connected, no data from the...
    The sketch I have tried was written by Guzu I have tried the sketch as written and in modified form with the additional features such as temperature etc turned off.
    I can see the pedal position move on the Serial Monitor as I turn the 5k pot.
    I have the external GPS connected and can see my location in Racechrono.
    The baud rate is set at 9600. Do I need to change the baud rate?
    The GPS is stationary as is the laptop and UNO.
  • @Hustler You have to make sure that the Arduino is transmitting at the same baudrate as the HC-05 is set.
    If the the Arduino is transmitting at 9600 baudrate (Serial.begin(9600)) the HC-05 has to be set at 9600. (the default baudrate of the HC-05 is 9600)
  • Hi Guzu,
    The Racechrono now sees the HT-05 module as the OBD-II and says
    Bluetooth OBD-II Reader, Connected 3.0kbit/s.This varies but is generally around 3.0kbit/s.
    The OBD-II Reader still says Waiting for Data.
    Below is the code I am using that was posted by Guzu some time back.
    I have added a SoftSerial to talk to the Freetronics BT Shield plugged into a UNO board and have recently altered the Serial.begin(9600) and Serial.println to reflect this.
    eg: SoftSerial BTserial(2,3) , BTserial.begin(9600) and BTserial.println to write to the HC-05. This has now connected the BT Shield to Racechrono.
    I have left in the Serial.begin(9600) and Serial.println as the Serial Monitor requires it to work.
    The sketch has optional RC2 and RC3 string formats that I have been working with which I suspect is where my problems are coming from???? The sketch verifies and uploads ok.
    I have turned off some of the other features such as temperature.
    I can see the external GPS but no data from the BT Shield to the OBD-II reader.
    I have a 5k pot connected to A0 Pin, Gnd and 5v and can see it on the Serial Monitor.
    Any comments or assistance would be greatly appreciated.

    // Sketch Start


    SoftwareSerial BTserial(2,3); // RX | TX on Pins 2 & 3 of the Freetronics BT Shield with default setting of 9600 BAUD rate

    int rpm = 0, gear = 0, brake = 0, acceleration = 0, sensorValue1 = 0, sensorValue2 = 0;
    unsigned long count = 0, lastmillis = 0;
    volatile int half_revolutions = 0;
    unsigned long debounceDelay = 200; // the debounce time;
    unsigned long lastDebounceTime = 0; // the last time the gear was changed

    void setup(){
    BTserial.begin(9600); // 9600 sets Rx and Tx to digital pins 2 and 3, these are set with jumpers on the Freetronics Shield
    Serial.begin(9600); // 9600
    attachInterrupt(0, rpm_fan, FALLING);
    pinMode(A0, INPUT); // acceleration connected to a 5k pot
    //pinMode(A1, INPUT); // not used
    //pinMode(9, INPUT); // RPM not used as yet
    //pinMode(11, INPUT); // not used

    void loop(){

    if (digitalRead(11) == HIGH){
    if ((millis() - lastDebounceTime) > debounceDelay) {
    gear += 1;
    if (gear>6){
    lastDebounceTime = millis();
    if (digitalRead(12) == HIGH){
    if ((millis() - lastDebounceTime) > debounceDelay) {
    gear -= 1;
    if (gear<1){
    lastDebounceTime = millis();

    //TEMP reading turn off
    //int reading = analogRead(2); // converting that reading to voltage, for 3.3v arduino use 3.3
    //float voltage = reading * 5.0;
    //voltage /= 1024.0;
    //float temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mV offsetto degrees ((voltage - 500mV) times 100)

    sensorValue1 = analogRead(A0);
    //sensorValue2 = analogRead(A1);
    acceleration = map(sensorValue1, 0, 1023, 0, 100); //maps the input value of 0-1023 to 0-100
    //brake = map(sensorValue2, 0, 1023, 0, 100); //maps the input value of 0-1023 to 0-100

    if (millis() - lastmillis >= 100){ //Update every one hundredth of a second.
    detachInterrupt(0);//Disable interrupt when calculating
    rpm = half_revolutions * 60; // Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use half_revolutions * 30.
    half_revolutions = 0; // Restart the RPM counter
    lastmillis = millis(); // Update lasmillis
    attachInterrupt(0, rpm_fan, FALLING); //enable interrupt

    String buffer = "RC3,," + String(count) + ",,,,,,," + rpm + "," + acceleration + ",,,,,,,,,,,,,,"; // RC3 format. Removed gears, brake, temperatureC.

    //String buffer = "RC2,," + String(count) + "," + rpm + "," + "," + "," + acceleration + "," + "," + "," + "," + ",,,,,,";//Removed gears, brake, temperatureC.
    String checksum = String (checkSum(buffer), HEX);
    String data = "$" + buffer + "*" + checksum;
    BTserial.println (data); //prints data sent to pins 2&3 of BT shield
    Serial.println (data); // prints to serial monitor shows $RC2,,#,0,,,0-100,,,,,,,,,,*checksum or $RC3,,#,,,,,,,0,0-100,,,,,,,,,,,,,,*checksum
    if (count == 65535){
    count = 0;

    char checkSum(String chars) {
    char check = 0;
    for (int c = 0; c < chars.length(); c++) {
    check = char(check ^ chars.charAt(c));
    return check;

    void rpm_fan(){
    //Racechrono shows H5-05 Bluetooth OBD-ii reader Connected, 3.2 kbit/s and OBD-II reader waiting for data
  • @DrMotor I read your discussion, you are using JDY-30. You talked about problems with this module and lower speed. And there are any advantages, compared with hc05/06?
  • @Hustler Hi. So basicly, you can se the data on the serial monitor, but you cannot see it in RaceChrono?
  • Guys, I can only recommend to raise the BT baudrate! This will speedup the messages per second instantly!

    It could be easy, but sadly the HC-models differ a bit (Lineendchar and stuff).
    But I found a way around it, which does it quite well for me:

    But be aware: The Softwareserial is limited.

    @sst78rus I´m using a HC-06 and it works fine since several years.
  • una consulta, en que canal se ponen las RPM en el codigo para que racechrono lo lea?
  • @sebaguaita119, you should look for "RPM" in the code:
    >>> #define RPM PB0 // optional: Pin for ignition "probe"
    PB0 is a pin on STM32/"Blue pill".
    (Arduino Nano also has PB0, but I have not tried it for RPM)

    ...and it is sent to Rachechrono on the phone via $RC3, UART and bluetooth
  • @DrMotor - Is RaceTemp 0.7.5 the latest version? I'm getting a number of errors like ('HardwareTimer' was not declared in this scope) and ('I2C_FAST_MODE' was not declared in this scope). These appear to be library issues but my programming knowledge is based on an engineering FORTRAN class in the last century. I understand the program flow but don't know how to debug the structural issues.
  • @jspicer

    Did you follow the instructions under point 2 (and 2c) in the code?
    2c.Restart Arduino GUI and select:
    * Tools --> Boards --> Boards manager --> search for and install "SAM Boards"
    * Tools --> Boards --> Generic STM32F103C
    * Tools --> Upload method: STM32duino_bootloader (if you upload via USB)
    * Tools --> Variant --> set it to 128 kB (or try 64)

    It compiles OK on my computer. I only had to re-install (or upgrade?) "SAM Boards" after upgrading to new Arduino version.
  • Issue solved. Here was the problem. does not exist any longer so you can't download the boards package. Its been ported to github with a different board package. I used the STMCores by STMmicroelectronics board package and got compile errors as stated above. RaceTemp 0.7.5 was written using the STM32duino board package and libraries. You must acquire the board manager package from which does still exist by inserting the URL into the Additional Boards Manager URL in the preferences. Then you can choose the STM32F1xx/GD32F1xx board package by stm32duino. Uninstall the STMCores.
  • @jspicer
    You probably don't need that http-link to STM32duino: Just search for "SAM Boards" (and install) in the Arduino IDE under menu Tools --> Boards --> Boards manager -->
  • @DrMotor , first of all - Thanx for this project, it's awesome :-) Even though I'm a noop using STM32 and as such it's inspiring and a project I'm working on for a group of Yamaha KT100 users, myself included.

    Second, I've hit the same bump as you mentioned regarding the JDY-30 (I've got JDY-31, which essentially should be the same). When I look at the data the STM32 is producing (USB data output below) the BT transmission is being corrupted at 128000 baud and 115200baud (pic iaw. DB link). When I lower the baud to 9600 the data transmitted is more complete (pic iaw. DB link), but still some data is being corrupted, hence RaceChrono does not see the GPS data (waiting for data ... and No fix to sattelites).

    My setup is iaw. @mmrizio sketch --> with only the NEO M8N GPS Module attached. I've used both a Samsung GT-I9000 and a Huawei Mate7 same result!

    I can only think of possible error's below:
    1) Maybe the JDY-31 is not being configured correctly!
    I've referenced the datasheet, however, as an example, when I use the AT+BAUD or AT+VERSION commands the module does not return a response!;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwi09rOHhNbkAhVQIVAKHWgND_cQFjAAegQIAhAC&amp;url=;usg=AOvVaw1mS7CdaI0em59S3IRDBa-L

    2) does the STM32F103C8T6 provide 5V on A9 TX, A10 RX?
    If yes, then I would need to add 1K/2K pull down on the TX?

    3) Maybe it's JDY-30/31 firmware issue as you stated?
    Well, I've just ordered some HC06 and try those instead.

    Lastly, I can't upload compile/upload sketch via USB even though the STM32 is recognized as COM6 Maple Mini, however I can compile/upload via the STLink! And as shown below, I can monitor the STM32 via USB. Wierd!!
    Using USB to compile/upload a sketch the Arduino returns with the following:
    maple_loader v0.1
    Resetting to bootloader via DTR pulse
    Searching for DFU device [1EAF:0003]...
    dfu-util - (C) 2007-2008 by OpenMoko Inc.
    Couldn't find the DFU device: [1EAF:0003]


    PNG's with 128000baud and 9600baud.

    STM32F103C8T6 data output from Serial Monitor (USB):
    22:15:46.713 -> RaceTemp -- DIY input device for RaceChrono. 100Hz update
    22:15:46.713 -> Bluetooth at baudrate 115200 :-/
    22:15:46.713 -> Setup GNS
    22:15:47.019 -> Setup analog channel(s)
    22:15:47.019 -> Setup digital channels (ignition probe for RPM)
    22:15:47.019 -> Setup timer
    22:15:47.019 -> Setup complete :p)
    22:15:47.019 -> $RC3,,0,0.000,0.000,0.000,0.000,0.000,0.000,inf,,25.803,105.273,50.000,40.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000*4E
    22:15:47.053 -> $GNRMC,000000.000,V,00000.00000,S,00000.00000,W,0.0000,0.00,000000,0.0,E,A*33
    22:15:47.053 -> $GPGGA,000000.000,0000.00000,S,00000.00000,W,0,00,0.00,0.0,M,0.0,M,,*52
    22:15:47.053 -> $GNRMC,000000.000,V,00000.00000,S,00000.00000,W,0.0000,0.00,000000,0.0,E,A*33
    22:15:47.053 -> $GPGGA,000000.000,0000.00000,S,00000.00000,W,0,00,0.00,0.0,M,0.0,M,,*52
    22:15:47.053 -> $GNRMC,000000.000,V,00000.00000,S,00000.00000,W,0.0000,0.00,000000,0.0,E,A*33
    22:15:47.088 -> $GPGGA,000000.000,0000.00000,S,00000.00000,W,0,00,0.00,0.0,M,0.0,M,,*52
    22:15:47.088 -> $GNRMC,000000.000,V,00000.00000,S,00000.00000,W,0.0000,0.00,000000,0.0,E,A*33
    22:15:47.088 -> $GPGGA,000000.000,0000.00000,S,00000.00000,W,0,00,0.00,0.0,M,0.0,M,,*52
    22:15:47.122 -> $RC3,,1,0.000,0.000,0.000,0.000,0.000,0.000,inf,,25.933,38.803,50.000,40.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000*7F
    22:15:47.224 -> $RC3,,2,0.000,0.000,0.000,0.000,0.000,0.000,inf,,26.001,32.753,50.000,40.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000*77
    22:15:47.326 -> $RC3,,3,0.000,0.000,0.000,0.000,0.000,0.000,inf,,26.040,29.930,50.000,40.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000*72
    22:15:47.393 -> $GNRMC,201547.600,A,05515.43353,N,00918.06510,E,0.0000,0.00,150919,0.0,E,A*29
    22:15:47.393 -> $GPGGA,201547.600,5515.43353,N,00918.06510,E,0,00,30826.11,29.1,M,44.0,M,,*5F
  • Winter Update
    I've had some serious trouble with the JDY-30 Bluetooth module, which I've replaced with HC-06 and now it's working a-ok sending data ~25 kbit/s w/10Hz and only 4 sats acquired at the time of testing.

    Furthermore RaceTemp_v0.7.5 needs a minor modification to get the MPU to work as the MPU is connected to PB10 (SCL2) and PB11 (SDA2), iaw. DrMotor and mmrizio connections sketches, whilst the code states as follows under // setting all GPIO pins to output low:
    #ifndef MPU
    pinMode(PB11, OUTPUT); digitalWrite(PB11, LOW);
    pinMode(PB12, OUTPUT); digitalWrite(PB12, LOW);

    This must be updated to the following:
    #ifndef MPU
    pinMode(PB10, OUTPUT); digitalWrite(PB10, LOW);
    pinMode(PB11, OUTPUT); digitalWrite(PB11, LOW);

    I've also got the hall sensor OH4913B to react on a small magnet passing over the hall sensor in simulation of a racetrack magnet strip, which in return updates the timestamps in the $RC3 messages.

    I think I'll have to add two toggle switches to be able to set the amount of RaceTrack MagnetStrip (1,2 or 3) in order not to have to drag a laptop to the racetrack to reprogram the amount of MagnetStrips (locally we have two tracks with either two or three magnetstrips)!

    Shout-out to DrMotor ;-)
  • hello, i have a question if i buy the arduino elements and install the library its enough for it to work? or i need to do other process? thanks

  • Hello, many thanks for sharing this project here.

    My setup was the 0.75 racetemp with the HC-06 BT module and the MN8 GPS module.

    After setting baudrate for BT to 115200 it connect to racechrono and show some measuring. Unfortunately it didn't connect with the GPS module. Is there anything else todo in the code to activate GPS?

    MN8 GPS module works great on another Arduino sketch for testing it.


  • Goodmorning everyone. I found this discussion because I also use racechrono for kz karting, and I also wanted to add the water temperature, exhaust temperature and rpm data. Unfortunately, I am not good with electronics. Can someone sell me all the kit already programmed and working or can you explain me step by step how to do it? thanks
  • for the magnetic laptime sensor, i took apart an original alfano magnetic sensor. its just a reed switch, no hall sensor needed. it didnt have any numbers on it, but after searching online, it looked exactly like a fr2025 reed switch. i barely got my script working ( not good with arduino, and had to use a neo 6m since its the only one available here and never got the gps working, so now i just use this script for temp sensor), so someone might could add the reed switch feature?
  • hello, is this project still alive? im having trouble compiling the sketch. Im using the latest stm32duino files on github. there is alot of error during my trial and error. So i wonder this thread still alive.
  • The code depends on your device which you are using. What are u using?
  • @R1Snake hey buddy.

    i am using the last racetemp 0.75, Stm32 bluepill, HC-06 and M8N ublox. As far as i know the original stm32duino website is down and they changed to github.

    all the instruction in the arduino sketch is based on an old website so when i tried to compile/upload i will get an error.

    After reading a few post earlier from @jspicer recommend to use a link from here ( and by using his instruction i can now upload to the bluepill but encounter another problem which i cant get data logger to work. I cant get my analog reading for temperature and throttle. Even when i tried to put a fix figure just to let RC3 script detect my input still when in serial monitor RC3 script only get GNS data.

    sorry my english is not good. but im looking forward to fix the issue. i would prefer direct communication via discord or any recommendation for easier communication.
  • Great news if you can upload the scetch.

    Important for Serial BT is, that you can not transmit GPS and Can Messages at the same time. You have to transmit first all of your GPS Data and after that you can send your CAN Data.

    I had the same problem
  • On additional problem was the checksum:

    Check my code:

    sprintf(buffer, "RC3,%s,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",

    int lenght = strlen(buffer);
    for (int i = 0; i < lenght; i++)
    checksum = checksum ^ (uint8_t)buffer[i];

    bt_Provider->SerialBT.printf("$%s*%02X\r\n", buffer, checksum);
  • @R1Snake yes, that is why the GNS data will do sequencing with data logger.

    I see your sketch is actually different with racetemp 0.7.5, yours are using CanBus.

    (im maybe wrong, i have minimum understanding of using sketch
  • Yes in my example i am using canbus, but you can change to code to the variables you want to use.

    You only have to remove my can_Provider->decodedMessages.... with your variables.
  • Important is the buffer variable because this buffer represents the format RC wants to have and the checksum creation.

    At the end I merge the RC3 buffer variable with my checksum value and send this via SerialBT to my device:

    bt_Provider->SerialBT.printf("$%s*%02X\r\n", buffer, checksum);

  • Great to see there's life in this topic again. I got my setup partly working initially, but lost focus while I was waiting for parts to come in. I will refresh my tool-chain, dust off my knowledge and retry with the latest info posted here :smile:
  • edited October 2021

    Wrong thread...

  • can someone please help me out, ive been trying to get the magnetic laptime to work but nothing works, ive activated it in the arduino program, i want it activated by a reed switch but just nothing works, ive tried it with voltage dividers, even hall sensors but even that wont work, can somebody tell me what im missing?
Sign In or Register to comment.