Die Lichtmühle

Eine solche Mühle dreht sich ja, je nach Lichteinfall,

in unterschiedlichen Geschwindigkeiten.

Da kam ich auf die Idee, mal zu ermitteln, wie schnell sich so ein Ding

dreht und auch wie oft sie sich an einem Tag dreht.

Dafür habe ich die Drehzahl mit einer Lichtschranke abgetastet,

die Impulse in einen Arduino Uno geschoben

und die gewünschten Informationen auf ein Display gebracht.

 

 

 

 

Links oben: Flügeldrehzahl              Rechts oben: Umdrehungen/Minute

Links unten: Flügelzähler bis 1-4              Rechts unten: Gesammtdrehzahl

Update: Ich habe dann doch ein anderes Display genommen:

 

Der Sketch (mit dem oberen Display):

 Der Teil mit der Drehzahl stammt leider nicht von mir :( aber hier einen Dank an den Schreiber !

#include <LiquidCrystal_I2C.h> //Display Libary, der richtige Treiber muss es sein !
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Display Adresse 0x3f
int buttonPin = 2; // Pin2 heißt jetzt buttonPin
int zaehl=0; // für die Eingangszählung bis 4
int Umdreh=0; // Umdrehungszähler
int buttonPushCounter = 0; // Eingangszähler
int buttonState = 0; // Eingangsstatus
int lastButtonState = 0; // Letzter Eingangsstatus

const int sensorPin = A0; //Teil Drehzahl Anfang
int sensorwert = 0;
int alterwert = 0;
int rpmcount = 0;
int value = 0;
int messen=0;
unsigned long int startzeit=0;
float rpm=0;
int rpm_speicher=0;
int vergleich=0;
unsigned long int messzeit = 0;
int fertig = 0;
float rpm1=0;
float rpm2=0;
float rpm3=0; //Teil Drehzahl Ende

void setup()
{
lcd.begin(16,2); // Display 2 Zeilen mit 16 Anzeigen
lcd.backlight(); // Licht Display wird eingeschaltet

pinMode(buttonPin, INPUT); // Pin 2 ist ein Eingang

}
void loop() // Beginn der Schleife
{
{
buttonState = digitalRead(buttonPin); //Zustand Eingang wird abgefragt
if (buttonState != lastButtonState) // Ist der Eingang ungleich dem letzten Zustand
{
if (buttonState == HIGH) // Ist der Eingang = High
{
{
buttonPushCounter++; // Eingangszähler wird 1 Hochgezählt
zaehl++; //Zähler für "nur jeden vierten" wird hochgezählt
if (zaehl == 4) Umdreh++; // bei jedem vierten Eingang wird Umdreh 1 weiter gezählt
if (zaehl == 5) zaehl =1; // wenn Zaehl = 5 dann zurück auf 1
}
}
else // Ansonsten gehts weiter
{
}
}
{
}
lastButtonState = buttonState; // der letzteZustand ist gleich dem aktuellenZustand



lcd.setCursor(0,0); //Setze den Curser im Display auf obere Zeile erste Spalte
lcd.print(buttonPushCounter); //Zeige den Inhalt von buttonpuschCounter an der Stelle an
lcd.setCursor(8,0); //Setze den Curser im Display auf obere Zeile achte Spalte
lcd.print(rpm3); //Anzeige Umdehungen / Minute
lcd.setCursor(0,1); //Setze den Curser im Display auf untere Zeile erste Spalte
lcd.print(zaehl); //Zeige den Inhalt von zaehl an der Stelle an
lcd.setCursor(8,1); //Setze den Curser im Display auf untere Zeile achte Spalte
lcd.print(Umdreh); //Zeige den Inhalt von Umdreh an der Stelle an
}
if(messen==0) //Messung reset Drehzahl beginn //Teil Drehzahl Anfang
{
rpmcount=0;
rpm_speicher=0;
startzeit=millis();
alterwert=0;
messen=1;
fertig=0;
messzeit=0;
}
else
{
sensorwert = analogRead(sensorPin); //messwert lesen
if(sensorwert > 300) //Auswertung anfang
{
value = 1;
}
else
{
value = 0;
}
if(value != alterwert)
{
alterwert = value;
if(value==1)
{
rpmcount++; //Auswertung ende
}
}
if (((millis()-startzeit) >=1000) && (fertig==0)) //Abbruchbedingung nach 1 sec.
{
rpm_speicher = rpmcount;
vergleich = rpmcount+1;
fertig=1;
} //abruchbedingung zu
if ((rpmcount==vergleich) && (fertig==1)) //Messen Zusatzzeit
{
messzeit=millis()-startzeit;
rpm1=rpmcount*1000;
rpm2=rpm1/messzeit;
rpm3=(rpm2*60);
rpm3=int(rpm3);
messen=0;
} //Messen zu
} //else zu //Teil Drehzahl Anfang
} //loop zu