Programa
El programa, una vez configurados el pin 2 como entrada digital y la comunicación serie para poder monitorizar la salida, realiza de forma cíclica una lectura del puerto de entrada. Mediante una sentencia condicional comprueba si el estado ha cambiado. En el caso de que el cambio sea a un nivel alto (HIGH) incrementa en una unidad la variable que cuenta las vueltas. Con la instrucción millis() se puede calcular el tiempo que trascurre en dar una vuelta completa (tiempo_una_rev), por lo que mediante un sencillo cálculo podremos conocer la velocidad del rotor en revoluciones por minuto (rpm).
// Cuenta las vueltas de un rotor de aerogenerador. const int releReedPin = 2; int vueltas = 0; int estadoRele = 0; int ultimoEstadoRele = 0; long tiempo_anterior = 0; long tiempo_una_rev = 0; unsigned long tiempo_ahora; long rpm; void setup() { pinMode(releReedPin, INPUT); Serial.begin(9600); } void loop() { // Lee el estado del rele estadoRele = digitalRead(releReedPin); // Compara el estado del rele con el estado previo if (estadoRele != ultimoEstadoRele) { // Si el estado ha cambiado incrementa el contador if (estadoRele == HIGH) { vueltas++; tiempo_ahora =millis(); tiempo_una_rev = tiempo_ahora - tiempo_anterior; rpm = 60000 / tiempo_una_rev; // 1 minuto = 60000 ms Serial.println("Rele ON"); Serial.print("vuelta "); Serial.println(vueltas); Serial.print("Tiempo por revolucion: "); Serial.println(tiempo_una_rev); Serial.print("Revoluciones por minuto: "); Serial.println(rpm); } else { // Si el estado actual es LOW pasa de ON a OFF Serial.println("Rele OFF"); tiempo_anterior = tiempo_ahora; } } // Guarda el estado actual como ultimo estado ultimoEstadoRele = estadoRele; }