Saltar la navegación

Programa

alumnosEl 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; 

}