Arduino cykel hastighetsmätare (11 / 16 steg)
Steg 11: Sista hastighetsmätare kod
Mäta radien av dina däck hjul (i tum) och infoga den i raden: float radie = ''';
cykel hastighetsmätare
Amanda Ghassaei 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
utgångar hastigheten på cykel till LCD
beräkningar
däckets radie ~ 13.5 inches
omkrets = pi * 2 * r = ~ 85 inches
max hastighet av 35 km/h = ~ 616inches/sekund
Max rps = ~7.25
#define reed A0 /-pin ansluten till läsa switch
lagring variabler
float radie = 13,5; / / däck radius (i tum) - ändra detta för din egen cykel
int reedVal;
lång timer = 0; / / tid mellan en full rotation (i ms)
flyta mph = 0.00;
float omkrets;
booleska bakgrundsbelysning;
int maxReedCounter = 100; //min tid (i ms) av en rotation (för debouncing)
int reedCounter;
void setup() {
reedCounter = maxReedCounter;
omkrets = 2 * 3.14 * radie.
pinMode (1, OUTPUT); //tx
pinMode (2, utgång); //backlight växla
pinMode (reed, ingång);
checkBacklight();
Serial.write (12), //clear
TIMER SETUP - timer avbrottet tillåter preceise tidsinställda mätningar av reed switch
mor finns information om konfiguration av arduino timers http://arduino.cc/playground/Code/Timer1
(CLI); //stop avbrott
Ställ in timer1 avbrott vid 1kHz
TCCR1A = 0; / / Ställ in hela TCCR1A register till 0
TCCR1B = 0; / / samma för TCCR1B
TCNT1 = 0;
ställa in timer räknas 1khz steg
OCR1A = 1999. / / = (1/1000) / ((1/(16*10^6))*8) - 1
Aktivera CTC läge
TCCR1B | = (1 << WGM12);
Ange CS11 bit för 8 prescaler
TCCR1B | = (1 << CS11);
Aktivera timern jämför avbrott
TIMSK1 | = (1 << OCIE1A);
SEI (); //allow avbrott
AVSLUTA INSTALLATIONSPROGRAMMET FÖR TIMER
Serial.BEGIN(9600);
}
void checkBacklight() {
bakgrundsbelysning = digitalRead(2);
om (bakgrundsbelysning) {
Serial.write (17), //turn bakgrundsbelysningen på
}
annat {
Serial.write (18), //turn bakgrundsbelysning av
}
}
ISR(TIMER1_COMPA_vect) {//Interrupt på freq 1 kHz att mäta reed switch
reedVal = digitalRead (vass); //get val av A0
om (reedVal) {//if reed switch är stängd
om (reedCounter == 0) {//min tid mellan pulserna har gått
mph = (56.8*float(circumference)) / flyta (timer); //calculate miles per timme
timer = 0; //reset timer
reedCounter = maxReedCounter; //reset reedCounter
}
annat {
om (reedCounter > 0) {//don't låt reedCounter gå negativ
reedCounter-= 1; //decrement reedCounter
}
}
}
annat {//if reed switch är öppen
om (reedCounter > 0) {//don't låt reedCounter gå negativ
reedCounter-= 1; //decrement reedCounter
}
}
om (timer > 2000) {
mph = 0; //if inga nya pulser från reed switch-däck är fortfarande inställd 0 mph
}
annat {
Timer += 1; //increment timer
}
}
void displayMPH() {
Serial.write (12), //clear
Serial.write ("Speed =");
Serial.write (13); //start en ny rad
Serial.Print(mph);
Serial.write ("MPH");
Serial.write ("0.00 MPH");
}
void loop() {
skriva ut mph en gång per sekund
displayMPH();
Delay(1000);
checkBacklight();
}
Jag använde timer avbrott i denna del av koden för att hålla variabeln "timer" uppräkning vid 1kHz. Mer info om avbrott och en förklaring av hur jag ställa upp kan hittas här.