Мазмұны:

Arduino мәзірі және түймелерді пайдалану әдісі: 10 қадам (суреттермен)
Arduino мәзірі және түймелерді пайдалану әдісі: 10 қадам (суреттермен)
Anonim
Arduino мәзірі және түймелерді пайдалану әдісі
Arduino мәзірі және түймелерді пайдалану әдісі

Менің Arduino 101 оқулығымда сізге Tinkercad -те қоршаған ортаны қалай орнату керектігін үйретеді. Мен Tinkercad -ты қолданамын, себебі бұл студенттерге схемаларды құру дағдыларын көрсетуге мүмкіндік беретін өте қуатты онлайн -платформа. Менің барлық оқулықтарымды Arduino IDE мен нағыз Arduino көмегімен құруға болады!

Бұл оқулықта біз түймелер туралы білетін боламыз! Біз білуіміз керек:

  • Оларды қалай қосуға болады
  • Олардың құндылығын оқу
  • Шығыңыз, және бұл неге маңызды
  • Практикалық қосымша (мәзір құру)

Көптеген адамдар түймені қолданудың ең тиімдісі - шамды қосу және өшіру деп ойлайды. Біз боламыз, мұнда емес! Біз мәзір жасау үшін Arduino -да кейбір опцияларды орнату үшін өзіміздікін қолданамыз.

Дайын ба? Бастайық!

1 -қадам: тақтаны орнатыңыз

Тақтаны орнатыңыз
Тақтаны орнатыңыз
Тақтаны орнатыңыз
Тақтаны орнатыңыз

Бірінші қадам - прототиптік аймаққа Arduino мен Breadboard Small орнату. Жоғарыдағы суреттерді тексеріп, электр рельстерін қалай жалғауға болатынын біліңіз.

Breadboard Mini жоғарғы және төменгі екі рельске ие. Біз оларды басқа компоненттерге қуат беру үшін Arduino -ға қосамыз. Кейінірек бұл оқулықта біз 3 түймені қолданамыз, сондықтан бізге көбірек қуат қажет болады. Айта кету керек, шағын тақтада электр рельстері көлденеңінен тақта арқылы өтеді. Бұл ортасындағы негізгі прототиптеу аймағындағы бағандардан өзгеше; бұлар тігінен жүреді. Негізгі аймақтағы кез келген бағанды қуатпен қамтамасыз ету үшін кез келген қуат түйреуіштерін пайдалануға болады.

Қуат қосқан кезде қара және қызыл сымдарды тиісінше теріс және оңға қолданыңыз. Тақтаның екінші жағына қуат беретін сымдарды қосыңыз. Біз бұл жағын қолданбаймыз, бірақ бұл жақсы тәжірибе.

2 -қадам: Түйме мен резисторды қосыңыз

Түйме мен резисторды қосыңыз
Түйме мен резисторды қосыңыз
Түйме мен резисторды қосыңыз
Түйме мен резисторды қосыңыз
Түйме мен резисторды қосыңыз
Түйме мен резисторды қосыңыз

Компоненттер науасынан кішкене батырманы қосыңыз. Ол суреттегідей болуы керек. Бұл қосқыш емес екеніне көз жеткізіңіз! Резисторды да қосыңыз. Оны нұқыңыз және оның мәнін 10 кОм -ге орнатыңыз. Бұл істікшені жалғанбаған кезде төмен түсіру үшін жеткілікті, бұл кейінірек кодта өте маңызды.

Компонентті тақтаның ортасына қойыңыз. Түйменің жұмыс әдісі:

  • Бұрышқа бұрыш, түйме қосылмаған. Түймені басу контактілерді жабады және бұрыштарды қосады.
  • Түйменің жақтары қосылады. Егер сіз сымды сол жақ жоғарғы және төменгі сол жаққа қоссаңыз, онда тізбек жабылады.

Сондықтан біз компонентті кеңістіктің ортасына қойдық. Бұл бұрыштардың тақтадағы түйреуіштердің астына қосылмағанына көз жеткізеді.

Келесі қадам осы нүктелерді көрсететін бірнеше суретті ұсынады.

Резисторды төменгі оң жақ түйреуіштен бағандарға қойыңыз, сонда ол көлденең орналасады.

3 -қадам: түйме қосылымдары

Түймешік қосылымдары
Түймешік қосылымдары
Түймешік қосылымдары
Түймешік қосылымдары

Жоғарыдағы суреттер түймелердің қалай қосылатынын анық көрсетеді. Егер сіз бірдеңе жақсы деп ойласаңыз және ол жұмыс істемесе, бұл әрқашан шатасудың нүктесі болды!

Енді сымдарды қосамыз.

  • Оң жақ түйреуіштен қызыл сымды түйменің төменгі оң жақ түйреуішімен бір бағанға қойыңыз
  • Теріс қуат түйреуішінен қара сымды резистормен бір бағанға қойыңыз.
  • Түсті сымды (қызыл/қара емес) жоғарғы сол жақ түйреуіштен Arduino -ға Digital Pin 2 -ге қойыңыз

Сымның дұрыс екеніне көз жеткізу үшін жоғарыдағы суреттерді тексеріңіз.

4 -қадам: Код…

Кодекс…
Кодекс…
Кодекс…
Кодекс…

Негізгі батырманың кодын қарастырайық.

Код редакторын ашып, Блоктардан Мәтінге ауысыңыз. Келген ескертуді өшіріңіз. Біз мәтінге қуаныштымыз!

Сіз негізгі орнатуды білесіз, сондықтан батырманы анықтап, негізгі оқуды жасайық. Біз шығуды серияға басып шығарамыз.

Мен төмендегі кодқа бірнеше қосымша түсініктемелер енгіздім, сондықтан суретке қарағанда оқу оңай.

// Тұрақтыларды анықтаңыз

#define 2 түймені жарамсыз күйге келтіру () {pinMode (түйме, INPUT); Serial.begin (9600); } void loop () {// int түймесінің күйін тексеру үшін сандық түйреуішті оқыңыз = digitalRead (түйме); // Түйме басылса, HIGH мәнін қайтарады, егер LOW болмаса, (басылған == HIGH) {Serial.println («Басылған!»); }}

Жақсы, бұл жұмыс істейді!

Шындығында, біз тек кодты айналдырған сайын цифрлық түйреуіштің күйін тексереміз. Егер сіз «Модельдеуді бастау» түймесін басып, түймені бассаңыз, сіз сериялық мониторды көресіз (кодтың астындағы түймені басыңыз) «Басылған!» Дисплейі пайда болады. бірнеше рет.

Жоғарыдағы кодта көретін бір ерекшелігі - if () жағдайын бағалау. Барлық код - бұл сұрақ қою және бұл рас екенін бағалау. Біз айнымалының мәні белгілі бір мәнге тең екендігін тексеру үшін тең (екі есе тең таңбалар, мысалы: ==) қолданамыз. DigitalRead () жоғары немесе төмен мәнді қайтарады.

If () else if / else көмегімен біз көптеген шарттарды немесе барлық шарттарды тексере аламыз, және егер сіз Arduino негіздеріне қайтып оралсаңыз, сіз жасай алатын салыстыруларды көресіз.

Енді … Біздің код толық көрінуі мүмкін … Бірақ бізде мәселе бар.

Қараңыз, бұл тренажерде болғанда өте жақсы жұмыс істейді. Бірақ нақты электр энергиясында шу бар, әсіресе тұрақты электроника. Біздің түйме кейде жалған оқуды қайтаруы мүмкін. Және бұл мәселе, себебі сіздің жобаңыз пайдаланушыға дұрыс жауап бермеуі мүмкін.

Түзетейік!

5 -қадам: Аздап шығу

Кішкене дебунг
Кішкене дебунг

Біз түйменің мәселесін шешу үшін debounce деп аталатын процедураны қолданамыз. Бұл түймені басу мен басуға нақты жауап беру арасындағы белгілі бір уақытты күтеді. Бұл пайдаланушыға әлі де табиғи болып көрінеді (егер сіз тым ұзақ уақыт жасамасаңыз). Сіз оны басу ұзақтығын тексеру үшін де пайдалана аласыз, сондықтан сіз әр уақытта әр түрлі жауап бере аласыз. Сізге сымдарды өзгертудің қажеті жоқ!

Кодты қарастырайық:

#2 түймесін анықтаңыз#debounceTimeout 100 анықтаңыз

Бірінші өзгеріс жаһандық ауқымда. Естеріңізде болар, бұл жерде біз функциялардың көпшілігінің айнымалы мәндерін анықтаймыз немесе цикл әр жаңартылған кезде қалпына келтіру мүмкін емес. Сонымен, біз анықталған тұрақтыларға debounceTimeout қостық. Біз бұл 100 -ді жасадық (ол кейін 100 мс -ке аударылады), бірақ ол қысқа болуы мүмкін. Әрі қарай және бұл табиғи емес сияқты болады.

long int lastDebounceTime;

Бұл айнымалылар тұрақтылардың астында жарияланады. Бұл ұзын int түрі, ол бізге ұзақ сандарды жадта сақтауға мүмкіндік береді. Біз оны lastDebounceTime деп атадық.

Void setup () функциясында ештеңені өзгертудің қажеті жоқ. Осыны қалдырайық.

void loop () {// int түймесінің күйін тексеру үшін сандық түйреуішті оқыңыз = digitalRead (түйме); long int currentTime = millis (); // Батырманың коды}

Цикл () функциясында біз енгізетін бірінші өзгеріс түймені оқуға шақыру астында болады. Біз қазіргі уақытты қадағалауымыз керек. Millis () функциясы Arduino миллисекундта жүктелгеннен бері сағаттың ағымдағы уақытын қайтарады. Біз мұны int типті ұзақ айнымалыда сақтауымыз керек.

Енді біз түйме басылған уақыттан хабардар екенімізге көз жеткізуіміз керек, сондықтан ол басылмаған кезде таймерді қалпына келтіреміз. Қара:

void loop () {// int түймесінің күйін тексеру үшін сандық түйреуішті оқыңыз = digitalRead (түйме); long int currentTime = millis (); if (== LOW басылды) {// түйме басылмай тұрғанда санау уақытын қалпына келтіру lastDebounceTime = currentTime; } // Батырманың коды}

If (басылған == LOW) алгоритмі түйменің басылмағанын тексереді. Егер олай болмаса, онда код соңғы шығарылған сәттен бастап ағымдағы уақытты сақтайды. Осылайша, түйме басылған сайын бізде түйменің басылғанын тексеруге болатын уақыт бар. Содан кейін біз батырманың қанша уақыт басылғанын көру үшін жылдам математикалық есептеулер жүргізіп, дұрыс жауап бере аламыз. Кодтың қалған бөлігін қарастырайық:

void loop () {// int түймесінің күйін тексеру үшін сандық түйреуішті оқыңыз = digitalRead (түйме); long int currentTime = millis (); if (== LOW басылды) {// түйме басылмай тұрғанда санау уақытын қалпына келтіру lastDebounceTime = currentTime; } // Түйме белгілі бір уақытқа басылады, егер (((currentTime - lastDebounceTime)> debounceTimeout)) {// Егер күту уақыты аяқталса, түйме басылады! Serial.println («Басылды!»); }}

Кодтың соңғы блогы ағымдағы уақытты алады, соңғы шығарылу уақытын алып тастайды және оны біз орнатқан күту уақытымен салыстырады. Егер ол үлкен болса, код түйме сол уақытта басылған деп есептейді және жауап береді. Ұқыпты!

Кодыңызды іске қосыңыз және оның жұмыс істейтінін тексеріңіз. Егер сізде қателер болса, кодты тексеріңіз!

Енді практикалық мысалды қарастырайық.

6 -қадам: мәзір жасау

Мәзір жасау
Мәзір жасау

Түймелер қызықты, өйткені олардың мүмкіндіктері өте көп! Бұл мысалда біз мәзір жасаймыз. Сіз шынымен де керемет құрылғыны жасадыңыз делік және пайдаланушыларға белгілі бір заттарды қосу немесе өшіру немесе параметрлер үшін белгілі бір мәнді орнату үшін опцияларды өзгертуге мүмкіндік қажет. Бұл үш батырмалы дизайн мұны істей алады!

Сонымен, бұл жоба үшін бізге қажет:

  • Үш түйме
  • Үш резистор 10 кОм -ге орнатылды

Бізде олардың бірі бар, қалған екеуі бізге қажет. Сондықтан оларды тақтаға қосыңыз. Қосылу сәл күрделі, бірақ мен оны шынымен жинақы ұстағым келгендіктен. Сіз бірінші түйме үшін сол үлгі бойынша жүре аласыз немесе жоғарыдағы суретті орындауға болады.

Үш түйме - бұл мәзірді ашу/келесі опциясы, өзгерту опциясы (сияқты, параметрді өзгерту) және мәзірді сақтау/жабу түймесі.

Қосыңыз, кодты қарастырайық!

7 -қадам: кодты бөлу - жаһандық

Жақсы, бұл ұзақ қадам болады, бірақ мен кодтың әр бөлімін өтемін.

Алдымен, қажет жаһандық айнымалыларды қарастырайық.

// Тұрақтыларды анықтаңыз #менюді анықтаңызТүйме 2 #менюді анықтаңыз 3 таңдаңыз #таңдаңыз мәзірді сақтаңыз 4 #анықтаңыз debounceTimeout 50 // int айнымалыларын анықтаңыз int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Мәзір опциялары char * menuOptions = {«Температураны тексеру», «Жарықты тексеру»}; bool featureSetting = {жалған, жалған}; bool menuMode = жалған; bool menuNeedsPrint = жалған; int optionSelected = 0;

Бұл үш блок бұрын көргенімізге ұқсас. Біріншісінде мен үш түймені және күту уақытын анықтадым. Жобаның осы бөлігі үшін мен оны 50 мс етіп қойдым, сондықтан оны жұмыс істеу үшін әдейі басу қажет.

Екінші блок - барлық айнымалылар. Біз buttonPreviousState түймесін қадағалауымыз керек, және біз lastDebounceTime -ді қадағалауымыз керек. Бұл int түрінің айнымалы мәндері, бірақ соңғысы - бұл ұзақ тип, себебі жадта бос орын қажет деп ойлаймын.

Мәзір опцияларының блогында бірнеше жаңа мүмкіндіктер бар. Біріншіден, char * (иә, бұл қасақана жұлдызша), ол символ/жолдың айнымалы мәні болып табылады. Бұл жадтағы статикалық қойманың көрсеткіші. Сіз оны өзгерте алмайсыз (мысалы, Python -дағыдай). Бұл char *menuOptions жолы жолдың әріптік әріптер жиынын жасайды. Сіз қалағаныңызша мәзір элементтерін қосуға болады.

Bool featureSetting айнымалысы - бұл мәзірдің әрбір элементін көрсететін мәндер жиыны. Ия, сіз өзіңізге ұнайтын нәрсені сақтай аласыз, тек айнымалы түрін өзгертіңіз (олардың барлығы бірдей болуы керек). Енді мұны басқарудың жақсы әдістері болуы мүмкін, мысалы, сөздіктер немесе кортеждер, бірақ бұл қосымша үшін бұл қарапайым. Мүмкін, мен орналастырылған бағдарламада соңғылардың бірін жасар едім.

Мен menuMode режимін қадағалап отырдым, сондықтан егер мен дисплейде басқа нәрселерді қаласам, мен мұны істей аламын. Сонымен қатар, егер менде сенсорлық логика болса, мен бірдеңе қарама -қайшы болған жағдайда, мәзір жұмысын тоқтатуым мүмкін. Менде menuNeedsPrint айнымалысы бар, себебі мен мәзірді барлық уақытта емес, белгілі бір уақытта басып шығарғым келеді. Ақырында, менде optionSelected айнымалысы бар, сондықтан мен оған бірнеше жерде қол жеткізгенде таңдалған опцияны қадағалай аламын.

Келесі функциялар жиынтығын қарастырайық.

8 -қадам: кодты бөлу - орнату және реттелетін функциялар

Setup () функциясы жеткілікті қарапайым, тек үш енгізу мәлімдемесі:

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

Келесі - үш реттелетін функция. Алғашқы екеуін, содан соңғысын бөлек қарастырайық.

Бізге кейбір ақпаратты қайтаратын екі функция қажет. Себебі, біз мұны адам оқитынына көз жеткізгіміз келеді. Егер бізде мәселе туындаса, бұл кодты жөндеуге көмектеседі. Код:

// Ағымдағы таңдалған опцияларды қайтаратын функция *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Қайтару опциясы Таңдалған қайтару мәзіріOption; } // Ағымдағы таңдалған опцияның күйін қайтаратын функция char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = «Жалған»; } else {optionSettingVal = «True»; } // Қайтару опциясынҚайтуды қайтару опциясынSettingVal; }

Char *ReturnOptionSelected () функциясы таңдалған опцияны тексереді (егер сіз жоғарыда көрсеңіз, біз оны қадағалайтын айнымалы мәнді орнатамыз) және жолдың литералын біз бұрын жасаған массивтен шығарамыз. Содан кейін оны char түрі ретінде қайтарады. Біз мұны білеміз, себебі функция қайтару түрін көрсетеді.

Екінші функция, char *ReturnOptionStatus () массивте сақталған опцияның күйін оқиды және мәнді білдіретін жолдың литералын қайтарады. Мысалы, егер біз сақтаған параметр жалған болса, мен «Жалған» дегенді қайтарар едім. Себебі біз пайдаланушыға осы айнымалы мәнді көрсетеміз және бұл логиканы бірге сақтаған дұрыс. Мен мұны кейінірек жасай аламын, бірақ мұны мұнда жасаудың мағынасы бар.

// Ағымдағы опцияларды ауыстыру функциясы ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; шындықты қайтару; }

Bool ToggleOptionSelected () функциясы - бұл мәзірде біз таңдаған параметрдің мәнін өзгертуге арналған ыңғайлы функция. Бұл жай ғана мәнді аударады. Егер сізде күрделі опциялар жиынтығы болса, бұл мүлдем басқаша болуы мүмкін. Мен бұл функцияда шындықты қайтарамын, себебі менің кері шақыруым (бұл функцияны іске қосатын кодтағы кейінірек қоңырау) шын/жалған жауапты күтеді. Мен бұл жұмыс істейтініне 100% сенімдімін, сондықтан мен оны жұмыс істемейтінін есептемедім, бірақ мен қолданылған қосымшаны қолданамын (мүмкін болған жағдайда).

9 -қадам: Цикл …

Цикл () функциясы өте ұзақ, сондықтан біз оны бөліктерде орындаймыз. Сіз бұл функцияда ұялардың астындағы барлық нәрсені болжай аласыз:

void loop () {

// Мұнда жұмыс жасаңыз <-----}

Жақсы, біз бұны бұрын көрдік:

// батырмаларды оқу int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // ағымдағы уақытты алу int intTimeTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// түймесі басылмаған кезде санау уақытын қалпына келтіру lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }

Бұл жерде үш digitalRead () қоңырауларын қосу керек болды, және егер барлық түймелер төмен болса, біз таймерді (lastDebounceTime = currentTime) қалпына келтіріп, барлық алдыңғы күйлерді төмен деңгейге қоюымыз керек екеніне сенімді болдым. Мен millis () файлын ағымдағы уақытта сақтаймын.

Келесі бөлім жолдың ішіне ұя салады

егер (((currentTime - lastDebounceTime)> debounceTimeout)) {

// Мұнда жұмыс жасаңыз <----}

Үш бөлім бар. Иә, мен оларды өз функциясына көшіре алар едім, бірақ қарапайымдылық үшін мен үш негізгі түйме алгоритмін осында сақтадым.

if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Пайдаланушыға Serial.println туралы хабарлаңыз («Мәзір белсенді»); } else if (menuMode == true && optionSelected = 1) {// Параметрлерді қалпына келтіру optionSelected = 0; } // Менюдің мәзірін басып шығарыңызNeedsPrint = true; // Алдынғы батырманы ауыстыру. күй тек мәзірді көрсетуді көрсетеді // егер түйме босатылып, қайтадан басылса menuButtonPreviousState = menuButtonPressed; // жоғары болар еді}

Бұл біріншісі menuButtonPressed HIGH жоғары болғанда немесе мәзір батырмасы басылғанда өңделеді. Ол сондай -ақ, бұрынғы күйдің LOW күйін тексереді, сондықтан түймешікті қайта басудан бұрын оны босату керек еді, бұл бағдарламаның бір оқиғаны үнемі қайталауын тоқтатады.

Содан кейін, егер мәзір белсенді болмаса, оны іске қосатынын тексереді. Ол таңдалған бірінші опцияны басып шығарады (бұл мәзір опциялары массивінің бірінші элементі болып табылады. Егер сіз түймені екінші немесе үшінші рет (т.б.) бассаңыз, тізімдегі келесі опцияны аласыз. Мен түзете алатын нәрсе - Егер ол соңына жеткенде, ол бастапқыға оралады, егер сіз параметрлер санын өзгертсеңіз, бұл массивтің ұзындығын оқи алады және велосипедпен жүруді жеңілдетеді, бірақ бұл әзірше қарапайым болды.

Соңғы кішкене бөлім (// мәзірді басып шығарады) мәзірді анық басып шығарады, бірақ ол сонымен қатар алдыңғы күйді ЖОҒАРЫ етіп қояды, сондықтан сол функция цикл болмайды (жоғарыдағы түйменің бұрын ТӨМЕН болғанын тексеру туралы менің жазбамды қараңыз).

// menuSelect басылады, логиканы қамтамасыз етіңіз ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Таңдалған опцияны өзгерту // Қазіргі уақытта бұл шын/жалған // bool toggle = ToggleOptionSelected () кез келген нәрсе болуы мүмкін; if (ауыстыру) {menuNeedsPrint = true; } else {Serial.println («Бірдеңе дұрыс болмады. Қайталап көріңіз»); }} // Күйді тек босату және қайта басу жағдайында ғана ауысу үшін ауыстырыңыз menuSelectPreviousState = menuSelectPressed; }

Бұл код биті MenuSelectPressed батырмасын дәл осылай өңдейді, тек бұл кезде ToggleOptionSelected () функциясын өшіреміз. Бұрын айтқанымдай, сіз бұл функцияны өзгерте аласыз, сондықтан ол көп нәрсені жасайды, бірақ мен мұны істеуім керек.

Ең бастысы - ауысу айнымалысы, ол кері қоңыраудың сәттілігін бақылайды және егер ол рас болса, мәзірді басып шығарады. Егер ол ештеңе қайтармаса немесе жалған болса, ол қате туралы хабарды басып шығарады. Бұл жерде сіз кері байланыс арқылы басқа әрекеттерді жасай аласыз.

if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Мәзірден шығу // Мұнда кез келген жинауды // жасауға болады немесе EEPROM menuMode = false; Serial.println («Мәзірден шығу»); // Күйді ауыстыру үшін мәзір тек menuSavePreviousState = menuSavePressed; }}

Бұл функция мәзірден шығатын menuSave батырмасын өңдейді. Бұл жерде сізде бас тарту немесе сақтау опциясы болуы мүмкін, мүмкін тазалауды немесе EEPROM -ге сақтаңыз. Мен жай ғана «Мәзірден шықтым» деп басып шығарамын және түйменің күйін ЖОҒАРЫ етіп қоямын, ол айналмайды.

if (menuMode && menuNeedsPrint) {// Біз мәзірді басып шығардық, сондықтан бірдеңе // болмаса, оны қайтадан басып шығарудың қажеті жоқ menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print («Таңдалған:»); Serial.print (optionActive); Serial.print («:»); Serial.print (optionStatus); Serial.println (); }

Бұл menuPrint алгоритмі, ол тек мәзір белсенді болғанда және menuNeedsPrint айнымалы мәні true мәніне орнатылғанда ғана іске қосылады.

Бұл міндетті түрде өз функциясына ауысуы мүмкін, бірақ қарапайымдылық үшін..!

Жақсы, осымен! Бүкіл код блогы үшін келесі қадамды қараңыз.

10 -қадам: соңғы код блогы

// Тұрақтыларды анықтаңыз

#define menuButton 2 #define menuSelect 3 #define menuSave 4 #debune deuneTimeout 50 int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // long int lastDebounceTime айнымалыларын анықтаңыз; bool lightSensor = ақиқат; bool tempSensor = ақиқат; // Мәзір опциялары char * menuOptions = {«Температураны тексеру», «Жарықты тексеру»}; bool featureSetting = {жалған, жалған}; bool menuMode = жалған; bool menuNeedsPrint = жалған; int optionSelected = 0; // Орнату функциясы

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

// Ағымдағы таңдалған параметрді қайтаратын функция char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Қайтару опциясы Таңдалған қайтару мәзіріOption; } // Ағымдағы таңдалған опцияның күйін қайтаратын функция char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = «Жалған»; } else {optionSettingVal = «True»; } // Қайтару опциясынҚайтуды қайтару опциясынSettingVal; } // Ағымдағы параметрді ауыстыру функциясы bool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; шындықты қайтару; } // Негізгі цикл

void loop () {// батырмаларын оқу int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // ағымдағы уақытты алу int intTimeTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// түймесі басылмаған кезде санау уақытын қалпына келтіру lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } if (((currentTime - lastDebounceTime)> debounceTimeout)) {// Егер күту уақыты аяқталса, түйме басылады!

// menuButton басылады, логиканы қамтамасыз етеді

// Түйме бұрын босатылған кезде ғана жанады, егер ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Пайдаланушыға Serial.println туралы хабарлаңыз («Мәзір белсенді»); } else if (menuMode == true && optionSelected = 1) {// Параметрлерді қалпына келтіру optionSelected = 0; } // Менюдің мәзірін басып шығарыңызNeedsPrint = true; // Алдынғы батырманы ауыстыру. күй тек мәзірді көрсетуді көрсетеді // егер түйме босатылып, қайтадан басылса menuButtonPreviousState = menuButtonPressed; // Жоғары болар еді} // menuSelect басылады, логиканы қамтамасыз етіңіз, егер ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Таңдалған опцияны өзгерту // Қазіргі уақытта бұл жай ғана true/false // бірақ кез келген нәрсе болуы мүмкін bool toggle = ToggleOptionSelected (); if (ауыстыру) {menuNeedsPrint = true; } else {Serial.print («Бірдеңе дұрыс болмады. Қайталап көріңіз»); }} // Күйді тек босату және қайта басу жағдайында ғана ауысу үшін ауыстырыңыз menuSelectPreviousState = menuSelectPressed; } if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Мәзірден шығу // Мұнда кез келген жинауды // жасауға болады немесе EEPROM menuMode = false; Serial.println («Мәзірден шығу»); // Күйді ауыстыру үшін мәзір тек menuSavePreviousState = menuSavePressed; }} // Ағымдағы мәзір опциясын белсенді түрде басып шығарыңыз, бірақ оны тек бір рет басып шығарыңыз, егер (menuMode && menuNeedsPrint) {// Біз мәзірді басып шығардық, сондықтан егер бірдеңе // болмаса, оны қайта басып шығарудың қажеті жоқ menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print («Таңдалған:»); Serial.print (optionActive); Serial.print («:»); Serial.print (optionStatus); Serial.println (); }}}

Схема Tinkercad сайтында қол жетімді. Мен сізге төмендегі схеманы енгіздім, оны сіз де көре аласыз!

Әдеттегідей, егер сізде сұрақтар немесе мәселелер болса, маған хабарлаңыз!

Ұсынылған: