Hey guys, this a instructable of how to make a bike speedometer.Yeah,you read it right the one that we use in car but only for 10$ .Well the first this for you to know is that this is the collaborated project of Mr_DIY_Electrician and paurushthemaker .So back to topic our project is all about a speedometer which has 3 modes as follow:-

Speedometer(for speed) and odometer(for distance)

Task1.-Cover 20 miles

Task2-Achieve 30mph speed

And yes one more thing is that this is a arduino speedometer so there is no limitation for imagination. Let's Get Started.........


The working of a project is simple. It is also very important to understand it for making the project. Basically the apparatus consists of the reed switch or the magnetic switch mounted on the frame of the cycle and a magnet mounted on the one of the spokes. As the wheel rotates the magnet triggers the switch every rotation. The signal go to the arduino which counts the no of rotation and finds the distance covered(you have to pre enter the diameter of your cycle). The arduino also measures the time and calculates the speed. The output from the arduino then goes to the lcd where it is shown in miles per hour (you can convert it if you want).


The full project would cost you about 5$-10$ depending on the place you live in. The cycle speedometer also would require moderate soldering skills and an afternoon. so without any further ado the materials for the build are --:

1. The arduino board - i got Rs.330 which is around 5$ but to programme the pro mini you will also need to have an arduino uno or an usb to ttl adapter (how to program an arduino pro mini with an uno) or if you don't have it then use an arduino micro or an arduino uno.

2.Arduino 16x2 lcd (Rs150 or 2.3 $)

3.7805 voltage regulator (increases the control over the contrast no major difference -optional)

4. 2x switches for backlight and on off (optional)

5.220 ohm resistor

6. trimer pot 10k ohm

7.female headers and male headers if you want the reed switch to be detachable

8. reed switch


10. a momentary switch to change the modes

11. 0.1uf capacitor to reduce the debounce of the button

12.10k ohm resistor

The tools you would require are

1. soldering iron


3. enclosure

4. cutting tool like the dremel to cut out holes in the enclosure to mount he lcd and stuff

5. hot glue or any adhesive to mount the various components.

Step 3: THE CODE

Before moving on to the electronics it would be good to flash the code so that you don't need to struggle between wires afterwards

flash the given code on the arduino but DON'T FORGET TO SET IN THE DIAMETER OF YOUR CYCLE.

the code can be downloaded below


The wiring diagram can be found above also I have mentioned it down


1 - GND


3 VIPER PIN OF THE POT (ends to vcc and gnd and center to pin 3 of lcd)

4 13

5 gnd

6 12

7 --

8 --

9 --

10 --

11 11

12 10

13 9

14 8

15 VCC

16 GND


a 220 ohm resistor is to be connected between pin 2 of the arduino and ground(pull down)

the momentary switch is connected to pin two and vcc

a 0.1 uf capacitor between the two terminals of the switch to reduce the debounce

the reed switch to vcc and A0

a resistor between A0 and gnd (pull down)

After connecting all this the wiring would be complete and now you can connect power and check if every thing is working


The enclosure can be a plastic box or a wooden , just that it should be sturdy and should have enough space.

After mounting the switches ,lcd,button and headers do check the working of the device also.

as far as possible try and make it waterproof because the cycle goes into the worst of the conditions.t


Connect a 9v battery and test all three modes completely. Bring a magnet close to the reed switch and the speed and distance should increase.

If it is not so in your case then post your doubts and queries in the comments and i will answer them back as soon as possible...



    • Epilog Challenge 9

      Epilog Challenge 9
    • Paper Contest 2018

      Paper Contest 2018
    • Science of Cooking

      Science of Cooking

    We have a be nice policy.
    Please be positive and constructive.




    i also have same problem either 47 or 0 mph

    so please help!!

    Hey guys,

    I copied and pasted the speedometer code onto my arduino, but get either binary results: it read either 0.0 mph or 47 mph. When it read 47pm, there was a long delay in the reading before the "speed" went back down to 0 mph.

    I installed simpler code just to test out the reed switch and it is reading the magnetic field correctly, so the issue isn't in the reed switch. I wonder if there's an issue with the code or the arduino setup.

    Have any of you guys also faced this similar issue? If so, how did you resolve?



    add a resister directly from A0 to the adjacent gnd of the arduino. i think this is becaue the ardunio is not able to receive analog signal from the reed switch.

    i am facing similar kind of problem. The code does display intermediate values at lower rotational speed but at higher rotational speed it displays 47 mph constantly irrespective of the speed of the rotation.

    what Arduino did I you buy?


    i am workind on something similar, he differences are:

    - i have a line follower sensor on digital pin 2

    - i have a black and white stripe with 20 mm between 2 white stripes

    - i need the output on the serial monitor, and not on the lcd.

    i have put up a sketch, but i have some issues with the time.

    i need to:

    - start the counting every time the pin 2 changes (the sensor has moved) and count the millis until next pin 2 changes, and have the speed. at the end, if the pin 2 does not changes for 1 sec, the program stop's

    can someone help me?

    i have this sketch until now:

    // Constante:

    const int buttonPin = 2; // pinul digital pentru senzorul de linie

    // Variabile:

    int buttonPushCounter = 0; // counter numar impulsuri (1 sau 0)

    int buttonState = 0; // starea actuala a senzorului de linie (1 sau zero)

    int lastButtonState = 0; // starea anterioara a senzorului de linie (1 sau zero)

    long time = 0;

    void setup() {

    // inititalizeaza intrarea pentru senzorul de linie:

    pinMode(buttonPin, INPUT);

    // initializeaza comunicatia seriala:



    Serial.println("Program test");



    void loop() {

    // citeste intrarea senzorului de linie:

    buttonState = digitalRead(buttonPin);

    time = 0;

    // compara starea butonului actuala cu cea anterioara

    if (buttonState != lastButtonState) {

    // if the state has changed, increment the counter

    if (buttonState == HIGH) {

    // if the current state is HIGH then the button

    // wend from off to on:




    Serial.print("Deplasare [mm]: ");


    Serial.print("Timp [s]: ");

    time = millis();

    //prints time since program started


    Serial.print("Viteza [mm/s]: ");



    // Delay a little bit to avoid bouncing



    // save the current state as the last state,

    //for next time through the loop

    lastButtonState = buttonState;

    time = 0;


    Hey guys, does anyone know what he meant by pin 2 for the momentary switch? is it from the LCD or pin 2 from Arduino?

    hello i want to build an arduino that measures speed and a proximity sensor , something like i can set it in the car near to see how fast i am going , also i want to make a sensor that will tell me the distance between my hand and my sensor.

    what would i need to do that?

    how to make it in km/h ?

    Hi there thanks for the great instructable! I just wanted to know if it would be possible to add a startup message into the code so when the divice is first powered on it would say "Henrys Bike" for like 10 seconds - Thanks :-)