Мазмуну:
- 1 -кадам: Башкарманы орнотуу
- 2 -кадам: Баскычты жана Резисторду кошуңуз
- 3 -кадам: Баскычтын туташуулары
- 4 -кадам: Код…
- 5 -кадам: Бир аз четтөө
- 6 -кадам: Меню түзүү
- 7 -кадам: Коддордун бөлүштүрүлүшү - Глобалдуу
- 8 -кадам: Code Breakdown - Орнотуу жана Ыңгайлаштырылган Функциялар
- 9 -кадам: Цикл…
- 10 -кадам: Акыркы коддун блогу
Video: Ардуинодогу меню жана баскычтарды кантип колдонуу керек: 10 кадам (сүрөттөр менен)
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:41
Менин Arduino 101 үйрөткүчүмдө сизге Tinkercadда айланаңызды кантип орнотууну үйрөтүшөт. Мен Tinkercad колдоном, анткени бул студенттерге микросхемаларды куруу боюнча бир катар көндүмдөрдү көрсөтүүгө мүмкүндүк берген абдан күчтүү онлайн платформа. Менин бардык окуу куралдарымды Arduino IDE жана чыныгы Arduino аркылуу курууга тартынбаңыз!
Бул окуу куралында биз баскычтар жөнүндө үйрөнөбүз! Биз билишибиз керек:
- Аларды кантип туташтыруу керек
- Алардын баасын окуу
- Дебунга чыгуу жана бул эмне үчүн маанилүү
- Практикалык колдонмо (менюну түзүү)
Көпчүлүк адамдар кнопканы басуу менен жарыкты күйгүзүү жана өчүрүү эң практикалык нерсе деп ойлошот. Биз, бул жерде эмес! Биз өзүбүздүкүн колдонуп, меню түзөбүз жана Arduinoдо айрым параметрлерди орнотобуз.
Даярсызбы? Кел, баштайлы!
1 -кадам: Башкарманы орнотуу
Биринчи кадам - Arduino жана Breadboard Small прототиптөө аймагына коюу. Электр рельстерин кантип зым менен жабуу керектигин көрүү үчүн жогорудагы сүрөттөрдү текшериңиз.
A Breadboard Mini үстү жана асты эки электр рельсине ээ. Биз муну Arduino менен байланыштырабыз, андыктан биз көбүрөөк компоненттерге энергия бере алабыз. Кийинчерээк бул окуу куралында биз 3 баскычты колдонобуз, андыктан бизге көбүрөөк күч керек болот. Белгилей кетчү нерсе, кичинекей нан тактасында, электр рельстери тактанын туурасынан өтөт. Бул ортодогу негизги прототиптөө аймагындагы мамычалардан айырмаланат; булар тигинен иштейт. Ортодогу негизги аймакта каалаган мамычаны электр менен камсыз кылуу үчүн, электр казыктарын колдонсоңуз болот.
Күч кошкондо, терс жана оң жагына кара жана кызыл зымдарды колдонуңуз. Акырында тактанын башка жагына кубат берүүчү зымдарды кошуңуз. Биз бул жагын колдонбойбуз, бирок бул жакшы практика.
2 -кадам: Баскычты жана Резисторду кошуңуз
Компоненттердин табагынан кичинекей баскычты кошуңуз. Бул сүрөттөгүдөй болушу керек. Бул которгуч эмес экенин текшериңиз! Резистор кошуңуз. Аны чыкылдатып, 10kΩ маанисин коюңуз. Бул кодду кийинчерээк абдан маанилүү болгон туташпай турганда пинди төмөн түшүрүү үчүн жетиштүү.
Бөлүктү нан тактасынын ортосуна коюңуз. Баскычтын иштөө тартиби мындай:
- Бурчка бурч, баскыч туташкан жок. Баскычты басуу контакттарды жабат жана бурчтарды бириктирет.
- Баскычтын капталдары туташкан. Эгерде сиз зымды жогорку солго жана астыңкы солго туташтырсаңыз, чынжыр жабык болмок.
Мына ошондуктан биз компоненттин ортосуна боштукту койдук. Бул бурчтар тактадагы төөнөгүчтөрдүн астына туташпаганын текшерет.
Кийинки кадам бул ойлорду чагылдырган бир -эки сүрөттү камсыз кылат.
Төмөнкү оң казыктан резисторду мамычаларга койгула, ошондо ал горизонталдуу түрдө отурат.
3 -кадам: Баскычтын туташуулары
Жогорудагы сүрөттөр кнопкалардын кантип туташканын ачык көрсөтөт. Бир нерсе жакшы деп ойлогондо, ал дайыма башаламандыкка алып келет жана ал иштебейт!
Эми зымдарды кошолу.
- Позитивдүү электр түйүнүнөн кызыл коргошун баскычтын төмөнкү оң жагындагы пинге окшош мамычага коюңуз
- Терс кубатуу түйүнүнөн кара коргошун резистор менен бирдей мамычага коюңуз.
- Түстүү зымды (кызыл/кара эмес) жогорку сол пинден Ардуиного Digital Pin 2ге коюңуз
Сиздин зымдардын туура экенине ынануу үчүн жогорудагы сүрөттөрдү текшериңиз.
4 -кадам: Код…
Келгиле, негизги баскычтын кодун карап көрөлү.
Код редакторун ачыңыз жана Блоктордон Текстке өзгөртүңүз. Келген эскертүүнү тазалаңыз. Биз текст менен бактылуубуз!
Сиз негизги орнотууну билесиз, андыктан баскычты аныктап, негизги окууну жасайбыз. Биз серияны басып чыгарабыз.
Төмөндөгү кодго бир нече кошумча комментарийлерди жаздым, андыктан сүрөттү караганда окуу оңой.
// Туруктууларды аныктоо
#define баскычы 2 жараксыз орнотуу () {pinMode (баскыч, INPUT); Serial.begin (9600); } void loop () {// int басылган баскычтын абалын текшерүү үчүн санариптик пинди окуңуз = digitalRead (баскыч); // Баскыч басылганда ЖОГОРУну кайтарат, эгер LOW болбосо, (басылган == HIGH) {Serial.println ("Басылды!"); }}
Макул, бул иштейт!
Негизи, биз жасай турган нерсе - бул код циклдар сайын цифралык пиндин абалын текшерүү. Симуляцияны баштоо баскычын бассаңыз, Serial Monitor (коддун астындагы баскычты басыңыз) "Басылган!" Дисплейин көрөсүз. кайра -кайра.
Жогорудагы коддон көрө турган бир өзгөчөлүк - if () абалын баалоо болуп жатат. Бул учурда, бул коддун баары суроо берүү жана анын чын экенин баалоо. Биз өзгөрмөнүн мааниси белгилүү бир мааниге барабар экендигин текшерүү үчүн тең (эки эсе барабар белгилерди колдонобуз: ==). DigitalRead () ЖОГОРУ же ТӨМӨН кайтарат.
If () else if / else колдонуп, биз көптөгөн шарттарды же бардык шарттарды текшере алабыз, жана эгер сиз Arduino Basicsке кайтып барсаңыз, сиз жасай ала турган салыштырууларды көрө аласыз.
Азыр … Биздин код толук көрүнүшү мүмкүн … Бирок бизде көйгөй бар.
Карачы, бул симулятордо жүргөндө абдан жакшы иштейт. Бирок чыныгы электр энергиясында ызы -чуу бар, өзгөчө DC электроникасы. Ошентип, биздин баскыч кээде жалган окууну кайтарышы мүмкүн. Жана бул көйгөй, анткени сиздин долбоор колдонуучуга туура жооп бербеши мүмкүн.
Кел, оңдойлу!
5 -кадам: Бир аз четтөө
Биз баскыч көйгөйүн чечүү үчүн debounce аттуу процедураны колдонобуз. Бул, негизинен, баскыч басылган убакка чейин жана басууга жооп берген убакыттын ортосунда күтүлөт. Бул дагы эле колдонуучуга табигыйдай сезилет (эгер сиз убакытты өтө узун кылбасаңыз). Сиз аны басуунун узундугун текшерүү үчүн колдоно аласыз, андыктан ар бир жолу башкача жооп бере аласыз. Электр өткөргүчтөрүн алмаштыруунун кажети жок!
Келгиле, кодду карап көрөлү:
#аныктоо баскычы 2#debounceTimeout аныктоо 100
Биринчи өзгөрүү дүйнөлүк масштабда. Эсиңизде болсун, бул жерде биздин функциялар колдоно турган өзгөрмөлөрдү аныктайбыз же цикл күйгөн сайын баштапкы абалга келтирүү мүмкүн эмес. Ошентип, биз аныкталган константаларга debounceTimeout коштук. Биз муну 100 кылдык (кийинчерээк 100msге которулат), бирок ал кыска болушу мүмкүн. Мындан ары жана бул табигый эмес сезилет.
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 (басылган == ТӨМӨН) {// баскычты баспай жатканда эсептөө убактысын баштапкы абалга келтирүү lastDebounceTime = currentTime; } // Баскыч белгилүү бир убакытка чейин басылган, эгерде (((currentTime - lastDebounceTime)> debounceTimeout)) {// Эгерде күтүү убактысына жетсе, баскыч басылган! Serial.println ("Басылды!"); }}
Акыркы код блогу учурдагы убакытты талап кылат, акыркы четтетүү убактысын алып салат жана аны биз койгон тыныгуу менен салыштырат. Эгерде ал чоңураак болсо, анда код ошол убакыт үчүн басылган деп ойлойт жана жооп берет. Тыкан!
Кодуңузду иштетип, анын иштээрин текшериңиз. Эгер каталарыңыз болсо, кодуңузду текшериңиз!
Эми практикалык мисалды карап көрөлү.
6 -кадам: Меню түзүү
Баскычтар кызыктуу, анткени алар менен көптөгөн мүмкүнчүлүктөр бар! Бул мисалда биз меню түзөбүз. Келгиле, бул чындап эле сонун түзмөктү жараттыңыз дейли жана колдонуучулар кээ бир нерселерди күйгүзүү же өчүрүү үчүн параметрлерди өзгөртө алышы керек же жөндөө үчүн белгилүү бир маанини коюшу керек. Бул үч баскыч дизайны муну кыла алат!
Ошентип, бул долбоор үчүн бизге керек:
- Үч баскыч
- Үч резистор 10 кОмго коюлган
Бизде булардын бири бар, калган экөөсүнө эле муктажбыз. Андыктан муну тактага кошуңуз. Кабелдик байланыш бир аз татаалыраак, бирок мен аны чынында эле компакт сактоону каалагандыктан. Сиз биринчи баскыч үчүн ошол эле үлгү боюнча жүрө аласыз, же жогорудагы сүрөттү ээрчишиңиз мүмкүн.
Үч баскыч - бул менюну ачуу/кийинки вариант, өзгөртүү опциясы (сыяктуу эле, орнотууну өзгөртүү) жана сактоо/жабуу менюсу.
Байланыш, кодду карап көрөлү!
7 -кадам: Коддордун бөлүштүрүлүшү - Глобалдуу
Макул, бул узак кадам болот, бирок мен коддун ар бир бөлүмүн карап чыгам.
Биринчиден, глобалдуу өзгөрмөлөрдү карап көрөлү.
// Константаларды аныктоо #аныктоо менюБутон 2 #менюну аныктоо 3 #тандоо менюСакта 4 #аныктоо debounceTimeout 50 // int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Меню параметрлери char * menuOptions = {"Температураны текшерүү", "Жарыкты текшерүү"}; bool featureSetting = {жалган, жалган}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0;
Бул үч блок биз көргөн нерселерге абдан окшош. Биринчисинде, мен үч баскычты жана күтүү убактысын аныктадым. Долбоордун бул бөлүгү үчүн мен аны 50 мс кылып койгом, ошондуктан аны иштетүү үчүн атайылап басуу керек.
Экинчи блок - бардык өзгөрмөлөр. Биз buttonPreviousState'ти көзөмөлдөшүбүз керек жана lastDebounceTime'ди көзөмөлдөшүбүз керек. Булардын баары int тибиндеги өзгөрмөлөр, бирок акыркысы - бул узун тип, анткени мен эстутумдагы орунга муктажбыз деп ойлойм.
Меню параметрлери блогунда бир нече жаңы мүмкүнчүлүктөр бар. Биринчиден, char * (ооба, бул атайылап коюлган жылдызча), ал символ/саптын түзмө -түз өзгөрмөсү. Бул эстутумдагы статикалык сактагычтын көрсөткүчү. Сиз аны өзгөртө албайсыз (мисалы, Python сыяктуу). Бул char *menuOptions сабы сап литералдарынын массивин түзөт. Менюга каалаган нерсеңизди кошсоңуз болот.
Bool featureSetting өзгөрмөсү - бул ар бир меню пунктун чагылдырган баалуулуктардын массиви. Ооба, сиз каалаган нерсеңизди сактай аласыз, жөн гана өзгөрмөнүн түрүн өзгөртүңүз (алардын бардыгы бирдей болушу керек). Эми муну башкаруунун жакшы жолдору болушу мүмкүн, мисалы сөздүктөр же кортеждер, бирок бул колдонмо үчүн жөнөкөй. Мен, балким, жайгаштырылган тиркемеде экинчисинин бирин түзмөкмүн.
Мен меню режимин көзөмөлдөп жүрдүм, ошондуктан мен дисплейимде башка нерселерди кааласам, муну кыла алам. Ошондой эле, эгерде менде сенсордук логика болсо, меню иштөө учурунда, эгер бир нерсе карама -каршы келсе, аны токтото алмакмын. Менде menuNeedsPrint өзгөрмөсү бар, анткени менюду дайыма эмес, белгилүү бир убакта басып чыгаргым келет. Акыр -аягы, менде optionSelected өзгөрмөсү бар, андыктан мен ага бир нече жерден киргенде тандалган вариантты көзөмөлдөй алам.
Келгиле, кийинки функциялар топтомун карап көрөлү.
8 -кадам: Code Breakdown - Орнотуу жана Ыңгайлаштырылган Функциялар
Setup () функциясы жетишерлик оңой, болгону үч киргизүү декларациясы:
void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menuSelect, INPUT); Serial.begin (9600); }
Кийинки үч ыңгайлаштырылган функциялар. Биринчи экөөнү, андан соңкусун өзүнчө карап көрөлү.
Бизге кээ бир маалыматты кайтаруучу эки функция керек. Себеби, биз муну адам окуй тургандай кылып текшергибиз келет. Ошондой эле, эгерде бизде көйгөй болсо, кодду оңдоого жардам берет. Код:
// Учурдагы тандалган вариантты кайтаруу функциясы *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Return optionSelected return menuOption; } // Учурдагы тандалган параметрдин статусун кайтаруу функциясы char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "False"; } else {optionSettingVal = "True"; } // Return optionSetting return optionSettingVal; }
Char *ReturnOptionSelected () функциясы тандалган вариантты текшерет (эгер сиз жогоруда көрсөңүз, биз муну көзөмөлдөө үчүн өзгөрмөнү койобуз) жана биз түзгөн массивден саптын тамгасын чыгарат. Андан кийин аны char түрү катары кайтарат. Биз муну билебиз, анткени функция кайтаруу түрүн көрсөтөт.
Экинчи функция, char *ReturnOptionStatus () массивде сакталган параметрдин абалын окуйт жана маанини билдирген саптын литералын кайтарат. Мисалы, биз сактаган параметр жалган болсо, мен "Жалган" деп кайтармакмын. Себеби, биз колдонуучуга бул өзгөрмөнү көрсөтөбүз жана бул логиканын бардыгын бирге кармаганыбыз жакшы. Мен муну кийинчерээк кыла алмакмын, бирок бул жерде жасоонун мааниси көбүрөөк.
// Учурдагы optionbool которуштуруу функциясы ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; чындыкка кайтуу; }
Bool функциясы ToggleOptionSelected () - менюда биз тандаган параметрдин маанисин өзгөртүү үчүн ыңгайлуу функция. Бул жөн гана маанини бурат. Эгерде сизде татаал варианттар болсо, анда бул таптакыр башкача болушу мүмкүн. Мен бул функцияда чындыкты кайтарам, анткени менин кайра чалуум (бул функцияны өчүргөн коддогу кийинчерээк чалуулар) чыныгы/жалган жоопту күтөт. Мен бул иштээрине 100% ишенем, ошондуктан мен анын иштебегенин эсепке алган жокмун, бирок мен колдонулган колдонмодо болмокмун (эгер болгон учурда).
9 -кадам: Цикл…
Loop () функциясы өтө узун, ошондуктан биз аны бөлүктөргө бөлүп жасайбыз. Бул функциядагы уялардын астындагы бардык нерселерди кабыл алсаңыз болот:
void loop () {
// Бул жерде иште <-----}
Макул, биз бул нерсени мурун көргөнбүз:
// баскычтарын оку int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Учурдагы убакытты алуу int int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// баскыч басылбай калганда эсептөө убактысын баштапкы абалга келтирүү lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }
Бул жерде мен үч digitalRead () чалуусуна кошуум керек болчу, эгерде бардык баскычтар төмөн болсо, биз таймерди (lastDebounceTime = currentTime) баштапкы абалга келтирип, мурунку абалдын бардыгын төмөндөтүшүбүз керек экенине ынандым. Мен ошондой эле millis () дүкөнүн currentTimeде сактайм.
Кийинки бөлүм сызыктын ичине уя салат
эгер (((currentTime - lastDebounceTime)> debounceTimeout)) {
// Бул жерде иште <----}
Үч бөлүм бар. Ооба, мен аларды өз функцияларына которсо болмок, бирок жөнөкөйлүк үчүн бул жерде үч негизги баскыч алгоритмин сактап койгом.
if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Колдонуучуга Serial.println билдириңиз ("Меню активдүү"); } else if (menuMode == true && optionSelected = 1) {// Параметрлерди баштапкы абалга келтирүү optionSelected = 0; } // Менюну басып чыгарыңыз menuNeedsPrint = true; // Алдын ала баскычын которгула. менюду көрсөтүү үчүн гана мамлекет // // Жогорку болмок}
Бул биринчиси menuButtonPressed ЖОК болгондо же меню баскычы басылганда иштейт. Ал ошондой эле мурунку абалдын ТӨМӨН экенине ынануу үчүн текшерет, ошондуктан баскыч кайра басылганга чейин бошотулушу керек болчу, бул программаны дайыма ошол эле окуяны кайра -кайра аткылоону токтотот.
Андан кийин меню активдүү болбосо, аны активдештирерин текшерет. Ал тандалган биринчи вариантты басып чыгарат (бул менюда Опциялар массивиндеги биринчи пункт. Демейки боюнча баскычты экинчи же үчүнчү жолу (ж.б.) бассаңыз, тизмеде кийинки вариант пайда болот. Мен оңдоого мүмкүн болгон нерсе Бул аягына жеткенде, ал кайра башына кайтат. Бул массивдин узундугун окуй алат жана варианттардын санын өзгөртсөңүз, велосипед тебүүнү жеңилдетет, бирок азырынча бул жөнөкөй эле.
Акыркы кичинекей бөлүм (// Менюду басып чыгарат), албетте, менюну басып чыгарат, бирок ошол эле функция мурунку абалын ЖОГОРУ кылып коёт, ошондуктан ошол эле функция айланбайт (баскычтын мурун ТӨМӨН болгонун текшерүү жөнүндө менин эскертүүнү караңыз).
// menuSelect басылып жатат, логиканы камсыздаңыз ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Тандалган вариантты өзгөртүү // Учурда, бул жөн эле чындык/жалган // бирок нерсе болушу мүмкүн bool toggle = ToggleOptionSelected (); if (switch) {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 #debuine debounceTimeout 50 int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // long int lastDebounceTime өзгөрмөлөрүн аныктаңыз; bool lightSensor = true; bool tempSensor = true; // Меню параметрлери char * menuOptions = {"Температураны текшерүү", "Жарыкты текшерүү"}; bool featureSetting = {жалган, жалган}; bool menuMode = false; bool menuNeedsPrint = false; int optionSelected = 0; // Орнотуу функциясы
void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menuSelect, INPUT); Serial.begin (9600); }
// Учурдагы тандалган параметрди кайтаруу функциясы char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Return optionSelected return menuOption; } // Учурдагы тандалган параметрдин статусун кайтаруу функциясы char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "False"; } else {optionSettingVal = "True"; } // Return optionSetting return optionSettingVal; } // Учурдагы параметрди алмаштыруучу функция bool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; чындыкка кайтуу; } // Негизги цикл
void loop () {// баскычтарын оку int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Учурдагы убакытты алуу int int currentTime = 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; } // Менюну басып чыгарыңыз menuNeedsPrint = true; // Алдын ала баскычын которгула. менюду көрсөтүү үчүн гана мамлекет // // ЖОК болот} // menuSelect басылган, логиканы камсыз кыл ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Тандалган вариантты өзгөртүү // Учурда, бул жөн гана чындык/жалган // бирок кандайдыр бир нерсе болушу мүмкүн bool toggle = ToggleOptionSelected (); if (switch) {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 сайтында жеткиликтүү. Мен сизди да көрүү үчүн төмөндөгү схеманы камтып койдум!
Адаттагыдай эле, эгер сизде суроолор же көйгөйлөр болсо, мага кабарлаңыз!
Сунушталууда:
Arduino Control DC моторунун ылдамдыгы жана багыты потенциометрди, OLED дисплейди жана баскычтарды колдонуу: 6 кадам
Arduino Control DC моторунун ылдамдыгы жана багыты потенциометрди, OLED дисплейди жана баскычтарды колдонуу: Бул окуу куралында биз L298N DC MOTOR CONTROL драйверин жана потенциометрди DC моторунун ылдамдыгын жана багытын эки баскыч менен башкаруу жана потенциометрдин маанисин көрсөтүү үчүн колдонууну үйрөнөбүз. OLED дисплейинде. Демонстрациялык видеону көрүңүз
Linux жүктөө дискин кантип түзүү керек (жана аны кантип колдонуу керек): 10 кадам
Linux жүктөө дискин кантип түзүү керек (жана аны кантип колдонуу керек): Бул Linuxту кантип баштоо керектиги жөнүндө жөнөкөй маалымат, тактап айтканда Ubuntu
Arduino Control DC моторунун ылдамдыгы жана багыты потенциометрди жана баскычтарды колдонуу: 6 кадам
Ардуино Control DC моторунун ылдамдыгы жана багыты потенциометрди жана баскычтарды колдонуу: Бул окуу куралында биз L298N DC MOTOR CONTROL драйверин жана потенциометрди DC моторунун ылдамдыгын жана багытын эки баскыч менен башкаруу үчүн колдонууну үйрөнөбүз
Жарыктыкты көзөмөлдөө PWM негизиндеги LED башкаруу баскычтарды, Raspberry Pi жана Scratchти колдонуу: 8 кадам (сүрөттөр менен)
Жарыктыкты башкаруу PWMге негизделген LED башкаруу баскычтарын, Raspberry Pi жана Scratchти колдонуу: Мен PWMдин студенттериме кантип иштегенин түшүндүрүүнүн жолун издеп жаттым, ошондуктан мен 2 баскычты колдонуп, LEDдин жарыгын көзөмөлдөөгө аракет кылдым. - бир баскыч LEDдин жарыктыгын жогорулатат, экинчиси аны өчүрөт. Программаларга
Mac Терминалын кантип колдонуу керек жана Негизги функцияларды кантип колдонуу керек: 4 кадам
Mac Терминалын кантип колдонуу керек жана Негизги функцияларды кантип колдонуу керек: Биз сизге MAC Терминалын кантип ачууну көрсөтөбүз. Биз ошондой эле сизге терминалдын ичинде ifconfig, каталогдорду өзгөртүү, файлдарга кирүү жана arp сыяктуу бир нече мүмкүнчүлүктөрдү көрсөтөбүз. Ifconfig сизге IP дарегиңизди жана MAC жарнагыңызды текшерүүгө мүмкүндүк берет