Obsah:

Nabídka v Arduinu a jak používat tlačítka: 10 kroků (s obrázky)
Nabídka v Arduinu a jak používat tlačítka: 10 kroků (s obrázky)

Video: Nabídka v Arduinu a jak používat tlačítka: 10 kroků (s obrázky)

Video: Nabídka v Arduinu a jak používat tlačítka: 10 kroků (s obrázky)
Video: How to use up to 10 push button switch with 1 Arduino input pin ANPB-V1 2024, Listopad
Anonim
Nabídka v Arduinu a jak používat tlačítka
Nabídka v Arduinu a jak používat tlačítka

V mém tutoriálu Arduino 101 se naučíte, jak nastavit prostředí v Tinkercad. Používám Tinkercad, protože je to docela silná online platforma, která mi umožňuje předvést studentům řadu dovedností při stavbě obvodů. Neváhejte a sestavte všechny své výukové programy pomocí Arduino IDE a skutečného Arduina!

V tomto tutoriálu se seznámíme s tlačítky! Potřebujeme vědět:

  • Jak je zapojit
  • Čtení jejich hodnoty
  • Debounce a proč je to důležité
  • Praktická aplikace (vytvoření nabídky)

Většina lidí si myslí, že nejpraktičtější věcí, kterou lze pomocí tlačítka udělat, je zapnutí a vypnutí světla. Budeme, tady ne! Použijeme naše k vytvoření nabídky a nastavení některých možností na Arduinu.

Připraveni? Začněme!

Krok 1: Nastavení desky

Nastavte desku
Nastavte desku
Nastavte desku
Nastavte desku

Prvním krokem je umístit Arduino a Breadboard Small do oblasti prototypování. Na výše uvedených obrázcích zjistíte, jak zapojit napájecí lišty.

Breadboard Mini má dvě napájecí lišty nahoře a dole. Připojte je k Arduinu, abychom mohli napájet více komponent. Později v tomto tutoriálu použijeme 3 tlačítka, takže budeme potřebovat více energie. Věc, kterou je třeba si uvědomit, je, že na malém prkénku vedou napájecí kolejnice po desce horizontálně. To se liší od sloupců v hlavní oblasti prototypování uprostřed; tyto běží svisle. K napájení libovolného sloupce v hlavní oblasti uprostřed můžete použít kterýkoli z napájecích kolíků.

Když přidáváte energii, použijte černý a červený vodič na záporný a kladný. Na konci připojte vodiče, které napájí energii na druhou stranu desky. Tuto stránku nebudeme používat, ale je to dobrá praxe.

Krok 2: Přidejte tlačítko a odpor

Přidejte tlačítko a odpor
Přidejte tlačítko a odpor
Přidejte tlačítko a odpor
Přidejte tlačítko a odpor
Přidejte tlačítko a odpor
Přidejte tlačítko a odpor

Přidejte malé tlačítko ze zásobníku komponent. Mělo by to vypadat jako na obrázku. Ujistěte se, že to není přepínač! Přidejte také odpor. Klikněte na něj a nastavte jeho hodnotu na 10 kΩ. To stačí k vytažení kolíku nízko, když není připojen, což je velmi důležité později v kódu.

Umístěte součást doprostřed prkénka. Tlačítko funguje takto:

  • Roh do rohu, tlačítko není připojeno. Stisknutím tlačítka se kontakty zavřou a spojí rohy.
  • Boky tlačítka jsou spojeny. Pokud byste připojili vodič vlevo nahoře a vlevo dole, obvod by byl uzavřen.

Proto jsme komponentu umístili přes prostor uprostřed. Zajišťuje, aby rohy nebyly spojeny pod kolíky v desce.

Další krok poskytuje několik obrázků, které tyto body ilustrují.

Umístěte odpor z pravého dolního kolíku přes sloupce tak, aby seděl vodorovně.

Krok 3: Připojení tlačítek

Připojení tlačítek
Připojení tlačítek
Připojení tlačítek
Připojení tlačítek

Výše uvedené obrázky jasně ukazují, jak se tlačítka spojují. Vždycky to byl bod zmatku, když si myslíte, že je něco v pořádku a nefunguje to!

Nyní přidáme dráty.

  • Umístěte červený vodič z kladného napájecího pinu do stejného sloupce jako pravý dolní kolík na tlačítku
  • Umístěte černý vodič od záporného napájecího pinu do stejného sloupce jako odpor.
  • Umístěte barevný vodič (ne červený/černý) z levého horního kolíku na digitální kolík 2 na Arduinu

Zkontrolujte obrázky výše, abyste se ujistili, že je vaše kabeláž správná.

Krok 4: Kód…

Kód…
Kód…
Kód…
Kód…

Pojďme se podívat na kód základního tlačítka.

Otevřete editor kódu a změňte z bloků na text. Vymažte varování, které se objeví. S textem jsme spokojeni!

Základní nastavení znáte, pojďme tedy definovat tlačítko a provést základní čtení. Výstup vytiskneme na Sériový.

Do níže uvedeného kódu jsem vložil několik dalších komentářů, takže je snáze čitelný než obrázek.

// Definujte konstanty

#define button 2 void setup () {pinMode (button, INPUT); Serial.begin (9600); } void loop () {// Přečíst digitální pin a zkontrolovat stav tlačítka int stisknuto = digitalRead (tlačítko); // Tlačítko vrací HIGH, pokud je stisknuto, LOW, pokud ne, pokud (stisknuto == HIGH) {Serial.println ("Pressed!"); }}

Dobře, funguje to!

V podstatě vše, co děláme, je kontrolovat stav digitálního pinu pokaždé, když se kód smyčky. Pokud kliknete na Spustit simulaci a stisknete tlačítko, zobrazí se obrazovka Serial Monitor (klikněte na tlačítko pod kódem) „Pressed!“opakovaně.

Jednou z funkcí, kterou uvidíte v kódu výše, je vyhodnocení podmínky if (). Jediné, co kód dělá, je v tomto případě položit otázku a vyhodnotit, zda je to pravda. Ke kontrole, zda se hodnota proměnné rovná určité hodnotě, používáme rovnítko (dvojité znaménka rovnosti, například toto: ==). A digitalRead () vrací buď HIGH nebo LOW.

Pomocí if () else if / else můžeme zkontrolovat mnoho podmínek nebo všechny podmínky, a pokud se vrátíte k základům Arduina, uvidíte některá srovnání, která můžete provést.

Nyní … Náš kód může vypadat kompletně … Ale máme problém.

V simulátoru to funguje velmi dobře. Ale skutečná elektřina má hluk, zejména DC elektronika. Naše tlačítko tedy může někdy vrátit falešné čtení. A to je problém, protože váš projekt nemusí reagovat správným způsobem pro uživatele.

Pojďme to opravit!

Krok 5: Trochu debounce

Trochu debounce
Trochu debounce

K překonání problému s tlačítky používáme proceduru zvanou debounce. To v podstatě čeká po určitou dobu mezi stisknutím tlačítka a skutečnou reakcí na stisknutí. Uživatelovi to stále připadá přirozené (pokud si čas příliš nepřidělíte). Můžete jej také použít ke kontrole délky tisku, takže můžete pokaždé reagovat jinak. Nemusíte měnit žádné zapojení!

Podívejme se na kód:

#tlačítko definovat 2#definovat debounceTimeout 100

První změna se týká globálního rozsahu. Pamatujete si, že tam definujeme proměnné, které může používat mnoho našich funkcí, nebo ty, které nelze resetovat při každém spuštění smyčky. K definovaným konstantám jsme tedy přidali debounceTimeout. Udělali jsme to 100 (což se později přeloží na 100 ms), ale mohlo by to být kratší. Už to bude vypadat nepřirozeně.

long int lastDebounceTime;

Tato proměnná je deklarována pod konstantami. Jedná se o typ typu long int, který nám v zásadě umožňuje ukládat dlouhá čísla do paměti. Říkali jsme tomu lastDebounceTime.

Ve funkci void setup () nemusíme nic měnit. Nechme toho.

void loop () {// Přečíst digitální pin a zkontrolovat stav tlačítka int stisknuto = digitalRead (tlačítko); long int currentTime = millis (); // Kód tlačítka}

První změna, kterou provedeme ve funkci loop (), je pod výzvou ke čtení tlačítka. Musíme sledovat aktuální čas. Funkce millis () vrací aktuální čas hodin od spuštění Arduina v milisekundách. Musíme to uložit do proměnné typu long int.

Nyní se musíme ujistit, že jsme si vědomi času od stisknutí tlačítka, takže časovač resetujeme, když není stisknutý. Podívej se:

void loop () {// Přečíst digitální pin a zkontrolovat stav tlačítka int stisknuto = digitalRead (tlačítko); long int currentTime = millis (); if (Pressed == LOW) {// Reset count time while button is not press lastDebounceTime = currentTime; } // Kód tlačítka}

Algoritmus if (Pressed == LOW) kontroluje, zda není tlačítko stisknuto. Pokud tomu tak není, pak kód ukládá aktuální čas od posledního debounce. Tímto způsobem máme při každém stisknutí tlačítka časový bod, od kterého můžeme zkontrolovat, kdy bylo tlačítko stisknuto. Poté můžeme provést rychlý matematický výpočet, abychom zjistili, jak dlouho bylo tlačítko stisknuto, a správně reagovat. Podívejme se na zbytek kódu:

void loop () {// Přečtěte si digitální pin a zkontrolujte stav tlačítka int stisknuto = digitalRead (tlačítko); long int currentTime = millis (); if (Pressed == LOW) {// Vynulování času počítání, když není tlačítko stisknuto lastDebounceTime = currentTime; } // Tlačítko bylo po určitou dobu stisknuto, pokud (((currentTime - lastDebounceTime)> debounceTimeout)) {// Pokud dojde k vypršení časového limitu, tlačítko bylo stisknuto! Serial.println ("Pressed!"); }}

Poslední blok kódu bere aktuální čas, odečte poslední čas odskoku a porovná ho s nastaveným časovým limitem. Pokud je větší, kód předpokládá, že tlačítko bylo po tu dobu stisknuto a odpoví. Elegantní!

Spusťte kód a zkontrolujte, zda funguje. Pokud máte chyby, zkontrolujte kód!

Nyní se podívejme na praktický příklad.

Krok 6: Vytvoření nabídky

Vytvoření nabídky
Vytvoření nabídky

Knoflíky jsou zajímavé, protože s nimi existuje tolik možností! V tomto příkladu vytvoříme nabídku. Řekněme, že jste vytvořili toto opravdu skvělé zařízení a potřebujete, aby uživatelé mohli měnit možnosti pro zapnutí nebo vypnutí určitých věcí nebo nastavit konkrétní hodnotu pro nastavení. Tento design se třemi tlačítky to dokáže!

Pro tento projekt tedy potřebujeme:

  • Tři tlačítka
  • Tři odpory nastaveny na 10 kΩ

Jeden z nich již máme, jen potřebujeme další dva. Přidejte je tedy na tabuli. Zapojení je trochu složitější, ale jen proto, že jsem ho chtěl udržet opravdu kompaktní. Můžete se řídit stejným vzorem pro první tlačítko nebo sledovat obrázek výše.

Tato tři tlačítka jsou možnost otevření/další nabídky, možnost změny (jako v, změna nastavení) a tlačítko uložení/zavření nabídky.

Zapojte to, podívejme se na kód!

Krok 7: Rozdělení kódu - globální

Dobře, bude to dlouhý krok, ale projdu každou část kódu.

Nejprve se podívejme na potřebné globální proměnné.

// Definujte konstanty #definujte menuButton 2 #definujte menuVyberte 3 #definujte menuSave 4 #define debounceTimeout 50 // Definujte proměnné int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Možnosti nabídky char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0;

Tyto tři bloky jsou docela podobné tomu, co jsme viděli dříve. V prvním jsem definoval tři tlačítka a časový limit. Pro tuto část projektu jsem ji nastavil na 50 ms, takže to chce záměrný tisk, aby to fungovalo.

Druhým blokem jsou všechny proměnné. Musíme sledovat buttonPreviousState a musíme sledovat posledníDebounceTime. To jsou všechny proměnné typu int, ale poslední je dlouhý typ, protože předpokládám, že potřebujeme místo v paměti.

Blok možností nabídky má několik nových funkcí. Nejprve char * (ano, to je záměrná hvězdička), což je proměnná doslovného znaku/řetězce. Je to ukazatel na statické úložiště v paměti. Nelze to změnit (jako například v Pythonu). Tento řádek char *menuOptions vytvoří řadu řetězcových literálů. Můžete přidat libovolný počet položek nabídky.

Proměnná bool featureSetting je pouze řada hodnot, které představují každou položku nabídky. Ano, můžete uložit cokoli, co se vám líbí, stačí změnit typ proměnné (všechny musí být stejného typu). Nyní mohou existovat lepší způsoby, jak to spravovat, například slovníky nebo řazené kolekce členů, ale pro tuto aplikaci je to jednoduché. Pravděpodobně bych jeden z nich vytvořil v nasazené aplikaci.

Sledoval jsem režim menu, takže kdybych chtěl na svém displeji jiné věci, mohl bych to udělat. Také, kdybych měl logiku senzoru, mohl bych to pozastavit během ovládání nabídky, jen pro případ, že by došlo ke konfliktu. Mám proměnnou menuNeedsPrint, protože chci nabídku vytisknout v konkrétních časech, nejen po celou dobu. Nakonec mám proměnnou optionSelected, abych mohl sledovat vybranou možnost, protože k ní přistupuji na několika místech.

Podívejme se na další sadu funkcí.

Krok 8: Rozdělení kódu - nastavení a vlastní funkce

Funkce setup () je dostatečně snadná, pouze tři vstupní deklarace:

void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menuSelect, INPUT); Serial.begin (9600); }

Další jsou tři vlastní funkce. Podívejme se na první dva, pak na poslední zvlášť.

Potřebujeme dvě funkce, které vracejí nějaké informace. Důvodem je, že se chceme ujistit, že je to čitelné pro člověka. Pomůže také s laděním kódu, pokud máme problém. Kód:

// Funkce pro vrácení aktuálně vybrané optionchar *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Možnost návratu Vybraná návratová nabídkaOption; } // Funkce pro vrácení stavu aktuálně vybrané volby char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "False"; } else {optionSettingVal = "True"; } // Return optionSetting return optionSettingVal; }

Funkce char *ReturnOptionSelected () zkontroluje vybranou možnost (pokud vidíte výše, nastavíme proměnnou, která to bude sledovat) a vytáhne doslovný řetězec z pole, které jsme vytvořili dříve. Poté jej vrátí jako typ char. Víme to, protože funkce označuje typ návratu.

Druhá funkce, char *ReturnOptionStatus () čte stav možnosti uložené v poli a vrací řetězcový literál, který představuje hodnotu. Pokud je například nastavení, které jsme uložili, false, vrátil bych „False“. Důvodem je, že ukazujeme uživateli tuto proměnnou a je lepší mít celou tuto logiku pohromadě. Mohl bych to udělat později, ale dává větší smysl to udělat tady.

// Funkce pro přepnutí aktuálního optionbool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; return true; }

Funkce bool ToggleOptionSelected () je praktická funkce pro změnu hodnoty nastavení, které jsme vybrali v nabídce. Jen to převrací hodnotu. Pokud byste měli složitější sadu možností, mohlo by to být úplně jiné. V této funkci vracím true, protože moje zpětné volání (volání později v kódu, který tuto funkci aktivuje) očekává pravdivou/nepravdivou odpověď. Jsem si 100% jistý, že to bude fungovat, takže jsem nepočítal s tím, že to nefunguje, ale chtěl bych v nasazené aplikaci (jen pro případ).

Krok 9: Smyčka…

Funkce loop () je poměrně dlouhá, takže to budeme dělat po částech. V rámci této funkce můžete předpokládat, že vše níže hnízdí:

prázdná smyčka () {

// Pracujte zde <-----}

Dobře, viděli jsme tyto věci dříve:

// Přečíst tlačítka int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Získejte aktuální čas dlouhý int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Reset počítání času, když není stisknuto tlačítko lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }

Jediné, co jsem zde musel udělat, bylo přidat tři volání digitalRead () a ujistit se, že jsem zohlednil skutečnost, že pokud jsou všechna tlačítka nízká, měli bychom resetovat časovač (lastDebounceTime = currentTime) a nastavit všechny předchozí stavy na nízké. Také ukládám millis () v currentTime.

Další část hnízdí uvnitř řádku

if ((((currentTime - lastDebounceTime)> debounceTimeout)) {

// Pracujte zde <----}

Existují tři sekce. Ano, mohl jsem je přesunout do jejich vlastních funkcí, ale kvůli jednoduchosti jsem sem nechal tři algoritmy hlavních tlačítek.

if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Nechte uživatele vědět Serial.println ("Nabídka je aktivní"); } else if (menuMode == true && optionSelected = 1) {// Reset option optionSelected = 0; } // Tisk nabídky nabídkyNeedsPrint = true; // Přepnout tlačítko předchozí. stav pouze pro zobrazení nabídky // pokud je tlačítko uvolněno a znovu stisknuto menuButtonPreviousState = menuButtonPressed; // Bylo by VYSOKÉ}

Tento první zpracovává, když je nabídkaButtonPressed VYSOKÁ nebo když je stisknuto tlačítko nabídky. Zkontroluje také, zda je předchozí stav NÍZKÝ, takže tlačítko muselo být uvolněno dříve, než bylo znovu stisknuto, což brání programu v neustálém spouštění stejné události znovu a znovu.

Poté zkontroluje, že pokud není nabídka aktivní, aktivuje ji. Vytiskne první vybranou možnost (což je ve výchozím nastavení první položka v nabídceMožnosti. Pokud stisknete tlačítko podruhé nebo potřetí (atd.), Dostanete další možnost v seznamu. Něco, co bych mohl opravit, je že když se dostane na konec, cykluje zpět na začátek. To by mohlo přečíst délku pole a usnadnit cyklování zpět, pokud jste změnili počet možností, ale to bylo prozatím jednoduché.

Poslední malá část (// Vytiskne nabídku) evidentně vytiskne nabídku, ale také nastaví předchozí stav na VYSOKÝ, takže stejná funkce se nebude opakovat (viz moje poznámka výše o kontrole, zda bylo tlačítko dříve NÍZKÉ).

// menuSelect je stisknuto, zadejte logicif ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Změňte vybranou možnost // V tuto chvíli je to jen pravda/nepravda // ale může být cokoli bool toggle = ToggleOptionSelected (); if (toggle) {menuNeedsPrint = true; } else {Serial.println ("Něco se pokazilo. Zkuste to znovu"); }} // Přepnout stav na přepnout pouze při uvolnění a opětovném stisknutí menuSelectPreviousState = menuSelectPressed; }

Tento kousek kódu zpracovává tlačítko menuSelectPressed stejným způsobem, kromě toho, že tentokrát spustíme funkci ToggleOptionSelected (). Jak jsem již řekl, tuto funkci můžete změnit, aby fungovala více, ale to je vše, co k tomu potřebuji.

Hlavní věc, kterou je třeba poznamenat, je přepínací proměnná, která sleduje úspěch zpětného volání a vytiskne nabídku, pokud je pravdivá. Pokud nevrací nic nebo false, vytiskne chybovou zprávu. Zde můžete zpětné volání využít k dalším činnostem.

if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Ukončete nabídku // Zde můžete provést úklid // nebo uložit do EEPROM menuMode = false; Serial.println ("Nabídka byla ukončena"); // Přepnout stav, takže nabídka se ukončí pouze jednou menuSavePreviousState = menuSavePressed; }}

Tato funkce zpracovává tlačítko menuSave, které právě opouští nabídku. Zde můžete mít možnost zrušit nebo uložit, možná provést nějaké vyčištění nebo uložit do EEPROM. Jen vytisknu „Nabídka ukončena“a stav tlačítka nastavím na VYSOKÝ, aby se necyklil.

if (menuMode && menuNeedsPrint) {// Nabídku jsme vytiskli, takže pokud se něco // nestane, není třeba ji znovu tisknout menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Vybráno:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }

Toto je algoritmus menuPrint, který se spouští pouze v případě, že je nabídka aktivní a když je proměnná menuNeedsPrint nastavena na hodnotu true.

To by se určitě dalo přesunout do vlastní funkce, ale pro jednoduchost..!

No, to je ono! Viz další krok celého bloku kódu.

Krok 10: Konečný blok kódu

// Definujte konstanty

#define menuButton 2 #define menuVyberte 3 #define menuSave 4 #define debounceTimeout 50 int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // Definujte proměnné long int lastDebounceTime; bool lightSensor = true; bool tempSensor = true; // Možnosti nabídky char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0; // Funkce nastavení

void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menuSelect, INPUT); Serial.begin (9600); }

// Funkce pro vrácení aktuálně vybrané možnosti char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Možnost návratu Vybraná návratová nabídkaOption; } // Funkce pro vrácení stavu aktuálně vybrané volby char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "False"; } else {optionSettingVal = "True"; } // Return optionSetting return optionSettingVal; } // Funkce pro přepínání aktuální možnosti bool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; return true; } // Hlavní smyčka

void loop () {// Přečíst tlačítka int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Získejte aktuální čas dlouhý int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Reset počítání času, když není stisknuto tlačítko lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } if (((currentTime - lastDebounceTime)> debounceTimeout)) {// Pokud dojde k vypršení časového limitu, bylo stisknuto tlačítko!

// menuButton je stisknuto, zadejte logiku

// Spustí se pouze tehdy, když bylo tlačítko dříve uvolněno, pokud ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Nechte uživatele vědět Serial.println ("Nabídka je aktivní"); } else if (menuMode == true && optionSelected = 1) {// Reset option optionSelected = 0; } // Tisk nabídky nabídkyNeedsPrint = true; // Přepnout tlačítko předchozí. stav pouze pro zobrazení nabídky // pokud je tlačítko uvolněno a znovu stisknuto menuButtonPreviousState = menuButtonPressed; // By HIGH} // je stisknuto menuSelect, zadejte logiku if ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Změňte vybranou možnost // V tuto chvíli je toto just true/false // but could be anything bool toggle = ToggleOptionSelected (); if (toggle) {menuNeedsPrint = true; } else {Serial.print ("Něco se pokazilo. Zkuste to znovu"); }} // Přepnout stav na přepnout pouze při uvolnění a opětovném stisknutí menuSelectPreviousState = menuSelectPressed; } if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Ukončete nabídku // Zde můžete provést úklid // nebo uložit do EEPROM menuMode = false; Serial.println ("Nabídka byla ukončena"); // Přepnout stav, takže nabídka se ukončí pouze jednou menuSavePreviousState = menuSavePressed; }} // Vytisknout aktuální možnost nabídky je aktivní, ale vytisknout ji pouze jednou, pokud (menuMode && menuNeedsPrint) {// Nabídku jsme vytiskli, takže pokud se něco // nestane, není třeba ji znovu tisknout menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Vybráno:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }}}

Okruh je k dispozici na webu Tinkercad. Vložil jsem níže uvedený obvod, abyste to také viděli!

Jako vždy, pokud máte dotazy nebo problémy, dejte mi prosím vědět!

Doporučuje: