-         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Drucktaster einbinden mit der OneButton Library

  1. #11
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2018
    Beiträge
    202
    Anzeige

    Siro sagt es! Solang der in clickedIt() hängt bekommt er nichts mit. Und das fast eine halbe Sekunde lang. Dann bleibt für das Taste Drücken nur die Zeit, bis er nach dem clickedIt() wieder im clickedIt() landet, weil es aufgerufen wird. Man müsste daher die Taste für ca. 1 Sekunde drücken, vielleicht auch etwas länger, damit er es mitbekommt oder eben öfter. Das Problem gibt es, seit es Computer gibt. Deshalb hat man sich dafür etwas einfallen lassen: Interrupt Controller. Ob der Arduino einen solchen hat, weiß ich nicht, aber er kennt Interrupts. Die Digital Pins, die für einen Interrupt (Unterbrechung) genutzt werden können sind hier soweit alle aufgeführt: https://www.arduino.cc/reference/en/...tachinterrupt/

    Der Taster müsste an einen solchen Pin angeschlossen werden. Wenn dann der Taster gedrückt wird, sollte der Arduino direkt zur Interruptroutine springen und andere Dinge unterbrechen. Das nennt sich dann Interrupt Service Routine.

    Auf der Seite ist alles beschrieben:

    Syntax

    attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)

    Parameters

    interrupt: the number of the interrupt (int)
    pin: the pin number (Arduino Due, Zero, MKR1000 only)
    ISR: the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.
    mode: defines when the interrupt should be triggered. Four constants are predefined as valid values:

    LOW to trigger the interrupt whenever the pin is low,

    CHANGE to trigger the interrupt whenever the pin changes value

    RISING to trigger when the pin goes from low to high,

    FALLING for when the pin goes from high to low.

    The Due, Zero and MKR1000 boards allows also:

    HIGH to trigger the interrupt whenever the pin is high.


    Wenn man keinen Interrupt nutzt, hat man das Problem, dass man dauernd überall im Programmcode immer wieder auf den Taster prüfen müsste, damit man den Tastendruck nicht verpasst. Das kann sogar funktionieren, bläht aber den Code auf und ist äußerst unübersichtlich (in der Regel funktioniert es auch nicht wirklich gut).

    Was man tun kann, ist dieses rausschmeißen:

    Code:
     digitalWrite(LED, HIGH);
      delay(100);
      
      digitalWrite(LED, LOW);
      delay(100);
     
      digitalWrite(LED, HIGH);
      delay(100);
    
      digitalWrite(LED, LOW);
      delay(100);
    In loop() kann man immer auf den Taster prüfen. Verändert sich das Signal, kann man reagieren. Außerdem zählt man einen Zähler runter (Startwert meinetwegen bei 1000), bei jedem Durchlauf von loop() zähler = zähler -1. Wenn der Zähler auf 0 ist, setzt man die LED entweder auf HIGH oder LOW, abhängig davon, was zuletzt war (logisch) und setzt den Zähler wieder auf den Startwert. Wegen der Blinkgeschwindigkeit kann man den Zählerstartwert variieren.
    Geändert von Moppi (19.08.2018 um 15:49 Uhr)

  2. #12
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    38
    Beiträge
    228
    was halt komisch ist das wen ich den arduino nano an USB angeschlossen habe sprich an Serial funktioniert alles gut wen ich ihn ohne Laufen lasse macht er Probleme

    hir noch mal den Aktuellen Code

    Code:
    /*
      Analog Input
    
     
    */
    #include "OneButton.h"
    
    #define MOTOR_1  A2
    #define MOTOR_2  A4
    #define POTI     A0
    #define PWM      9
    #define TASTER   5
    
    #define LED      3
    
    bool sto = 0;
    
    
    
    
    
    //void clickedIt();
    OneButton button(TASTER, true);
    //int poti = A0;    // select the input pin for the potentiometer
    
    int poti_Value = 0;  // variable to store the value coming from the sensor
    
    int poti_prozent = 0;
    bool sicherheit = 1;
    
    void setup() {
      // declare the ledPin as an OUTPUT:
      //pinMode(ledPin, OUTPUT);
     Serial.begin(9600);
      //pinMode(MOTOR_1,OUTPUT);
      //pinMode(MOTOR_2,OUTPUT);
      pinMode(LED,OUTPUT);
      //pinMode(TASTER,INPUT_PULLUP);
      pinMode(MOTOR_1,OUTPUT);
      pinMode(MOTOR_2,OUTPUT);
      pinMode(PWM,OUTPUT);
      digitalWrite(LED, LOW); 
      poti_prozent = 4;
      // Sicherheitsschaltung Poti auf 0 und Motor Aus
      //poti_Value = analogRead(POTI);
      //poti_prozent = map(poti_Value, 0,1023, 0,100);
    
      //pinMode(TASTER, INPUT);
      button.attachClick(clickedIt);
      button.attachDoubleClick(doubleClickedIt);
    
      
          while( poti_prozent >= 3 )
          {  
               Serial.println("Poti zu Hoch ! ! !");
               digitalWrite(MOTOR_1, HIGH);
               digitalWrite(MOTOR_2, HIGH);
               digitalWrite(LED, HIGH);
               delay(60); 
              poti_Value = analogRead(POTI);
              poti_prozent = map(poti_Value, 0,1023, 0,100);
               digitalWrite(LED, LOW);
               delay(60);
              
          }
    
            
    }
    bool Drehrichtung = true;
    
    void loop() {
     button.tick();
     stopp();
     
           
      //void clickedIt();
      
      int pwmSpeed;
    
       //delay(200);
       //digitalWrite(MOTOR_1, HIGH);
       //digitalWrite(MOTOR_2, HIGH);
       //delay(200);
      
      if(Drehrichtung == true)
      {
           button.tick();
           stopp();
      //void clickedIt();
     // LED Drehrichtung Rechts 
     digitalWrite(LED, LOW);
     
      poti_Value = analogRead(POTI);
      poti_prozent = map(poti_Value, 0,1023, 0,100);
      // Ausgabe
      Serial.print("Rechts Poti = ");
      Serial.print(poti_prozent);
      Serial.println("% ");
      
      // Drehrichtung Rechts
      digitalWrite(MOTOR_1, LOW);
      digitalWrite(MOTOR_2, HIGH);
      
      // Geschwindigkeit regeln
      analogWrite(PWM, poti_Value / 4);
      
      }
      else
      {
            button.tick();
            stopp();
      //void clickedIt();
      
      // LED Drehrichtung Links
      digitalWrite(LED, HIGH);
    
      poti_Value = analogRead(POTI);
      poti_prozent = map(poti_Value, 0,1023, 0,100);
      // Ausgabe
      Serial.print("Links Poti = ");
      Serial.print(poti_prozent);
      Serial.println("% ");
    
      // Drehrichtung Links 
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, LOW);
      
      // Geschwindigkeit regeln
      analogWrite(PWM, poti_Value / 4);
      
      
      }
    
    
    
    
      
    }
    
    void clickedIt()
    {
    
      Drehrichtung = !Drehrichtung;
      
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, HIGH);
      
      
      digitalWrite(LED, HIGH);
      delay(100); 
      digitalWrite(LED, LOW);
      delay(100);
      digitalWrite(LED, HIGH);
      delay(100); 
      digitalWrite(LED, LOW);
      delay(100);
      
      
     }
     
    void doubleClickedIt()
    {
      sto = !sto;
      
     }
    
     void stopp(void)
    {
      while(sto == true )
      {
       button.tick();
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, HIGH);
    
       Serial.println("STOPP!!!");
      
      
      digitalWrite(LED, HIGH);
      delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();  
      digitalWrite(LED, LOW);
      delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();
        delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
      
      }
      
    }
    - - - Aktualisiert - - -

    ok hab es jetzt mal mit einer Funktion versucht leider nach einmaligen Drehrichtungswechsel reagiert er nicht mehr auf Tastendruck


    Code:
    /*
      Analog Input
    
     
    */
    #include "OneButton.h"
    
    #define MOTOR_1  A2
    #define MOTOR_2  A4
    #define POTI     A0
    #define PWM      9
    #define TASTER   5
    
    #define LED      3
    
    bool sto = 0;
    bool drehrichtung = 0;
    
    
    
    
    //void clickedIt();
    OneButton button(TASTER, true);
    //int poti = A0;    // select the input pin for the potentiometer
    
    int poti_Value = 0;  // variable to store the value coming from the sensor
    
    int poti_prozent = 0;
    bool sicherheit = 1;
    
    void setup() {
      // declare the ledPin as an OUTPUT:
      //pinMode(ledPin, OUTPUT);
     Serial.begin(9600);
      //pinMode(MOTOR_1,OUTPUT);
      //pinMode(MOTOR_2,OUTPUT);
      pinMode(LED,OUTPUT);
      //pinMode(TASTER,INPUT_PULLUP);
      pinMode(MOTOR_1,OUTPUT);
      pinMode(MOTOR_2,OUTPUT);
      pinMode(PWM,OUTPUT);
      digitalWrite(LED, LOW); 
      poti_prozent = 4;
      // Sicherheitsschaltung Poti auf 0 und Motor Aus
      //poti_Value = analogRead(POTI);
      //poti_prozent = map(poti_Value, 0,1023, 0,100);
    
      //pinMode(TASTER, INPUT);
      button.attachClick(clickedIt);
      button.attachDoubleClick(doubleClickedIt);
    
      
          while( poti_prozent >= 3 )
          {  
               Serial.println("Poti zu Hoch ! ! !");
               digitalWrite(MOTOR_1, HIGH);
               digitalWrite(MOTOR_2, HIGH);
               digitalWrite(LED, HIGH);
               delay(60); 
              poti_Value = analogRead(POTI);
              poti_prozent = map(poti_Value, 0,1023, 0,100);
               digitalWrite(LED, LOW);
               delay(60);
              
          }
    
            
    }
    bool Drehrichtung = true;
    
    void loop() {
     button.tick();
     stopp();
     if(drehrichtung == 1)
     {
        drehrichtun();
     }
           
      //void clickedIt();
      
      int pwmSpeed;
    
       //delay(200);
       //digitalWrite(MOTOR_1, HIGH);
       //digitalWrite(MOTOR_2, HIGH);
       //delay(200);
      
      if(Drehrichtung == true)
      {
           button.tick();
           stopp();
      //void clickedIt();
     // LED Drehrichtung Rechts 
     digitalWrite(LED, LOW);
     
      poti_Value = analogRead(POTI);
      poti_prozent = map(poti_Value, 0,1023, 0,100);
      // Ausgabe
      Serial.print("Rechts Poti = ");
      Serial.print(poti_prozent);
      Serial.println("% ");
      
      // Drehrichtung Rechts
      digitalWrite(MOTOR_1, LOW);
      digitalWrite(MOTOR_2, HIGH);
      
      // Geschwindigkeit regeln
      analogWrite(PWM, poti_Value / 4);
      
      }
      else
      {
            button.tick();
            stopp();
      //void clickedIt();
      
      // LED Drehrichtung Links
      digitalWrite(LED, HIGH);
    
      poti_Value = analogRead(POTI);
      poti_prozent = map(poti_Value, 0,1023, 0,100);
      // Ausgabe
      Serial.print("Links Poti = ");
      Serial.print(poti_prozent);
      Serial.println("% ");
    
      // Drehrichtung Links 
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, LOW);
      
      // Geschwindigkeit regeln
      analogWrite(PWM, poti_Value / 4);
      
      
      }
    
    
    
    
      
    }
    
    void clickedIt()
    {
    
    drehrichtung = 1;
      
     }
     
    void doubleClickedIt()
    {
      sto = !sto;
      
     }
    
     void stopp(void)
    {
      while(sto == true )
      {
       button.tick();
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, HIGH);
    
       Serial.println("STOPP!!!");
      
      
      digitalWrite(LED, HIGH);
      delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();  
      digitalWrite(LED, LOW);
      delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();
        delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
      
      }
      
    }
    
    void drehrichtun(void)
    {
      Drehrichtung = !Drehrichtung;
      
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, HIGH);
      
      
      digitalWrite(LED, HIGH);
      delay(100); 
      digitalWrite(LED, LOW);
      delay(100);
      digitalWrite(LED, HIGH);
      delay(100); 
      digitalWrite(LED, LOW);
      delay(100);
      drehrichtung = 0;
    }
    ich habe das "button.tick();" noch in der schleife vergessen


    Code:
    
    void drehrichtun(void)
    {
      Drehrichtung = !Drehrichtung;
      
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, HIGH);
      
      
      digitalWrite(LED, HIGH);
      delay(100); 
      digitalWrite(LED, LOW);
      delay(100);
      digitalWrite(LED, HIGH);
      delay(100); 
      digitalWrite(LED, LOW);
      delay(100);
      drehrichtung = 0;
    }
    wes geht nur sauber wen ich es am PC angeschlossen habe
    Geändert von Ferdinand (19.08.2018 um 21:12 Uhr)
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2018
    Beiträge
    202
    Vielleicht hat es dann etwas mit der Spannungsquelle zu tun?

  4. #14
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    38
    Beiträge
    228
    ja du hattest recht es war was mit dem Taster nicht in Ordnung der hatte nicht den richtigen Kontakt typisch Steckbrett eben jetzt geht alles wie ich mir das vorstelle später kommt noch ein 3 * 7Segment anzeige für die Ausgabe in % hinzu
    hir mein aktueller code

    Code:
    /*
      Analog Input
    
     
    */
    #include "OneButton.h"
    
    #define MOTOR_1  A2
    #define MOTOR_2  A4
    #define POTI     A0
    #define PWM      9
    #define TASTER   5
    
    #define LED      3
    
    bool sto = 0;
    bool drehrichtung = 0;
    
    
    
    
    //void clickedIt();
    OneButton button(TASTER, true);
    //int poti = A0;    // select the input pin for the potentiometer
    
    int poti_Value = 0;  // variable to store the value coming from the sensor
    
    int poti_prozent = 0;
    bool sicherheit = 1;
    
    void setup() {
      
     Serial.begin(9600);
    
      pinMode(LED,OUTPUT);
      //pinMode(TASTER,INPUT_PULLUP);
      pinMode(MOTOR_1,OUTPUT);
      pinMode(MOTOR_2,OUTPUT);
      pinMode(PWM,OUTPUT);
      digitalWrite(LED, LOW); 
      poti_prozent = 4;
      // Sicherheitsschaltung Poti auf 0 und Motor Aus
      
    
      //pinMode(TASTER, INPUT);
      button.attachClick(clickedIt);
      button.attachDoubleClick(doubleClickedIt);
    
      
          while( poti_prozent >= 3 )
          {  
               Serial.println("Poti zu Hoch ! ! !");
               digitalWrite(MOTOR_1, HIGH);
               digitalWrite(MOTOR_2, HIGH);
               digitalWrite(LED, HIGH);
               delay(60); 
              poti_Value = analogRead(POTI);
              poti_prozent = map(poti_Value, 0,1023, 0,100);
               digitalWrite(LED, LOW);
               delay(60);
              
          }
    
            
    }
    bool Drehrichtung = true;
    
    void loop() {
     button.tick();
     stopp();
     if(drehrichtung == 1)
     {
        button.tick();
        drehrichtun();
     }
           
      //void clickedIt();
      
      int pwmSpeed;
    
      
      if(Drehrichtung == true)
      {
           button.tick();
           stopp();
     
     // LED Drehrichtung Rechts 
     digitalWrite(LED, LOW);
     
      poti_Value = analogRead(POTI);
      poti_prozent = map(poti_Value, 0,1023, 0,100);
    
           button.tick();
            stopp();
      
      // Ausgabe
      Serial.print("Rechts Poti = ");
      Serial.print(poti_prozent);
      Serial.println("% ");
    
           button.tick();
            stopp();
      
      
      // Drehrichtung Rechts
      digitalWrite(MOTOR_1, LOW);
      digitalWrite(MOTOR_2, HIGH);
      
      // Geschwindigkeit regeln
      analogWrite(PWM, poti_Value / 4);
    
           button.tick();
            stopp();
      
      
      }
      else
      {
            button.tick();
            stopp();
      //void clickedIt();
      
      // LED Drehrichtung Links
      digitalWrite(LED, HIGH);
    
      poti_Value = analogRead(POTI);
      poti_prozent = map(poti_Value, 0,1023, 0,100);
    
           button.tick();
            stopp();
      
      // Ausgabe
      Serial.print("Links Poti = ");
      Serial.print(poti_prozent);
      Serial.println("% ");
    
           button.tick();
            stopp();
    
      // Drehrichtung Links 
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, LOW);
      
      // Geschwindigkeit regeln
      analogWrite(PWM, poti_Value / 4);
      
             button.tick();
            stopp();
      
      }
    
    
    
    
      
    }
    
    void clickedIt()
    {
    
    drehrichtung = 1;
      
     }
     
    void doubleClickedIt()
    {
      sto = !sto;
      
     }
    
     void stopp(void)
    {
      while(sto == true )
      {
       button.tick();
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, HIGH);
    
       Serial.println("STOPP!!!");
      
      
      digitalWrite(LED, HIGH);
      delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();  
      digitalWrite(LED, LOW);
      delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
        delay(50);
      button.tick();
        delay(50);
      button.tick(); 
        delay(50);
      button.tick(); 
      
      }
      
    }
    
    void drehrichtun(void)
    {
      Drehrichtung = !Drehrichtung;
      
      digitalWrite(MOTOR_1, HIGH);
      digitalWrite(MOTOR_2, HIGH);
      
      
      digitalWrite(LED, HIGH);
      delay(100); 
      digitalWrite(LED, LOW);
      delay(100);
      digitalWrite(LED, HIGH);
      delay(100); 
      digitalWrite(LED, LOW);
      delay(100);
      drehrichtung = 0;
    }
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2018
    Beiträge
    202
    Bei Steckbrettern muss man immer damit rechnen.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. C-Library in BASCOM einbinden??
    Von Jon im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 20.11.2009, 18:26
  2. Library einbinden
    Von fofi1 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 03.02.2009, 22:48
  3. Einbinden einer Library auf Mikrocontroller
    Von SummerTime im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 25.03.2008, 19:53
  4. MSDN Library in MS Visual Studio.Net 2003 Prof einbinden???
    Von sg10241024 im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 5
    Letzter Beitrag: 13.02.2005, 14:28
  5. drucktaster entprellen
    Von pebisoft im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 06.01.2005, 07:49

Berechtigungen

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