4711:
Helfen würde mir ein Beispiel, dass in standard Arduino Sprache (ich weiß, klingt blöd) geschrieben wurde und einfach einen (oder mehrere) Eingänge entprellt. Unabhängig von Schalter und LED usw. und eff.(weniger Speicher braucht) und sauber programmiert ist.
Ja, das klingt etwas blöd.... (sorry)
Denn die "standard Arduino Sprache" ist C++.
Und alle bisher gezeigten Beispiel sind in C++.
Auch wohl alle im Internet findbaren.
Selbst die in Büchern und Köpfen versteckten.
so, hier mal mein erster Entwurf, hab ihn noch nicht getestet
// DEBOUNCE ------------------------------------------
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers
unsigned int iSensor1State; // aktueller Zustand vom Eingang
unsigned int ilastSensor1State = LOW; // letzter Zustand vom Eingang
void Debounce() {
int ireadingSensor1 = digitalRead(I_Sensor1);
if (ireadingSensor1 != ilastSensor1State) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (ireadingSensor1 != iSensor1State) {
bSensor1 = ireadingSensor1;
if (iSensor1State == HIGH) {
bSensor1 = !bSensor1;
}
}
}
ilastSensor1State = ireadingSensor1;
}
100ms ein = ein,
100ms aus = aus,
Schaltzustände dazwischen ignorieren
Nochmal zum Verständnis. Eingangssignal soll nur "ein" sein wenn der Sensor mindestens ununterbrochen 100ms lang high liefert und umgekehrt 100ms lang low dann "aus"?
Ja richtig.
Damit braucht es wohl eine Änderung von "wie lange soll auf ein gültiges Signal gewartet werden?" zu "wie lange muss das Signal high/low anstehen".
Äääh ... Nein?
Ggf. meinen Versuch da Oben Mal ansehen?
Bei JEDER Pegel-Änderung wird diese Zeit als Startzeit hinterlegt.
ERST, wenn die Prellzeit vorbei ist, wird dieser Status übernommen.
Dar 'riecht' doch schon durch, daß Da in beiden Richtungen die 100ms (oder was sonst) das Signal sauber anliegen muß - wenn nicht, wird ja die Startzeit neu gesetzt und schon ist's Essig mit der Prellzeit.
combie:
Hach...
Ich habe ihm auch meine schönster und einfachste Entprellung angeboten.
Aber: Schmeckte nicht!
Hmm, dein Beispiel kann ich da nur schwerlich lesen, mit den Libs und dem C++ Style.
Einen einfachen habe ich ja nachgebaut, das Array ging noch ab.
Oder kapier ich was nicht ?
combie:
Ich habe ihm auch meine schönster und einfachste Entprellung angeboten.
Aber: Schmeckte nicht!
Das kommt noch. Warte mal so 5 Jahre und 4000 postings.
P.S. Um alle Kommentaren vorzubeugen, ich beziehe mich nicht im entferntesten auf die Intelligenz/Interesse/Lust des TE, sondern auf die Programmierkenntnisse von combie.
So ist es, meine Programmierkenntnisse sind jetzt ein paar Tage jung
Ich möchte auch kein Profi werden, die Umsetzung meiner Interessen mit eurer Hilfe reicht mir völlig.
Und so wie sich das alles abzeichnet, wird das auch klappen.
Das ist allerdings schade, daß Du nicht darauf zielst, dem Steinchen das Maximum entlocken zu wollen.
(wobei combie in einer gaaanz anderen Liga spielt - wobei - in Ligen, in Denen ich kaum als Zuschauer erlaubt bin, spielen hier Einige )
Wenn ich aber so weit bin, werde ich den ganzen Kram schamlos abkupfern ... versprochen!
Klein anfangen, groß werden. Ja nicht den Spaß an der Sache verlieren, darum die Ziele in griffweite halten.
Heute noch ist das Interesse, dass es einfach nur funktioniert. Morgen, wer weiß
Ist es das?
#include <CombieTimer.h>
using Combie::Timer::EntprellTimer;
const byte taster = 2; // taster gegen GND schaltend
EntprellTimer entprellen(200); // in der Praxis wird man wohl eher 20ms verwenden
void setup()
{
pinMode(LED_BUILTIN,OUTPUT);
pinMode(taster,INPUT_PULLUP);
}
void loop()
{
// die LED zeigt das, vom prellen bereinigte, Signal
digitalWrite(LED_BUILTIN,entprellen(!digitalRead(taster))); // invers, wg. pullup
}
das ist das Kunststück richtig ?
entprellen(!digitalRead(taster))
damit müsste ich meinen Merkerzuweisungen nur das entprellen( ) hinzufügen ?
Und, wie du siehst, ist es nicht C++, oder die Komplexität des Entprellers, welche dich erst davon abgehalten hat, ihn zu nutzen, sonder eher ein innerer Widerstand.
Und diese, kann nur der Eigentümer der Widerstände bearbeiten.
Was du ja jetzt wohl erfolgreich gemeistert hast.
Ja schon, aber wenn man das Wissen nicht hat, wie sollst das erkennen geschweige verstehen.
Man kann einfach nicht auf ein galoppierendes Pferd aufspringen, ich zumindest nicht.
Ich muss es häppchenweise machen und ohne die richtungsweisende Führung, bist halt im Wald.
Ich hab grad das Gefühl, dass ich auf einen Schnellzug aufspringe
So lange ihr mir nicht abspringt, fährt der Zug!
C++ steht auf der Todo, aber so schnell geht das nicht, das wird seine Zeit brauchen.
Aktuell möchte ich nur nicht die Lust und Laune verlieren und mal das gesetzte Ziel schaffen.
Die Schleife fehlt mir noch, dann würde ich meinen wäre diese Aufgabenstellung gelöst.