Ciljevi učenja
- Povezati GPIO27 sa tasterom prema GND i uključiti INPUT_PULLUP.
- Razlikovati sirovo očitavanje, stabilno stanje i opadajuću ivicu.
- Objasniti filtriranje odskakivanja kontakata pomoću millis() i intervala 30 ms.
- Uključiti i isključiti LED jednim prihvaćenim pritiskom bez ponavljanja tokom držanja.
- Provjeriti očekivano ponašanje pritiskom, otpuštanjem, držanjem i resetovanjem.
Prije početka
Završi kurseve 01 i 02: učitavanje Arduino programa, Serial Monitor i LED sa serijskim otpornikom.
Referentna postavka
- Ploča u Arduino IDE-u
- ESP32 Dev Module
- Arduino-ESP32
- 3.3.12
- Serial Monitor
- 115200 baud
Ovo je referentni profil, a ne identifikacija ploče sa fotografije. Za ESP32-C3/S2/S3 ili drugačije označenu ploču treba prilagoditi GPIO i provjeriti šemu prije spajanja.
Šta ćemo napraviti
Napravićemo svjetlo kojim se upravlja kratkim pritiscima: prvi pritisak uključuje LED, drugi je isključuje. LED zadržava izabrano stanje kada otpustimo taster. Držanje tastera ne izaziva ponovljeno uključivanje i isključivanje. Program pri pokretanju postavlja LED u isključeno stanje.
Ovakvo ponašanje povezuje fizičku radnju sa jednom komandom. Osim spajanja kola, naučićemo zašto računar može jedan stvarni pritisak protumačiti kao nekoliko događaja i kako to ispraviti.
Šta ćeš naučiti
- Povezati taster na digitalni ulaz sa unutrašnjim pull-up otpornikom.
- Razlikovati trenutno stanje ulaza od događaja pritiska.
- Prihvatiti promjenu tek poslije 30 ms stabilnog očitavanja.
- Sačuvati stanje LED diode između prolazaka kroz
loop(). - Provjeriti kratki pritisak, otpuštanje i dugo držanje.
Predznanje
Prvo završi kurseve 01 i 02: učitavanje programa, Serial Monitor i povezivanje LED diode sa otpornikom. Potrebno je da prepoznaš setup(), loop() i razliku između HIGH i LOW. Vremensku provjeru objasnićemo kroz ovaj primjer.
Potrebna oprema
| Komponenta | Količina | Specifikacija i napomene |
|---|---|---|
| ESP32 razvojna ploča sa klasičnim ESP32-WROOM-32 modulom | 1 | GPIO nazivi moraju odgovarati referentnom profilu; fizički položaj izvoda provjeriti na ploči. |
| USB kabl za podatke i napajanje | 1 | Priključak prilagoditi ploči; komplet na slici navodi Micro-USB. |
| Eksperimentalna ploča | 1 | Komplet navodi 830 kontaktnih tačaka. Provjeriti eventualni prekid naponskih vodova. |
| Crvena LED dioda | 1 | Anoda A i katoda K; provjeriti polaritet stvarne komponente. |
| Otpornik 220 Ω | 1 | Po jedan otpornik za svaku LED granu; 220 Ω iz kompleta. |
| Trenutni taster | 1 | Koristiti par priključaka koji se spaja pritiskom; ista strana četvoronožnog tastera može već biti spojena. |
| Spojni kablovi | 5 | M-M ili F-M prema priključcima ploče. Okvirna količina. |
Koristimo klasičnu ESP32 ploču sa modulom ESP32-WROOM-32. Prati oznake GPIO na ploči, bez brojanja fizičkih položaja pinova. Ovaj raspored nije namijenjen varijantama ESP32-C3, S2 ili S3.
Kako taster i program rade
Taster spaja GPIO27 sa masom kada ga pritisnemo. Podešavanje INPUT_PULLUP uključuje unutrašnji otpornik koji otpušten ulaz drži na HIGH. Pritisnut taster dovodi ulaz na LOW. Za ovaj raspored nije potreban poseban spoljašnji pull-up otpornik. Funkcije za podešavanje i čitanje ulaza opisane su u Espressif GPIO dokumentaciji.
Mehanički kontakti pri pritiskanju kratko poskakuju. Zato program razlikuje sirovo očitavanje od prihvaćenog, stabilnog stanja. Svaka promjena sirovog očitavanja ponovo pokreće mjerenje intervala. Novo stanje prihvata se tek kada očitavanje ostane isto najmanje 30 ms. To je uklanjanje odskakivanja kontakata, odnosno debounce; Arduino primjer Debounce prikazuje ovaj princip.
LED mijenjamo samo kada prihvaćeno stanje pređe sa HIGH na LOW, što zovemo opadajuća ivica. Stabilno LOW tokom držanja nije novi događaj. Otpuštanje vraća stanje na HIGH i omogućava sljedeći pritisak.
Šema i povezivanje
Šema povezivanja
Prikaz prikazuje električne veze po GPIO nazivima, a ne fizički raspored priključaka ploče. Napajanje ploče je preko USB kabla.
| Od | Do | Opis veze |
|---|---|---|
ESP32.GPIO25 | R1.1 | Upravljanje granom LED. |
R1.2 | D1.A | Otpornik 220 Ω prema anodi LED diode. |
D1.K | ESP32.GND | Katoda prema zajedničkoj masi. |
ESP32.GPIO27 | SW1.CONTACT_A | Digitalni ulaz sa uključenim INPUT_PULLUP. |
SW1.CONTACT_B | ESP32.GND | Odabrani par kontakata spaja se tek pritiskom. |
- Odspoji USB prije pomjeranja kablova. Spoji GND ESP32 na izabranu masu eksperimentalne ploče.
- Spoji GPIO25 preko otpornika od 220 Ω na anodu LED. Katodu spoji na GND. Anoda je obično duža nožica nove LED, a ravna ivica kućišta označava stranu katode; kod skraćenih nožica provjeri oznake konkretnog dijela.
- Prepoznaj kontakte tastera. Kod uobičajenog četvoronožnog tastera postoje dvije grupe interno spojenih nožica; pritisak povezuje te grupe. Raspored provjeri dokumentacijom ili mjerenjem kontinuiteta na odspojenom tasteru.
- Izaberi dva kontakta koji su razdvojeni dok je taster otpušten, a spojeni kada se pritisne. Jedan spoji na GPIO27, drugi na GND.
- Provjeri da taster ili žice nisu spojili ulaz direktno sa masom mimo prekidača. Ne dovodi 5 V na GPIO; ploča se napaja USB kablom.
Pogrešan izbor dva već spojena kontakta znači stalno pritisnut taster. Na eksperimentalnoj ploči provjeri i interne grupe rupica: dvije nožice u istoj povezanoj grupi ostaju električki spojene bez obzira na položaj tastera.
Priprema Arduino okruženja
U Arduino IDE-u 2.x instaliraj paket esp32 by Espressif Systems, ciljna verzija 3.3.12, prema zvaničnom uputstvu. Izaberi ESP32 Dev Module i port svoje ploče. Dodatne biblioteke nisu potrebne.
Preuzmi Arduino primjer (.zip), raspakuj ga i otvori button_toggle/button_toggle.ino. U kompletnom paketu kursa nalazi se pod arduino/. Zadrži naziv foldera button_toggle da odgovara nazivu skice. Provjeri GPIO25 za LED i GPIO27 za taster. Serial Monitor podesi na 115200 baud.
Kompletan Arduino program
#include <Arduino.h>
constexpr uint8_t LED_PIN = 25;
constexpr uint8_t BUTTON_PIN = 27;
constexpr uint32_t DEBOUNCE_MS = 30;
bool ledOn = false;
int lastReading = HIGH;
int stableButtonState = HIGH;
uint32_t lastChangeMs = 0;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// A button held during startup must be released before the first toggle.
lastReading = digitalRead(BUTTON_PIN);
stableButtonState = lastReading;
lastChangeMs = millis();
Serial.println("WB Maker Bridge - Press the button to toggle the LED.");
Serial.println("LED: OFF");
}
void loop() {
const uint32_t now = millis();
const int reading = digitalRead(BUTTON_PIN);
if (reading != lastReading) {
lastReading = reading;
lastChangeMs = now;
}
if (now - lastChangeMs >= DEBOUNCE_MS && reading != stableButtonState) {
stableButtonState = reading;
// INPUT_PULLUP means LOW is pressed; only a new press toggles the LED.
if (stableButtonState == LOW) {
ledOn = !ledOn;
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
Serial.print("LED: ");
Serial.println(ledOn ? "ON" : "OFF");
}
}
}
Program prikazan ovdje i datoteka za preuzimanje predstavljaju isti primjer. Prvo ga pokreni bez izmjena da dobiješ polazno ponašanje za poređenje.
Prolazak kroz program
U setup() LED izlaz dobija početno isključeno stanje, a ulaz tastera unutrašnji pull-up. ledOn pamti stanje LED; program čuva i posljednje sirovo očitavanje, prihvaćeno stanje i vrijeme posljednje promjene. Konstanta DEBOUNCE_MS određuje 30 ms stabilnosti.
Svaki prolazak kroz loop() očitava ulaz i provjerava koliko je vremena prošlo. Pri promjeni ulaza bilježi se novo vrijeme. Poslije 30 ms stabilnosti program prihvata promjenu. Ako je novo prihvaćeno stanje LOW, obrće zapamćeno stanje LED i postavlja izlaz.
Za vremensku provjeru koristi se millis() i razlika vremenskih oznaka. Program ne zaustavlja izvršavanje čekanjem od 30 ms; tokom tog intervala nastavlja očitavati taster. Time razlikujemo filtriranje događaja od blokirajuće pauze.
Pokretanje i očekivani rezultat
Klikni Verify, zatim Upload. Otvori Serial Monitor i otpusti taster. Za ponovljiv početak pritisni reset na ESP32. LED treba da bude ugašena. Pritisni i otpusti taster uobičajenom brzinom: LED se uključuje. Sljedeći pritisak je isključuje.
Držanje dvije sekunde daje jednu promjenu, a otpuštanje nijednu. Serial Monitor prijavljuje LED: ON ili LED: OFF. Reset vraća isključeno stanje. Ako je taster pritisnut tokom resetovanja, prvo ga otpusti pa ponovo pritisni.
| Proba od početnog isključenog stanja | Očekivanje |
|---|---|
| Jedan normalan pritisak | LED uključena. |
| Drugi pritisak | LED isključena. |
| Treći pritisak i držanje dvije sekunde | LED uključena tokom držanja. |
| Otpuštanje poslije držanja | LED ostaje uključena. |
| Reset uz otpušten taster | LED isključena. |
Zabilježi odvojeno uspjeh kompajliranja i ponašanje isprobano na ploči. Vrlo kratak impuls, kraći od perioda stabilizacije, program može namjerno odbaciti.
Najčešći problemi
| Simptom | Provjera i postupak |
|---|---|
| LED nikad ne svijetli | Provjeri polaritet, otpornik, GPIO25 i zajednički GND; ponovi LED vježbu iz kursa 02. |
| Taster ne izaziva promjenu | Provjeri GPIO27 i izabrane kontakte; oni moraju mijenjati kontinuitet pritiskom. |
| Ulaz izgleda stalno aktivan | Provjeri da dvije žice nisu na interno spojenim nožicama ili istoj grupi rupica. |
| Više promjena pri jednom pritisku | Vrati izvorni program sa 30 ms filtriranjem i provjeri labave kontakte. |
| Poruke su nečitljive | Podesi Serial Monitor na 115200 baud. |
Samostalni zadatak
Od resetovanog uređaja uradi pet odvojenih pritisaka pa predvidi stanje prije šestog. Zatim promijeni period filtriranja sa 30 na 250 ms i ispitaj kratak dodir i pritisak koji traje pola sekunde. Zapiši koja se radnja prihvata i osjećaš li kašnjenje. Vrati početnih 30 ms.
Pitanja za provjeru
- Zašto otpušten taster daje
HIGH? - Zašto obrada svakog očitanog
LOWne odgovara našem zadatku? - Da li je otpuštanje opadajuća ivica u ovoj šemi?
Smjernice i rješenje
Poslije pet prihvaćenih pritisaka LED je uključena; šesti je isključuje. Svaki par pritisaka vraća početno stanje. Sa intervalom 250 ms pritisak od približno 200 ms ne ostaje dovoljno dugo stabilan da bude prihvaćen. Pritisak od pola sekunde prihvata se poslije približno četvrtine sekunde stabilnog nivoa.
Unutrašnji pull-up određuje otpušteni HIGH. Obrada svakog LOW mijenjala bi LED tokom mnogih prolazaka petlje dok držimo taster. Pritisak je prelaz HIGH → LOW; otpuštanje je prelaz LOW → HIGH. Za novi prihvaćeni pritisak i otpuštanje mora biti uredno registrovano.
