Hallo,
noch ne Lösung!
Zur Erklärung ist ja eigendlich schon alles gesagt. Du benötigst eine Variable die den Zustand des letzten Durchlaufs speichern kann und mit dem akuellen neuen Zustand vergleicht. Insofern war Dein Ansatz ja fast richtig.
Wenn man das in eine Funktion packt kann das so aussehen.
die Fuktion hat einen return Wert der TRUE ist wenn die Flanke erkannt wurde.
boolean posflanke( boolean input, boolean &hilfsmerker)
Der erste Parameter input ist eine Eingabe, hier der Pegel des Tasters.
Der zweite ist Ein und Ausgabe. (& vor dem Namen der Variablen)
in dem Beispiel wird ein Taster abgefragt. Mit jedem Betätigen wird ein Zähler um 1 erhöht. Ohne Flankenerkennung würde so lange hochgezählt wie der Taster gedrückt ist. Mit dem Monitor werden die Zustände angezeigt.
Wenn Du die Funktion so wie sie ist mehrfach benötigst, und das ist u.A ist der Sinn von Funktionen, kannst Du sie für unterschiedliche Input Signale mit unterschiedlichen Parametern mehrfach aufrufen.
pflanke1=posflanke(signal1,flag1)
pflanke2=posflanke(signal2,flag2)
Das Ganze geht natürlich auch für negative Flanken mit einer ähnlichen Funktion.
Gruß Heinz
// Testprogram positive Flankenerkennung
// ein Zähler wird mit jeder Flanke erhöht
int taster = 3; // Taster liegt auf pin 3 und 0V
boolean pegel; // Variable für Tastersignal
boolean pflanke;// Variable für pos. Flanke
boolean flag1; // Hilfsmerker
int count; // counter zum testen
void setup() {
Serial.begin(9600);
pinMode(taster, INPUT); // pin 3 ist ein Eingang
}
void loop() {
// Anzeige nur zum testen
Serial.print(pegel); Serial.print("\t");
Serial.print(flag1); Serial.print("\t");
Serial.println(count);
// Taster invertiert lesen (Taster schaltet nach 0V)
pegel = !digitalRead(taster);
// Function aufrufen
pflanke = posflanke(pegel, flag1);
// bei pos. flanke zähler erhöhen
if (pflanke) {
count++;
}
}
// ================ functon´s =================
boolean posflanke( boolean input, boolean &hilfsmerker) {
if (input && !hilfsmerker ) { // wenn Signal True und hilfsmerker false
hilfsmerker = true; // Zustand von Signal abspeichern
return true; // Funktion mit Rückgabe true verlssen
}
if (!input) { // wenn Signal False ist Hilfsmerker auch auf false setzten
hilfsmerker = false;
}
return false; // funktion mit Rückgabe false verlassen
}