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