Obsah:
- Krok 1: Nastavte dosku
- Krok 2: Pridajte tlačidlo a odpor
- Krok 3: Pripojenie tlačidiel
- Krok 4: Kód…
- Krok 5: Malá debounka
- Krok 6: Vytvorenie ponuky
- Krok 7: Rozdelenie kódu - globálne
- Krok 8: Rozpis kódu - nastavenie a vlastné funkcie
- Krok 9: Smyčka…
- Krok 10: Konečný blok kódu
Video: Ponuka v Arduine a spôsob použitia tlačidiel: 10 krokov (s obrázkami)
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:59
V mojom návode na Arduino 101 sa naučíte, ako nastaviť svoje prostredie v Tinkercad. Používam Tinkercad, pretože je to dosť silná online platforma, ktorá mi umožňuje predviesť študentom množstvo zručností pri stavbe obvodov. Neváhajte a zostavte všetky svoje návody pomocou Arduino IDE a skutočného Arduina!
V tomto návode sa naučíme niečo o tlačidlách! Potrebujeme vedieť:
- Ako ich zapojiť
- Čítanie ich hodnoty
- Debounce a prečo je to dôležité
- Praktická aplikácia (vytvorenie menu)
Väčšina ľudí si myslí, že najpraktickejšou vecou, ktorú je možné vykonať pomocou tlačidla, je zapnúť a vypnúť svetlo. Nebudeme tu! Použijeme naše na vytvorenie ponuky a nastavenie niektorých možností na Arduine.
Pripravený? Začnime!
Krok 1: Nastavte dosku
Prvým krokom je vloženie Arduina a Breadboard Small do oblasti prototypov. Na vyššie uvedených obrázkoch zistíte, ako zapojiť napájacie koľajnice.
Breadboard Mini má dve napájacie lišty hore a dole. Pripojíme ich k Arduinu, aby sme mohli napájať viac komponentov. Neskôr v tomto návode použijeme 3 tlačidlá, takže budeme potrebovať viac energie. Je potrebné poznamenať, že na malých doskách sú napájacie koľajnice vedené po doske horizontálne. To sa líši od stĺpcov v hlavnej oblasti prototypov v strede; tieto prebiehajú vertikálne. Na napájanie akéhokoľvek stĺpca v hlavnej oblasti v strede môžete použiť ktorýkoľvek z napájacích kolíkov.
Keď pridáte energiu, použite čierny a červený vodič na záporný a kladný. Na druhú stranu dosky pridajte vodiče na konci, ktoré napájajú. Túto stránku nebudeme používať, ale je to dobrá prax.
Krok 2: Pridajte tlačidlo a odpor
Pridajte malé tlačidlo zo zásobníka komponentov. Malo by to vyzerať ako na obrázku. Uistite sa, že nejde o prepínač! Pridajte tiež odpor. Kliknite naň a nastavte jeho hodnotu na 10 kΩ. To stačí na to, aby ste kolík stiahli nízko, keď nie je pripojený, čo je veľmi dôležité neskôr v kóde.
Umiestnite komponent do stredu nepájivej dosky. Ako tlačidlo funguje, je:
- Roh do rohu, tlačidlo nie je pripojené. Stlačením tlačidla sa kontakty zatvoria a spoja rohy.
- Bočné strany tlačidla sú spojené. Ak by ste zapojili drôt vľavo hore a vľavo dole, obvod by bol uzavretý.
Preto sme komponent umiestnili cez priestor v strede. Zabezpečuje, aby rohy neboli spojené pod kolíkmi v doske.
Ďalší krok poskytuje niekoľko obrázkov, ktoré ilustrujú tieto body.
Rezistor umiestnite z kolíka vpravo dole na stĺpce tak, aby sedel horizontálne.
Krok 3: Pripojenie tlačidiel
Obrázky vyššie jasne ukazujú, ako sa tlačidlá spájajú. Vždy to bol zmätok, keď si myslíte, že niečo je dobré a nefunguje to!
Teraz pridáme drôty.
- Umiestnite červený vodič z kladného napájacieho kolíka do rovnakého stĺpca ako pravý dolný kolík na tlačidle
- Umiestnite čierny vodič od záporného napájacieho kolíka do rovnakého stĺpca ako odpor.
- Umiestnite farebný vodič (nie červený/čierny) z ľavého horného kolíka na digitálny kolík 2 na Arduino
Skontrolujte obrázky vyššie a uistite sa, že je vaše zapojenie správne.
Krok 4: Kód…
Pozrime sa na kód základného tlačidla.
Otvorte editor kódu a prepnite z blokov na text. Vymažte varovanie, ktoré sa zobrazí. Sme spokojní s textom!
Základné nastavenie poznáte, definujme teda tlačidlo a vykonajme základné čítanie. Výstup vytlačíme na Sériové.
Do kódu nižšie som vložil niekoľko ďalších komentárov, aby bol čitateľnejší ako obrázok.
// Definujte konštanty
#define button 2 void setup () {pinMode (button, INPUT); Serial.begin (9600); } void loop () {// Prečítajte si digitálny pin a skontrolujte stav stlačeného tlačidla int = digitalRead (tlačidlo); // Tlačidlo vráti HIGH, ak je stlačené, LOW, ak nie, ak (stlačené == HIGH) {Serial.println ("Stlačené!"); }}
Dobre, funguje to!
V podstate všetko, čo robíme, je kontrola stavu digitálneho pinu vždy, keď sa kód zacyklí. Ak kliknete na Spustiť simuláciu a stlačíte tlačidlo, zobrazí sa Sériový monitor (kliknite na tlačidlo pod kódom) s textom „Stlačené!“opakovane.
Jednou z funkcií, ktorú uvidíte v kóde vyššie, je hodnotenie stavu if (). Všetko, čo kód robí, je v tomto prípade položiť otázku a vyhodnotiť, či je to pravda. Na kontrolu, či sa hodnota premennej rovná určitej hodnote, použijeme znak rovnosti (dvojité znamienka rovnosti, napríklad: ==). A digitalRead () vráti HIGH alebo LOW.
Použitím príkazu if () else if / else môžeme skontrolovať mnoho podmienok alebo všetky podmienky a ak sa vrátite k základom Arduino, uvidíte niektoré z porovnaní, ktoré môžete urobiť.
Teraz … Náš kód môže vyzerať kompletne … Máme však problém.
V simulátore to funguje veľmi dobre. Skutočná elektrina má však hluk, najmä jednosmerná elektronika. Naše tlačidlo teda môže niekedy vrátiť falošné údaje. A to je problém, pretože váš projekt nemusí pre používateľa správne reagovať.
Poďme to napraviť!
Krok 5: Malá debounka
Na prekonanie problému s tlačidlami používame postup nazývaný debounce. To v podstate počká určitý čas medzi stlačením tlačidla a skutočnou reakciou na stlačenie. Užívateľovi to stále pripadá prirodzené (pokiaľ si neurobíte čas príliš dlho). Môžete ho použiť aj na kontrolu dĺžky lisu, takže môžete zakaždým reagovať inak. Nie je potrebné meniť žiadne vedenie!
Pozrime sa na kód:
#tlačidlo definovania 2#definovať debounceTimeout 100
Prvá zmena sa týka globálneho rozsahu. Pamätáte si, že tam definujeme premenné, ktoré môže používať veľa našich funkcií alebo tie, ktoré nemožno resetovať pri každom spustení slučky. K definovaným konštantám sme teda pridali debounceTimeout. Vyrobili sme týchto 100 (čo sa neskôr preloží na 100 ms), ale môže byť kratšie. Bude to trvať dlhšie a bude to neprirodzené.
long int lastDebounceTime;
Táto premenná je deklarovaná pod konštantami. Jedná sa o typ typu long int, ktorý nám v zásade umožňuje ukladať dlhé čísla do pamäte. Nazvali sme to lastDebounceTime.
Na funkcii void setup () nepotrebujeme nič meniť. Nechajme toho.
void loop () {// Prečítajte si digitálny pin a skontrolujte stav stlačeného tlačidla int = digitalRead (tlačidlo); long int currentTime = millis (); // kód tlačidla}
Prvá zmena, ktorú vykonáme vo funkcii loop (), je pod výzvou na prečítanie tlačidla. Musíme sledovať aktuálny čas. Funkcia millis () vracia aktuálny čas hodín od spustenia Arduina v milisekundách. Musíme to uložiť do dlhej premennej typu int.
Teraz sa musíme uistiť, že sme si vedomí času od stlačenia tlačidla, takže časovač resetujeme, keď nie je stlačený. Pozri sa:
void loop () {// Prečítajte si digitálny pin a skontrolujte stav stlačeného tlačidla int = digitalRead (tlačidlo); long int currentTime = millis (); ak (stlačené == NÍZKE) {// Resetuje čas počítania, pokiaľ nie je stlačené tlačidlo lastDebounceTime = currentTime; } // Kód tlačidla}
Algoritmus if (Press == LOW) kontroluje, či tlačidlo nie je stlačené. Ak nie je, potom kód uloží aktuálny čas od posledného zrušenia. Tak pri každom stlačení tlačidla máme časový bod, od ktorého môžeme skontrolovať, kedy bolo tlačidlo stlačené. Potom môžeme urobiť rýchly matematický výpočet, aby sme zistili, ako dlho bolo tlačidlo stlačené, a správne reagovať. Pozrime sa na zvyšok kódu:
void loop () {// Prečítajte si digitálny pin a skontrolujte stav stlačeného tlačidla int = digitalRead (tlačidlo); long int currentTime = millis (); ak (stlačené == NÍZKE) {// Resetuje čas počítania, pokiaľ nie je stlačené tlačidlo lastDebounceTime = currentTime; } // Po určitý čas bolo tlačidlo stlačené, ak (((currentTime - lastDebounceTime)> debounceTimeout)) {// Ak dôjde k vypršaniu časového limitu, tlačidlo bolo stlačené! Serial.println ("Stlačené!"); }}
Posledný blok kódu odoberá aktuálny čas, odpočíta posledný čas odskoku a porovná ho s nastaveným časovým limitom. Ak je väčšia, kód predpokladá, že tlačidlo bolo stlačené po dobu, a odpovie. Úhľadné!
Spustite kód a skontrolujte, či funguje. Ak máte chyby, skontrolujte kód!
Teraz sa pozrime na praktický príklad.
Krok 6: Vytvorenie ponuky
Gombíky sú zaujímavé, pretože s nimi je toľko možností! V tomto prípade urobíme menu. Povedzme, že ste vytvorili toto skutočne skvelé zariadenie a potrebujete, aby používatelia mohli meniť možnosti zapínania a vypínania určitých vecí alebo nastaviť konkrétnu hodnotu nastavenia. Tento dizajn s tromi tlačidlami to dokáže!
Na tento projekt teda potrebujeme:
- Tri tlačidlá
- Tri odpory nastavené na 10 kΩ
Jedného z nich už máme, potrebujeme len ďalšie dva. Pridajte ich teda na tabuľu. Zapojenie je trochu zložitejšie, ale iba preto, že som ho chcel udržať skutočne kompaktný. Pri prvom tlačidle môžete postupovať podľa rovnakého vzoru alebo môžete postupovať podľa obrázku vyššie.
Tri tlačidlá sú možnosť otvorenia/ďalšej ponuky, možnosť zmeny (ako v prípade zmeny nastavenia) a tlačidlo uloženia/zatvorenia ponuky.
Zapojte to, pozrime sa na kód!
Krok 7: Rozdelenie kódu - globálne
Ok, toto bude dlhý krok, ale prejdem si každú sekciu kódu.
Najprv sa pozrime na potrebné globálne premenné.
// Definovanie konštánt #definovať menuButton 2 #definovať menuVybrať 3 #definovať menuSave 4 #define debounceTimeout 50 // Definovať premenné int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Možnosti ponuky char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0;
Tieto tri bloky sú dosť podobné tým, ktoré sme videli predtým. V prvom som definoval tri tlačidlá a časový limit. V tejto časti projektu som ho nastavil na 50 ms, aby fungoval úspešne a úmyselne.
Druhým blokom sú všetky premenné. Musíme sledovať buttonPreviousState a musíme sledovať poslednýDebounceTime. Toto sú všetky premenné typu int, ale posledný je dlhý typ, pretože predpokladám, že potrebujeme priestor v pamäti.
Blok možností ponuky má niekoľko nových funkcií. Najprv znak * (áno, to je zámerná hviezdička), čo je doslovná premenná znak/reťazec. Je to ukazovateľ na statické úložisko v pamäti. Nemôžete to zmeniť (ako napríklad v Pythone). Tento riadok char *menuOptions vytvára pole reťazcových literálov. Môžete pridať ľubovoľný počet položiek ponuky.
Premenná bool featureSetting je iba pole hodnôt, ktoré predstavujú každú položku ponuky. Áno, môžete uložiť čokoľvek, čo sa vám páči, stačí zmeniť typ premennej (všetky musia byť rovnakého typu). Teraz môžu existovať lepšie spôsoby, ako to spravovať, napríklad slovníky alebo n -tice, ale pre túto aplikáciu je to jednoduché. Jeden z posledných by som asi vytvoril v nasadenej aplikácii.
Sledoval som režim ponuky, takže ak by som chcel na svojom displeji iné veci, mohol by som to urobiť. Tiež, ak by som mal logiku senzorov, mohol by som to pozastaviť počas prevádzky ponuky, len pre prípad, že by došlo k nejakému konfliktu. Mám premennú menuNeedsPrint, pretože chcem menu vytlačiť v konkrétnych časoch, nielen stále. Nakoniec mám premennú optionSelected, aby som mohol sledovať vybranú možnosť, pretože k nej pristupujem na mnohých miestach.
Pozrime sa na ďalšiu sadu funkcií.
Krok 8: Rozpis kódu - nastavenie a vlastné funkcie
Funkcia setup () je dosť jednoduchá, iba tri vstupné deklarácie:
void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menuSelect, INPUT); Serial.begin (9600); }
Ďalej sú uvedené tri vlastné funkcie. Pozrime sa na prvé dve, potom na poslednú zvlášť.
Potrebujeme dve funkcie, ktoré vrátia niektoré informácie. Dôvodom je, že chceme zaistiť, aby to bolo čitateľné pre ľudí. Pomôže to aj pri ladení kódu, ak máme problém. Kód:
// Funkcia na vrátenie aktuálne vybranej optionchar *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Možnosť vráteniaVybratá návratová ponukaOption; } // Funkcia na vrátenie stavu aktuálne zvolenej možnosti char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "False"; } else {optionSettingVal = "True"; } // Možnosť vráteniaNastavenie možnosti vráteniaSettingVal; }
Funkcia char *ReturnOptionSelected () skontroluje vybranú možnosť (ak vidíte vyššie, nastavíme premennú, ktorá to bude sledovať) a vytiahne doslovný reťazec z poľa, ktoré sme vytvorili predtým. Potom ho vráti ako typ znaku. Vieme to, pretože funkcia označuje typ návratu.
Druhá funkcia, char *ReturnOptionStatus (), číta stav možnosti uloženej v poli a vracia reťazcový literál, ktorý predstavuje hodnotu. Ak je napríklad nastavenie, ktoré sme uložili, falošné, vrátil by som „False“. Dôvodom je, že používateľovi ukazujeme túto premennú a je lepšie nechať celú túto logiku pohromade. Mohol by som to urobiť neskôr, ale má väčší zmysel to urobiť tu.
// Funkcia na prepínanie aktuálnej optionbool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; návrat true; }
Funkcia bool ToggleOptionSelected () je praktická funkcia na zmenu hodnoty nastavenia, ktoré sme vybrali v ponuke. To len prevráti hodnotu. Ak by ste mali komplexnejší súbor možností, mohlo by to byť úplne iné. V tejto funkcii sa vraciam true, pretože moje spätné volanie (volanie neskôr v kóde, ktorý spúšťa túto funkciu) očakáva pravdivú/nepravdivú odpoveď. Som si 100% istý, že to bude fungovať, takže som nerátal s tým, že to nefunguje, ale v nasadenej aplikácii by som to urobil (len pre prípad).
Krok 9: Smyčka…
Funkcia loop () je pomerne dlhá, takže to urobíme po častiach. V rámci tejto funkcie môžete predpokladať všetko nižšie uvedené hniezda:
prázdna slučka () {
// Pracujte tu <-----}
Dobre, už sme videli tieto veci:
// Prečítajte si tlačidlá int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Získanie aktuálneho času long int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Vynulovanie času odpočítavania, pokiaľ nie je stlačené tlačidlo lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }
Jediné, čo som tu musel urobiť, bolo pridať tri hovory digitalRead () a uistiť sa, že som zohľadnil skutočnosť, že ak sú všetky tlačidlá nízke, mali by sme resetovať časovač (lastDebounceTime = currentTime) a nastaviť všetky predchádzajúce stavy na nízke hodnoty. Tiež ukladám millis () v currentTime.
Ďalšia časť sa nachádza v hniezde
if ((((currentTime - lastDebounceTime)> debounceTimeout)) {
// Pracuj tu <----}
Existujú tri sekcie. Áno, mohol som ich presunúť do ich vlastných funkcií, ale kvôli jednoduchosti som tu nechal tri algoritmy hlavných tlačidiel.
if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Dajte používateľovi vedieť Serial.println ("Menu je aktívne"); } else if (menuMode == true && optionSelected = 1) {// Reset option optionSelected = 0; } // Vytlačenie ponuky ponukyNeedsPrint = true; // Prepnite tlačidlo prev. state to only display menu // if the button is checked and again again menuButtonPreviousState = menuButtonPressed; // Bude VYSOKÝ}
Tento prvý pracuje, keď je ponukaButtonPressed VYSOKÁ alebo keď je stlačené tlačidlo ponuky. Kontroluje tiež, či bol predchádzajúci stav NÍZKY, takže tlačidlo bolo potrebné pred ďalším stlačením uvoľniť, čím sa zabráni programu, aby neustále opakovane spúšťal rovnakú udalosť.
Potom skontroluje, či ak ponuka nie je aktívna, aktivuje ju. Vytlačí prvú vybranú možnosť (čo je predvolene prvá položka v poli Možnosti. Ak stlačíte tlačidlo druhý alebo tretí (atď.) Čas, zobrazí sa ďalšia možnosť v zozname. Niečo, čo by som mohol opraviť, je že keď sa dostane na koniec, cykluje sa späť na začiatok. To by mohlo prečítať dĺžku poľa a uľahčiť cyklovanie späť, ak by ste zmenili počet možností, ale zatiaľ to bolo jednoduché.
Posledná malá sekcia (// Vytlačí ponuku) evidentne vytlačí ponuku, ale tiež nastaví predchádzajúci stav na VYSOKÝ, aby sa rovnaká funkcia neopakovala (pozri moju poznámku vyššie o kontrole, či bolo tlačidlo predtým NÍZKE).
// menuSelect je stlačené, zadajte logicif ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Zmeňte vybratú možnosť // Momentálne je to len pravda/nepravda // ale môže byť čokoľvek bool toggle = ToggleOptionSelected (); if (toggle) {menuNeedsPrint = true; } else {Serial.println ("Niečo sa pokazilo. Skúste to znova"); }} // Prepnutie stavu na prepnutie iba pri uvoľnení a opätovnom stlačení menuSelectPreviousState = menuSelectPressed; }
Tento kúsok kódu spracováva tlačidlo menuSelectPressed rovnakým spôsobom, ibaže tentokrát spustíme funkciu ToggleOptionSelected (). Ako som už povedal, túto funkciu môžete zmeniť, aby robila viac, ale to je všetko, čo k tomu potrebujem.
Hlavnou vecou je prepínacia premenná, ktorá sleduje úspech spätného volania a vytlačí ponuku, ak je pravdivá. Ak nevráti nič alebo nepravdu, vytlačí chybové hlásenie. Tu môžete pomocou spätného volania vykonávať ďalšie činnosti.
if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Opustenie ponuky // Tu môžete vykonať akékoľvek upratanie // alebo uložiť do EEPROM menuMode = false; Serial.println ("Menu bolo opustené"); // Prepnutie stavu, takže ponuka sa ukončí iba raz menuSavePreviousState = menuSavePressed; }}
Táto funkcia pracuje s tlačidlom menuSave, ktoré práve opustí ponuku. Tu môžete mať možnosť zrušenia alebo uloženia, prípadne vyčistenie alebo uloženie do EEPROM. Vytlačím iba „Ponuka bola ukončená“a stav tlačidla nastavím na VYSOKÝ, aby sa necyklil.
if (menuMode && menuNeedsPrint) {// Menu sme vytlačili, takže pokiaľ sa niečo // nestane, nie je potrebné ho znova tlačiť menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Vybraté:"); Serial.print (voliteľnéActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }
Toto je algoritmus menuPrint, ktorý sa spúšťa iba vtedy, keď je ponuka aktívna a keď je premenná menuNeedsPrint nastavená na hodnotu true.
Toto by sa dalo určite presunúť do vlastnej funkcie, ale kvôli jednoduchosti..!
Tak a je to! Pozrite si ďalší krok celého bloku kódu.
Krok 10: Konečný blok kódu
// Definujte konštanty
#define menuButton 2 #define menuVyberte 3 #define menuUložiť 4 #define debounceTimeout 50 int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // Definovanie premenných long int lastDebounceTime; bool lightSensor = true; bool tempSensor = true; // Možnosti ponuky char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0; // Funkcia nastavenia
void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menuSelect, INPUT); Serial.begin (9600); }
// Funkcia na vrátenie aktuálne zvolenej možnosti char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Možnosť vráteniaVybratá návratová ponukaOption; } // Funkcia na vrátenie stavu aktuálne zvolenej možnosti char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "False"; } else {optionSettingVal = "True"; } // Možnosť vráteniaNastavenie možnosti vráteniaSettingVal; } // Funkcia na prepínanie aktuálnej možnosti bool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; návrat true; } // Hlavná slučka
void loop () {// Prečítajte si tlačidlá int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Získanie aktuálneho času long int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Vynulovanie času odpočítavania, pokiaľ nie je stlačené tlačidlo lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } if (((currentTime - lastDebounceTime)> debounceTimeout)) {// Ak nastane časový limit, tlačidlo je stlačené!
// menuButton je stlačené, zadajte logiku
// Spustí sa iba vtedy, ak bolo tlačidlo predtým uvoľnené, ak ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Dajte používateľovi vedieť Serial.println ("Menu je aktívne"); } else if (menuMode == true && optionSelected = 1) {// Reset option optionSelected = 0; } // Vytlačenie ponuky ponukyNeedsPrint = true; // Prepnite tlačidlo prev. state to only display menu // if the button is checked and again again menuButtonPreviousState = menuButtonPressed; // Bude HIGH} // menuSelect je stlačené, zadajte logiku, ak ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Zmeňte vybranú možnosť // Momentálne je to just true/false // but could be anything bool toggle = ToggleOptionSelected (); if (toggle) {menuNeedsPrint = true; } else {Serial.print ("Niečo sa pokazilo. Skúste to znova"); }} // Prepnutie stavu na prepnutie iba pri uvoľnení a opätovnom stlačení menuSelectPreviousState = menuSelectPressed; } if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Opustenie ponuky // Tu môžete vykonať akékoľvek upratanie // alebo uložiť do EEPROM menuMode = false; Serial.println ("Menu bolo opustené"); // Prepnutie stavu, takže ponuka sa ukončí iba raz menuSavePreviousState = menuSavePressed; }} // Vytlačiť aktuálnu možnosť ponuky je aktívna, ale vytlačte ju iba raz, ak (menuMode && menuNeedsPrint) {// Menu sme vytlačili, takže pokiaľ sa niečo // nestane, nie je potrebné ho znova tlačiť menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Vybraté:"); Serial.print (voliteľnéActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }}}
Okruh je k dispozícii na webe Tinkercad. Nasledujúci obvod som vložil, aby ste to videli aj vy!
Ako vždy, ak máte otázky alebo problémy, dajte mi vedieť!
Odporúča:
Jednoduchý spôsob použitia Makey Makey s technickou palubou: 5 krokov
Jednoduchý spôsob použitia Makey Makey s technickou palubou: Ahoj. Nedávno som v tejto súťaži videl program tech deck makey makey, ktorý bol skutočne úžasný, ale zdal sa ťažký, a tak som si urobil jednoduchý spôsob hrania hier s tech deckom. Ak sa vám môj pokyn páči, hlasujte zaň v súťaži o makey makey
Ovládanie jasu Ovládanie LED na báze PWM pomocou tlačidiel, Raspberry Pi a Scratch: 8 krokov (s obrázkami)
Ovládanie jasu Ovládanie LED na základe PWM pomocou tlačidiel, Raspberry Pi a Scratch: Snažil som sa nájsť spôsob, ako vysvetliť, ako PWM funguje u mojich študentov, a tak som si dal za úlohu pokúsiť sa ovládať jas LED pomocou dvoch tlačidiel. - jedno tlačidlo zvyšuje jas LED diódy a druhé ju stmieva. Programovať
Panel tlačidiel Arduino USB: 5 krokov (s obrázkami)
Panel s tlačidlami USB Arduino: Arduino Leonardo je veľmi výkonná doska s malými rozdielmi od veľmi obľúbeného Arduino UNO. ATMega 32U4 je hlavným procesorom modelu Leonardo. Tento mikrokontrolér môžete použiť na sériovú komunikáciu cez USB. Arduino Leo
Ponuka Arduino na telefóne Nokia 5110 LCD pomocou rotačného kodéra: 6 krokov (s obrázkami)
Ponuka Arduino na telefóne Nokia 5110 LCD pomocou rotačného kodéra: Vážení priatelia, vítam vás pri ďalšom návode! V tomto videu sa naučíme zostaviť vlastnú ponuku pre obľúbený LCD displej Nokia 5110, aby boli naše projekty užívateľsky prívetivejšie a schopnejšie. Začnime! Toto je projekcia
HC - 06 (podradený modul) Zmena „NÁZOV“bez použitia „Monitor sériového Arduina“ ktorý „funguje jednoducho“: Bezchybný spôsob!: 3 kroky
HC - 06 (podradený modul) Zmena „NÁZOV“bez použitia „Monitor sériového Arduina“… ktorý „funguje jednoducho“: Bezchybný spôsob!: Po " Dlho " pokúša sa zmeniť meno na HC - 06 (podradený modul) pomocou " sériový monitor Arduina, bez " Úspech ", našiel som ďalší jednoduchý spôsob a zdieľam teraz! Bavte sa priatelia