Selbstbau Simple Ketten Oiler für Motorrad

Hallo,

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.

Hehe, nein ich will niemand veräppeln.
Geplant waren reedsensoren.
Bis ein Freund meinte ob auch hallsensoren gehen würden da es keine mechanic gibt.

Das verstehe ich jetzt leider nicht,
Wo muss das denn noch hin im code bzw. was bewirkt es
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.

Möglicherweise sinnvoll könnte es hier sein:

lastreedkontaktzustand = reedkontaktzustand;
reedkontaktzustand = digitalRead(reedpin);

Hallo agmue,

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 :frowning:

Die Zuweisung

lastreedkontaktzustand = reedkontaktzustand;

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).

Gruß Tommy

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:

void setup() {
...
reedkontaktzustand = digitalRead(reedpin);
lastreedkontaktzustand = reedkontaktzustand;
...
}

Vor der Flankenerkennung wird der alte Wert gemerkt und der neue abgefragt:

lastreedkontaktzustand = reedkontaktzustand;
reedkontaktzustand = digitalRead(reedpin);
...
if (!lastreedkontaktzustand && reedkontaktzustand) {
...

Dabei habe ich noch die richtigen, aber überflüssigen Vergleiche gekürzt:

lastreedkontaktzustand == LOW entspricht !lastreedkontaktzustand
reedkontaktzustand == HIGH entspricht reedkontaktzustand

Alles klar?

@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 :slight_smile:

nicht verwirren

Ich finde, man darf aus jedem Problem das Optimum raus holen.
Das ist halt: Problem Optimierung