To make a tachometer for bicycle tachometer we will be using Arduino and reed switch as the main component. We will design the tachometer to Display Speed and also temperature. Following are the list of components required.
Parts list:
- Arduino
- Bicycle with reed switch
- LCD display 16×2
- thermometer DS18B20
- Servo
- resistor 1.2k Ω , 4.7k Ω
- potentiometer 10 kΩ
- Miscellaneous – 9V battery, cables, switch, button
- Enclosure
- breadboard
Note that you can omit the Servo if you do not want to display speed in graphical way.
You may refer my earlier post on how to connect LCD display, measure temperature using DS18b20 sensor and how to control servo using Arduino
How to connect 16*2 LCD display Arduino UNO
How to Measure temperature with Arduino and DS18B20 sensor?
Servo Motor Control using Arduino
Step 1: Connecting the 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 with 1.2 k resistor
- K –> GND Arduino
Step 2: Connecting the Servo
- VCC –> 5V Arduino
- mass –> GND Arduino
- Data –> pin 6 Arduino
Step 3: Connecting the Thermometer
- VCC –> 5V Arduino
- mass –> GND Arduino
- Data –> pin 1 Arduino
data and power is connected via a 4.7 kΩresistor
Step 4: Sensor on wheel (reed switch)
- one end -> 5V Arduino
- second end -> A0 Arduino and resistor 1.2 kΩ
The other end of the resistor to ground in the Arduino
Step 5: Connect the Button
- one end –> 5V Arduino
- second end –> A1 Arduino
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).
//Code #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 diameter of wheel you need change it float circuit=2.0; double temperature; void setup() { lcd.begin(16, 2); 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"); }
Cut the image below and stick on top of the enclosure. You need to position the servo at the Centre. Movement of the arm will indicate the speed in the tachometer for bicycle. To make it simple you can omit this part and just use the LCD to display the speed and distance only. Temperature display is also optional. May be you can add extra features one by one.