INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Taster Entprellen
03.03.2015, 10:41
Beitrag #1
Taster Entprellen
Hey Leute,
arbeite noch nicht so lange mit Arduino Uno,
habe nun ein Programm geschrieben, dass bei Tasterdruck eine sieben Segment Anzeige zum leuchten bringt und dort eine Zahl ausgibt. (Zahlen 1-9, Buchstaben A-F)
Nun muss ich das Programm noch entprellen und ich verstehe ich nicht wie ich das machen soll,
bitte nun um eure Hilfe
MFG Runi

Code:
int sega  = 2;
int segb = A2;
int segc = A3;
int segd = A1;
int sege = A0;
int segf = 3;
int segg = 4;
int segdp = A4;


int state ;
int laststate = HIGH ;
unsigned long lasttime ;
unsigned long time = 50 ;
int aktuell ;
int zahl = 0 ;
unsigned long longtime = 2500 ;


int ledPin [] = {
  2,3,4,A1,A2,A3,A4,A0};

int buttonPin = 7;

int  digits[][7] = {
  /* seg a, b, c, d, e, f */
  {  
    LOW, LOW, LOW, LOW, LOW, LOW, HIGH                                            }//0
  ,
  {
    HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH                                         }//1
  ,
  {
    LOW, LOW, HIGH, LOW, LOW, HIGH, LOW                                            }//2
  ,
  {
    LOW, LOW, LOW, LOW, HIGH, HIGH, LOW                                            }//3
  ,
  {
    HIGH, LOW, LOW, HIGH, HIGH, LOW, LOW                                           }//4
  ,
  {  
    LOW, HIGH, LOW, LOW, HIGH, LOW, LOW                                            }//5 ,
  ,
  {
    LOW, HIGH, LOW, LOW, LOW, LOW, LOW                                             }//6
  ,
  {
    LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH                                           }//7  
  ,
  {
    LOW, LOW, LOW, LOW, LOW, LOW, LOW                                               }//8  
  ,
  {
    LOW, LOW, LOW, LOW, HIGH, LOW, LOW                                              }//9
  ,
  {
    LOW, LOW, LOW, HIGH, LOW, LOW, LOW                                             }//10
  ,
  {
    HIGH, HIGH, LOW, LOW, LOW, LOW, LOW                                             }//11
  ,
  {
    LOW, HIGH, HIGH, LOW, LOW, LOW, HIGH                                          }//12
  ,
  {
    HIGH, LOW, LOW, LOW, LOW, HIGH, LOW                                           }//13
  ,
  {
    LOW, HIGH, HIGH, LOW, LOW, LOW, LOW                                            }//14    
  ,
  {
    LOW, HIGH, HIGH, HIGH, LOW, LOW, LOW                                            }//15
};




void set_digit(unsigned int ziffer){
  if(ziffer <16){
    digitalWrite(sega, digits[ziffer][0]);

    digitalWrite(segb, digits[ziffer][1]);

    digitalWrite(segc, digits[ziffer][2]);

    digitalWrite(segd, digits[ziffer][3]);

    digitalWrite(sege, digits[ziffer][4]);

    digitalWrite(segf, digits[ziffer][5]);

    digitalWrite(segg, digits[ziffer][6]);
  }
}



void setup()
{
  for(int i=0; i<8; i++)      
  {
    pinMode(ledPin [i], OUTPUT);
    digitalWrite(ledPin [i], HIGH);
  }
  pinMode(buttonPin, INPUT);

}

void loop()
{
  
  
  
  
  if ( zahl == 16)
  {
    zahl = 0;
  }
  state = digitalRead(buttonPin);

  if (state != laststate)
  {
    lasttime = millis();
  }



  if ((millis() - lasttime) > time)
  {

    if (state != aktuell)
    {
      aktuell = state;
      if (aktuell == LOW)
      {

        if(millis()>longtime)
        {
          while(digitalRead(buttonPin) == LOW)
          {
            set_digit(zahl);
            zahl = zahl+1;
            delay(240);

            if ( zahl == 16)
            {
              zahl = 0;
            }
          }
        }
        else
        {
          set_digit(zahl);
          zahl = zahl+1;
        }
      }
    }
  }
  laststate = state;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2015, 10:55
Beitrag #2
RE: Taster Entprellen
Hallo Runi,

entweder du machst es "manuell" wie hier beschrieben: http://arduino.cc/en/Tutorial/Debounce oder du nutzt die bounce - Lib von hier: http://playground.arduino.cc/Code/Bounce .
Da ist das Coding einfacher.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2015, 11:07
Beitrag #3
RE: Taster Entprellen
Wie genau hast Du denn den Taster angeschlossen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2015, 11:18
Beitrag #4
RE: Taster Entprellen
Angeschlossen in pin7 und in 5V, also dem Power Modul.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2015, 11:25 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2015 12:21 von HaWe.)
Beitrag #5
RE: Taster Entprellen
ich persönlich verwende für alle Werte, die ich einlese, einen Median-von-3 Filter mit ausgesprochen gutem Erfolg.
Vorraussetzung ist nur, dass die Werte zyklisch abgefragt werden.

Das heißt:
alle gemessenen Werte werden in ein FIFO-array[3] von der einen Seite reingeschleust, der älteste fliegt dafür raus.
Jetzt wird eine temporäre Array-Kopie erstellt und davon der Median berechnet (damit die zeitliche Ordnung des Original-Arrays nicht geändert wird).
Der Median (das ist der mittlere Wert des sortierten arrays) entspricht nun bei 3 Elementen automatisch dem am häufigsten vorkommenden Wert, das ist der, den ich zurückgebe.
Auf diese Weise werden kurzzeitige Ausreißer völlig eliminiert, und es entsehen keine Pseudo-Mittelwerte wie 0,7, die es bei einem 0/1 Taster nicht geben kann. Wer extrem verrauschte / verbouncte Werte hat, kann auch einen Median-von-5 verwenden, das ist aber bei mir noch nie nötig gewesen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2015, 11:25
Beitrag #6
RE: Taster Entprellen
Hmmm - einfacher wäre, wenn Du die Tasten auf GND/Minus schalten würdest, dann kannst Du den internen Pullup-Widerstand nutzen. So wie jetzt benötigst Du für den sicheren Betrieb einen Pull-Down-Widerstand den Du extern beschalten musst.

Die einfachste Variante zum Entprellen ist ein "delay(100)" (manchmal auch ein höherer oder niedrigerer Wert, das hängt von der Mechanik der Taster ab) nachdem der Eingang auf den entsprechenden Pegel geschaltet wurde. Hängt aber davon ab, ob man sich im Programm die Zeit dafür nehmen kann / will.

Gruss Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2015, 11:43
Beitrag #7
RE: Taster Entprellen
das stimmt - falls nicht kurz nach dem Drücken und 1µs bevor das Delay verarbeitet wird, doch noch ein Störsignal reinkommt.

und wer 10 Taster abfragen will, hat dann natürlich immer 10x100ms = 1 volle Sekunde Wartezeit.

Daher sind statistische Filter sicher geeigneter.

Wer keinen Median mag, kann auch einen Tiefpassfilter verwenden
F = (0.7 * F_alt) + (0.3 * Messwert)
und ihn bei 0/1-Tastern auf oder abrunden

if(F>0.5) F=1; else F=0;

funktoniert auch, reagiert aber nicht so sensibel und flink wie der Median.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2015, 12:07
Beitrag #8
RE: Taster Entprellen
Zu allererst würde ich versuchen das Problem, oder einen Teil davon an der Wurzel zu beseitigen.

http://playground.arduino.cc/Deutsch/Eingang

Man könnte das auch noch über ein RC-Glied versuchen. Das kommt dann drauf an, wie schnell hintereinander der Taster gedrückt werden wird.

Ich habe kürzlich einen Drehimpulsgeber und dessen digitalen Taster so entprellt. Danach gab es keine Preller mehr.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  mehrere Taster entprellen Kitt 15 532 24.10.2016 21:17
Letzter Beitrag: georg01
  Taster für mehrere Funktionen matthias3579 5 353 16.08.2016 16:00
Letzter Beitrag: StephanBuerger
  Steuern von 4 Servo mittels eines Taster und eines Potis Jackie09 17 766 16.07.2016 11:43
Letzter Beitrag: Binatone
  Schwellwert mit Taster ändern malsehen 16 1.421 12.04.2016 20:11
Letzter Beitrag: malsehen
  3 Schrittmotoren, 2 LED's 1 Taster cichla 0 397 31.03.2016 15:21
Letzter Beitrag: cichla
  Arduino Alarmanlage mit Taster erweitern Vengance 0 529 22.03.2016 17:54
Letzter Beitrag: Vengance
  Taster abfragen Rudi 3 694 25.02.2016 14:03
Letzter Beitrag: hotsystems
  digitalOutputpin mit Taster an- oder ausschalten Raptor 2 576 26.12.2015 20:59
Letzter Beitrag: torsten_156
  Problem mit Taster eddykett 0 784 23.08.2015 10:16
Letzter Beitrag: eddykett
  Taster-Programm TheTerrawr 2 1.060 06.08.2015 16:24
Letzter Beitrag: TheTerrawr

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste