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
Smile Motorsteuerung mit Taster Eggi123 11 398 26.02.2017 15:48
Letzter Beitrag: MicroBahner
  Arduino-UNO LED über Taster digital zum leuchten zu bringen IvKriz 9 338 18.02.2017 08:33
Letzter Beitrag: renid55
  Hilfe bei Taster huber5093 11 305 14.02.2017 19:26
Letzter Beitrag: Tommy56
  8 Taster an einem Pin Kitt 9 467 04.02.2017 18:51
Letzter Beitrag: ardu_arne
  Led Impuls beim Taster betätigen clemens5555 11 453 17.01.2017 20:00
Letzter Beitrag: renid55
  Über drei Taster zwei externe Timer steuern Sidamo 23 612 09.01.2017 20:12
Letzter Beitrag: Tommy56
  Led mit taster ausschalten Frankeg 17 721 07.01.2017 21:17
Letzter Beitrag: renid55
  aufeinander Aufbauende Lichtaktion mit einem Taster Colby 9 479 17.12.2016 13:30
Letzter Beitrag: Colby
  mehrere Taster entprellen Kitt 15 953 24.10.2016 21:17
Letzter Beitrag: georg01
  Taster für mehrere Funktionen matthias3579 5 553 16.08.2016 16:00
Letzter Beitrag: StephanBuerger

Gehe zu:


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