Menyu katika Arduino, na Jinsi ya Kutumia Vifungo: Hatua 10 (na Picha)
Menyu katika Arduino, na Jinsi ya Kutumia Vifungo: Hatua 10 (na Picha)
Anonim
Menyu katika Arduino, na jinsi ya kutumia vifungo
Menyu katika Arduino, na jinsi ya kutumia vifungo

Katika mafunzo yangu ya Arduino 101, utafundishwa jinsi ya kuweka mazingira yako katika Tinkercad. Ninatumia Tinkercad kwa sababu ni jukwaa nzuri la mkondoni ambalo linaniruhusu kuonyesha ustadi anuwai kwa wanafunzi kwa kujenga mizunguko. Jisikie huru kujenga mafunzo yangu yote kwa kutumia Arduino IDE na Arduino halisi!

Katika mafunzo haya, tutajifunza juu ya vifungo! Tunahitaji kujua:

  • Jinsi ya kuzifunga
  • Kusoma thamani yao
  • Mjadala, na kwa nini ni muhimu
  • Maombi ya vitendo (kuunda menyu)

Watu wengi wanafikiria jambo la vitendo zaidi kufanya na kitufe ni kuwasha na kuwasha taa. Tutakuwa, sio hapa! Tutatumia yetu kuunda menyu na kuweka chaguzi kadhaa kwenye Arduino.

Uko tayari? Tuanze!

Hatua ya 1: Sanidi Bodi

Sanidi Bodi
Sanidi Bodi
Sanidi Bodi
Sanidi Bodi

Hatua ya kwanza ni kuweka Arduino na Breadboard ndogo kwenye eneo la prototyping. Angalia picha hapo juu ili uone jinsi ya kufunga waya za umeme.

Breadboard Mini ina reli mbili za nguvu juu na chini. Sisi waya hizi hadi Arduino ili tuweze kutoa nguvu kwa vifaa zaidi. Baadaye katika mafunzo haya tutatumia vifungo 3 kwa hivyo tutahitaji nguvu zaidi. Jambo la kumbuka ni kwamba kwenye ubao mdogo wa mkate, reli za umeme hutembea kwa bodi, usawa. Hii ni tofauti na nguzo katika eneo kuu la prototyping katikati; hizi hukimbia wima. Unaweza kutumia pini yoyote ya nguvu kutoa nguvu kwa safu yoyote katika eneo kuu katikati.

Unapoongeza nguvu, tumia waya mweusi na nyekundu kwa hasi na chanya mtawaliwa. Ongeza waya mwishoni ambayo hutumia nguvu kwa upande mwingine wa bodi. Hatutatumia upande huo, lakini ni mazoezi mazuri.

Hatua ya 2: Ongeza Kitufe na Kizuizi

Ongeza Kitufe na Kinga
Ongeza Kitufe na Kinga
Ongeza Kitufe na Kinga
Ongeza Kitufe na Kinga
Ongeza Kitufe na Kinga
Ongeza Kitufe na Kinga

Ongeza kitufe kidogo cha kusukuma kutoka kwenye tray ya vifaa. Inapaswa kuonekana kama ile iliyo kwenye picha. Hakikisha sio kubadili! Ongeza kontena, pia. Bonyeza, na uweke thamani yake kwa 10kΩ. Hiyo ni ya kutosha kuvuta pini chini wakati haijaunganishwa, ambayo ni muhimu sana baadaye kwenye nambari.

Weka sehemu katikati ya ubao wa mkate. Njia ambayo kifungo hufanya kazi ni:

  • Kona hadi kona, kitufe hakijaunganishwa. Kusukuma kitufe hufunga mawasiliano na inaunganisha pembe.
  • Pande za kifungo zimeunganishwa. Ikiwa ungeunganisha waya juu kushoto na chini kushoto, mzunguko ungefungwa.

Hii ndio sababu tunaweka sehemu katikati. Inahakikisha pembe hazijaunganishwa chini ya pini kwenye ubao.

Hatua inayofuata hutoa picha kadhaa zinazoonyesha vidokezo hivi.

Weka kontena kutoka pini ya kulia chini kwenye nguzo, kwa hivyo inakaa usawa.

Hatua ya 3: Uunganisho wa vifungo

Uunganisho wa vifungo
Uunganisho wa vifungo
Uunganisho wa vifungo
Uunganisho wa vifungo

Picha zilizo hapo juu zinafanya iwe wazi kabisa jinsi vifungo vikiungana. Ilikuwa wakati wote mkanganyiko wakati unafikiria kitu ni nzuri na haifanyi kazi!

Sasa, wacha tuongeze waya.

  • Weka risasi nyekundu kutoka kwa pini nzuri ya nguvu hadi kwenye safu sawa na pini ya kulia chini kwenye kitufe
  • Weka risasi nyeusi kutoka kwa pini ya nguvu hasi hadi kwenye safu sawa na kontena.
  • Weka waya wenye rangi (sio nyekundu / nyeusi) kutoka pini ya juu kushoto hadi Dijiti ya 2 kwenye Arduino

Angalia picha zilizo hapo juu ili kuhakikisha kuwa wiring yako ni sahihi.

Hatua ya 4: Kanuni…

Kanuni…
Kanuni…
Kanuni…
Kanuni…

Wacha tuangalie nambari hiyo kwa kitufe cha msingi.

Fungua kihariri cha msimbo na ubadilishe kutoka Vitalu hadi Nakala. Futa onyo linalokuja. Tunafurahi na maandishi!

Unajua usanidi wa kimsingi, kwa hivyo hebu fafanua kitufe na usome msingi. Tutachapisha pato kwa Serial.

Ninaweka maoni machache ya ziada kwenye nambari hapa chini kwa hivyo ni rahisi kusoma kuliko picha.

// Fafanua msimamo

#fafanua kitufe cha 2 kuweka mipangilio () {pinMode (kifungo, INPUT); Serial. Kuanza (9600); } kitanzi batili () {// Soma pini ya dijiti ili uangalie hali ya kitufe cha int pressed = digitalRead (kifungo); // Kitufe kinarudi JUU ikiwa imeshinikizwa, LOW ikiwa sio ikiwa (taabu == JUU) {Serial.println ("Imesisitizwa!"); }}

Ok, vizuri hiyo inafanya kazi!

Kwa kweli, tunachofanya ni kuangalia hali ya pini ya dijiti kila wakati vitanzi vya nambari. Ukibonyeza Anza Masimulizi na bonyeza kitufe, utaona Serial Monitor (bonyeza kitufe chini ya nambari) kuonyesha "Imesisitizwa!" mara kwa mara.

Kipengele kimoja utaona katika nambari hapo juu ni if () hali ya tathmini inayofanyika. Nambari yote inayofanya ni kuuliza swali na kutathmini ikiwa ni kweli, katika kesi hii. Tunatumia sawa (ishara mbili sawa, kama hii: ==) kuangalia ikiwa thamani ya ubadilishaji ni sawa na thamani fulani. DigitalRead () inarudi ikiwa ya juu au ya chini.

Kutumia if () vinginevyo ikiwa / vinginevyo tunaweza kuangalia hali nyingi au hali zote, na ikiwa utarudi kwenye Misingi ya Arduino, utaona ulinganisho unaoweza kufanya.

Sasa… Msimbo wetu unaweza kuonekana umekamilika… Lakini tuna shida.

Tazama, hiyo inafanya kazi vizuri wakati uko kwenye simulator. Lakini umeme halisi una kelele, haswa umeme wa DC. Kwa hivyo kitufe chetu kinaweza kurudisha usomaji wa uwongo wakati mwingine. Na hilo ni shida, kwa sababu mradi wako hauwezi kujibu njia inayofaa kwa mtumiaji.

Wacha tuirekebishe!

Hatua ya 5: Mjadala mdogo

Mjadala mdogo
Mjadala mdogo

Tunatumia utaratibu unaoitwa kujiondoa ili kushinda shida yetu ya kitufe. Kwa kweli hii inasubiri muda maalum kati ya wakati kifungo kilisukumwa na kwa kweli kujibu kushinikiza. Bado hujisikia asili kwa mtumiaji (isipokuwa ukifanya muda kuwa mrefu sana). Unaweza pia kutumia kwa kuangalia urefu wa vyombo vya habari, kwa hivyo unaweza kujibu tofauti kila wakati. Huna haja ya kubadilisha wiring yoyote!

Wacha tuangalie nambari:

#fafanua kitufe 2 # fafanua kujiondoaTimeout 100

Mabadiliko ya kwanza ni kwenye wigo wa ulimwengu. Utakumbuka hapo ndipo tunapofafanua vigeuzi kazi zetu nyingi zinaweza kutumia au zile ambazo haziwezi kuweka upya kila wakati moto wa kitanzi. Kwa hivyo, tumeongeza debounceTimeout kwa vifungu vilivyoainishwa. Tulifanya hii 100 (ambayo baadaye itatafsiriwa hadi 100ms), lakini inaweza kuwa fupi. Kwa muda mrefu zaidi na itahisi isiyo ya kawaida.

kwa muda mrefu int lastDebounceTime;

Tofauti hii imetangazwa chini ya viti vyote. Hii ni aina ndefu ya int, ambayo kimsingi inatuwezesha kuhifadhi nambari ndefu kwenye kumbukumbu. Tuliiita mwishoDebounceTime.

Hatuna haja ya kubadilisha chochote katika kazi tupu ya kuanzisha (). Wacha tuiache hiyo.

kitanzi batili () {// Soma pini ya dijiti ili uangalie hali ya kitufe ndani ya taabu = dijitiSoma (kitufe); muda mrefu int currentTime = millis (); Nambari ya Kitufe}

Mabadiliko ya kwanza tunayofanya katika kitanzi () kazi iko chini ya simu ya kusoma kitufe. Tunahitaji kuweka wimbo wa wakati wa sasa. Kazi ya millis () inarudisha saa ya sasa ya saa tangu Arduino ilipopiga risasi kwenye milliseconds. Tunahitaji kuhifadhi hii kwa anuwai ya aina ndefu ya int.

Sasa, tunahitaji kuhakikisha kuwa tunatambua wakati tangu kitufe kilibonye, kwa hivyo tunaweka tena kipima wakati kisichobanwa. Angalia:

kitanzi batili () {// Soma pini ya dijiti ili uangalie hali ya kitufe kilichoshinikizwa = dijitiSoma (kitufe); muda mrefu wa sasa wa sasa = milimita (); ikiwa (imebanwa == LOW) {// Rudisha wakati wa kuhesabu wakati kitufe hakijashinikizwa lastDebounceTime = currentTime; } // Msimbo wa Kitufe}

Algorithm ikiwa (imebanwa == LOW) inakagua ikiwa kitufe hakijashinikizwa. Ikiwa sivyo, basi nambari huhifadhi wakati wa sasa tangu kujiondoa mwisho. Kwa njia hiyo, kila wakati kitufe kinabanwa, tuna wakati kwa wakati ambao tunaweza kuangalia wakati kifungo kilibanwa. Tunaweza kisha kufanya hesabu ya haraka ya hesabu ili kuona kitufe kilibanwa kwa muda gani, na kujibu kwa usahihi. Wacha tuangalie nambari iliyobaki:

kitanzi batili () {// Soma pini ya dijiti ili uangalie hali ya kitufe kilichoshinikizwa = dijitiSoma (kitufe); muda mrefu wa sasa wa sasa = milimita (); ikiwa (imebanwa == LOW) {// Rudisha wakati wa kuhesabu wakati kitufe hakijashinikizwa lastDebounceTime = currentTime; } // Kitufe kimesisitizwa kwa muda uliopewa ikiwa (((currentTime - lastDebounceTime)> debounceTimeout)) {// Ikiwa muda umefikia, kifungo kibonye! Serial.println ("Amesisitizwa!"); }}

Kizuizi cha mwisho cha nambari huchukua wakati wa sasa, huondoa wakati wa mwisho wa kujiondoa na kuilinganisha na muda uliowekwa. Ikiwa ni kubwa zaidi, nambari hiyo inadhani kitufe kimesisitizwa kwa wakati huo na hujibu. Nadhifu!

Endesha nambari yako na uangalie inafanya kazi. Ikiwa una makosa, angalia nambari yako!

Sasa, wacha tuangalie mfano wa vitendo.

Hatua ya 6: Utengenezaji wa Menyu

Utengenezaji wa Menyu
Utengenezaji wa Menyu

Vifungo vinavutia, kwa sababu kuna uwezekano mwingi nao! Katika mfano huu, tutafanya menyu. Wacha tuseme umeunda kifaa hiki kizuri sana, na unahitaji watumiaji kuweza kubadilisha chaguzi kuwasha au kuzima vitu fulani, au kuweka thamani fulani ya mpangilio. Ubunifu huu wa vitufe unaweza kufanya hivyo!

Kwa hivyo, kwa mradi huu tunahitaji:

  • Vifungo vitatu
  • Vipimo vitatu vilivyowekwa hadi 10kΩ

Tayari tuna moja ya haya, tunahitaji tu zingine mbili. Kwa hivyo ongeza hizo kwenye bodi. Wiring up ni ngumu zaidi, lakini kwa sababu tu nilitaka kuiweka sawa. Unaweza kufuata muundo sawa kwa kitufe cha kwanza, au kufuata picha hapo juu.

Vifungo vitatu ni menyu wazi / chaguo inayofuata, chaguo la mabadiliko (kama ilivyo, badilisha mipangilio), na kitufe cha menyu ya kuokoa / kufunga.

Funga waya, wacha tuangalie nambari!

Hatua ya 7: Kuvunjika kwa Msimbo - Ulimwenguni

Ok, hii itakuwa hatua ndefu, lakini nitaenda kupitia kila sehemu ya nambari.

Kwanza, wacha tuangalie anuwai ya ulimwengu inayohitajika.

// Fafanua vifupisho # fafanua menyuBofya 2 #fafanua menyu Chagua 3 # fafanua menyu Hifadhi Okoa 4 #fafanua kujiondoaTimeout 50 // Fafanua anuwai kwenye menyuButtonPreviousState = LOW; orodha ya intSelectPreviousState = LOW; orodha ya ndaniSavePreviousState = LOW; muda mrefu int lastDebounceTime; // Chaguzi za menyu char * menyuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; menyu ya bool = uwongo; menyu ya boolNeedsPrint = false; Chaguo la intIlichaguliwa = 0;

Vitalu hivi vitatu ni sawa na kile tumeona hapo awali. Katika ya kwanza, nimeelezea vifungo vitatu na muda wa kumaliza. Kwa sehemu hii ya mradi, nimeiweka kwa 50ms kwa hivyo inachukua vyombo vya habari vya makusudi kuifanya ifanye kazi.

Kizuizi cha pili ni vigeuzi vyote. Tunahitaji kufuatilia kitufe chaPreviousState, na tunahitaji kuweka wimbo wa LastDebounceTime. Hizi ni aina zote za aina ya int, lakini ya mwisho ni aina ndefu kwa sababu nadhani tunahitaji nafasi kwenye kumbukumbu.

Menyu ya kuzuia chaguo ina huduma mpya. Kwanza, char * (ndio, hiyo ni kinyota cha makusudi), ambayo ni tabia / kamba inayobadilika. Ni pointer kwa kuhifadhi tuli katika kumbukumbu. Huwezi kuibadilisha (kama unaweza katika Python, kwa mfano). Mstari huu wa char * menuOptions huunda safu ya fasihi ya kamba. Unaweza kuongeza vitu vingi vya menyu kama unavyopenda.

Kipengele cha bool Kuweka tofauti ni safu tu ya maadili ambayo inawakilisha kila kitu cha menyu. Ndio, unaweza kuhifadhi chochote unachopenda, badilisha tu aina ya kutofautisha (zote zinapaswa kuwa aina moja). Sasa, kunaweza kuwa na njia bora za kudhibiti hii, kama kamusi au vibaraka, lakini hii ni rahisi kwa programu hii. Labda ningeunda moja ya mwisho katika programu iliyotumika.

Nimefuatilia orodha ya Menyu, kwa hivyo ikiwa ningetaka vitu vingine kwenye onyesho langu ningeweza kufanya hivyo. Pia, ikiwa ningekuwa na mantiki ya sensa ningeweza kusitisha wakati wa operesheni ya menyu, ikiwa tu kuna kitu kitatokea migogoro. Nina menyuNeedsPrint inayobadilika kwa sababu nataka kuchapisha menyu kwa wakati maalum, sio wakati wote tu. Mwishowe, nina chaguo la Chaguo lililochaguliwa, kwa hivyo naweza kufuatilia chaguo lililochaguliwa ninapoipata katika maeneo kadhaa.

Wacha tuangalie seti inayofuata ya kazi.

Hatua ya 8: Kuvunjika kwa Msimbo - Usanidi na Kazi za Mila

Kazi ya kuanzisha () ni rahisi kutosha, maazimio matatu tu ya kuingiza:

kuanzisha batili () {pinMode (menuSelect, INPUT); pinMode (menyu Hifadhi, INPUT); pinMode (menyu Chagua, INPUT); Serial. Kuanza (9600); }

Ifuatayo ni kazi tatu za kitamaduni. Wacha tuangalie mbili za kwanza, halafu ya mwisho kando.

Tunahitaji kazi mbili ambazo zinarudisha habari. Sababu ni kwamba, tunataka kuhakikisha kuwa hii ni aina ya usomaji wa kibinadamu. Itasaidia pia utatuaji wa nambari ikiwa tuna shida. Nambari:

// Kazi kurudisha chaguo cha sasa kilichochaguliwa * ReturnOptionSelected () {char * menuOption = menuOptions [optionSelected]; // Chaguo cha Kurudisha Chaguzi za kurudi zilizochaguliwa Chaguo; } // Kazi ya kurudisha hali ya chaguo iliyochaguliwa sasa ya char * ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char * chaguoSettingVal; ikiwa (optionSetting == false) {optionSettingVal = "Uongo"; } mwingine {optionSettingVal = "Kweli"; } // Chaguo cha kurudisha Kuweka chaguo la kurudiSettingVal; }

Kazi ya char * ReturnOptionSelected () huangalia chaguo iliyochaguliwa (ikiwa utaona hapo juu, tunaweka anuwai ili kufuatilia hiyo), na kuvuta kamba halisi kutoka kwa safu tuliyoiunda hapo awali. Halafu inarudisha kama aina ya char. Tunajua hii kwa sababu kazi inaonyesha aina ya kurudi.

Kazi ya pili, char * ReturnOptionStatus () inasoma hali ya chaguo iliyohifadhiwa katika safu na inarudisha kamba halisi ambayo inawakilisha thamani. Kwa mfano, ikiwa mpangilio ambao tumehifadhi ni wa uwongo, ningerejea "Uwongo". Hii ni kwa sababu tunaonyesha mtumiaji tofauti hii na ni bora kuweka mantiki hii yote pamoja. Ningeweza kuifanya baadaye, lakini inafanya busara kuifanya hapa.

// Kazi ya kubadilisha chaguo la sasa bool ToggleOptionSelected () {featureSetting [optionSelected] =! KipengeleSetting [optionSelected]; kurudi kweli; }

Bool ya kazi ToggleOptionSelected () ni kazi ya urahisi kubadilisha thamani ya mipangilio tuliyochagua kwenye menyu. Inapindua tu thamani. Ikiwa ungekuwa na chaguzi ngumu zaidi, hii inaweza kuwa tofauti kabisa. Ninarudi kweli katika kazi hii, kwa sababu kupigiwa simu tena (simu baadaye katika nambari inayowasha kazi hii) inatarajia jibu la kweli / la uwongo. Nina hakika kwa 100% hii itafanya kazi, kwa hivyo sikuihesabu kuwa haifanyi kazi, lakini ningefanya kwenye programu iliyopelekwa (ikiwa tu).

Hatua ya 9: Kitanzi…

Kitanzi () kazi ni ndefu sana, kwa hivyo tutaifanya kwa sehemu. Unaweza kudhani kila kitu chini ya viota ndani ya kazi hii:

kitanzi batili () {

// Fanya kazi hapa <-----}

Sawa, tuliona vitu hivi hapo awali:

// Soma vifungo kwenye menyuButtonPressed = digitalRead (menuButton); orodha ya intSelectPressed = DigitalRead (menyuSelect); orodha ya ndaniSavePressed = kusoma kwa dijiti (menyuSave); // Pata muda wa sasa kwa muda wa sasa wa sasa = mamilioni (); ikiwa (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Rudisha muda wa kuhesabu wakati kitufe hakijabanwa lastDebounceTime = currentTime; menyuButtonPreviousState = CHINI; menyuSelectPreviousState = CHINI; menyuSavePreviousState = CHINI; }

Nilipaswa kufanya hapa ni kuongeza kwenye simu tatu za dijitiRead (), na hakikisha nilihesabu ukweli kwamba ikiwa vifungo vyote vilikuwa chini, tunapaswa kuweka upya kipima saa (lastDebounceTime = currentTime) na kuweka majimbo yote ya awali kuwa ya chini. Pia ninahifadhi millis () kwa sasaTime.

Sehemu inayofuata ina viota ndani ya mstari

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

// Fanya kazi hapa <----}

Kuna sehemu tatu. Ndio, ningeweza kuwahamisha katika kazi zao wenyewe, lakini kwa unyenyekevu niliweka algorithms tatu kuu za kifungo hapa.

ikiwa ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Mruhusu mtumiaji ajue Serial.println ("Menyu inafanya kazi"); } vingine ikiwa (menuMode == kweli && optionSelected = 1) {// Rudisha chaguo chaguo ChaguliwaSelected = 0; } // Chapa menyu ya menyuNeedsPrint = true; // Kubonyeza kitufe kilichopita. hali ya kuonyesha tu menyu // ikiwa kitufe kinatolewa na kubonyeza tena menyuButtonPreviousState = menuButtonPressed; // Ingekuwa juu}

Hili la kwanza hushughulikia wakati menyuButtonPressed iko juu, au wakati kitufe cha menyu kinabanwa. Inakagua pia kuhakikisha kuwa hali ya awali ilikuwa chini, ili kitufe kilipaswa kutolewa kabla ya kushinikizwa tena, ambayo inazuia programu hiyo kurusha mara kwa mara tukio moja mara kwa mara.

Halafu inakagua ikiwa menyu haifanyi kazi, inaiamilisha. Itachapisha chaguo la kwanza lililochaguliwa (ambayo ni kitu cha kwanza kwenye orodha ya Chaguo za menyu kwa chaguo-msingi. Ukibonyeza kitufe wakati wa pili au wa tatu (nk), utapata chaguo linalofuata kwenye orodha. Kitu ambacho ningeweza kurekebisha ni kwamba inapofika mwisho, inarudi mwanzoni. Hii inaweza kusoma urefu wa safu na kufanya baiskeli kurudi rahisi ikiwa ulibadilisha idadi ya chaguzi, lakini hii ilikuwa rahisi kwa sasa.

Sehemu ndogo ya mwisho (// Inachapisha menyu) ni wazi inachapisha menyu, lakini pia inaweka hali iliyotangulia kuwa JUU ili kazi ile ile isiingie (tazama maandishi yangu hapo juu juu ya kuangalia ikiwa kitufe hapo awali kilikuwa CHINI).

// menuSelect imesisitizwa, toa logicif ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Change the selected chaguo // Kwa sasa, hii ni kweli tu / uwongo // lakini inaweza kuwa kitu chochote cha kubadilisha bool = ToggleOptionSelected (); ikiwa (toggle) {menuNeedsPrint = true; } mwingine {Serial.println ("Kuna kitu kilienda vibaya. Tafadhali jaribu tena"); }} // Badilisha hali ya kugeuza tu ikiwa imetolewa na kubonyeza tena menyuSelectPreviousState = menuSelectPressed; }

Kidogo cha nambari hii inashughulikia kitufe cha menyu Chagua Chagua kwa njia ile ile, isipokuwa wakati huu tunachoma kazi ya ToggleOptionSelected (). Kama nilivyosema hapo awali, unaweza kubadilisha kazi hii kwa hivyo inafanya zaidi, lakini ndio tu ninahitaji kufanya.

Jambo kuu kukumbuka ni ubadilishaji wa kubadilisha, ambao unafuatilia mafanikio ya kupiga tena na kuchapisha menyu ikiwa ni kweli. Ikiwa hairudishi chochote au uwongo, itachapisha ujumbe wa kosa. Hapa ndipo unaweza kutumia kurudi kwako tena kufanya mambo mengine.

ikiwa ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Toka kwenye menyu // Hapa unaweza kufanya utaftaji wowote // au uhifadhi kwenye menyu ya EEPROMMode = uwongo; Serial.println ("Menyu imetoka"); // Badilisha hali kwa hivyo menyu hutoka tu mara moja menyuSavePreviousState = menyuSavePressed; }}

Kazi hii inashughulikia kitufe cha menyu Hifadhi, ambayo hutoka tu kwenye menyu. Hapa ndipo unaweza kughairi au uhifadhi chaguo, labda fanya usafishaji au uhifadhi kwenye EEPROM. Ninachapisha tu "Menyu imetoka" na kuweka hali ya kitufe kwa HIGH ili isiingie.

ikiwa (menuMode && menuNeedsPrint) {// Tumechapisha menyu, kwa hivyo isipokuwa kitu // kitatokea, hakuna haja ya kuchapisha tena menyuNeedsPrint = false; char * optionActive = ReturnOptionSelected (); char * optionStatus = ReturnOptionStatus (); Serial.print ("Imechaguliwa:"); Serial.print (chaguoActive); Serial.print (":"); Serial.print (chaguoStatus); Serial.println (); }

Hii ni menyu ya Printa ya menyu, ambayo huwaka tu wakati menyu inafanya kazi na wakati menyu ya NeedsPrint imewekwa kuwa kweli.

Kwa kweli hii inaweza kuhamishiwa kwa kazi yake mwenyewe, lakini kwa sababu ya unyenyekevu..!

Kweli, ndio hivyo! Angalia hatua inayofuata kwa kizuizi chote cha nambari.

Hatua ya 10: Zuia Nambari ya Mwisho

// Fafanua msimamo

#fafanua menyuButton 2 #fafanua menyuChagua 3 #fafanua menyuSave 4 #fafanua debounceTimeout 50 int menuButtonPreviousState = LOW; orodha ya intSelectPreviousState = LOW; orodha ya ndaniSavePreviousState = LOW; // Fafanua vigeuzi kwa muda mrefu int lastDebounceTime; bool lightSensor = kweli; bool tempSensor = kweli; // Chaguzi za menyu char * menyuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {false, false}; menyu ya bool = uwongo; menyu ya boolNeedsPrint = false; Chaguo la intIlichaguliwa = 0; // Kazi ya kuanzisha

kuanzisha batili () {pinMode (menuSelect, INPUT); pinMode (menyu Hifadhi, INPUT); pinMode (menyu Chagua, INPUT); Serial. Kuanza (9600); }

// Kazi ya kurudisha chaguo iliyochaguliwa sasa ya char * ReturnOptionSelected () {char * menuOption = menuOptions [optionSelected]; // Chaguo cha Kurudisha Chaguzi za kurudi zilizochaguliwa Chaguo; } // Kazi ya kurudisha hali ya chaguo iliyochaguliwa sasa ya char * ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char * chaguoSettingVal; ikiwa (optionSetting == false) {optionSettingVal = "Uongo"; } mwingine {optionSettingVal = "Kweli"; } // Chaguo cha kurudisha Kuweka chaguo la kurudiSettingVal; } // Kazi ya kugeuza bool ya chaguo la sasa ToggleOptionSelected () {featureSetting [optionSelected] =! KipengeleSetting [optionSelected]; kurudi kweli; } // Kitanzi kuu

kitanzi batili () {// Soma vitufe ndani ya menyuButtonPressed = DigitalRead (menuButton); orodha ya intSelectPressed = DigitalRead (menyuSelect); orodha ya ndaniSavePressed = kusoma kwa dijiti (menyuSave); // Pata muda wa sasa kwa muda wa sasa wa sasa = mamilioni (); ikiwa (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// Rudisha muda wa kuhesabu wakati kitufe hakijabanwa lastDebounceTime = currentTime; menyuButtonPreviousState = CHINI; menyuSelectPreviousState = CHINI; menyuSavePreviousState = CHINI; } ikiwa (((currentTime - lastDebounceTime)> debounceTimeout)) {// Ikiwa muda umefikia, kifungo kibonye!

// menuButton imesisitizwa, toa mantiki

// Moto tu wakati kitufe kimetolewa hapo awali ikiwa ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Mruhusu mtumiaji ajue Serial.println ("Menyu inafanya kazi"); } vingine ikiwa (menuMode == kweli && optionSelected = 1) {// Rudisha chaguo chaguo ChaguliwaSelected = 0; } // Chapa menyu ya menyuNeedsPrint = true; // Kubonyeza kitufe kilichopita. hali ya kuonyesha tu menyu // ikiwa kitufe kinatolewa na kubonyeza tena menyuButtonPreviousState = menuButtonPressed; // Itakuwa HIGH} // menyu Chagua imeshinikizwa, toa mantiki ikiwa ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Change the selected chaguo // Kwa sasa, hii ni kweli tu / uwongo // lakini inaweza kuwa chochote bool toggle = ToggleOptionSelected (); ikiwa (toggle) {menuNeedsPrint = true; } mwingine {Serial.print ("Kuna kitu kilienda vibaya. Tafadhali jaribu tena"); }} // Badilisha hali ya kugeuza tu ikiwa imetolewa na kubonyeza tena menyuSelectPreviousState = menuSelectPressed; } ikiwa ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Toka kwenye menyu // Hapa unaweza kufanya utaftaji wowote // au uhifadhi kwenye menyu ya EEPROMMode = uwongo; Serial.println ("Menyu imetoka"); // Badilisha hali kwa hivyo menyu hutoka tu mara moja menyuSavePreviousState = menyuSavePressed; }} // Chapa chaguo la menyu ya sasa inayotumika, lakini ichapishe mara moja ikiwa (menuMode && menuNeedsPrint) {// Tumechapisha menyu, kwa hivyo isipokuwa kitu // kitatokea, hakuna haja ya kuchapisha tena menyuNeedsPrint = uwongo; char * optionActive = ReturnOptionSelected (); char * optionStatus = ReturnOptionStatus (); Serial.print ("Imechaguliwa:"); Serial.print (chaguoActive); Serial.print (":"); Serial.print (chaguoStatus); Serial.println (); }}}

Mzunguko unapatikana kwenye wavuti ya Tinkercad. Nimeingiza mzunguko hapa chini ili uone, pia!

Kama kawaida, ikiwa una maswali au maswala, tafadhali nijulishe!

Ilipendekeza: