Introduction: DIY Bike Tachometer

I will show you how to build a bike speedometer. It shows your speed,
the average speed,the temperature, the trip time and the total distance. You can change it using the button. Additionally, the speed is shown on a tachometer. I built it because I like building new things, I have not found anything like this on the internet so I want to show you how to build a good speedometer as the one on my bike is not as cool as I want :) . So let's get started.

Step 1: Parts:

This is a list of parts that you will need. They cost me about $ 40 but I bought them in Poland.

-arduino

-bike with reed switch

-LCD display 16x2

-servo

-breadboard

-thermometer DS18B20

-resistor 1.2k Ω , 4.7k Ω

-switch

-button

-potentiometer 10 kΩ

-9V battery

-cables

-box

-tools (drill, soldering, knife, tape)

Step 2: Connection

I added a picture from Fritzing and verbal description of how to connect it. In the picture all red wires are connected to 5V, all blue cables are connected to GND.

  • LCD display:

VSS --> GND Arduino

VDP --> 5V Arduino

VO --> output potentiometer (potentiometer VCC -> 5V Arduino, potentiometer GND -> Arduino GND).

RS --> pin 12 Arduino

RW --> GND Arduino

E --> pin 11 Arduino

D4 --> pin 5 Arduino

D5 --> pin 4 Arduino

D6 --> pin 3 Arduino

D7 --> pin 2 Arduino

A --> 5V Arduino

K --> GND Arduino

  • Servo:

VCC --> 5V Arduino

mass --> GND Arduino

Data --> pin 6 Arduino

  • Thermometer:

VCC --> 5V Arduino

mass --> GND Arduino

Data --> pin 1 Arduino

data and power is connected via a 4.7 kΩresistor

  • Sensor on wheel:

one end -> 5V Arduino

second end -> A0 Arduino and resistor 1,2 kΩ

The other end of the resistor to ground in the Arduino

  • Button:

one end --> 5V Arduino

second end --> A1 Arduino

Step 3: Upload Code:

Below I added the code in comments there is an explanation.

links to the download libraries:

http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip

https://github.com/milesburton/Arduino-Temperature-Control-Library

If you have a different wheel diameter you have to change it. You can calculate it with this formula:

circuit = π*d*2,54 (d=diameter of your wheel, I multiplied it by 2.54 to get the result in meters).

/*
##################################################


Copyright by Nikodem Bartnik june 2014


##################################################
*/




//librarys
#include  < Servo.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);


//LCD display pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//servo name
Servo myservo;
//definition of variables
 long previous, triptime, time, impulses;
 float speedometer, dist, aspeed;
 int servo;
 int screen=1;
 //If you have other circuit of wheel you need change it
 float circuit=2.0;
 double temperature;
 
 
 void setup() {


 lcd.begin(16, 2);</p><p>
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  
  //servo definition and setting the tachometer to 0
  myservo.attach(6); 
  myservo.write(180);
  lcd.print("Bike tachometer");
  delay(1000);
  lcd.setCursor(5, 1);
  lcd.print("V 1.0");
  delay(4000);
  lcd.clear();
  delay(500);
  lcd.setCursor(0, 0);
  lcd.print("Dist:");
 } 




 void loop() {
   //if wheel turns
   if(analogRead(A0)>=300){
      //number of turns++
      impulses++;
      //count turn time
    time=(millis()-previous);
    //count speed
    speedometer=(circuit / time)*3600.0;
  previous=millis();
    Tachometer();
  delay(100);
}

  Lcd(); 
   }
   
   //display speed on tachometer
   void Tachometer(){
     //map speed 0-180 to servo
  speedometer=int(speedometer);
  servo = map(speedometer, 0, 72, 180, 0);
  //setup servo
  myservo.write(servo);
   }
  
  
  
    void Lcd(){
       //when button is clicked
      if(analogRead(A1)>=1010){
        lcd.clear();
      screen++;
      if(screen==5){
          screen=1;
        }
      }
   
        if(screen==1){
        //displays speed
        lcd.setCursor(0, 1);
        lcd.print("Speed:");
        lcd.setCursor(7, 1);
        lcd.print(speedometer);
        lcd.print("km/h");
        }
        
        if(screen==2){
          
        //displays themperature
        temperature=sensors.getTempCByIndex(0);
        sensors.requestTemperatures(); 
        lcd.setCursor(0, 1);
        lcd.print("Temp:");
        lcd.setCursor(7, 1);
        lcd.print(temperature);
        lcd.print(" C");
        }
        
        if(screen==3){
          //displays averagr speed
        aspeed=dist/(millis()/1000.0)*3600.0;
        lcd.setCursor(0, 1);
        lcd.print("A.speed:");
        lcd.setCursor(8, 1);
        lcd.print(aspeed);
        lcd.print("km/h");
        }
        
        if(screen== 4){
          //diplays trip time
        triptime=millis()/60000;
        
        lcd.setCursor(0, 1);
        lcd.print("Time:");
        lcd.setCursor(7, 1);
        lcd.print(triptime);
    
        
        }
        
       
        lcd.setCursor(0, 0);
        lcd.print("Dist:");
        //calculation of the distance
       dist=impulses*circuit/1000.00;
       //dislays distance
       lcd.setCursor(6,0);
       lcd.print(dist);
       lcd.print("km");
      }                                                     

Step 4: Pack

As a cover I used a plastic box I bought for $ 1. I cut holes using a knife and a drill. Servo and LCD display I glued with a tape, tip I made with carton and painted it with paint. I did shield in Corel Draw X5 and I printed it, I added a PNG image, and Corel Draw file (if you want, you can edit it). I clipped the box to steering wheel on my bike and I soldered cables to the reed switch.

Step 5: Run It!

Now it is ready. All you need to do is turn it on and ride. Have fun with your speedometer. If you like this project, please vote on me.

Comments

author
KIMBONGCHILL made it!(author)2014-08-27

what are you using for the sensor

author
Nikus made it!(author)2014-09-02

I use reed switch.

author
CurtR made it!(author)2017-05-15

What are you using to close the reed switch? Usually a magnet is used. Did you leave this out or is there another way to activate the switch?

author
Cleytond made it!(author)2017-04-28

What is the maximum speed? Can I use it in a car?

author
Nikus made it!(author)2017-04-28

Yes, you can use it in a car

author
Cleytond made it!(author)2017-04-28

I intend to use only the LCD

author
mazena made it!(author)2015-04-01

i have run the code, but it counts by it self and the speed is 63 as a stable speed. It should give 0.00 . Any solution for that?

and thank you for the ide

author
vordesigns made it!(author)2017-02-18

Congratulations Nikus, great proyect, but I have the same problem. Can you help me? Mi email is vordesigns@hotmail.com. I will thank you very much.

author
Nikus made it!(author)2017-02-19

Check if you have everything alright with connection. Hard to say but for sure you have problem with hardware. It is also possible that you used NC reed switch (normally close) but you should use NO (normally open)

author
vordesigns made it!(author)2017-02-24

hi, is very important this proyect for me, can you sell me the proyect Assembled and working? i really apreciate a good price.

author
vordesigns made it!(author)2017-02-23

I really appreciate your response. I checked the connections and they are well, I even put the cables of the same color that your own but still the same. My switch is a push buttom (NO). I'm thinking that the problem may be the libraries that may change or be different from yours. Could you send them to my mail? vordesigns@hotmail.com. Thanks very much Nikus!

author
Mat%C3%BA%C5%A1M2 made it!(author)2016-02-01

I have the same problem.

author
karthik60 made it!(author)2016-05-23

This is a speedometer ,not a tachometer.

author
pintushaw made it!(author)2016-04-12

Which arduino board you have used?

author
Nikus made it!(author)2016-04-12

leonardo

author
Yonatan24 made it!(author)2015-11-04

Looks really cool! I can put this on my To-Do list (after I learn arduino :( ...)

author
Nikus made it!(author)2015-11-04

Thanks! Good luck with arduino

author
ranjith5581 made it!(author)2014-11-13

Could you tell us more about Reed switches and How to connect Reed switch to wheels..?

author
epicali made it!(author)2014-07-06

is there anychance that the sensor would be a steppermotor connected to the wheel ?

author
Lowkey+Lyesmithe made it!(author)2014-09-19

If you were to connect a regular motor to the wheel, you could measure its voltage and get an accurate reading of your speed, you could also use that voltage to run your system and forgo batteries altogether!

author
Nikus made it!(author)2014-07-06

I've never done anything with steppermotors so I do not know. Now I'm going on holiday so I can't check it but when I get back I'll try.

author
zapro made it!(author)2014-09-09

Cool project!

You can save a wire on the DS18B20 by running it in parasite-power-mode. It's supported by the PJRC-library.

Also, i don't know how much time you get out of the 9V battery, but i cannot be very much. 40% of the energy of the 9V battery is lost as heat in the voltage regulator on the Arduino, and there isn't much more than 600 mAh in one of those, so it will run down very fast. You will get much longer runtime with a battery holder for 3 AA-cells, and connecting that to the 5V-rail. It should be plenty enough to run all your stuff nicely. If not, use 5 AA-cells, and wire it to the VIN-terminal. Then you will have 2000-2500 mAh capacity :D

author
Nikus made it!(author)2014-09-10

Thank you.

I know about the 9V battery, about temperature sensor too. I plan to do a second version which will have a more function and other power will be much smaller size.

author
Psycho4Ever made it!(author)2014-07-06

Nice idea :)

author
Nikus made it!(author)2014-07-06

Thank you :)

About This Instructable

31,988views

189favorites

License:

Bio: Hi, my name is Nikodem Bartnik. I live in Poland, I'm 18 years old. I like to program and create robots, devices and things ... More »
More by Nikus:BoseBuild GoPro MountCheap 30x30x40cm 3D PrinterFidget Spinning Robot
Add instructable to: