hier nochmal kurz und knapp das Problem.
Ich habe einen Lichtschrankensensor und möchte hier die Impulse auslesen.
Für jedes Mal, wenn ich die Schranke unterbreche, soll n um 1 hochzählen.
Erst, wenn die Schranke für einen Moment nicht unterbrochen war und wieder unterbrochen wird, soll n auf 2 hochzählen.
Das ganze soll in einem Intervall von 5 Sekunden hochgezählt werden und danach wieder auf 0 gehen.
Ich bin leider blutiger Anfänger.
Wenn ich jetzt also 5 Mal in 4 Sekunden die Schranke unterbreche, soll n = 5 sein. Ich möchte es ausschalten, dass n weitergezählt wird, wenn ich den Finger weiterhin davor halte. Dass praktisch das Finger wegnehmen notwendig ist um beim erneuten Reizen weiterzuzählen.
Mein ArmateurCode im Folgenden. Ich hoffe, ihr könnt mir auf die Sprünge helfen.
Schönen Abend und schöne Vorweihnachtstage wünsche ich euch.
int i;
int n = 0; // n Anzahl der Impulse
int Z; // Z INPUT des Sensors 0 oder 1
void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
}
void loop() {{
Z = digitalRead(A0); // LOW oder HIGH
if ( Z != HIGH)
{
n++;
if ( n > 10)
{
n = 10;
}
}
else
{
n = n-1;
if (n < 0)
{
n = 0;
}
}
}
Serial.println(n);
}
dein Problem mit dem Hochzählen würde ich über eine Kontrollvariable verwirklichen, welche das hochzählen erst erlaubt, wenn der Wert zwischenzeitig 0 war.
Du musst doch nur auswerten, ob die Lichtschranke bereits für 5 Sekunden NICHT unterbrochen wurde - daraufhin die Anzeige auf Null setzen (oder erst bei der nächsten Unterbrechung mit 1 anfangen).
Hochzählen bei Flankenwechsel Low->High, Wartezeit starten bei Flankenwechsel High->Low.
Würde Beides mit einem Interrupt erschlagen wollen.
Da elektronische Schalter, ist kein Prellen vorhanden also auch kein Endprellen nötig, sonst würde durch den Interrupt ziemlich schnell gezählt werden