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

Čí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.
Obsah článku:
Potřebný hardware
- Arduino
- tlačítko či spínač
- rezistor s odporem 10 kΩ
- nepájivé kontaktní pole
- propojovací vodiče
Obvod
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
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); } }
- TOP 11 Free nástrojů, aby se naše děti naučily programovat - 6.12.2024
- Jak vyrobit plošný spoj pomocí laseru TOOCA L1? - 30.11.2024
- Microbit ve výuce a doma aneb jak a s čím začít - 27.11.2024
Max
1.12.2020 at 17:39Dobrý 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:17Zdraví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:47Tak 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:38Dobrý 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:46Dobrý 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:17Pozdrav 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