Sadržaj:

Meni u Arduinu i kako koristiti dugmad: 10 koraka (sa slikama)
Meni u Arduinu i kako koristiti dugmad: 10 koraka (sa slikama)

Video: Meni u Arduinu i kako koristiti dugmad: 10 koraka (sa slikama)

Video: Meni u Arduinu i kako koristiti dugmad: 10 koraka (sa slikama)
Video: Книга - Моя первая схема ArduMikron 2024, Novembar
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ćava da demonstriram niz vještina studentima 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
  • Odustanite i zašto je to važno
  • Praktična primjena (kreiranje menija)

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

Spreman? Hajde da počnemo!

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. Pogledajte gornje slike da vidite kako spojiti ograde.

Breadboard Mini ima dvije gornje i donje šine za napajanje. 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, preko ploče. Ovo se razlikuje od stupaca u glavnom području za izradu prototipova u sredini; oni idu okomito. Možete koristiti bilo koji od priključaka za napajanje za napajanje bilo koje kolone 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 dugme i otpornik

Dodajte dugme i otpornik
Dodajte dugme i otpornik
Dodajte dugme i otpornik
Dodajte dugme i otpornik
Dodajte dugme i otpornik
Dodajte dugme i otpornik

Dodajte mali taster iz ležišta za komponente. Trebalo bi da izgleda kao na slici. Uvjerite se da nije prekidač! Dodajte i otpornik. Kliknite na nju i postavite vrijednost na 10 kΩ. To je dovoljno da pin povučete nisko kada nije povezan, što je vrlo važno kasnije u kodu.

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

  • Od ugla do ugla, dugme nije povezano. Pritiskom na dugme zatvaraju se kontakti i povezuju uglovi.
  • Bočne strane dugmeta su povezane. Ako biste spojili žicu s gornje lijeve i donje lijeve strane, krug bi se zatvorio.

Zbog toga komponentu stavljamo preko razmaka u sredini. On 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 pina preko stupova tako da leži vodoravno.

Korak 3: Povezivanje dugmadi

Button Connections
Button Connections
Button Connections
Button Connections

Gornje slike jasno pokazuju kako se tipke povezuju. Uvijek je došlo do zabune kada mislite da je nešto dobro i ne funkcionira!

Sada, dodajmo žice.

  • Postavite crveni provodnik sa pozitivnog pina za napajanje u istu kolonu kao i donji desni pin na dugmetu
  • Postavite crni provodnik s negativnog pina napajanja na istu kolonu 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…

Kodeks…
Kodeks…
Kodeks…
Kodeks…

Pogledajmo kod za osnovno dugme.

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

Znate osnovno postavljanje, pa definirajmo dugme i pročitajmo osnovno. Odštampaćemo izlaz na Serial.

Stavio sam nekoliko dodatnih komentara u donji kod 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 da biste provjerili status dugmeta int pritisnuto = digitalRead (dugme); // Dugme vraća HIGH ako je pritisnuto, LOW ako nije ako (pritisnuto == HIGH) {Serial.println ("Pritisnuto!"); }}

Ok, pa to radi!

U osnovi, sve što radimo je provjera statusa digitalnog pina svaki put kada se kôd petlja. Ako pritisnete Pokreni simulaciju i pritisnete dugme, vidjet ćete da serijski monitor (kliknite gumb ispod koda) prikazuje "Pressed!" više puta.

Jedna od karakteristika koju ćete vidjeti u gornjem kodu je procjena stanja if (). Sve što kôd radi je postavljanje pitanja i procjena da li je u ovom slučaju istina. Koristimo jednako (dvostruki znakovi jednakosti, ovako: ==) da provjerimo je li vrijednost varijable jednaka određenoj vrijednosti. DigitalRead () vraća HIGH ili LOW.

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

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

Vidite, to radi jako dobro dok ste u simulatoru. Ali prava struja ima buku, posebno istosmjerna elektronika. Tako da naše dugme ponekad može 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: Malo otklanjanja

Little Debounce
Little Debounce

Koristimo proceduru koja se naziva debounce kako bismo prevladali problem s gumbima. Ovo u suštini čeka određeno vrijeme od trenutka kada je dugme pritisnuto do trenutka reagovanja na pritisak. Korisniku se i dalje čini prirodnim (osim ako vrijeme predugo produžite). Možete ga koristiti i za provjeru dužine štampe, 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. Zapamtit ćete da tu definiramo varijable koje bi mnoge naše funkcije mogle koristiti ili one koje se ne mogu resetirati svaki put kada se petlja aktivira. Dakle, dodali smo debounceTimeout definiranim konstantama. Napravili smo ovo 100 (što će kasnije biti prevedeno na 100ms), ali moglo bi biti i kraće. Više će se osjećati neprirodno.

long int lastDebounceTime;

Ova varijabla je deklarirana ispod konstanti. Ovo je dugi int tip, koji nam u osnovi omogućava pohranjivanje 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 da provjerite status dugmeta int pritiskom = digitalRead (dugme); dugi int currentTime = millis (); // Šifra dugmeta}

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

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

void loop () {// Pročitajte digitalni pin da provjerite status dugmeta int pritiskom = digitalRead (dugme); dugi int currentTime = millis (); if (pritisnuto == LOW) {// Poništite vrijeme odbrojavanja dok dugme nije pritisnuto lastDebounceTime = currentTime; } // Šifra dugmeta}

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

void loop () {// Pročitajte digitalni pin da provjerite status dugmeta int pritiskom = digitalRead (dugme); dugi int currentTime = millis (); if (pritisnuto == LOW) {// Poništite vrijeme odbrojavanja dok dugme nije pritisnuto lastDebounceTime = currentTime; } // Dugme je pritisnuto određeno vrijeme ako (((currentTime - lastDebounceTime)> debounceTimeout)) {// Ako je vremensko ograničenje dosegnuto, dugme je pritisnuto! Serial.println ("Pressed!"); }}

Zadnji 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 dugme pritisnuto za to vrijeme i odgovara. Uredno!

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

Pogledajmo sada jedan praktični primjer.

Korak 6: Izrada menija

Izrada menija
Izrada menija

Gumbi su zanimljivi jer s njima postoji toliko mogućnosti! U ovom primjeru napravit ćemo jelovnik. Recimo da ste stvorili ovaj zaista odličan 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 projekat potrebno nam je:

  • Tri dugmeta
  • Tri otpornika postavljena na 10 kΩ

Jedan od njih 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 htio da bude zaista kompaktno. Možete slijediti isti obrazac za prvo dugme ili slijediti gornju sliku.

Tri dugmeta su opcija otvaranja/sljedećeg menija, opcija promjene (kao u, promijenite postavku) i tipka za spremanje/zatvaranje menija.

Povežite to, pogledajmo kod!

Korak 7: Podjela 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 menija char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0;

Ova tri bloka su prilično slična onome što smo ranije vidjeli. U prvom sam definirao tri dugmeta i vrijeme čekanja. Za ovaj dio projekta postavio sam ga na 50 ms pa je potrebno namjerno pritiskanje da bi funkcionirao.

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

Blok opcija menija ima nekoliko novih funkcija. Prvo, char * (da, to je namjerna zvjezdica), koji je doslovno promenljiva karakter/niz. To je pokazivač na statičku memoriju 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 menija koliko želite.

Promenljiva bool featureSetting je samo niz vrednosti koji predstavlja svaku stavku menija. 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 podružnica, ali ovo je jednostavno za ovu aplikaciju. Vjerovatno bih stvorio jednu od ovih posljednjih u postavljenoj aplikaciji.

Pratio sam menuMode, pa ako želim druge stvari na ekranu, mogao bih to učiniti. Takođe, da imam logiku senzora, mogao bih to pauzirati tokom rada u meniju, u slučaju da se nešto sukobi. Imam varijablu menuNeedsPrint jer želim štampati meni 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 taj što želimo biti sigurni da je ovo na neki način čitljivo za ljude. Također će pomoći pri otklanjanju grešaka u kodu ako imamo problem. Šifra:

// Funkcija za vraćanje trenutno odabrane opcijechar *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Opcija povrata Odabrani 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 = "Tačno"; } // Return optionSetting return optionSettingVal; }

Funkcija char *ReturnOptionSelected () provjerava odabranu opciju (ako vidite gore, postavili smo varijablu da to prati) i povlači literal niza iz niza koji smo ranije stvorili. Zatim ga vraća kao char tip. To znamo jer funkcija označava tip 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 pokreće ovu funkciju) očekuje tač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 raditi po 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) {// Resetirajte vrijeme odbrojavanja dok dugme nije pritisnuto lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }

Sve što sam trebao učiniti ovdje je dodati tri poziva digitalRead () i pobrinuti se da uzmem u obzir činjenicu da ako su svi gumbi niski, trebamo resetirati tajmer (lastDebounceTime = currentTime) i postaviti sva prethodna stanja na nisko. Takođe skladištim millis () u currentTime.

Sljedeći odjeljak gnijezdi se unutar linije

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 s gumbima 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 menija menuNeedsPrint = true; // Prebacivanje dugmeta prev. stanje samo za prikaz izbornika // ako se dugme otpusti i ponovo pritisne menuButtonPreviousState = menuButtonPressed; // Bilo bi VISOKO}

Ovaj prvi se rukuje kada je menuButtonPressed visoko, ili kada je pritisnuto dugme menija. Takođe proverava da li je prethodno stanje NISKO, tako da je dugme moralo da se otpusti pre nego što se ponovo pritisne, što sprečava program da stalno iznova pokreće isti događaj.

Zatim provjerava da li ga izbornik aktivira, ako nije aktivan. Ispisat će prvu odabranu opciju (koja je prva stavka u nizu menuOptions prema zadanim postavkama. Ako pritisnete dugme drugi ili treći (itd) put, dobit ćete sljedeću opciju na listi. Nešto što bih mogao popraviti je da kada 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 dugme prethodno bilo NISKO).

// menuSelect je pritisnut, unesite logicif ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Promijenite odabranu opciju // Trenutno je ovo samo tačno/netačno // ali može biti bilo šta bool toggle = ToggleOptionSelected (); if (prebaci) {menuNeedsPrint = true; } else {Serial.println ("Nešto nije u redu. Pokušajte ponovo"); }} // Uključivanje / isključivanje stanja samo ako se otpusti i ponovo 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 tačan. Ako ne vrati ništa ili nije točno, ispisat će poruku o grešci. Ovdje možete koristiti povratni poziv za obavljanje drugih poslova.

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

Ova funkcija upravlja tipkom MenuSave, koja upravo izlazi iz menija. Ovdje možete imati opciju otkazivanja ili spremanja, možda izvršiti čišćenje ili spremiti na EEPROM. Samo ispisujem "Izlaz iz menija" i postavljam stanje dugmeta na VISOKO da se ne petlja.

if (menuMode && menuNeedsPrint) {// Štampali smo meni, pa ako se nešto // ne desi, nema potrebe za ponovnim štampanjem 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 meni 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 menija char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0; // Funkcija postavljanja

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 povrata Odabrani 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 = "Tačno"; } // 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) {// Resetirajte vrijeme odbrojavanja dok dugme nije pritisnuto lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } if ((((currentTime - lastDebounceTime)> debounceTimeout)) {// Ako je vremensko ograničenje dostignuto, dugme je pritisnuto!

// menuButton je pritisnut, unesite logiku

// Aktivira se samo ako je dugme prethodno otpušteno 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 menija menuNeedsPrint = true; // Prebacivanje dugmeta prev. stanje samo za prikaz izbornika // ako se dugme otpusti i ponovo pritisne 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 šta bool toggle = ToggleOptionSelected (); if (prebaci) {menuNeedsPrint = true; } else {Serial.print ("Nešto nije u redu. Pokušajte ponovo"); }} // Uključivanje / isključivanje stanja samo ako se otpusti i ponovo pritisne menuSelectPreviousState = menuSelectPressed; } if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Izađite iz menija // Ovdje možete napraviti bilo kakvo pospremanje // ili spremiti u EEPROM menuMode = false; Serial.println ("Izlaz iz menija"); // Uključuje/ isključuje stanje pa izbornik izlazi samo jednom menuSavePreviousState = menuSavePressed; }} // Odštampajte trenutnu opciju menija aktivnu, ali je odštampajte samo jednom ako (menuMode && menuNeedsPrint) {// Štampali smo meni, pa ako se nešto // ne desi, nema potrebe za ponovnim štampanjem menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Odabrano:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }}}

Kolo je dostupno na web lokaciji Tinkercad. Ugradio sam kolo ispod da biste i vi vidjeli!

Kao i uvijek, ako imate pitanja ili problema, obavijestite me!

Preporučuje se: