Arduino Intelligent bromsljus (4 / 7 steg)
Steg 4: kodning
Jag skriver åter inte här koden från början, jag bara revidera Arduino cykel hastighetsmätare koder av Amanda Ghassaei. Vad jag ändra använder meter per sekund (m/s) istället för mil per timme (mph). Cykeln gör inte går att snabbt så behandlingen meter per sekund är lättare tror jag, men du kan ändra den tillbaka till mph eller km/h om du vill. Den andra saken är som hastigheten till noll när vi stannar vid den plats där magneten håller reed switch stängt.
Jag lägger hastighet läsning att aktivera eller inaktivera ljuset. När hastigheten är långsammare, blinkar lampan så att fordon på baksidan kommer att märka och vara medveten om. När cykeln sluta helt eller bromsarmens trycks så att hjulet inte snurrar, lampan tänds. Ljuset kommer att vara avstängd på viss tid, kan du ange detta i koden nämligen lightOffDelay och lightOnCounter.
Arduino cykel hastighetsmätare w serial.print()
Amanda Ghassaei 2012
Revidera genom Chienline
Visar noll i stället för Max Speed när reed byter vistelse stängd på stopp.
Ändra från MPH (miles per timme) till m/s (meter per sekund).
Lägga till funktioner av Intelligent stoppa ljus på Digital PIN 13
/*
* 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.
*
*/
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
#define stoppljus 13 /-pin ansluten till stoppa ljus
lagring variabler
int reedVal;
int lightOffDelay = 4; bromsljus av fördröjningstiden
int lightOnCounter = 5; slå på stop ljus under viss tid; från början satts högre än lightOffDelay
lång timer; tiden mellan en full rotation (i ms)
float mps; hastighet i m/s
flyta prevmps = 0; tidigare hastighet i m/s
float radie = 13,5; / / däck radius (i tum)
float omkrets;
int maxReedCounter = 100; //min tid (i ms) av en rotation (för debouncing)
int reedCounter;
int i;
void setup() {
reedCounter = maxReedCounter;
omkrets = 2 * 3.14 * radie.
pinMode (reed, ingång);
pinMode (stoppljus, produktionen);
TIMER SETUP - timer avbrottet tillåter exakta tidsinställda mätningar av reed switch
för mer information om konfiguration av arduino timers se < en href = "http://arduino.cc/playground/Code/Timer1" > http://arduino.cc/playground/Code/Timer1
< /a >
(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
LED_OFF();
Serial.BEGIN(9600);
}
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
m/s = (25.4*float(circumference)) / flyta (timer); //calculate meter per sekund
om (mps > 21) {/ / Detta är när röret håller stänga när sluta; du nog inte gå så fort.
m/s = 0;
}
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) {
m/s = 0; //if inga nya pulser från reed switch-däck är fortfarande inställd 0 m/s
}
annat {
Timer += 1; //increment timer
}
}
void LED_ON(int state) {
0 = vissa tid är över. Inaktivera LED; lightOnCounter högre än lightOffDelay
1 = tur LED ON och återställa lightOnCounter
2 = tur LED ON och öka lightOnCounter
om (statligt == 0) {
digitalWrite (stoppljus, låg);
lightOnCounter = lightOffDelay + 1.
}
om (statligt == 1) {
digitalWrite (stoppljus, hög);
lightOnCounter = 0;
}
om (statligt == 2) {
digitalWrite (stoppljus, hög);
lightOnCounter + = 1;
}
}
void LED_BLINK() {
int j;
för (j = 1; j < 10; j ++) {
digitalWrite (stoppljus, hög);
Delay(90);
digitalWrite (stoppljus, låg);
Delay(90);
}
}
void LED_OFF() {
digitalWrite (stoppljus, låg);
}
void displaySpeed() {
Serial.println(MPS);
Serial.println ("m/s");
Serial.println("");
}
void loop() {
Utskriftshastigheten en gång per sekund
displaySpeed();
//--
om (mps == 0) {
om (prevmps! = 0) {/ / broms på; LED_ON för vissa förseningar
LED_ON(1);
}
annat {/ / prevmps = 0; inte flytta
om (lightOnCounter < = lightOffDelay) {/ / ljus om tid inte har klarat
LED_ON(2);
}
annat {/ / ljus om tid har gått, turn ljus OFF
LED_ON(0);
}
}
}
annars om (mps! = 0 & & mps < prevmps) {
LED_BLINK();
}
annat {
LED_OFF();
}
//--
prevmps = mps;
Delay(1000);
}