ich habe die Signalflanke nun erfolgreich eingbaut und angefangen mit den serialmonitor zu testen.
Dabei ist mir dann aufgefallen, dass die Signalwerte auch wunderbar von 0 zu 1 wechseln und das heffig schnell.
Hefftig schnell zählt er aber auch den counter hoch.
Mit einem Delay kann ich das zwar ganze bremsen, aber das scheint mir noch nicht richtig
Entprellt habe ich noch nichts da es sich um ein Hallgeber handelt und ich bis jetzt dachte, dass man das nur bei mechanischen bauteilen machen muss.
Ist das so, oder muss man den auch entprellen ?
hier noch mal der neue code
// lese den status vom reedkontakt
reedkontaktzustand = digitalRead(reedpin);
if (lastreedkontaktzustand == LOW && reedkontaktzustand == HIGH) //wenn lastreed low und reed high ...weiter
{
Serial.println(lastreedkontaktzustand); // serialausgabe lastreed
Serial.println(reedkontaktzustand); // serial ausgabe reed
Serial.println(zaehler++); // zaehler um 1 erhöhen mit serial ausgabe
delay(300);
}
if (zaehler == 30) // bis 30 hochzählen
{
//if (millis() - Zeit > pumpeAus) { // Zeit wielange die Pumpe aus bleibt
digitalWrite(pumpe, HIGH); //pumpe an
delay(1000); //delay 1sek
digitalWrite(pumpe, LOW); //pumpe aus
zaehler = 0; // zaehler reseten
}
PhyniX:
Entprellt habe ich noch nichts da es sich um ein Hallgeber handelt und ich bis jetzt dachte, dass man das nur bei mechanischen bauteilen machen muss.
Ist das so, oder muss man den auch entprellen ?
Willst uns veräppeln? Schreibst Reed und hast Hall. Hall prellt nicht, das kann es also nicht sein.
Mir fehlt lastreedkontaktzustand = reedkontaktzustand.
PhyniX:
Wo muss das denn noch hin im code bzw. was bewirkt es
Einer Variablen sollte doch ein Wert zugewiesen werden, oder? Wo geschieht dies bei lastreedkontaktzustand? Innerhalb des gezeigten Programmschnipsels sehe ich es nicht.
ich habe es mal wie du gesagt hast rein kopiert, nur bin ich super happy das dass Ding läuft wie eine biene
Aber zum Vertsändnis habe ich doch noch eine Frage
Ich habe beide variablen ganz oben im code deklariert also:
int reedkontaktzustand = HIGH;
int lastreedkontaktzustand = LOW;
So ging es aber leider nicht,erst durch dein Beispiel:
lastreedkontaktzustand = reedkontaktzustand;
funktionierte es dann einwandfrei.
Da ich ja nun was lernen will (ist ja mein hauptziehl bei der ganzen geschichte) würde micht interessieren, ob es gegangen wäre
wenn ich oben:
int reedkontaktzustand = HIGH;
int lastreedkontaktzustand = HIGH;
geschieben hätte ?
Da ja lastreedkontaktzustand = reedkontaktzustand; so wie ich es verstehe nur sagt das lastreedkontaktzustand gleich reedkontaktzustand ist, also dem nach HIGH.
Hätte es auf die schnelle gerne mal getestet,aber mir ist ne messspitze aus der hand gefallen und habe dadurch kurz einen kurzschluss gemacht,dadurch war der nano dann reif für die tonne
ist dafür da, sich den letzten Zustand zu merken, egal ob der LOW oder HIGH ist.
Das ist etwas anderes, als die Variable beim Anlegen zu initialisieren (z.B.mit HIGH).
Gehen wir mal davon aus, reedkontaktzustand und lastreedkontaktzustand werden global deklariert, dann erhalten sie einen Anfangswert LOW, wenn man nichts anderes angibt. Das reicht eigentlich. Allerdings können die beiden Variablen nur HIGH oder LOW werden, daher sollte der Typ bool gewählt werden, also:
bool reedkontaktzustand, lastreedkontaktzustand;
Um ungewollte Flanken zu vermeiden, muß der Anfangswert in setup ermittelt werden:
@PhyniX, hoffentlich hat der letzte Beitrag dir geholfen, statt dich mehr zu verwirren.
var1 = var2; ist eine Wertzuweisung, keine Gleichung.
Nach Ausführung dieser Anweisung hatvar1eventuell einen anderen Wert als vorher. Die Reihenfolge der Anweisungen spielt eine Rolle.
Die Definition
int reedkontaktzustand = HIGH;
ist global, findet also einmalig statt, bevor die erste Zeile jemals ausgeführt wurde.
Da im Programmablaufreedkontaktzustandjedesmal neu gesetzt wird,
( nämlich inreedkontaktzustand = digitalRead(reedpin); ) ist eine Initialiserung während der Definition überflüssig. Eine Definition als[b] bool [/b]stattint ist generell zu empfehlen: passende Datentypen können helfen, Fehler zu entdecken und sparen Speicherplatz.
Arduino hat den Datentyp boolean zubooldazuerfunden, das sollte dich nicht weiter verwirren.
Wenn dir (inzwischen) sowieso schon alles klar war, umso besser und Glückwunsch.
Jedenfalls verkneife ich mir hier Klugscheisser-Kommentare zu agmue's setup() Ergänzung.
michael_x: @PhyniX, hoffentlich hat der letzte Beitrag dir geholfen, statt dich mehr zu verwirren.
... Jedenfalls verkneife ich mir hier Klugscheisser-Kommentare zu agmue's setup() Ergänzung.
Meine Erklärungen sollen helfen, nicht verwirren. Wenn es für den TO nützlich ist, dann darfst Du klugscheissern. Ich werde es gelassen lesen