Fiets beter met een LED cadans meter (7 / 11 stap)

Stap 7: De Code


Deze code wordt gelezen wanneer de magneet passeert de sensor en houdt een lopend gemiddelde van de tijd tussen pedaal passeert. Deze gegevens worden gebruikt voor het berekenen van de rotaties per minuut.

Als u wilt output naar de LED's, het maakt gebruik van een functie voor het berekenen van de helderheid van de LED gebaseerd op de rpm-waarde. Dit creëert een gladde vervagende effect tussen de LEDs als de waarden veranderen.

De beste manier om te lezen van de sensor zou zijn geweest met interrupts, maar ik liep in een probleem waar de waarden van de sensor waren niet hoog genoeg te registreren met de Arduino als digitale signalen. Zodoende had mij voor het gebruik van de analoge sensor-waardes.

Dit is niet de meest elegante code, maar het werkt en is momenteel vergrendeld in een doos op mijn fiets, dus ik ben posting deze zo is. Suggesties en wijzigingen zijn welkom.

 #define ARRAY_SIZE 3 //The number of values to keep in the running average #define TIMEOUT 1500 //Max time without input before turning off LEDs #define FADE_INCREMENT .1 //Controls the fading speed--adjust with trial and error #define LED_CONSTANT -20 //Used in the brightness fading equation //RPM targets for each LED: #define RED_1_TARGET 45 #define YELLOW_1_TARGET 68 #define GREEN_TARGET 90 #define YELLOW_2_TARGET 113 #define RED_2_TARGET 135 /**PORT SETUP**/ const int magnetSensor = A7; //Change this for your arduino const int red1 = 12; const int yellow1 = 10; const int green = 9; const int yellow2 = 5; const int red2 = 4; const int ledPin = 11; bool magnetOn = false; bool prevMagOn = false; bool primed = false; bool arrayEmpty = false; float times[ARRAY_SIZE]; //array to hold values for the running average float startTime = millis(); int rpm = 0; bool pedaling = false; int targetR1; int targetY1; int targetG; int targetR2; int targetY2; float r1; float y1; float g; float y2; float r2; //add a new value to the array, moving the rest back one space and removing the oldest void updateTimes(float newValue) { for(int i = 0; i < ARRAY_SIZE-1; i++) { times[i] = times[i+1]; } times[ARRAY_SIZE-1] = newValue; } //returns an average of the values in the array int avgArray(float values[]) { int total = 0; int counted = ARRAY_SIZE; for(int i = 0; i < ARRAY_SIZE; i++) { total = total + values[i]; if(values[i] == 0) counted--; } return(total/counted); } //for debugging void printValues() { for(int i = 0; i < ARRAY_SIZE - 1; i++) { Serial.print(times[i]); Serial.print(", "); } Serial.println(times[ARRAY_SIZE -1]); } //clear the array void clearTimes() { for(int i = 0; i < ARRAY_SIZE; i++) times[i] = 0; } //check if the array is full void checkFullArray() { arrayEmpty = true; for(int i = 0; i < ARRAY_SIZE; i++) { if(times[i] != 0) arrayEmpty = false; } } //use a function to calculate the brightness of a given led based on a target int calculateLED(int target) { if (rpm <= 0) return 0; return int(LED_CONSTANT*abs(target-rpm)+255); } void setup() { pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(red2, OUTPUT); Serial.begin(9600); } void loop() { //Read from the hall effect sensor (using analog values, unfortunately) int magnetState = analogRead(magnetSensor); Serial.println(magnetState); if(magnetState > 60) { magnetOn = false; } else { magnetOn = true; } if(!magnetOn && prevMagOn) { primed = true; } //timeout if(millis()-startTime > TIMEOUT) { clearTimes(); pedaling = false; } if(magnetOn && !prevMagOn && primed) { //if magnet passes sensor once float currentTime = millis(); float changeTime = (currentTime - startTime); //record the time since the last pedal startTime = millis(); if(pedaling) //if there has been pedaling since the last timeout updateTimes(changeTime); //add the time to the running average array primed = false; pedaling = true; } //mostly for debugging, this blinks the built-in LED whenever the magnet passes the sensor if(magnetOn) digitalWrite(ledPin, HIGH); else digitalWrite(ledPin, LOW); prevMagOn = magnetOn; checkFullArray(); float gap = avgArray(times); if(arrayEmpty) { rpm = 0; } else rpm = 60000/gap; //turn millisecond gap value into rpm //light the lowest red LED when the first pedal stroke is recorded, since there isn't enough data to calculate rpm if(pedaling && rpm == 0) rpm = 40; /******LED OUTPUT*****/ //calculate values targetR1 = calculateLED(RED_1_TARGET); targetY1 = calculateLED(YELLOW_1_TARGET); targetG = calculateLED(GREEN_TARGET); targetY2 = calculateLED(YELLOW_2_TARGET); targetR2 = calculateLED(RED_2_TARGET); //Normalize negative values to zero (these should really be in an array...) if(targetR1 < 0) targetR1 = 0; if(targetY1 < 0) targetY1 = 0; if(targetG < 0) targetG = 0; if(targetY2 < 0) targetY2 = 0; if(targetR2 < 0) targetR2 = 0; //fade to value if (r1 < targetR1) r1 += FADE_INCREMENT; if (r1 > targetR1) r1 -= FADE_INCREMENT; if (y1 < targetY1) y1 += FADE_INCREMENT; if (y1 > targetY1) y1 -= FADE_INCREMENT; if (g < targetG) g += FADE_INCREMENT; if (g > targetG) g -= FADE_INCREMENT; if (y2 < targetY2) y2 += FADE_INCREMENT; if (y2 > targetY2) y2 -= FADE_INCREMENT; if (r2 < targetR2) r2 += FADE_INCREMENT; if (r2 > targetR2) r2 -= FADE_INCREMENT; //output to LEDs analogWrite(red1, r1); analogWrite(yellow1, y1); analogWrite(green, g); analogWrite(yellow2, y2); analogWrite(red2, r2); } 

Gerelateerde Artikelen

Hoogvermogen LED fiets koplamp met geïntegreerde koellichaam

Hoogvermogen LED fiets koplamp met geïntegreerde koellichaam

voor degenen onder ons reizen door niet-gemotoriseerd vervoer (bijvoorbeeld fiets), zichtbaarheid is belangrijk in zowel middaguur en na twilight voorwaarden. De beste manier om ervoor te zorgen dergelijke zichtbaarheid is door het gebruik van extree
Een LED Menorah met behulp van Chibitronics Circuit Stickers

Een LED Menorah met behulp van Chibitronics Circuit Stickers

Gehost in December onze hackerspace, Crash ruimte in Culver City, een Instructables bouwen nacht met Chibitronics Circuit Stickers. Met Channukah om de hoek, ik dacht dat een LED menora zou een perfect project om te zien wat ik kon maken met de zelfk
Eenvoudig Project - besturingselement een LED-lampje met Python met behulp van een Raspberry Pi

Eenvoudig Project - besturingselement een LED-lampje met Python met behulp van een Raspberry Pi

Dit is de eenvoudigste Raspberry Pi GPIO LED-project ooit. Als u deze handleiding volgt moet duurt minder dan 20 minuten te installeren en te hebben uitgevoerd. Het doel van dit project is om een enkel LED licht knipperen gebaseerd op een Python prog
Bevestiging van een fiets hoorn met Sugru

Bevestiging van een fiets hoorn met Sugru

Ik had een gek idee. Ik dacht dat het hebben van een hoorn, in plaats van een bel op mijn fiets zou mooier. Het blijkt dat een hoorn mensen springen van hun huid zelfs meer maakt dan een klok doet. Mislukt, maar laat je niet dat stoppen mij.Stap 1: I
Met behulp van een enkele RGB LED (of een LED-strip) om informatie te tonen: klok, thermometer en een rare communicator

Met behulp van een enkele RGB LED (of een LED-strip) om informatie te tonen: klok, thermometer en een rare communicator

Een van de eerste projecten die ik deed met een Arduino was een Christmas lights garland. In feite, was gemaakt van een eenvoudige RGB LED-strip snijd doormidden, zoals Arduino slechts 6 hardware PWM outputs heeft. Ik wilde niet het aan vertoning tri
Een LED voor controle op het Internet via Arduino met Teleduino

Een LED voor controle op het Internet via Arduino met Teleduino

er is iets cool over het maken van een LED-gloed via een Arduino. Wat kon maken dat zelfs koeler? Hoe over het maken van die LED gloed van overal in de wereld via het internet? Nu zijn we talkin '!Dit proces is echt eenvoudig met behulp van de schets
Reis draad met behulp van een LED laser

Reis draad met behulp van een LED laser

Wist u dat LED's kunnen worden gebruikt als zowel lichte vervuilers evenals lichte detectoren? De ooit verbazingwekkende Forrest Mims ontdekte dit decennia geleden en heeft diverse projecten benadrukken van dit concept. Het is wat maakt fotodiodes we
Knipperen van een LED met een 555 Timer-Circuit

Knipperen van een LED met een 555 Timer-Circuit

Hier is een gedetailleerde video die ik heb gemaakt om uit te leggen hoe met een 555 Timer IC, in combinatie met een paar weerstanden en condensatoren, een LED-licht knipperen.Dingen die je zal nodig:1) breadboard2) breadboard jumper draden3) 555 tim
Citroen batterijen: Verlichting een LED met citroenen

Citroen batterijen: Verlichting een LED met citroenen

Wist u dat u een LED met behulp van groenten en fruit kan licht?Voor dit experiment moet u de volgende materialen:4 citroenen of aardappelen4 gegalvaniseerde nagels4 U. S. koperen penningen (geslagen vóór 1982 als gevolg van de verandering in koperge
Knipperen van een LED met assembler & een PIC

Knipperen van een LED met assembler & een PIC

om de blindingly duidelijk, er zijn vele smaken van microcontroller in de wereld.  Er zijn ontelbare toepassingen voor hen ook.  Dit Instructable zal betrekking hebben op de noodzakelijke stappen voor het knipperen van een LED met een PIC microcontro
Aan de slag met LinkIt One - knippert een LED

Aan de slag met LinkIt One - knippert een LED

Hoi!Bent u vaak verward door de hele wereld nieuwe borden en tech die om de paar maanden houden komen?Bent u vaak op zoek op google gewoon zin te maken van dit alles?Bent u bereid om echt geweldig projecten te maken, maar weet niet waar te beginnen?B
Knipperen van een LED met Onion Omega

Knipperen van een LED met Onion Omega

Gisteren, ontving ik de Onion Omega, die heb ik gesteund op Kickstarter een paar maanden geleden. Onion Omega is enige raadscomputer met Linux loopt Open WRT en kan gemakkelijk worden aangesloten op het internet (het heeft eigenlijk twee WiFi antenne
Vervagen van een LED met een potentiometer op Intel Galileo en Visual Programming

Vervagen van een LED met een potentiometer op Intel Galileo en Visual Programming

Deze tutorial toont je hoe te vervagen een LED met behulp van een potentiometer op Intel Galileo met behulp van de ontwikkelingsuitrusting van de Intel-IoT en Wyliodrin. U moet:* Intel Galileo bord, rev 1 of 2* een Grove schild* een Grove LED* een Gr
Flitser een LED met Scratch op de Computer van de Kano

Flitser een LED met Scratch op de Computer van de Kano

Ik heb verloren telling van hoeveel computers ik heb gebouwd door de jaren heen, maar ik denk dat het veilig om te zeggen dat de Computer van de Kano de makkelijkste build ooit was. Zo eenvoudig een kind zou kunnen doen. Kano oprichters, Yonatan Raz-