Премахване на "шума" (Debounce)

Този пример показва как може да се използва обикновен бутон като ключ: всеки път когато се натисне бутона, светодиода (или каквото сте свързали) се включва (ако е бил изключен) и се изключва (ако е бил включен). Същевременно премахва "шума" на входния сигнал без който еднократното натискане на бутона ще се възприема от кода като множество натискания. Използва millis () функцията за да засече момента когато бутонът е бил натиснат.

За този пример е нужен обикновен бутон свързан към пин 2 и светодиод свързан към пин 13.

Снимка

Код

/* Premahvane na "shum"
* ------------
*
* kontrolira svetodiod s pomoshtta na buton kato izchistva "shuma"
*
* ot David A. Mellis (2006)
*
* podobrena ot Limor Fried (Juli 2009)
*
* bulgarski prevod ot Simeon Ianchev / Robotev.com (Septemvri 2009)
*/

int inPin = 2;        	// promenliva za vhoden pin 
int outPin = 13;       	// promenliva za izhoden pin  

int state = HIGH;      	// promenliva za momentnoto sustoyanie na izhodniya pin.  
int reading;           	// promenliva za momentnoto sustoyanie na vhodniya pin 
int previous = LOW; 	// promenliva za predishnoto sustoyanie na vhodniya pin 

/* sledvashtite promenlivi sa ot tipa “long” zashtoto vremeto, 
izmervano v milisekundi(ms), burzo shte stane po-golyamo ot tova, 
koeto moje da se zapazi kato promenliva ot tipa “int”. 
*/

long time = 0;         	// otchita koga za posleden put e bil natisnat butona 
long debounce = 200;   	// vremeto prez, koeto da ne se otchitat pokazaniya za da premahne 
                        //“shum” ili lujlivi pokazaniya. Ako ustroystvoto svurzano 
                        //kum izhodniya pin primigva uvelichete stoynostta na promenlivata debounce 

void setup()
{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);
}

void loop()
{
  reading = digitalRead(inPin);

/* ako natisnem butona (t.e. Ako pokazanieto ot vhodniya pin stane ot LOW na HIGH)
I sme izchakali dostatachno dulgo ot poslednoto natiskane, za da izbegnem nejelaniya “shum”...
*/  

  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    // ... promeni sustoyanieto na izhodniya pin

    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    // ... I zapomni koga za posledno e bil natisnat butona 

    time = millis();    
  }

  digitalWrite(outPin, state);

  previous = reading;
}


Share