In diesem Experiment messen wir die Umdrehungszahl pro Minute eines Lüfters. Dabei lassen wir uns die
Drehzahl in rpm (d.h. in
U/min) ausgeben.
Die Einheit für rpm ist: 1 rpm = 1/min = 1/60s
Die Idee bei dieser Art der Drehzahlmessung ist, dass z.B. ein Lüfter (Ventilator) mit seinen Rotorblättern einen Lichtstrahl durch Rotation immer wieder unterbricht. Dies geschieht umso häufiger, je schneller sich der Lüfter dreht. Diesen Umstand machen wir uns im folgenden Aufbau zunutze, denn wir bauen eine Lichtschranke, die jede Unterbrechung zählt und dann in regelmäßigen Zeitabständen die Anzahl der Umdrehungen ausrechnet.
#define PIN_LED 9
#define PIN_LED_DETECTOR A0
// [0..1023] = [dark..bright]
const unsigned int SENSOR_SENSITIVITY = 500;
// e.g. number of blades in a fan
const byte INTERUPTIONS_PER_REVOLUTION = 7;
// in ms
const unsigned long CALCULATE_INVERVAL = 2500;
bool sensorStatus = false;
unsigned int brightness = 0;
unsigned long interruptions, revolutions = 0, lastCalculateTime;
float rpm = 0;
void setup()
{
Serial.begin(9600);
lastCalculateTime = millis();
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, HIGH);
}
void loop()
{
if (millis() - lastCalculateTime > CALCULATE_INVERVAL) {
revolutions = interruptions / INTERUPTIONS_PER_REVOLUTION;
rpm = revolutions / (CALCULATE_INVERVAL / 1000) * 60;
revolutions = 0;
interruptions = 0;
lastCalculateTime = millis();
// show sensor brightness
Serial.print("B = " + (String)+brightness);
// show amount of interruptions of the sensor
Serial.print("; I = " + (String)interruptions);
// show amount of revolutions
Serial.print("; R = " + (String)revolutions);
// show rpm = "revolutions per minute"
Serial.println("; " + String(rpm) + " RPM");
}
brightness = analogRead(PIN_LED_DETECTOR);
if (sensorStatus == false && brightness >= SENSOR_SENSITIVITY) {
interruptions++;
sensorStatus = true;
}
if (sensorStatus == true && brightness < SENSOR_SENSITIVITY) {
sensorStatus = false;
}
}