Variable Zählen.. warum funzt mein Sketch nicht

  • Hallo,

    ich bin am verzweifeln. Ich versuche seit 2 Wochen (immer mal wieder dran) mir zum lernen einen Sketch zu basteln.
    Der Zählt.
    Also gnaz einfach, ich will eine Variable mit Ganzen Zahlen nutzen.

    Aufbau
    1x Taster
    2x LED

    Sketch ===

    Blöderweise schalten beide LED´s sofort ein beim ersten Tasten.

    Ich kann mir einfach nicht mehr selber helfen...
    Wies jemand Rat?

  • Hallo,

    die Schaltung funktioniert. Kann die LED´s und Taster auch einzeln ansteuern.
    Der Taster geht auch.
    Ein einfaches Programm mit einer Variable zum einschalter einer LED geht 1A.

    Hier mein Schaltbild:

    Habe es aus einfachheit mit einem UNO dargestellt.

    tsqq6bkq.jpg

    Einmal editiert, zuletzt von est24 (19. Juni 2016 um 20:36)

  • Ok ... Schaltbild sieht so weit ja gut aus ...

    Dann mach bitte erst mal ein bisschen Styling mit Deinem sketch: die überfüssigen, geschweiften Klammern raus, Einrückungen, damit man weiss, was zusammengehört ... posten - und dann schaun wir mal weiter ...

    //EDIT: sind schon ein paar nette "Eier" drin ;)

    cu,
    -ds-

  • Auch wenn Einrückungen nicht wichtig erscheinen helfen sie dennoch enorm bei der Lesbarkeit des Codes und dem sofortigen erkennen der jeweiligen Abschnitte/Zugehörigkeit. Diese Unordnung sorgt vermutlich auch dafür das du zu viele { nutzt wo sie aber garnicht benötigt werden.
    Eine vernünftige Benennung der Variablen gemäß ihrem Sinn und Zweck helfen ebenfalls den Code besser zu verstehen.

    Um das mal alles auf einen Blick zu sehen,
    Dein Code aus Beitrag#1: http://codepad.org/Hvldozij
    Korrekte Einrückungen bzw Abstände: http://codepad.org/8JW3Q5Vs

    Dein Problem wird Zeile 42 und 47 sein... vermutlich ;)

    Ich würde da auch eher mit "else if" arbeiten, da Variable3 nur eins von beidem sein soll entweder 1 oder 5, oder nicht?


  • Auch wenn Einrückungen nicht wichtig erscheinen helfen sie dennoch enorm bei der Lesbarkeit des Codes und dem sofortigen erkennen der jeweiligen Abschnitte/Zugehörigkeit. Diese Unordnung sorgt vermutlich auch dafür das du zu viele { nutzt wo sie aber garnicht benötigt werden.
    Eine vernünftige Benennung der Variablen gemäß ihrem Sinn und Zweck helfen ebenfalls den Code besser zu verstehen.

    Um das mal alles auf einen Blick zu sehen,
    Dein Code aus Beitrag#1: http://codepad.org/Hvldozij
    Korrekte Einrückungen bzw Abstände: http://codepad.org/8JW3Q5Vs

    Dein Problem wird Zeile 42 und 47 sein... vermutlich ;)

    Ich würde da auch eher mit "else if" arbeiten, da Variable3 nur eins von beidem sein soll entweder 1 oder 5, oder nicht?

    Vielen Dank meigrafd für die Korrekte Darstellung.
    Hatte schon angefangen, aber dann..... :helpnew:

    Also der Zustand der Variable soll 1 oder 5 sein.
    Also Taster 1 mal gedrückt (=LED1) oder 5 mal gedrückt (=LED2).
    Müsste aber so doch funktionieren.

    Wenn ich mein Programm richtig verstehe würde dann LED1 beim Tastendruck Leuchten. LED1 bleibt an. Wenn ich jetzt den Taster 5 mal drücke Leuchten beide LED´s.

    Wenn ich das ganze mit else if mache dann würde LED1 bei 5mal drücken ausgehen.


    Mein Problem ist nur das beide LED´s angehen, sobald ich den Taster betätige.

    Einmal editiert, zuletzt von est24 (20. Juni 2016 um 13:42)


  • Mein Problem ist nur das beide LED´s angehen, sobald ich den Taster betätige.

    Tastenprellen, du "denkst" du drückst einmal, was denkt wohl dein Taster?

    https://de.wikipedia.org/wiki/Prellen
    https://www.mikrocontroller.net/wikifiles/2/26/Entprellen.png

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ja servus,

    da meigrafd's überarbeiteter Code leider nich abrufbar ist ( internal server error ) hier mal meine Version:

    So ... also was passiert da?
    Du drückst eine Taste ... die if-Bedingung trifft zu:

    Code
    if (Variable1 == HIGH)
     {
       VariableZeit = millis();      // aktualisiere tasterZeit
       Variable2 = 1;                // speichert, dass Taster gedrückt wurde
     }

    soweit so gut ...
    Jetzt fragst Du eine Zeit ab ( das soll wohl so eine Art Software-Entprellung sein :(

    Code
    if ((millis() - VariableZeit > VariableEntZeit) && Variable2 == 1)
      {
        Variable3++;             // lichtmodus wird um +1 erhöht
        Variable2 = 0;      // setzt gedrückten Taster zurück
      }

    Da Variable wieder 0 wird, ist das imho ok ...

    //EDIT: da hatte ich Quatsch gepostet ...
    Ich denke, Du solltest mal versuchen die LED-Ausgänge im setup() auf LOW zu setzen ...


    cu,
    -ds-


  • Wenn ich das ganze mit else if mache dann würde LED1 bei 5mal drücken ausgehen.

    Nein, weil du setzt nirgends "LOW"

    Entprell den Taster am besten Hardwareseitig mit einem parallel geschalteten Kondensator direkt am Taster, zB 100nF zwischen den beiden Adern direkt am Taster.

    Wie gesagt, benenn die Variablen entsprechend ihrer Funktion. Variable1 kannst du dir zudem sparen, das macht den Sketch nur unnötig größer.

    => http://codepad.org/29n5puEL

    Als erstes wird geprüft ob der Taster gedrückt bzw HIGH ist und switch1State auf 1 gesetzt sowie die aktuelle millis() gespeichert. Stetig.
    Danach wird geprüft ob genug Zeit vergangen ist solange der Taster weiterhin gedrückt (HIGH) ist, und lightMode stetig um 1 erhöht.
    Und dann wird geschaut welcher lightMode verwendet werden soll - es kann ja nur einer von beiden zutreffen also nutzt mal "else if", Wenn lightMode = 1 dann ... wenn aber nicht, dann ob lightMode = 5.


    Vielleicht hilft dir auch das: AVR: Rundumlicht Sketch
    (Beschreibung im 1.Beitrag)

  • Tasterentprellung macht man aber mit einem retriggerbaren Monoflop, mit Kondensator ist es unsauber und tastertötend weil der Kondensator immer hart entladen wird und einen Kurzschlußstrom bedeutet.
    https://www.mikrocontroller.net/articles/Entprellung

    Software ist viel eleganter und schonender, Entprellung
    https://www.mikrocontroller.net/articles/Entpr…wareentprellung

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!