Aqui os dejo un interesante artículo que muestra cómo leer las revoluciones de un ventilador de PC mediante su pin de RPM. El método es muy sencillo ya que básicamente consiste en utilizar una interrupción para saber cuándo el ventilador da una vuelta y luego simplemente contar. El auto a añadido un pequeño display LED de 7 segmentos para visualizar las revoluciones.
Enlace: Revoluciones de ventilador con Arduino
Código fuente
# Include "SevenSegment.h" SevenSegment seg7(19,16,15,13, // ?1,?2,?3,?4, SevenSegment seg7 (19,16,15,13, / / 1 digit, 2 digit, 3 digit, 4 digit 18,14,11,9,8,17,12,10); // A,B,C,D,E,F,G,DP 18,14,11,9,8,17,12,10); / / A, B, C, D, E, F, G, DP unsigned long lastPulseTime; unsigned long lastPulseTime; unsigned long pulseInterval; unsigned long pulseInterval; // ???????????????? / / Falling edge detection pulse rotation void senseRotation( void ) { void senseRotation (void) ( unsigned long cur = micros (); unsigned long cur = micros (); unsigned long dif = cur - lastPulseTime; // ?????????? unsigned long dif = cur - lastPulseTime; / / difference between the previous edge pulseInterval = (pulseInterval - (pulseInterval >> 2)) + (dif >> 2); // ???? pulseInterval = (pulseInterval - (pulseInterval>> 2)) + (dif>> 2); / / smooth lastPulseTime = cur; lastPulseTime = cur; } ) void setup () { void setup () ( lastPulseTime = 0; lastPulseTime = 0; pulseInterval = 0; pulseInterval = 0; attachInterrupt (0, senseRotation, FALLING ); // 0 = D2, FALLING = ????? attachInterrupt (0, senseRotation, FALLING); / / 0 = D2, FALLING = falling seg7. begin (); // 7??LED???? seg7. begin (); / / 7 LED segment begins operation } ) unsigned long lastUpdateTime; unsigned long lastUpdateTime; void loop () { void loop () ( if (seg7. update ()){ // ??????????????????????????? if (seg7. update ()) (/ / called at short intervals as possible, so do dynamic lighting control unsigned long cur = millis (); unsigned long cur = millis (); if (cur - lastUpdateTime > 60){ // 60ms???LED??? if (cur - lastUpdateTime> 60) (/ / 60ms update interval LED uint16_t rpm = 60000000 / (pulseInterval * 2); // RPM???? uint16_t rpm = 60000000 / (pulseInterval * 2); / / RPM find seg7. print (rpm); // 7??LED???? seg7. print (rpm); / / 7 LED segment display update lastUpdateTime = cur; lastUpdateTime = cur; } ) } ) } )