Close

Arduino základy – 10. detekce změny stavu tlačítka

Zapojení tlačítka k Arduinu pomocí breadboardu

Číst stav tlačítka už umíme. Někdy ale potřebujeme provést nějakou činnost závislou na počtu jeho stlačení. Abychom však tento úkon mohli provést, musíme přesně vědět, kdy se stav tlačítka změní z LOW na HIGH a přitom počítat, kolikrát tato změna proběhne. Tento proces se nazývá detekce změny stavu či detekce náběžné hrany.

Potřebný hardware

  • Arduino
  • tlačítko či spínač
  • rezistor s odporem 10 kΩ
  • nepájivé kontaktní pole
  • propojovací vodiče

Obvod

Zapojení tlačítka - Arduino

Zapojení tlačítka

 

K Arduinu připojte tři vodiče: první zapojte od jednoho pinu tlačítka přes pull-down rezistor (10 kΩ) k zemi, druhý do 5V. Poslední potom zapojte do digitálního i/o pinu (pin 2), který bude číst stav tlačítka.

Když je tlačítko otevřené (nestlačené), tak mezi piny tlačítka neexistuje žádné spojení, takže pin D2 je připojen k zemi (přes pull-down rezistor) a funkce digitalRead(2) vrátí stav LOW. Když je tlačítko zavřené (stlačené), vytvoří spojení mezi piny, čímž připojí pin D2 k 5V a vrácená hodnota bude HIGH.

Schéma

Schéma zapojení tlačítka - Arduino

Schéma zapojení tlačítka

 

V programu se bude stále dokola opakovat následující: Vždy se přečte stav tlačítka, poté je zjištěný stav porovnán se stavem zjištěným z posledního průchodu cyklu loop. Pokud se naměřený stav liší od toho posledního a momentálně je na D2 stav HIGH, víme, že tlačítko někdo zmáčkl. V tomto případě je počet stlačení navýšen o jeden.

Program rovněž kontroluje hodnotu počítadla stisknutí a pokud se rovná násobku čtyř, zapne LED na pinu 13. V jiných případech ji naopak vypne.

Kód

/*
Změna stavu tlačítka (detekce hrany)

Většinou stav digitálního vstupu nepotřebujete neustále kontrolovat,
stačí vám vědět pouze informace o jeho změnách.
Chcete například zjistit, kdy se stav tlačítka změní z OFF na ON. Právě toto nazýváme detekce změny stavu či detekce hrany.

Tento příklad vám ukáže, jak takovou změnu stavu tlačítka z OFF na ON a naopak detekovat.

Obvod:
* tlačítko připojené k pinu 2 od +5V
* 10k ohm rezistor připojený k pinu D2 od GND
* LED připojená z pinu 13 k zemi (můžete rovněž použít již zabudovanou LED) 

vytvořeno  27 září 2005
upravil 30 srpna 2011
Tom Igoe

https://arduino.cc/en/Tutorial/ButtonStateChange

*/

// tato konstanta se nezmění:
const int  buttonPin = 2;    // pin, ke kterému je připojeno tlačítko
const int ledPin = 13;       // pin, ke kterému je připojena LED

// Proměnné se změní:
int buttonPushCounter = 0;   // počítadlo stlačení tlačítka
int buttonState = 0;         // současný stav tlačítka
int lastButtonState = 0;     // předchozí stav tlačítka

void setup() {
    // inicializujte pin tlačítka jako vstup:
    pinMode(buttonPin, INPUT);
    // inicializujte LED jako výstup:
    pinMode(ledPin, OUTPUT);
    // inicializujte sériovou komunikaci:
    Serial.begin(9600);
}


void loop() {
    // přečtěte vstupní pin tlačítka:
    buttonState = digitalRead(buttonPin);
    
    // porovnejte buttonState (stav tlačítka) s předchozím stavem
    if (buttonState != lastButtonState) {
        // jestliže se stav změnil, navyšte hodnotu počítadla
        if (buttonState == HIGH) {
            // jestliže je současný stav HIGH, tlačítko přešlo
            //z off na on:
            buttonPushCounter++;
            Serial.println("on");
            Serial.print("number of button pushes:  ");
            Serial.println(buttonPushCounter);
        }
        else {
            // jestliže je současný stav LOW, tlačítko přešlo
            // z on na off:
            Serial.println("off");
        }
    }
    // uložte současný stav jako „poslední stav“, 
    //abyste ho mohli v příští smyčce použít
    lastButtonState = buttonState;
    
    
    // zapne LED po každých čtyřech stlačeních
    // použitím modula počítadla.
    // funkce modulo vám vrátí zbytek
    // z dělení dvou čísel:
    if (buttonPushCounter % 4 == 0) {
        digitalWrite(ledPin, HIGH);
    } else {
        digitalWrite(ledPin, LOW);
    }
}

Oldřich Horáček

6 Comments on “Arduino základy – 10. detekce změny stavu tlačítka

Max
1.12.2020 at 17:39

Dobrý den.

Potřeboval bych vypsat kód pro ovládání pěti LED diod jedním tlačítkem a to tak že při prvním stisknutí tl. svítí LED 1 a při dalším stisknutí LED 1 zhasne a rozsvítí se LED 2. Při dalším stisknutí tlačítka, zhasne LED 2 ,rozsvítí se LED 3. Takto až k LED 5 a to celé ve smyčce při stálém mačkání tlačítka. A 2x na jedné desce. To znamená 2 tlačítka a 2x 5 LED ovládane zvlášt. Je to možné s použitím desky Arduino uno?

Děkuji za odpovědi

Oldřich Horáček
2.12.2020 at 10:17

Zdravím Jiří, určitě tohle je možné udělat a nebude se jednat o nic složitého. Po každé detekci zmáčknutí tlačítka jen změníte akci podle proměnné, ve které j počet zmáčknutí. Po projetí cyklu proměnnou vynulujete.

Max
2.12.2020 at 15:47

Tak program jsem našel a upravil ale nevím jak to vypsat aby to fungovalo s dvěma tlačítky a 2x 5 LED. Díky za odpověd Oldřich Horáček.

Ota
7.8.2016 at 21:38

Dobrý den mohl by mi prosim někdo pomoci dělam algoritmus a chtěl bych aby dioda když se zmáčkne tlačítko začala blikat a když se znova zmáčkne tak aby zasla zatim sem dokázal jen při stisku zapnout nebo vypnout. const int buttonPin = 2; // číslo pinu tlačítka
const int ledPin = 13; // číslo pinu LED
bool ledState = 0;
bool buttonState = 0;
bool lastButtonState= 0;

void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);

}

void loop() {

buttonState = digitalRead(buttonPin);

if (buttonState == 1 and lastButtonState == 0) {

if (ledState == HIGH)
ledState = 0;
else
ledState = 1;

digitalWrite(ledPin, ledState);

}
lastButtonState = buttonState;

}
Děkuji

Zbyšek Voda
8.8.2016 at 13:46

Dobrý den, třeba takhle:
const int buttonPin = 2; // číslo pinu tlačítka
const int ledPin = 13; // číslo pinu LED

byte lastButtonState = 0;
byte buttonState = 0;

byte ledBlinking = 0;
byte ledState = 0;
unsigned long lastTickTime = 0;
int tickPeriod = 500;

void setup(){
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}

void loop(){
buttonState = digitalRead(buttonPin);

if(buttonState != lastButtonState ){
if(buttonState == HIGH){
ledBlinking = !ledBlinking;
}
lastButtonState = buttonState;
}

if(ledBlinking){
if(millis() – lastTickTime >= tickPeriod){
lastTickTime = millis();
ledState = !ledState;
}
}
else{
ledState = LOW;
}

digitalWrite(ledPin, ledState);
}

Ivica
5.7.2016 at 8:17

Pozdrav vsem!
Jsem na osnove teho prikladu /ButtonStateChange/ udelal Čitadlo zmen, merič skorosti.
Nutne je ho dodelat a išču spolupraci.
link do toho co jsem do ted udelal: http://icahr.sweb.cz/poso/ardu/ArduProc-Counter.rar
Dekuji!
Ivica

Napsat komentář