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.........

## Step 1: HOW IT WORKS

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).

## Step 2: MATERIALS REQUIRED

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

9.wire

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

2.solder

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

## Step 4: THE ELECTRONICS

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

LCD -ARDUINO

1 - GND

2 VCC

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

Also

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

## Step 5: THE ENCLOSURE

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

## Step 6: TESTING AND TROUBLESHOOTING

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...

<p>Hey guys,</p><p>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 &quot;speed&quot; went back down to 0 mph. </p><p>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.</p><p>Have any of you guys also faced this similar issue? If so, how did you resolve?<br><br>Thanks,<br><br>John</p>
<p>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.</p>
<p>what Arduino did I you buy?</p>
<p>Hello,</p><p>i am workind on something similar, he differences are:</p><p>- i have a line follower sensor on digital pin 2</p><p>- i have a black and white stripe with 20 mm between 2 white stripes</p><p>- i need the output on the serial monitor, and not on the lcd.</p><p>i have put up a sketch, but i have some issues with the time.</p><p>i need to:</p><p>- 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</p><p>can someone help me?</p><p>i have this sketch until now:</p><p>// Constante:</p><p>const int buttonPin = 2; // pinul digital pentru senzorul de linie</p><p>// Variabile:</p><p>int buttonPushCounter = 0; // counter numar impulsuri (1 sau 0)</p><p>int buttonState = 0; // starea actuala a senzorului de linie (1 sau zero)</p><p>int lastButtonState = 0; // starea anterioara a senzorului de linie (1 sau zero)</p><p>long time = 0;</p><p>void setup() {</p><p>// inititalizeaza intrarea pentru senzorul de linie:</p><p>pinMode(buttonPin, INPUT);</p><p>// initializeaza comunicatia seriala:</p><p>Serial.begin(115200);</p><p>Serial.println(&quot;________________________&quot;);</p><p>Serial.println(&quot;Program test&quot;);</p><p>Serial.println(&quot;________________________&quot;);</p><p>}</p><p>void loop() {</p><p>// citeste intrarea senzorului de linie:</p><p>buttonState = digitalRead(buttonPin);</p><p>time = 0;</p><p>// compara starea butonului actuala cu cea anterioara</p><p>if (buttonState != lastButtonState) {</p><p>// if the state has changed, increment the counter</p><p>if (buttonState == HIGH) {</p><p>// if the current state is HIGH then the button</p><p>// wend from off to on:</p><p>buttonPushCounter++;</p><p>time++;</p><p>}</p><p>Serial.print(&quot;Deplasare [mm]: &quot;);</p><p>Serial.println(buttonPushCounter*20);</p><p>Serial.print(&quot;Timp [s]: &quot;);</p><p>time = millis();</p><p>//prints time since program started</p><p>Serial.println(time/1000);</p><p>Serial.print(&quot;Viteza [mm/s]: &quot;);</p><p>Serial.println((buttonPushCounter*20)/(time/1000));</p><p>Serial.println(&quot;________________________&quot;);</p><p>// Delay a little bit to avoid bouncing</p><p>delay(1);</p><p>}</p><p>// save the current state as the last state,</p><p>//for next time through the loop</p><p>lastButtonState = buttonState;</p><p>time = 0;</p><p>}</p>
<p>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? </p>
<p>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. </p><p>what would i need to do that? </p>
<p>how to make it in km/h ?</p>
<p>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 &quot;Henrys Bike&quot; for like 10 seconds - Thanks :-)</p>
In the beginning of the setup section on the code, put something like:<br>lcd.print (&quot;&quot;);<br>delay (10000);<br>lcd.clear ();<br><br><br>The rest of the code goes below.
In the quotations is where your message will go
<p>Can anyone explain the purpose of the reedcounter and max reed counter?</p>
<p>Hey guys,</p><p>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 &quot;speed&quot; went back down to 0 mph. </p><p>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.</p><p>Have any of you guys also faced this similar issue? If so, how did you resolve?<br><br>Thanks,<br><br>John</p>
<p>how to convert from MPH to KMH?</p><p>what the meaning of value = 56.8 on equation below:</p><p>&quot;mph = (56.8*float(circumference))/float(timer);//calculate miles per hour&quot;</p><p>would you explain to me about &quot;how it work&quot; of your code?</p>
<p>I'm not the OP, but this is how:<br>you provide r [in]<br><br>1000 [cyc] * 60 [sec] * 60 [min] * [ft] * [mi]<br>---------------------------------------------<br>12 [in] * 5280 [ft] * [sec] * [hr]<br><br> = 56.81818...<br><br>The 56.8 is just unit conversion from (circumference in inches per 1000Hz interrupt) to (miles per hr)<br><br>To get kilometers per hour, just do one more unit conversion<br><br>mi 1 km<br>----- * --------<br>hr 0.621371<br><br>In other words, change 56.8 in the code to 91.44 (still specifying radius in inches)<br>(you'll have to change other magic values in the code too)<br><br>To do it properly (specify radius in cm) you should redo the calculation similar to what I have done above, but starting from centimeters instead of inches. Left as an exercise to the reader.</p><p>Here's the fancy name for what I've done in a wikipedia article.</p><p><a href="https://en.wikipedia.org/wiki/Dimensional_analysis" rel="nofollow">https://en.wikipedia.org/wiki/Dimensional_analysis</a></p><p><br>in school we called it the &quot;factor label method&quot;</p>
<p>This is now housed in a plastic 3x5 card box, temporarily stuck to the bike with a couple of &quot;repair straps&quot; of metal from the big box store. This means my wife can know clock her workouts. I just have to repair the cracked vinyl seat and the front roller that cracked of the axle.</p>
<p>I had an exercise bike without a control head. It died years ago. The back bar under the seat is extra long so I sometimes trip over it. I was going to junk the thing until I found this article. The project is running, but is not in a housing yet. I'll post pictures of the unit and the installation. Thanks for saving us a TON on exercise equipment.</p>
congratulations<br>and thanks for the encouraging comments
<p>Great Job &iquest;Do you know how to convert to energia code for msp430g launchpad o TI?</p>
<p>Hey electroguyz,</p><p>I have tried your code and many others on Instructables. I am not using an LCD currently with this project, just the Serial Monitor. When the switch is high, the Serial Monitor will display the speed and then &quot;47.68 mph&quot; after that, until the switch is closed again. Unlike the other sketches, the Serial Monitor will display the speed for at least one line. There seems to be quite of few people having problems with this on other instructable, yet no answer. Any suggestions? Thanks. </p><p>On some of the other sketches, I eliminated the LCD factors within the code and was still getting the same result. </p>
<p>hi my congratulations on your project, I am willing to use my old moped 1978, more wanted to convert to KPH, I'm starting now with Arduino and do not know how to make this change from mph to kph. thank's for your time.</p>
<p>Just wondering if a Hall Effect speed sensor would be more reliable than the reed switch? I think that the reed switch has a moving part that seems like could be affected by bumps. I also wonder if it would work above a certain speed? </p>
no a hall effect sensor will not work that well because a hall effect sensor also measures proximity of a magnet also. This will cause multiple readings and false triggering<br><br>though you can use a hall effect switch
<p>Thanks for the response. I am new to the Arduino and electronics in general so thanks for indulging my newbie questions. If I understand your code, it appears that you are using an interrupt to check the reed switch 16 times a second (correct?). Every time that it detects that the switch is closed, it sets the counter to zero. This would have the effect of eliminating multiple reads in case the switch is still closed on subsequent interrupts. Once the switch is open, the number of 1/16th second intervals are counted until the switch closes again and the speed is calculated (using circumference and number of timer intervals). It would seem that a hall effect sensor would behave in exactly the same way as the reed switch because your interrupt logic discards multiple readings. Maybe the difference has more to do with the the type of signal that hall effect sensor provides or maybe that is the difference between a hall effect sensor or switch that you alluded to? It turns out that I have a hall effect sensor in my Arduino starter kit. It gives me a high or low reading but nothing in between. Do you think this means that it is a hall effect switch? </p>
<p>See the thing is that use hall effect sensor will give more precise and accurate result.But DIY means making things cheaper and other thing is that it would take more space to program it.</p>
<p>See the thing is that use hall effect sensor will give more precise and accurate result.But DIY means making things cheaper and other thing is that it would take more space to program it.</p>
<p>See the thing is that use hall effect sensor will give more precise and accurate result.But DIY means making things cheaper and other thing is that it would take more space to program it.</p>
Please support us like this and feel free to ask any doubts <br>
Great idea!!<br><br>Didn't see the wiring diagram though....?
thanks<br>I gave mentioned the wording diagram for the LCD but for the switches and resistors I have just written it down
wiring <br><br>sorry because of the autocorrect
<p>This is a really cool idea! Nice work!</p>
thanks

### About This Instructable

55,416views

185favorites

License:

Bio: We are two electronic hobbyist aiming to unleash the capability of arduino
More by electroguyz:
Add instructable to: