Turinys:

„Arduino“meniu ir mygtukų naudojimas: 10 žingsnių (su paveikslėliais)
„Arduino“meniu ir mygtukų naudojimas: 10 žingsnių (su paveikslėliais)

Video: „Arduino“meniu ir mygtukų naudojimas: 10 žingsnių (su paveikslėliais)

Video: „Arduino“meniu ir mygtukų naudojimas: 10 žingsnių (su paveikslėliais)
Video: How to use up to 10 push button switch with 1 Arduino input pin ANPB-V1 2024, Liepa
Anonim
„Arduino“meniu ir kaip naudoti mygtukus
„Arduino“meniu ir kaip naudoti mygtukus

Mano „Arduino 101“pamokoje būsite išmokyti nustatyti aplinką „Tinkercad“. Aš naudoju „Tinkercad“, nes tai yra gana galinga internetinė platforma, leidžianti demonstruoti studentams įvairius įgūdžius kuriant grandines. Nesivaržykite sukurti visų mano vadovėlių naudodami „Arduino IDE“ir tikrą „Arduino“!

Šioje pamokoje mes sužinosime apie mygtukus! Turime žinoti:

  • Kaip juos sujungti
  • Skaitant jų vertę
  • Debounce ir kodėl tai svarbu
  • Praktinė programa (meniu kūrimas)

Dauguma žmonių mano, kad praktiškiausias mygtuko veikimo būdas yra įjungti ir išjungti šviesą. Mes, o ne čia! Mes naudosime savo, kad sukurtume meniu ir nustatytume kai kurias „Arduino“parinktis.

Pasiruošę? Pradėkime!

1 žingsnis: nustatykite plokštę

Nustatykite lentą
Nustatykite lentą
Nustatykite lentą
Nustatykite lentą

Pirmasis žingsnis yra įdėti „Arduino“ir „Breadboard Small“ant prototipų kūrimo zonos. Patikrinkite aukščiau esančius paveikslėlius, kad sužinotumėte, kaip prijungti maitinimo bėgius.

„Breadboard Mini“turi du maitinimo bėgius viršuje ir apačioje. Mes prijungiame juos prie „Arduino“, kad galėtume aprūpinti energiją daugiau komponentų. Vėliau šioje pamokoje naudosime 3 mygtukus, todėl mums reikės daugiau energijos. Reikėtų pažymėti, kad ant mažos duonos lentos galios bėgeliai eina horizontaliai. Tai skiriasi nuo stulpelių pagrindinėje prototipų kūrimo srityje viduryje; šie važiuoja vertikaliai. Galite naudoti bet kurį maitinimo kaištį, kad aprūpintumėte maitinimą bet kuriuo stulpeliu pagrindinėje srityje viduryje.

Kai pridedate maitinimą, naudokite juodus ir raudonus laidus prie neigiamo ir teigiamo. Pabaigoje pridėkite laidus, kurie maitina, į kitą plokštės pusę. Mes nenaudosime šios pusės, bet tai gera praktika.

2 žingsnis: pridėkite mygtuką ir rezistorių

Pridėkite mygtuką ir rezistorių
Pridėkite mygtuką ir rezistorių
Pridėkite mygtuką ir rezistorių
Pridėkite mygtuką ir rezistorių
Pridėkite mygtuką ir rezistorių
Pridėkite mygtuką ir rezistorių

Įdėkite nedidelį mygtuką iš komponentų dėklo. Tai turėtų atrodyti kaip paveikslėlyje. Įsitikinkite, kad tai nėra jungiklis! Taip pat pridėkite rezistorių. Spustelėkite jį ir nustatykite jo vertę į 10 kΩ. To pakanka, kad smeigtukas būtų nuleistas žemai, kai jis nėra prijungtas, o tai labai svarbu vėliau kode.

Padėkite komponentą ant duonos lentos vidurio. Mygtuko veikimo būdas yra toks:

  • Nuo kampo iki kampo mygtukas nėra prijungtas. Paspaudus mygtuką, kontaktai uždaromi ir kampai sujungiami.
  • Mygtuko šonai yra sujungti. Jei prijungsite laidą prie viršutinio kairiojo ir apatinio kairiojo, grandinė bus uždaryta.

Štai kodėl mes dedame komponentą per erdvę viduryje. Tai užtikrina, kad kampai nebūtų sujungti po plokštės kaiščiais.

Kitas žingsnis pateikia keletą vaizdų, iliustruojančių šiuos dalykus.

Padėkite rezistorių iš apatinio dešiniojo kaiščio skersai stulpelių, kad jis būtų horizontaliai.

3 žingsnis: mygtukų jungtys

Mygtuko jungtys
Mygtuko jungtys
Mygtuko jungtys
Mygtuko jungtys

Aukščiau esantys vaizdai aiškiai parodo, kaip jungiasi mygtukai. Visada buvo sumišimas, kai manai, kad viskas yra gerai ir tai neveikia!

Dabar pridėkime laidus.

  • Įdėkite raudoną laidą iš teigiamo maitinimo kaiščio į tą patį stulpelį kaip ir mygtuko apatinis dešinysis kaištis
  • Įdėkite juodą laidą iš neigiamo maitinimo kaiščio į tą patį stulpelį kaip rezistorius.
  • Įdėkite spalvotą laidą (ne raudoną/juodą) nuo viršutinio kairiojo kaiščio iki „Arduino“2 skaitmeninio kaiščio

Patikrinkite aukščiau esančius paveikslėlius, kad įsitikintumėte, jog jūsų laidai yra teisingi.

4 žingsnis: kodas …

Kodas…
Kodas…
Kodas…
Kodas…

Pažvelkime į pagrindinio mygtuko kodą.

Atidarykite kodų rengyklę ir pakeiskite iš Blokų į Tekstą. Išvalykite pasirodžiusį įspėjimą. Džiaugiamės tekstu!

Jūs žinote pagrindinę sąranką, todėl apibrėžkime mygtuką ir atliksime pagrindinį skaitymą. Išvestį atspausdinsime serijiniu būdu.

Į žemiau pateiktą kodą įdėjau keletą papildomų komentarų, kad būtų lengviau skaityti nei paveikslėlį.

// Apibrėžti konstantas

#define button 2 void setup () {pinMode (mygtukas, Įvestis); Serial.begin (9600); } void loop () {// Perskaitykite skaitmeninį kaištį, kad patikrintumėte mygtuko int paspaudimo būseną = digitalRead (mygtukas); // Mygtukas grąžina HIGH, jei paspaudžiamas, LOW, jei ne, jei (paspaudžiamas == HIGH) {Serial.println ("Paspaustas!"); }}

Gerai, tai veikia!

Iš esmės viskas, ką mes darome, yra patikrinti skaitmeninio kaiščio būseną kiekvieną kartą, kai kodo kilpos. Jei spustelėsite Pradėti modeliavimą ir paspausite mygtuką, pamatysite serijinį monitorių (spustelėkite mygtuką po kodu), rodantį „Paspaustas!“. pakartotinai.

Viena iš funkcijų, kurią matysite aukščiau esančiame kode, yra būklės if () vertinimas. Viskas, ką daro kodas, yra užduoti klausimą ir įvertinti, ar tai tiesa. Norėdami patikrinti, ar kintamojo vertė yra lygi tam tikrai vertei, naudojame reikšmę lygus (dvigubus lygybės ženklus, tokius kaip: ==). „DigitalRead“() grąžina HIGH arba LOW.

Naudodami if () else if / else galime patikrinti daugelį sąlygų arba visas sąlygas, o jei grįšite prie „Arduino“pagrindų, pamatysite kai kuriuos palyginimus.

Dabar … Mūsų kodas gali atrodyti baigtas … Bet mes turime problemą.

Žiūrėk, tai tikrai gerai veikia simuliatoriuje. Tačiau tikra elektra turi triukšmą, ypač nuolatinės srovės elektronika. Taigi mūsų mygtukas kartais gali grąžinti klaidingą rodmenį. Ir tai yra problema, nes jūsų projektas gali netinkamai reaguoti vartotojui.

Pataisykime!

5 žingsnis: nedidelis nukrypimas

Mažas nukrypimas
Mažas nukrypimas

Norėdami įveikti mygtukų problemą, naudojame procedūrą, vadinamą debounce. Tai iš esmės laukia tam tikro laiko tarp mygtuko paspaudimo ir reagavimo į paspaudimą. Vartotojui tai vis tiek atrodo natūralu (nebent per ilgai užtrukiate). Taip pat galite jį naudoti paspaudimo trukmei patikrinti, kad kiekvieną kartą galėtumėte reaguoti skirtingai. Jums nereikia keisti jokių laidų!

Pažvelkime į kodą:

#define mygtukas 2#define debounceTimeout 100

Pirmasis pokytis susijęs su pasauliniu mastu. Prisiminsite, kad čia mes nustatome kintamuosius, kuriuos gali naudoti daugelis mūsų funkcijų, arba tuos, kurių negalima iš naujo nustatyti kiekvieną kartą, kai ciklas suaktyvinamas. Taigi, prie apibrėžtų konstantų pridėjome debounceTimeout. Mes padarėme šį 100 (kuris vėliau bus išverstas į 100 ms), tačiau jis gali būti trumpesnis. Dar ilgiau ir jausitės nenatūraliai.

long int lastDebounceTime;

Šis kintamasis deklaruojamas žemiau konstantų. Tai ilgas int tipas, kuris iš esmės leidžia mums išsaugoti ilgus skaičius atmintyje. Mes tai pavadinome lastDebounceTime.

Nereikia nieko keisti funkcijoje void setup (). Palikime tą.

void loop () {// Perskaitykite skaitmeninį kaištį, kad patikrintumėte mygtuko int paspaudimo būseną = digitalRead (mygtukas); ilgas int dabartinis laikas = milis (); // Mygtuko kodas}

Pirmasis „loop“() funkcijos pakeitimas yra po raginimu skaityti mygtuką. Turime sekti esamą laiką. Funkcija millis () grąžina dabartinį laikrodžio laiką nuo „Arduino“įkrovos milisekundėmis. Turime tai išsaugoti ilgame int tipo kintamajame.

Dabar turime įsitikinti, kad žinome laiką nuo mygtuko paspaudimo, todėl iš naujo nustatome laikmatį, kai jis nespaudžiamas. Pažiūrėk:

void loop () {// Perskaitykite skaitmeninį kaištį, kad patikrintumėte mygtuko int paspaudimo būseną = digitalRead (mygtukas); ilgas int dabartinis laikas = milis (); if (press == LOW) {// Iš naujo nustatyti skaičiavimo laiką, kol mygtukas nespaustas lastDebounceTime = currentTime; } // Mygtuko kodas}

Jei (paspaustas == LOW) algoritmas patikrina, ar mygtukas nėra paspaustas. Jei taip nėra, kodas saugo dabartinį laiką nuo paskutinio paleidimo. Tokiu būdu, kiekvieną kartą paspaudus mygtuką, mes turime laiko momentą, nuo kurio galime patikrinti, kada buvo paspaustas mygtukas. Tada galime atlikti greitą matematinį skaičiavimą, kad pamatytume, kiek laiko buvo paspaustas mygtukas, ir teisingai atsakyti. Pažvelkime į likusią kodo dalį:

void loop () {// Perskaitykite skaitmeninį kaištį, kad patikrintumėte mygtuko int paspaudimo būseną = digitalRead (mygtukas); ilgas int dabartinis laikas = milis (); if (press == LOW) {// Iš naujo nustatyti skaičiavimo laiką, kol mygtukas nespaustas lastDebounceTime = currentTime; } // Mygtukas buvo nuspaustas tam tikrą laiką, jei ((((currentTime - lastDebounceTime)> debounceTimeout)) {// Jei pasibaigė skirtasis laikas, paspauskite mygtuką! Serial.println ("Paspaustas!"); }}

Paskutinis kodo blokas užima dabartinį laiką, atima paskutinį atjungimo laiką ir palygina jį su mūsų nustatytu skirtuoju laiku. Jei jis didesnis, kodas numato, kad mygtukas buvo nuspaustas tą laiką ir reaguoja. Tvarkinga!

Paleiskite kodą ir patikrinkite, ar jis veikia. Jei turite klaidų, patikrinkite savo kodą!

Dabar pažvelkime į praktinį pavyzdį.

6 žingsnis: meniu sudarymas

Meniu sudarymas
Meniu sudarymas

Mygtukai yra įdomūs, nes su jais yra tiek daug galimybių! Šiame pavyzdyje mes sudarysime meniu. Tarkime, sukūrėte šį tikrai puikų įrenginį ir jums reikia, kad vartotojai galėtų pakeisti tam tikrų dalykų įjungimo ar išjungimo parinktis arba nustatyti tam tikrą nustatymo vertę. Šis trijų mygtukų dizainas gali tai padaryti!

Taigi šiam projektui mums reikia:

  • Trys mygtukai
  • Trys rezistoriai nustatyti į 10 kΩ

Mes jau turime vieną iš jų, mums reikia tik kitų dviejų. Taigi pridėkite juos prie lentos. Elektros instaliacija yra šiek tiek sudėtingesnė, bet tik todėl, kad norėjau, kad ji būtų tikrai kompaktiška. Galite sekti tą patį pirmojo mygtuko modelį arba sekti paveikslėlį aukščiau.

Trys mygtukai yra meniu atidarymo/kito pasirinkimo parinktis, pakeitimo parinktis (kaip nurodyta, pakeisti nustatymą) ir meniu išsaugojimo/uždarymo mygtukas.

Prijunkite laidą, pažvelkime į kodą!

7 žingsnis: kodo suskirstymas - visuotinis

Gerai, tai bus ilgas žingsnis, bet aš eisiu per kiekvieną kodo skyrių.

Pirmiausia pažvelkime į reikiamus pasaulinius kintamuosius.

// Apibrėžti konstantas #apibrėžti meniuButton 2 #define menuSelect 3 #define menuSave 4 #define debounceTimeout 50 // Apibrėžti kintamuosius int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Meniu parinktys char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {klaidinga, klaidinga}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0;

Šie trys blokai yra gana panašūs į tai, ką matėme anksčiau. Pirmajame apibrėžiau tris mygtukus ir skirtąjį laiką. Šiai projekto daliai nustatiau 50 ms, todėl norint, kad ji veiktų, reikia sąmoningai spausti.

Antrasis blokas yra visi kintamieji. Turime sekti mygtukąPreviousState ir sekti lastDebounceTime. Tai visi int tipo kintamieji, tačiau paskutinis yra ilgas tipas, nes darau prielaidą, kad mums reikia vietos atmintyje.

Meniu parinkčių bloke yra keletas naujų funkcijų. Pirma, simbolis * (taip, tai yra sąmoninga žvaigždutė), kuris yra simbolinis/eilutinis pažodinis kintamasis. Tai rodyklė į statinę atminties atmintį. Jūs negalite jo pakeisti (kaip, pavyzdžiui, „Python“). Ši char *menuOptions eilutė sukuria eilutės literalų masyvą. Galite pridėti tiek meniu elementų, kiek norite.

„Bool featureSetting“kintamasis yra tik reikšmių masyvas, vaizduojantis kiekvieną meniu elementą. Taip, galite saugoti viską, kas jums patinka, tiesiog pakeiskite kintamojo tipą (jie visi turi būti to paties tipo). Dabar gali būti geresnių būdų tai valdyti, pavyzdžiui, žodynai ar kopijos, tačiau tai paprasta šiai programai. Tikriausiai vieną iš pastarųjų sukurčiau diegtoje programoje.

Aš stebėjau meniu režimą, todėl, jei norėčiau, kad mano ekrane būtų kiti dalykai, galėčiau tai padaryti. Be to, jei turėčiau jutiklio logiką, tai galėčiau pristabdyti meniu veikimo metu, tik tuo atveju, jei kas nors prieštarautų. Turiu „menuNeedsPrint“kintamąjį, nes noriu spausdinti meniu tam tikru laiku, o ne tik visą laiką. Galiausiai turiu „OptionSelected“kintamąjį, kad galėčiau stebėti pasirinktą parinktį, kai ją pasiekiu daugelyje vietų.

Pažvelkime į kitą funkcijų rinkinį.

8 veiksmas: kodo suskirstymas - sąranka ir pasirinktinės funkcijos

Sąrankos () funkcija yra pakankamai paprasta, tik trys įvesties deklaracijos:

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

Toliau pateikiamos trys pasirinktinės funkcijos. Pažvelkime į pirmuosius du, paskui į paskutinį atskirai.

Mums reikia dviejų funkcijų, kurios grąžina tam tikrą informaciją. Priežastis yra ta, kad norime įsitikinti, kad tai yra tarsi suprantama žmonėms. Tai taip pat padės derinant kodą, jei iškils problemų. Kodas:

// Funkcija, skirta grąžinti pasirinktą parinktįchar *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Grąžinimo parinktisPasirinktas grąžinimo meniuOption; } // Funkcija, skirta grąžinti dabartinės pasirinktos parinkties būseną char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Netiesa"; } else {optionSettingVal = "Tiesa"; } // Grąžinimo parinktisGrąžinimo parinkties nustatymasSettingVal; }

Funkcija char *ReturnOptionSelected () patikrina pasirinktą parinktį (jei matote aukščiau, mes nustatome kintamąjį, kad tai stebėtume) ir ištraukia eilutės literalą iš anksčiau sukurto masyvo. Tada jis grąžina jį kaip anglies tipą. Mes tai žinome, nes funkcija nurodo grąžinimo tipą.

Antroji funkcija char *ReturnOptionStatus () nuskaito masyve išsaugotos parinkties būseną ir grąžina reikšmę atspindinčią eilutę. Pavyzdžiui, jei mūsų išsaugotas nustatymas yra klaidingas, grąžinčiau „False“. Taip yra todėl, kad parodome vartotojui šį kintamąjį ir geriau visą šią logiką laikyti kartu. Galėčiau tai padaryti vėliau, bet yra prasmingiau tai padaryti čia.

// Funkcija, skirta perjungti dabartinį parinkčių sąrašą ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; grįžti tiesa; }

Funkcija bool ToggleOptionSelected () yra patogi funkcija, leidžianti pakeisti meniu pasirinkto nustatymo vertę. Tai tik apverčia vertę. Jei turėtumėte sudėtingesnių parinkčių, tai gali būti visiškai kitaip. Šioje funkcijoje grįžtu tiesa, nes mano atgalinis skambutis (skambutis vėliau įvedus šią funkciją) tikisi tikro/klaidingo atsakymo. Esu 100% tikras, kad tai veiks, todėl neskaičiavau, kad jis neveikia, bet darytoje programoje (tik tuo atveju).

9 žingsnis: kilpa …

Ciklo () funkcija yra gana ilga, todėl tai darysime dalimis. Šioje funkcijoje galite daryti viską, kas nurodyta žemiau:

void loop () {

// Dirbk čia <-----}

Gerai, mes matėme šiuos dalykus anksčiau:

// Skaityti mygtukus int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Gauti dabartinį laiką long int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Iš naujo nustatyti skaičiavimo laiką, kol mygtukas nespaudžiamas lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }

Viskas, ką turėjau čia padaryti, buvo pridėti tris „digitalRead“() skambučius ir įsitikinti, kad atsižvelgiau į tai, kad jei visi mygtukai buvo žemi, turėtume iš naujo nustatyti laikmatį (lastDebounceTime = currentTime) ir nustatyti visas ankstesnes būsenas. Taip pat kaupiu milis () „currentTime“.

Kitas skyrius lizdas linijos viduje

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

// Dirbk čia <----}

Yra trys skyriai. Taip, galėjau juos perkelti į savo funkcijas, tačiau dėl paprastumo čia laikiau tris pagrindinius mygtukų algoritmus.

if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Praneškite vartotojui Serial.println („Meniu aktyvus“); } else if (menuMode == true && optionSelected = 1) {// Iš naujo nustatyti parinktįSelected = 0; } // Spausdinti meniu meniuNeedsPrint = true; // Perjungti mygtuką ankst. būsena tik rodyti meniu // jei mygtukas atleidžiamas ir dar kartą paspaudžiamas menuButtonPreviousState = menuButtonPressed; // Būtų HIGH}

Šis pirmasis veiksmas, kai menuButtonPressed yra HIGH arba kai paspaudžiamas meniu mygtukas. Ji taip pat patikrina, ar ankstesnė būsena buvo ŽEMA, kad prieš paspaudžiant mygtuką reikėjo atleisti, o tai neleidžia programai nuolat suaktyvinti to paties įvykio vėl ir vėl.

Tada ji patikrina, ar jei meniu nėra aktyvus, jis jį suaktyvina. Bus išspausdinta pirmoji pasirinkta parinktis (tai yra pirmasis meniu elementas „Parinkčių masyvas“pagal numatytuosius nustatymus. Jei paspausite mygtuką antrą ar trečią kartą (ir tt), gausite kitą parinktį sąraše. Kažką galėčiau pataisyti kad kai jis baigiasi, jis grįžta į pradžią. Tai gali nuskaityti masyvo ilgį ir palengvinti važiavimą atgal, jei pakeisite parinkčių skaičių, tačiau kol kas tai buvo paprasta.

Paskutinė mažoji skiltis (// Spausdina meniu) akivaizdžiai spausdina meniu, tačiau ji taip pat nustato ankstesnę būseną AUKŠTA, todėl ta pati funkcija nesikaupia (žr. Mano pastabą aukščiau, kaip patikrinti, ar mygtukas anksčiau buvo žemas).

// „menuSelect“yra paspaustas, pateikite „logif“((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Keisti pasirinktą parinktį // Šiuo metu tai tik tiesa/klaidinga // bet gali būti bet kas bool toggle = ToggleOptionSelected (); if (perjungti) {menuNeedsPrint = true; } else {Serial.println ("Kažkas nepavyko. Bandykite dar kartą"); }} // Perjungti būseną į perjungimą tik tada, kai atleidžiama ir dar kartą paspaudžiama menuSelectPreviousState = menuSelectPressed; }

Šis kodo bitas taip pat tvarko meniuSelectPressed, išskyrus šį kartą, kai mes tiesiog suaktyviname funkciją ToggleOptionSelected (). Kaip jau sakiau anksčiau, galite pakeisti šią funkciją, kad ji padarytų daugiau, bet tai viskas, ko man reikia.

Pagrindinis dalykas, į kurį reikia atkreipti dėmesį, yra perjungimo kintamasis, kuris stebi atgalinio skambučio sėkmę ir spausdina meniu, jei tai tiesa. Jei jis nieko negrąžina arba klaidingas, jis išspausdina klaidos pranešimą. Čia galite naudoti savo atgalinį skambutį kitiems dalykams atlikti.

if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Išeiti iš meniu // Čia galite atlikti bet kokį tvarkymą // arba išsaugoti EEPROM menuMode = false; Serial.println („Meniu išėjo“); // Perjungti būseną, todėl meniu išeina tik vieną kartą menuSavePreviousState = menuSavePressed; }}

Ši funkcija tvarko meniu išsaugojimo mygtuką, kuris tiesiog išeina iš meniu. Čia galite turėti atšaukimo arba išsaugojimo parinktį, galbūt išvalyti arba išsaugoti EEPROM. Aš tiesiog atspausdinu „Meniu išėjo“ir nustatau mygtuko būseną į AUKŠTĄ, kad jis nesisuktų.

if (menuMode && menuNeedsPrint) {// Meniu atsispausdinome, tad nebent kas nors // atsitiktų, nereikia jo dar kartą spausdinti menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Pasirinkta:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }

Tai yra „menuPrint“algoritmas, kuris suveikia tik tada, kai meniu yra aktyvus ir kai „menuNeedsPrint“kintamasis yra nustatytas į „true“.

Tai tikrai būtų galima perkelti į savo funkciją, bet dėl paprastumo..!

Na, tai viskas! Visą kodo bloką rasite kitame žingsnyje.

10 veiksmas: galutinis kodo blokas

// Apibrėžti konstantas

#define menuButton 2 #define menuPasirinkite 3 #define menuSave 4 #define debounceTimeout 50 int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // Apibrėžti kintamuosius long int lastDebounceTime; bool lightSensor = tiesa; bool tempSensor = tiesa; // Meniu parinktys char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {klaidinga, klaidinga}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0; // Sąrankos funkcija

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

// Funkcija, skirta grąžinti dabartinę pasirinktą parinktį char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Grąžinimo parinktisPasirinktas grąžinimo meniuOption; } // Funkcija, skirta grąžinti dabartinės pasirinktos parinkties būseną char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Netiesa"; } else {optionSettingVal = "Tiesa"; } // Grąžinimo parinktisGrąžinimo parinkties nustatymasSettingVal; } // Funkcija perjungti dabartinę parinktį bool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; grįžti tiesa; } // Pagrindinė kilpa

void loop () {// Skaityti mygtukus int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Gauti dabartinį laiką long int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Iš naujo nustatyti skaičiavimo laiką, kol mygtukas nespaudžiamas lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } if ((((currentTime - lastDebounceTime)> debounceTimeout)) {// Jei pasibaigė skirtasis laikas, paspauskite mygtuką!

// meniu mygtukas yra paspaustas, pateikite logiką

// Suveikia tik tada, kai mygtukas anksčiau buvo atleistas, jei ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Praneškite vartotojui Serial.println („Meniu aktyvus“); } else if (menuMode == true && optionSelected = 1) {// Iš naujo nustatyti parinktįSelected = 0; } // Spausdinti meniu meniuNeedsPrint = true; // Perjungti mygtuką ankst. būsena tik rodyti meniu // jei mygtukas atleidžiamas ir dar kartą paspaudžiamas menuButtonPreviousState = menuButtonPressed; // būtų HIGH} // menuSelect yra paspaustas, pateikite logiką, jei ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Keisti pasirinktą parinktį // Šiuo metu tai tik tiesa/klaidinga // bet gali buti bet kas bool toggle = ToggleOptionSelected (); if (perjungti) {menuNeedsPrint = true; } else {Serial.print ("Kažkas nepavyko. Bandykite dar kartą"); }} // Perjungti būseną į perjungimą tik tada, kai atleidžiama ir dar kartą paspaudžiama menuSelectPreviousState = menuSelectPressed; } if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Išeiti iš meniu // Čia galite atlikti bet kokį tvarkymą // arba išsaugoti EEPROM menuMode = false; Serial.println („Meniu išėjo“); // Perjungti būseną, todėl meniu išeina tik vieną kartą menuSavePreviousState = menuSavePressed; }} // Spausdinti esamą meniu parinktį aktyvią, bet atspausdinti tik vieną kartą, jei (menuMode && menuNeedsPrint) {// Meniu išspausdinome, taigi, nebent kas nors // atsitiktų, nereikia jo dar kartą spausdinti menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Pasirinkta:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }}}

Grandinę galima rasti Tinkercad svetainėje. Aš įdėjau žemiau esančią grandinę, kad ir jūs galėtumėte pamatyti!

Kaip visada, jei turite klausimų ar problemų, praneškite man!

Rekomenduojamas: