-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Auslösen der Taster-Funktion?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.03.2014
    Beiträge
    101

    Auslösen der Taster-Funktion?

    Anzeige

    Hallo zusammen,

    ich habe einen Sketch nachgebaut, bei dem 8 Taster an den Ausgängen eine definierte Schaltzeit ausgeben (z.B. 400 msek), unabhängig davon, wie kurz oder wie lange ich einen jeweiligen Taster drücke. Das ganze funktioniert auch. Allerdings löst die Funktion erst dann aus, wenn ich den Taster wieder loslasse. Wenn ich den Taster z.B. 1 min drücke, passiert da gar nichts. Ich möchte aber gern, dass die Funktion genau dann auslöst, wenn ich den Taster runterdrücke (nicht erst dann, wenn ich ihn wieder loslasse).
    Die Taster-Kontakte schliessen gegen GND, gegen Plus liegen jeweils Widerstände (Pull-Up).

    Könnt Ihr mir bitte sagen, woran das liegt? Ist das im Programm begründet? Oder liegt das an der Beschaltung der Taster (Pull-Up oder besser Pull-Down)? Wie kann ich das ändern?


    Andi

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.425
    Ich verstehe zwar kaum was du meinst, du schreibst ziemlich wirr.

    Aber ich nehme an daß du die steigende Flanke eines Digitaleingangs auswertest und eigentlich lieber die fallende Flanke auswerten willst.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.649
    Blog-Einträge
    133
    Zitat Zitat von Andi#87 Beitrag anzeigen
    Ist das im Programm begründet? Oder liegt das an der Beschaltung der Taster (Pull-Up oder besser Pull-Down)? Wie kann ich das ändern?
    Hallo,
    dazu solltest Du Programm und Schaltplan zeigen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    33
    Beiträge
    4.995
    Es ist so wie White_Fox bereits schrieb.

    Du erkennst die steigende Flanke, du musst umstellen auf fallende Flanke. Das ist ein rein softwaretechnisches Problem. Poste den Code und den Plan.

    MfG Hannes

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    27.12.2017
    Beiträge
    92
    Vielleicht bin ich am Thema vorbei, aber wenn Du den Taster nur entprellen willst, dann hilft dir vielleicht dieser Link: https://elektro.turanis.de/html/prj059/index.html

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.03.2014
    Beiträge
    101
    Es sind 8 PullUp-Widerstände, die fest an +5V anliegen, die jeweils damit verbundenen 8 Taster schliessen bei Tasterbetätigung gegen GND.

    Hier ist der Sketch:



    #include <ButtonDebounce.h>
    #include <millisDelay.h>


    //Establish output time
    const unsigned long Debounce_Delay = 10;
    const unsigned long Out_Delay = 400;

    //Establish output pin numbers
    int Out_1 = 11;
    int Out_2 = 12;
    int Out_3 = A0;
    int Out_4 = A1;
    int Out_5 = A2;
    int Out_6 = A3;
    int Out_7 = A4;
    int Out_8 = A5;

    //Establish ButtonDebounce instances
    ButtonDebounce btn1(2,Debounce_Delay);
    ButtonDebounce btn2(3,Debounce_Delay);
    ButtonDebounce btn3(4,Debounce_Delay);
    ButtonDebounce btn4(5,Debounce_Delay);
    ButtonDebounce btn5(6,Debounce_Delay);
    ButtonDebounce btn6(7,Debounce_Delay);
    ButtonDebounce btn7(8,Debounce_Delay);
    ButtonDebounce btn8(9,Debounce_Delay);

    //Establish millisDelay instances
    millisDelay Out1_Delay;
    millisDelay Out2_Delay;
    millisDelay Out3_Delay;
    millisDelay Out4_Delay;
    millisDelay Out5_Delay;
    millisDelay Out6_Delay;
    millisDelay Out7_Delay;
    millisDelay Out8_Delay;

    void setup()
    {
    //Establish buttonDebounce callbacks
    btn1.setCallback(btn1_Changed);
    btn2.setCallback(btn2_Changed);
    btn3.setCallback(btn3_Changed);
    btn4.setCallback(btn4_Changed);
    btn5.setCallback(btn5_Changed);
    btn6.setCallback(btn6_Changed);
    btn7.setCallback(btn7_Changed);
    btn8.setCallback(btn8_Changed);

    //Set output pinouts
    pinMode(Out_1,OUTPUT);
    pinMode(Out_2,OUTPUT);
    pinMode(Out_3,OUTPUT);
    pinMode(Out_4,OUTPUT);
    pinMode(Out_5,OUTPUT);
    pinMode(Out_6,OUTPUT);
    pinMode(Out_7,OUTPUT);
    pinMode(Out_8,OUTPUT);

    //Initialize outputs
    digitalWrite(Out_1,LOW);
    digitalWrite(Out_2,LOW);
    digitalWrite(Out_3,LOW);
    digitalWrite(Out_4,LOW);
    digitalWrite(Out_5,LOW);
    digitalWrite(Out_6,LOW);
    digitalWrite(Out_7,LOW);
    digitalWrite(Out_8,LOW);
    }

    void loop()
    {
    //Check output delays for completion
    if (Out1_Delay.justFinished())
    {digitalWrite(Out_1,LOW);}
    if (Out2_Delay.justFinished())
    {digitalWrite(Out_2,LOW);}
    if (Out3_Delay.justFinished())
    {digitalWrite(Out_3,LOW);}
    if (Out4_Delay.justFinished())
    {digitalWrite(Out_4,LOW);}
    if (Out5_Delay.justFinished())
    {digitalWrite(Out_5,LOW);}
    if (Out6_Delay.justFinished())
    {digitalWrite(Out_6,LOW);}
    if (Out7_Delay.justFinished())
    {digitalWrite(Out_7,LOW);}
    if (Out8_Delay.justFinished())
    {digitalWrite(Out_8,LOW);}

    //Check buttons pressed
    btn1.update();
    btn2.update();
    btn3.update();
    btn4.update();
    btn5.update();
    btn6.update();
    btn7.update();
    btn8.update();
    }

    // ButtonDebounce callbacks
    void btn1_Changed(int state)
    {
    if (state == HIGH)
    {
    digitalWrite(Out_1,HIGH);
    Out1_Delay.start(Out_Delay);
    }
    }

    void btn2_Changed(int state)
    {
    if (state == HIGH)
    {
    digitalWrite(Out_2,HIGH);
    Out2_Delay.start(Out_Delay);
    }
    }

    void btn3_Changed(int state)
    {
    if (state == HIGH)
    {
    digitalWrite(Out_3,HIGH);
    Out3_Delay.start(Out_Delay);
    }
    }

    void btn4_Changed(int state)
    {
    if (state == HIGH)
    {
    digitalWrite(Out_4,HIGH);
    Out4_Delay.start(Out_Delay);
    }
    }

    void btn5_Changed(int state)
    {
    if (state == HIGH)
    {
    digitalWrite(Out_5,HIGH);
    Out5_Delay.start(Out_Delay);
    }
    }

    void btn6_Changed(int state)
    {
    if (state == HIGH)
    {
    digitalWrite(Out_6,HIGH);
    Out6_Delay.start(Out_Delay);
    }
    }

    void btn7_Changed(int state)
    {
    if (state == HIGH)
    {
    digitalWrite(Out_7,HIGH);
    Out7_Delay.start(Out_Delay);
    }
    }

    void btn8_Changed(int state)
    {
    if (state == HIGH)
    {
    digitalWrite(Out_8,HIGH);
    Out8_Delay.start(Out_Delay);
    }
    }

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.04.2015
    Beiträge
    752
    Wenn der Taster beim Drücken auf Low gezogen wird und Du auf das Low reagieren willst, ist es auch sinnvoll, in den Funktionen
    Code:
    void btnX_Changed(int state)-Funktionen
    (mit X= 1..8 )
    auf LOW zu prüfen

    Code:
    if (state == LOW)

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.03.2014
    Beiträge
    101
    Danke für die Antwort und Korrektur, werde das heute Nachmittag ausprobieren

    In diesem Fall bleibt es bei den PullUp-Widerständen. Das heisst, es liegt im Ruhezustand der Schaltung über diese PullUp-Widerstände zunächst immer HIGH an den Eingängen des Arduino an. Mit if (state == LOW) reagiert der ATMEL bzw. der Sketch auf die fallende Flanke.
    Frage für mich zum Verständnis: Würde es dasselbe Resultat ergeben, wenn ich den Sketch so belasse, wie er ursprünglich war if (state == HIGH) , dafür aber die Widerstände beschalte als PullDown? Dadurch würde an den Eingängen im Ruhezustand zunächst immer LOW, und erst bei Tasterbetätigung HIGH anliegen. Das würde dem ursprünglichen Sketch und meinem Anliegen auch entsprechen, oder?
    Also entweder PullUp und if (state == LOW) , oder PullDown und if (state == HIGH) ?


    Andi

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    33
    Beiträge
    4.995
    Zuerst einmal, bitte Code immer in Codetags schreiben, so wie es bei Holomino ist. Dadurch wird der Post lesbarer/übersichtlicher.


    Bei diesem Code reagierst du mit dem "if (state=...)" auf eine Flanke sondern auf einen Zustand.

    Ich weiß nicht welche Funktion du gerne hättest.

    Abfrage mit "if (state=...)" reagierst du auf einen Zustand. Bei jedem Durchlauf des Programms wird der Status geprüft und angesprungen.
    Bedeutet das jedes mal bei einem Low (wenn auf state==low geprüft wird) den jeweiligen Ausgang setzt.

    Wenn du auf eine Flanke reagieren möchtest, benötigst du den aktuellen und den letzten Zustand. Die Flanke dauert genau einen Programmdurchlauf.
    Hier in Pseudocode:
    Code:
    if (Status_aktuell==low && Status_alt==high)
    {
    Programm wird ausgeführt wenn fallende Flanke
    }
    Status_alt = Status_aktuell
    Zu deiner Frage

    Du kannst im Programm das high gegen ein low oder den Widerstand und den Taster tauschen. Ich verwende häufig (eigentlich immer wenn nötig) die internen Widerstände. Dadruch prüfe ich auf Low-Zustand.

    MfG Hannes

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.03.2014
    Beiträge
    101
    Danke für die Antwort.

    Betreffs "...immer in Codetags schreiben..." Ich weiss nicht, wie das gemacht wird (sorry)

    Andi

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 07.11.2011, 17:24
  2. Taster als Schalter aber mit Reset Funktion
    Von BacT im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 27.11.2010, 14:18
  3. Probleme mit Taster zum Auslösen des externen Interrupts
    Von Jaccaranda im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 10.03.2010, 13:28
  4. Funktion gibt Funktion zurück... nächstes Problem
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 19.12.2008, 08:51
  5. Mit Taster 1 auswählen und Taster 2 bestäti. " Menü aus
    Von Luppi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 07.04.2006, 21:07

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •