Uno de lo grandes problemas al implementar un proyecto para medir la velocidad de un motor es tener un Encoder disponible, nuevos son normalmente caros, a veces se pueden conseguir usados, pero el problema es saber cual es el su resolución.
Programa:
#include <LiquidCrystal.h>
int Interruptor = 0; // El interruptor a utilizar sera el 0 es decir el pin digital 2
LiquidCrystal lcd(12,11, 6, 5, 4, 3);
int pulsos=0; // variable para contar los pulsos
int resolucion; // variable para guardar los pulsos en una revolucion
#define mide 0
#define captura 1
int modo = mide;
//Esta seria nuestra funcion interrupcion exte.
void interrupcion_isr()
{
pulsos=pulsos+1;
}
void setup()
{
pinMode(10,OUTPUT);//PIN2 salida PWM
pinMode(7,INPUT);//PIN2 salida PWM
lcd.begin(16,2);
attachInterrupt(Interruptor, interrupcion_isr, HIGH);
}
void loop()
{
switch( modo) {
case mide:
analogWrite(10,25); // gira el motor a baja velocidad
lcd.setCursor(0,0);
lcd.print("No.");
lcd.setCursor(5,0);
lcd.print(pulsos);
if ( digitalRead(7)==HIGH){
resolucion=pulsos;
modo=captura;
}
break;
case captura:
analogWrite(10,0); // se apaga el motor
lcd.setCursor(0,0);
lcd.print("No.");
lcd.setCursor(5,0);
lcd.print(resolucion);
break;
}
}
Diagrama de Proteus:




