Hi guys,
So I'm doing a project in which I need to create a speedometer using Arduino Uno. I'm using a reed switch (this one to be specific: $1.49 - Magnetism Sensor / Reed Switch - Tinkersphere) to detect a magnetic field to track the rotation of a wheel to Arduino.
Here's the setup & code (mostly borrowed from (http://www.instructables.com/id/Arduino-Bike-Speedometer/):
The blue wire is going to GND, and yellow to digital pin 2.
#define reed 2//pin connected to read switch
//storage variables
int reedVal;
long timer;// time between one full rotation (in ms)
float mph;
float radius = 8.5;// tire radius (in inches)
float circumference;
int maxReedCounter = 100;//min time (in ms) of one rotation (for debouncing)
int reedCounter;
void setup(){
reedCounter = maxReedCounter;
circumference = 2*3.14*radius;
pinMode(reed, INPUT_PULLUP);
// TIMER SETUP- the timer interrupt allows precise timed measurements of the reed switch
//for more info about configuration of arduino timers see http://arduino.cc/playground/Code/Timer1
cli();//stop interrupts
//set timer1 interrupt at 1kHz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;
// set timercount for 1khz increments
OCR1A = 1999;// = (1/1000) / ((1/(16*10^6))*8 ) - 1
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS11 bit for 8 prescaler
TCCR1B |= (1 << CS11);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//allow interrupts
//END TIMER SETUP
Serial.begin(9600);
}
ISR(TIMER1_COMPA_vect) {//Interrupt at freq of 1kHz to measure reed switch
reedVal = digitalRead(reed);//get val of 2
if (reedVal){//if reed switch is closed
if (reedCounter == 0){//min time between pulses has passed
mph = (56.8*float(circumference))/float(timer);//calculate miles per hour
timer = 0;//reset timer
reedCounter = maxReedCounter;//reset reedCounter
}
else{
if (reedCounter > 0){//don't let reedCounter go negative
reedCounter -= 1;//decrement reedCounter
}
}
}
else{//if reed switch is open
if (reedCounter > 0){//don't let reedCounter go negative
reedCounter -= 1;//decrement reedCounter
}
}
if (timer > 2000){
mph = 0;//if no new pulses from reed switch- tire is still, set mph to 0
}
else{
timer += 1;//increment timer
}
}
void loop(){
//print mph once a second
Serial.println(mph);;
delay(100);
}
Anyway, my problem is that when the magnet is not close, it prints the value 30.02 instead of 0.0 for some reason. When it is close, it quickly prints what appears to be the proper speed, but then goes back to 30.02 in the next println