Sadržaj:

Izbornik u Arduinu i kako koristiti gumbe: 10 koraka (sa slikama)
Izbornik u Arduinu i kako koristiti gumbe: 10 koraka (sa slikama)

Video: Izbornik u Arduinu i kako koristiti gumbe: 10 koraka (sa slikama)

Video: Izbornik u Arduinu i kako koristiti gumbe: 10 koraka (sa slikama)
Video: CS50 2013 - Week 9 2024, Studeni
Anonim
Izbornik u Arduinu i kako koristiti gumbe
Izbornik u Arduinu i kako koristiti gumbe

U mom vodiču za Arduino 101 bit ćete naučeni kako postaviti okruženje u Tinkercadu. Koristim Tinkercad jer je to prilično moćna internetska platforma koja mi omogućuje da studentima demonstriram niz vještina za izgradnju sklopova. Slobodno sastavite sve moje vodiče koristeći Arduino IDE i pravi Arduino!

U ovom ćemo vodiču naučiti o gumbima! Moramo znati:

  • Kako ih povezati
  • Čitajući njihovu vrijednost
  • Otpustite se i zašto je to važno
  • Praktična primjena (stvaranje izbornika)

Većina ljudi misli da je najpraktičnije s gumbom paliti i gasiti svjetlo. Hoćemo, ne ovdje! Koristit ćemo naš za stvaranje izbornika i postavljanje nekih opcija na Arduinu.

Spreman? Započnimo!

Korak 1: Postavite ploču

Postavite ploču
Postavite ploču
Postavite ploču
Postavite ploču

Prvi korak je staviti Arduino i Breadboard Small na područje izrade prototipa. Na gornjim slikama pogledajte kako spojiti vodilice za napajanje.

Breadboard Mini ima dvije gornje i donje dvije vodilice. Priključujemo ih na Arduino kako bismo mogli napajati više komponenti. Kasnije u ovom vodiču koristit ćemo 3 gumba pa će nam trebati više energije. Ono što treba napomenuti je da na maloj ploči, tračnice za napajanje idu vodoravno. To se razlikuje od stupaca u glavnom području za izradu prototipova u sredini; ovi idu okomito. Možete koristiti bilo koji od priključaka za napajanje za napajanje bilo kojeg stupca u glavnom području u sredini.

Kad dodate napajanje, upotrijebite crnu i crvenu žicu na negativnu i pozitivnu stranu. Dodajte žice na kraju koje napajaju drugu stranu ploče. Nećemo koristiti tu stranu, ali to je dobra praksa.

Korak 2: Dodajte gumb i otpornik

Dodajte gumb i otpornik
Dodajte gumb i otpornik
Dodajte gumb i otpornik
Dodajte gumb i otpornik
Dodajte gumb i otpornik
Dodajte gumb i otpornik

Dodajte mali gumb s ladice za komponente. Trebao bi izgledati kao na slici. Uvjerite se da nije prekidač! Dodajte i otpornik. Pritisnite ga i postavite vrijednost na 10 kΩ. To je dovoljno da pin povučete nisko kada nije spojen, što je vrlo važno kasnije u kodu.

Komponentu postavite na sredinu ploče. Način na koji gumb radi je:

  • Od ugla do ugla, gumb nije povezan. Pritiskom na gumb zatvaraju se kontakti i povezuju kutovi.
  • Stranice gumba su spojene. Ako spojite žicu s gornje lijeve i donje lijeve strane, krug bi se zatvorio.

Zbog toga komponentu stavljamo preko prostora u sredini. Osigurava da uglovi nisu spojeni ispod igala na ploči.

Sljedeći korak nudi nekoliko slika koje ilustriraju ove točke.

Otpornik postavite sa donjeg desnog zatiča preko stupova tako da leži vodoravno.

Korak 3: Povezivanje gumba

Priključci gumba
Priključci gumba
Priključci gumba
Priključci gumba

Gornje slike jasno pokazuju kako se gumbi spajaju. Uvijek je došlo do zabune kada mislite da je nešto dobro i ne radi!

Sada, dodajmo žice.

  • Postavite crveni kabel s pozitivnog priključka za napajanje u isti stupac kao i donji desni pin na gumbu
  • Postavite crni kabel s negativnog napajanja na isti stupac kao i otpornik.
  • Postavite obojenu žicu (ne crvenu/crnu) od gornjeg lijevog pina do digitalnog pina 2 na Arduinu

Provjerite slike iznad kako biste provjerili je li ožičenje ispravno.

Korak 4: Kôd …

Kod…
Kod…
Kod…
Kod…

Pogledajmo kod za osnovni gumb.

Otvorite uređivač koda i promijenite iz Blokovi u Tekst. Obrišite upozorenje koje se pojavljuje. Prezadovoljni smo tekstom!

Znate osnovno postavljanje, pa definirajmo gumb i učinimo osnovno čitanje. Ispisat ćemo izlaz na Serial.

Stavio sam nekoliko dodatnih komentara u donji kôd tako da je lakše čitati nego sliku.

// Definiranje konstanti

#define button 2 void setup () {pinMode (button, INPUT); Serial.begin (9600); } void loop () {// Pročitajte digitalni pin za provjeru statusa tipke int pritiskom = digitalRead (gumb); // Gumb vraća HIGH ako se pritisne, LOW ako ne ako (pritisnuto == HIGH) {Serial.println ("Pritisnuto!"); }}

Ok, pa to radi!

U biti, sve što radimo je provjeravanje statusa digitalnog pina svaki put kada se kôd petlja. Ako pritisnete Start Simulation i pritisnete gumb, vidjet ćete serijski monitor (kliknite gumb ispod koda) koji prikazuje "Pressed!" opetovano.

Jedna značajka koju ćete vidjeti u gornjem kodu je ocjenjivanje uvjeta if (). Kôd samo postavlja pitanje i procjenjuje je li u ovom slučaju istina. Koristimo jednako (dvostruki znakovi jednakosti, ovako: ==) za provjeru je li vrijednost varijable jednaka određenoj vrijednosti. DigitalRead () vraća visoku ili nisku vrijednost.

Pomoću if () else if / else možemo provjeriti mnoge uvjete ili sve uvjete, a ako se vratite na Osnove Arduina, vidjet ćete neke usporedbe koje možete napraviti.

Sada … Naš kôd bi mogao izgledati potpun … Ali imamo problem.

Vidite, to jako dobro radi kad ste u simulatoru. Ali prava struja ima buku, osobito istosmjerna elektronika. Tako bi naš gumb ponekad mogao vratiti lažno očitanje. I to je problem jer vaš projekt možda neće reagirati na pravi način za korisnika.

Popravimo to!

Korak 5: Mali zastoj

Mali zastoj
Mali zastoj

Za prevladavanje problema s gumbima koristimo postupak koji se naziva debounce. Ovo u biti čeka određeno vrijeme od trenutka kada je gumb pritisnut do trenutka reagiranja na pritisak. Korisniku se i dalje čini prirodnim (osim ako vrijeme predugo produžite). Možete ga koristiti i za provjeru duljine tiska, tako da svaki put možete drugačije odgovoriti. Ne morate mijenjati niti jedno ožičenje!

Pogledajmo kod:

#define button 2#define debounceTimeout 100

Prva promjena je na globalnom planu. Sjetit ćete se da tu definiramo varijable koje bi mnoge naše funkcije mogle koristiti ili one koje se ne mogu poništiti svaki put kada se petlja aktivira. Dakle, dodali smo debounceTimeout definiranim konstantama. Napravili smo ovo 100 (što će kasnije biti prevedeno na 100 ms), ali moglo bi biti kraće. Više će se osjećati neprirodno.

long int lastDebounceTime;

Ova je varijabla deklarirana ispod konstanti. Ovo je dugi int tip, koji nam u osnovi omogućuje pohranu dugih brojeva u memoriju. Nazvali smo ga lastDebounceTime.

Ne moramo ništa mijenjati u funkciji void setup (). Ostavimo to jedno.

void loop () {// Pročitajte digitalni pin za provjeru statusa tipke int pritiskom = digitalRead (gumb); dugi int currentTime = millis (); // Kôd gumba}

Prva promjena koju napravimo u funkciji loop () je pod pozivom za čitanje gumba. Moramo pratiti trenutno vrijeme. Funkcija millis () vraća trenutno vrijeme sata od pokretanja Arduina u milisekundama. Moramo to pohraniti u varijablu dugog int tipa.

Sada moramo biti sigurni da smo svjesni vremena otkad je gumb pritisnut, pa smo poništili mjerač vremena kada nije pritisnut. Pogledaj:

void loop () {// Očitajte digitalni pin za provjeru statusa tipke int pritiskom = digitalRead (gumb); dugi int currentTime = millis (); if (pritisnuto == LOW) {// Poništite vrijeme odbrojavanja dok gumb nije pritisnut lastDebounceTime = currentTime; } // Kôd gumba}

Algoritam if (pritisnut == LOW) provjerava nije li gumb pritisnut. Ako nije, kôd pohranjuje trenutačno vrijeme od posljednje objave. Na taj način, svaki put kad pritisnete gumb, imamo trenutak u kojem možemo provjeriti kada je gumb pritisnut. Zatim možemo napraviti brzi matematički izračun kako bismo vidjeli koliko dugo je tipka pritisnuta i pravilno odgovorili. Pogledajmo ostatak koda:

void loop () {// Pročitajte digitalni pin za provjeru statusa tipke int pritiskom = digitalRead (gumb); dugi int currentTime = millis (); if (pritisnuto == LOW) {// Poništite vrijeme odbrojavanja dok gumb nije pritisnut lastDebounceTime = currentTime; } // Gumb je pritisnut određeno vrijeme ako (((currentTime - lastDebounceTime)> debounceTimeout)) {// Ako je vremensko ograničenje dosegnuto, gumb je pritisnut! Serial.println ("Prešano!"); }}

Posljednji blok koda uzima trenutno vrijeme, oduzima posljednje vrijeme debounce i uspoređuje ga s timeout -om koji smo postavili. Ako je veći, kôd pretpostavlja da je gumb pritisnut za to vrijeme i odgovara. Uredan!

Pokrenite svoj kod i provjerite radi li. Ako imate grešaka, provjerite svoj kôd!

Pogledajmo sada jedan praktični primjer.

Korak 6: Izrada jelovnika

Izrada jelovnika
Izrada jelovnika

Gumbi su zanimljivi jer s njima postoji toliko mogućnosti! U ovom primjeru napravit ćemo jelovnik. Recimo da ste stvorili ovaj zaista sjajan uređaj i trebaju vam korisnici da bi mogli promijeniti opcije za uključivanje ili isključivanje određenih stvari ili postaviti određenu vrijednost za postavku. Ovaj dizajn s tri gumba može to učiniti!

Dakle, za ovaj projekt potrebno nam je:

  • Tri gumba
  • Tri otpornika postavljena na 10 kΩ

Jedan od ovih već imamo, trebaju nam samo druga dva. Zato ih dodajte na ploču. Ožičenje je malo složenije, ali samo zato što sam ga želio držati doista kompaktnim. Možete slijediti isti obrazac za prvi gumb ili slijediti gornju sliku.

Tri tipke su izbornik za otvaranje/sljedeću opciju, mogućnost promjene (kao u, promijenite postavku) i tipka za spremanje/zatvaranje izbornika.

Povežite to, pogledajmo kod!

Korak 7: Razbijanje koda - globalno

U redu, ovo će biti dug korak, ali proći ću kroz svaki odjeljak koda.

Prvo, pogledajmo potrebne globalne varijable.

// Definiranje konstanti #define menuButton 2 #define menuSelect 3 #define menuSave 4 #define debounceTimeout 50 // Definiranje varijabli int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Opcije izbornika char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0;

Ova tri bloka prilično su slična onom što smo već vidjeli. U prvom sam definirao tri gumba i vrijeme čekanja. Za ovaj dio projekta postavio sam ga na 50 ms pa je potreban namjeran pritisak kako bi funkcionirao.

Drugi blok su sve varijable. Moramo pratiti buttonPreviousState i moramo pratiti lastDebounceTime. Sve su to varijable tipa int, ali posljednja je dugačka jer pretpostavljam da nam treba prostora u memoriji.

Blok opcija izbornika ima nekoliko novih značajki. Prvo, char * (da, to je namjerna zvjezdica), koji je doslovna varijabla karaktera/niza. To je pokazivač na statičku pohranu u memoriji. Ne možete ga promijeniti (kao što možete, na primjer, u Pythonu). Ova linija char *menuOptions stvara niz nizova literala. Možete dodati onoliko stavki izbornika koliko želite.

Bool varijabla featureSetting samo je niz vrijednosti koji predstavlja svaku stavku izbornika. Da, mogli biste pohraniti sve što želite, samo promijenite tip varijable (svi moraju biti istog tipa). Sada bi mogli postojati bolji načini za rješavanje ovoga, poput rječnika ili zbirki, ali ovo je jednostavno za ovu aplikaciju. Vjerojatno bih stvorio jedno od ovih potonjih u postavljenoj aplikaciji.

Pratio sam menuMode, pa ako želim druge stvari na svom ekranu, to bih mogao učiniti. Također, da imam logiku senzora, mogao bih to pauzirati tijekom rada s izbornikom, u slučaju da se nešto sukobi. Imam varijablu menuNeedsPrint jer želim ispisati izbornik u određeno vrijeme, a ne samo cijelo vrijeme. Konačno, imam varijablu optionSelected, tako da mogu pratiti odabranu opciju dok joj pristupim na brojnim mjestima.

Pogledajmo sljedeći skup funkcija.

Korak 8: Razbijanje koda - postavljanje i prilagođene funkcije

Funkcija setup () je dovoljno laka, samo tri deklaracije unosa:

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

Slijede tri prilagođene funkcije. Pogledajmo prva dva, zatim posljednji zasebno.

Potrebne su nam dvije funkcije koje vraćaju neke informacije. Razlog je u tome što želimo biti sigurni da je ovo na neki način čitljivo ljudima. Također će pomoći pri otklanjanju pogrešaka u kodu ako imamo problem. Kodirati:

// Funkcija za vraćanje trenutno odabrane opcijechar *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Opcija povrataOdabrani povratak menuOption; } // Funkcija za vraćanje statusa trenutno odabrane opcije char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Netačno"; } else {optionSettingVal = "Istina"; } // Return optionSetting return optionSettingVal; }

Funkcija char *ReturnOptionSelected () provjerava odabranu opciju (ako vidite gore, postavili smo varijablu da to prati) i izvlači literal niza iz niza koji smo ranije stvorili. Zatim ga vraća kao tip char. To znamo jer funkcija označava vrstu povratka.

Druga funkcija, char *ReturnOptionStatus () čita status opcije spremljene u nizu i vraća string literal koji predstavlja vrijednost. Na primjer, ako je postavka koju smo pohranili lažna, vratio bih "False". To je zato što korisniku pokazujemo ovu varijablu i bolje je zadržati svu ovu logiku na okupu. Mogao bih to učiniti kasnije, ali ovdje ima više smisla.

// Funkcija za prebacivanje trenutne optionbool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; return true; }

Funkcija bool ToggleOptionSelected () je praktična funkcija za promjenu vrijednosti postavke koju smo odabrali u izborniku. Samo mijenja vrijednost. Da imate složeniji skup opcija, ovo bi moglo biti sasvim drugačije. Vraćam true u ovoj funkciji, jer moj povratni poziv (poziv kasnije u kodu koji aktivira ovu funkciju) očekuje točan/lažan odgovor. 100% sam siguran da će ovo uspjeti, pa nisam računao da ne radi, ali bih to učinio u postavljenoj aplikaciji (za svaki slučaj).

Korak 9: Petlja…

Funkcija loop () je prilično duga, pa ćemo to učiniti u dijelovima. U okviru ove funkcije možete pretpostaviti sve ispod gnijezda:

void loop () {{100} {101}

// Ovdje radite <-----}

U redu, ovo smo već vidjeli:

// Pročitajte gumbe int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalno čitanje (menuSelect); int menuSavePressed = digitalRead (menuSave); // Dobivanje trenutnog vremena long int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Poništite vrijeme odbrojavanja dok gumb nije pritisnut lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }

Ovdje sam trebao samo dodati tri poziva digitalRead () i pobrinuti se da uzmem u obzir činjenicu da bismo, ako su svi gumbi niski, trebali resetirati mjerač vremena (lastDebounceTime = currentTime) i postaviti sva prethodna stanja na nisko. Također spremam millis () u currentTime.

Sljedeći odjeljak gnijezdi se unutar crte

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

// Ovdje radite <----}

Postoje tri odjeljka. Da, mogao sam ih premjestiti u njihove vlastite funkcije, ali radi jednostavnosti zadržao sam tri glavna algoritma gumba ovdje.

if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Neka korisnik zna Serial.println ("Izbornik je aktivan"); } else if (menuMode == true && optionSelected = 1) {// Poništi opciju optionSelected = 0; } // Ispis izbornika menuNeedsPrint = true; // Uključivanje/ isključivanje gumba prev. stanje samo za prikaz izbornika // ako je gumb otpušten i ponovno pritisnut menuButtonPreviousState = menuButtonPressed; // Bilo bi visoko}

Ovaj prvi se rukuje kada je menuButtonPressed visoko, ili kada je pritisnuta tipka izbornika. Također provjerava je li prethodno stanje NISKO, tako da je gumb morao biti otpušten prije ponovnog pritiska, što sprečava program da stalno iznova pokreće isti događaj.

Zatim provjerava da li ga izbornik aktivira. Ispisat će prvu odabranu opciju (koja je prva stavka u nizu menuOptions prema zadanim postavkama. Ako pritisnete gumb drugi ili treći (itd.) Put, dobit ćete sljedeću opciju na popisu. Nešto što bih mogao popraviti je da kad dođe do kraja, vraća se na početak. Ovo bi moglo očitati duljinu niza i olakšati povratak ako promijenite broj opcija, ali to je za sada bilo jednostavno.

Posljednji mali odjeljak (// Ispisuje izbornik) očito ispisuje izbornik, ali također postavlja prethodno stanje na VISOKO, tako da se ista funkcija neće petljati (pogledajte moju gornju napomenu o provjeri je li tipka prethodno bila NISKA).

// menuSelect je pritisnut, unesite logicif ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Promijenite odabranu opciju // Trenutno je to točno/netočno // ali može biti bilo što bool toggle = ToggleOptionSelected (); if (prebaci) {menuNeedsPrint = true; } else {Serial.println ("Nešto je pošlo po zlu. Pokušajte ponovo"); }} // Uključivanje / isključivanje stanja ako se pusti i ponovno pritisne menuSelectPreviousState = menuSelectPressed; }

Ovaj dio koda upravlja gumbom MenuSelectPressed na isti način, osim što ovaj put samo aktiviramo funkciju ToggleOptionSelected (). Kao što sam već rekao, ovu funkciju možete promijeniti kako bi učinila više, ali to je sve što mi treba.

Ono što je važno napomenuti je varijabla toggle, koja prati uspjeh povratnog poziva i ispisuje izbornik ako je točan. Ako ne vrati ništa ili nije točno, ispisat će poruku o pogrešci. Ovdje možete koristiti povratni poziv za obavljanje drugih poslova.

if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Izađite iz izbornika // Ovdje možete napraviti bilo kakvo pospremanje // ili spremiti u EEPROM menuMode = false; Serial.println ("Izlaz iz izbornika"); // Promijeni stanje pa izbornik izlazi samo jednom menuSavePreviousState = menuSavePressed; }}

Ova funkcija upravlja gumbom Spremi izbornik koji upravo izlazi iz izbornika. Ovdje možete odabrati opciju otkazivanja ili spremanja, čišćenje ili spremanje na EEPROM. Samo ispisujem "Izlazak iz izbornika" i postavio stanje gumba na VISOKO da se ne petlja.

if (menuMode && menuNeedsPrint) {// Ispisali smo izbornik, pa ako se nešto // ne dogodi, nema potrebe za ponovnim ispisivanjem menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Odabrano:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }

Ovo je algoritam menuPrint, koji se aktivira samo kada je izbornik aktivan i kada je varijabla menuNeedsPrint postavljena na true.

Ovo bi se definitivno moglo premjestiti u vlastitu funkciju, ali radi jednostavnosti..!

Pa to je to! Pogledajte sljedeći korak za cijeli blok koda.

Korak 10: Završni blok koda

// Definiranje konstanti

#define menuButton 2 #define menuSelect 3 #define menuSave 4 #define debounceTimeout 50 int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // Definiranje varijabli long int lastDebounceTime; bool lightSensor = true; bool tempSensor = true; // Opcije izbornika char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0; // Postavljanje funkcije

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

// Funkcija za vraćanje trenutno odabrane opcije char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Opcija povrataOdabrani povratak menuOption; } // Funkcija za vraćanje statusa trenutno odabrane opcije char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Netačno"; } else {optionSettingVal = "Istina"; } // Return optionSetting return optionSettingVal; } // Funkcija za prebacivanje trenutne opcije bool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; return true; } // Glavna petlja

void loop () {// Pročitajte gumbe int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalno čitanje (menuSelect); int menuSavePressed = digitalRead (menuSave); // Dobivanje trenutnog vremena long int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Poništite vrijeme odbrojavanja dok gumb nije pritisnut lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } if ((((currentTime - lastDebounceTime)> debounceTimeout)) {// Ako je vremensko ograničenje dosegnuto, gumb je pritisnut!

// menuButton je pritisnut, unesite logiku

// Aktivira se samo ako je gumb prethodno otpušten ako ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Neka korisnik zna Serial.println ("Izbornik je aktivan"); } else if (menuMode == true && optionSelected = 1) {// Poništi opciju optionSelected = 0; } // Ispis izbornika menuNeedsPrint = true; // Uključivanje/ isključivanje gumba prev. stanje samo za prikaz izbornika // ako je gumb otpušten i ponovno pritisnut menuButtonPreviousState = menuButtonPressed; // Bilo bi HIGH} // menuSelect je pritisnuto, unesite logiku if ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Promijenite odabranu opciju // Trenutno je ovo samo true/false // ali može biti bilo što bool toggle = ToggleOptionSelected (); if (prebaci) {menuNeedsPrint = true; } else {Serial.print ("Nešto je pošlo po zlu. Pokušajte ponovo"); }} // Uključivanje / isključivanje stanja ako se pusti i ponovno pritisne menuSelectPreviousState = menuSelectPressed; } if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Izađite iz izbornika // Ovdje možete napraviti bilo kakvo pospremanje // ili spremiti u EEPROM menuMode = false; Serial.println ("Izlaz iz izbornika"); // Promijeni stanje pa izbornik izlazi samo jednom menuSavePreviousState = menuSavePressed; }} // Ispis trenutne opcije izbornika aktivna, ali ispišite je samo jednom ako (menuMode && menuNeedsPrint) {// Ispisali smo izbornik, pa ako se nešto // ne dogodi, nema potrebe za ponovnim ispisivanjem menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Odabrano:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }}}

Krug je dostupan na web stranici Tinkercad. Ugradio sam donji krug da biste i vi vidjeli!

Kao i uvijek, ako imate pitanja ili problema, javite mi!

Preporučeni: