zurück

Arduino-Drehzahlmessung

23.06.2018

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
Drehzahlmesser

Funktionsweise

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.

Schema der Funktionsweise
Abb.: Schema der Funktionsweise:
  1. Im ersten Bild wird der Lichtstrahl der LED durch den Lüfter nicht unterbrochen und kann vom Fotowiderstand (LDR) empfangen werden.
  2. Im zweiten Bild wird durch eine Weiterdrehung des Lüfters der Lichtstrahl unterbrochen und somit fällt kein Licht mehr auf den LDR.

Verwendete Bauteile

Aufbau

Aufbau der Schaltung
Abb.: Aufbau der Schaltung

Code

#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, rpm = 0;
unsigned long interruptions, revolutions = 0, lastCalculateTime;

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;
    }
}
Ausgabe der Resultate in der seriellen Konsole
Abb.: Ausgabe der Resultate in der seriellen Konsole

Weitere Ideen