Mejor con un medidor de cadencia de bicicleta (7 / 11 paso)

Paso 7: El código

Este código Lee cuando el imán pasa el sensor y mantiene un promedio de marcha del tiempo entre pedal pasa. Utiliza esta información para calcular las revoluciones por minuto.

Para la salida a los LEDs, utiliza una función para calcular el brillo de cada LED en función del valor de rpm. Esto crea un efecto de decoloración suave entre los LEDs como los valores cambian.

La mejor forma de leer del sensor habría sido con interrupciones, pero me encontré con un problema donde los valores del sensor no eran lo suficientemente altos como para registrarse con el Arduino como señales digitales. Así que tuve que utilizar los valores de los sensores analógicos.

Este no es el código más elegante, pero funciona y está actualmente bloqueado dentro de una caja en mi bici, así que les dejo como es. Sugerencias y cambios son bienvenidos.

 #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); } 

Artículos Relacionados

Velocímetro con gráficos LCD de la bicicleta

Velocímetro con gráficos LCD de la bicicleta

Se trata de una computadora de la bicicleta de la función de multi que he diseñado con una gráfica monocromática de 128 X 64 pantalla LCD.Esto tiene reloj de tiempo real, así como un sensor de temperatura. Datos medidos se pueden demostrar ya sea en
Solar cargo funcionamiento LED con luz de freno intermitente para bicicletas

Solar cargo funcionamiento LED con luz de freno intermitente para bicicletas

por lo que después de investigar las leyes para hacer mi bicicleta motorizada legal en California y el envío de la placa de la licencia, he decidido trabajar en la luz del freno mientras espero la placa.Después de un par de días de mirar diseños de o
Cargador del teléfono celular (turbina de viento con estructura en batería) la bicicleta

Cargador del teléfono celular (turbina de viento con estructura en batería) la bicicleta

Voy muy a menudo a ciclo en la naturaleza donde hay electricidad, y durante un paseo en bicicleta largo mi telefono descargas generalmente. Estos smartphones tienen una gran capacidad, pero su consumo es muy grande. Hice una hace unas semanas otra tu
La mesa de la bicicleta (aka Rackatabla), o que viaje con su mochila de senderismo en bicicleta

La mesa de la bicicleta (aka Rackatabla), o que viaje con su mochila de senderismo en bicicleta

¿Alguna vez has querido tour en bicicleta, pero no tenía el dinero para comprar las maletas de rack caro? ¿O mejor, siempre querido utilizar la bici para transportarte a la base de una montaña y tomar tu mochila desde el rack y practicar senderismo?
Galería de arte con las paredes móviles en bicicleta

Galería de arte con las paredes móviles en bicicleta

no estoy seguro de lo que a esto todavía, pero por ahora vamos con el arte Pedaler (conseguir el juego de palabras?).El arte Pedaler está diseñado para ser una galería de arte emergente que puede situarse en cualquier lugar. Obra de arte es que se cu
40W DIY CNC láser de corte, de impresión mala mejor con 3D

40W DIY CNC láser de corte, de impresión mala mejor con 3D

Este proyecto convierte un mal funcionamiento K40III chino-cortador del laser en un espacio físico al espacio de trabajo optimizado relación DIY-cortador del laser. Voy a intentar mi mejor para cubrir lo que uno podría hacer diferente para guardar di
Lo wingin': Hacer lo mejor con lo que han

Lo wingin': Hacer lo mejor con lo que han

En este Instructable vamos a aprender qué hacer y qué no hacer cuando un archivo de Thingiverse.com de impresión 3-d.Paso 1: Primer errorOriginalmente, tenía la intención de hacer una vela de uno de los archivos que encontré en Thingiverse.com, un si
Mejor con cuentas pendientes de racimo

Mejor con cuentas pendientes de racimo

Hay muchas maneras para hacer pendientes de racimo popular como estos. Las indicaciones con que veo más a menudo para la fijación de los granos a una cadena anillos del salto. Sin embargo, mi forma favorita para hacer estos pendientes grandes es un p
Nudillos, versión mejor con sangre

Nudillos, versión mejor con sangre

Hola, este es cómo jugar bloody knucklesEs una divertida forma de jugar con más personas y no requiere mucha habilidad o ninguna habilidad si tiene sentidoPaso 1: Cómo jugar Esta versión de nudillos sangrientos solo requiere 1 cuarto o níquel.Una per
Cómo reparar y hackear sus controladores de juego de video mejores, con sugru

Cómo reparar y hackear sus controladores de juego de video mejores, con sugru

me parece que presentar siempre nuevos constructable sólo cuando hay un concurso jeje.Recibí mi paquete de muestra gratis de sugru y yo simplemente no podía esperar para averiguar cómo podía usar y y chico sorprendió.Esto es bastante recto hacia adel
Taza de café mejora con sugru

Taza de café mejora con sugru

fijar su taza de café rota con sugru!
Leds de control Arduino con un medidor de olla

Leds de control Arduino con un medidor de olla

esto es solo un proyecto fácil.Paso 1: partes1 arduino2 breadbord3 cable usb4. 4 leds5. 4 resistencias de ohm 3306.10 k bote medidor7. y diversiónPaso 2: primer introducir a los leds en el bord de pan.Paso 3: luego entonces debe insertar las resisten
Lámpara de Mad profesor steampunk con medidor de peligro!!!

Lámpara de Mad profesor steampunk con medidor de peligro!!!

Después de ver esto me decidí a ver si puedo copiarlo para mi look de profesor loco.Sin embargo sobre de este lado del Atlántico no parece tener fácil acceso a la amplia gama de productos de bricolaje que hacer (creo).De todos modos, he estado buscan
Construyendo una bicicleta zapata con un CNC ruteado marco el jiggernaut

Construyendo una bicicleta zapata con un CNC ruteado marco el jiggernaut

este Instructable es presentada a usted por LLC ingeniería mixta y muestra el proceso de construcción de un marco de bicicleta tacos usando 'El Jiggernaut' un CNC ruteado, plantilla de marco de bicicleta de paquete plano.  Le traerá a través de todos