Mundarija:
- 1 -qadam: Kengashni sozlash
- 2 -qadam: tugma va rezistorni qo'shing
- 3 -qadam: tugmachali ulanishlar
- 4 -qadam: Kod…
- 5 -qadam: Kichik bir chiqish
- 6 -qadam: Menyu tuzish
- 7 -qadam: Kodni taqsimlash - global
- 8 -qadam: Kodni taqsimlash - sozlash va maxsus funktsiyalar
- 9 -qadam: Loop …
- 10 -qadam: Yakuniy kod bloki
Video: Arduino menyusi va tugmalardan foydalanish: 10 qadam (rasmlar bilan)
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:26
Mening Arduino 101 darsligimda sizga Tinkercad -da atrof -muhitni qanday sozlashni o'rgatishadi. Men Tinkercad -dan foydalanaman, chunki bu o'quvchilarga mikrosxemalar yaratish ko'nikmalarini namoyish etishimga imkon beradigan juda kuchli onlayn platforma. Mening barcha darsliklarimni Arduino IDE va haqiqiy Arduino yordamida qurishga jur'at eting!
Ushbu qo'llanmada biz tugmalar haqida bilib olamiz! Biz bilishimiz kerak:
- Ularni qanday ulash mumkin
- Ularning qiymatini o'qish
- Qabul qiling va nima uchun bu muhim
- Amaliy dastur (menyu yaratish)
Ko'pchilik, tugmani bosishning eng amaliy usuli - bu chiroqni yoqish va o'chirish. Biz boramiz, bu erda emas! Biz o'zimiznikidan foydalanib menyu tuzamiz va Arduino -da ba'zi variantlarni o'rnatamiz.
Tayyormi? Qani boshladik!
1 -qadam: Kengashni sozlash
Birinchi qadam - prototiplash maydoniga Arduino va Breadboard Small -ni o'rnatish. Quvvat relslarini qanday ulash kerakligini bilish uchun yuqoridagi rasmlarni tekshiring.
Breadboard Mini -ning yuqori va pastki qismida ikkita elektr rayı bor. Biz ularni Arduino -ga ulaymiz, shunda biz qo'shimcha komponentlarni quvvat bilan ta'minlay olamiz. Keyinchalik bu darslikda biz 3 tugmani ishlatamiz, shunda bizga ko'proq quvvat kerak bo'ladi. Shuni ta'kidlash kerakki, kichkina non taxtasida elektr relslari gorizontal ravishda taxta bo'ylab o'tadi. Bu o'rtadagi asosiy prototiplash maydonidagi ustunlardan farq qiladi; bular vertikal ravishda ishlaydi. O'rtadagi asosiy maydonning istalgan ustunini quvvat bilan ta'minlash uchun har qanday quvvat pinidan foydalanishingiz mumkin.
Quvvat qo'shganda, qora va qizil simlarni mos ravishda salbiy va musbatga ishlating. Tarmoqning boshqa tomoniga quvvat beradigan simlarni oxiriga qo'shing. Biz bu tomonni ishlatmaymiz, lekin bu yaxshi amaliyot.
2 -qadam: tugma va rezistorni qo'shing
Komponentlar panelidan kichik tugmachani qo'shing. Bu rasmdagi kabi ko'rinishi kerak. Bu kalit emasligiga ishonch hosil qiling! Rezistor qo'shing. Uni bosing va uning qiymatini 10 kΩ ga o'rnating. Bu pin ulanmaganida pastga tushirish uchun kifoya qiladi, bu keyinchalik kodda juda muhim.
Komponentni taxtaning o'rtasiga joylashtiring. Tugma qanday ishlaydi:
- Burchak burchakka, tugma ulanmagan. Tugmani bosish kontaktlarni yopadi va burchaklarni bog'laydi.
- Tugmaning yon tomonlari ulangan. Agar siz simni yuqori chap va pastki chapga ulagan bo'lsangiz, kontaktlarning zanglashiga olib keladi.
Shuning uchun biz komponentani bo'shliq bo'ylab o'rtasiga qo'yamiz. Burchaklar taxtadagi pinlar ostiga ulanmaganligiga ishonch hosil qiladi.
Keyingi qadam, bu fikrlarni aks ettiruvchi bir nechta tasvirni taqdim etadi.
Rezistorni pastki o'ng pimdan ustunlar orasiga joylashtiring, shunda u gorizontal joylashadi.
3 -qadam: tugmachali ulanishlar
Yuqoridagi rasmlar tugmachalarning qanday ulanishini aniq ko'rsatib turibdi. Hamma narsa yaxshi deb o'ylayotganda, bu har doim chalkashliklarga sabab bo'lardi va u ishlamaydi!
Endi simlarni qo'shamiz.
- Tugmachaning pastki o'ng burchagidagi musbat quvvat simidan qizil simni joylashtiring
- Qora simni manfiy quvvat pinidan rezistor bilan bir xil ustunga joylashtiring.
- Rangli simni (qizil/qora emas) yuqori chap pinidan Arduino -dagi Digital Pin 2 -ga joylashtiring
Kabelning to'g'riligiga ishonch hosil qilish uchun yuqoridagi rasmlarni tekshiring.
4 -qadam: Kod…
Keling, asosiy tugma kodini ko'rib chiqaylik.
Kod muharririni oching va bloklardan matnga o'zgartiring. Kelayotgan ogohlantirishni o'chirib tashlang. Biz matndan mamnunmiz!
Siz asosiy sozlamalarni bilasiz, shuning uchun tugmani aniqlab, asosiy o'qishni qilaylik. Biz chiqishni ketma -ket chop etamiz.
Quyidagi kodga bir nechta qo'shimcha izohlar qo'ydim, shuning uchun rasmdan ko'ra o'qish osonroq.
// Konstantalarni aniqlang
#define tugma 2 void setup () {pinMode (tugma, INPUT); Serial.begin (9600); } void loop () {// int tugmachasining holatini tekshirish uchun raqamli pinni o'qing = digitalRead (tugma); // Tugma bosilsa YUQORI qaytariladi, agar LOW bo'lmasa bosiladi (bosilganda == HIGH) {Serial.println ("Bosildi!"); }}
OK, bu ishlaydi!
Asosan, biz qilayotgan ishimiz - har safar kod aylansa, raqamli pin holatini tekshirish. Agar siz "Simulyatsiyani boshlash" tugmachasini bosib, tugmani bosgan bo'lsangiz, Serial monitor (kod ostidagi tugmani bosing) "Bosilgan!" Ko'rsatuvini ko'rasiz. qayta -qayta.
Yuqoridagi kodda ko'riladigan xususiyatlardan biri - if () holatini baholash. Hamma kod - bu savol berish va bu to'g'ri yoki yo'qligini baholash. O'zgaruvchining qiymati ma'lum bir qiymatga tengligini tekshirish uchun biz teng (er -xotin teng belgilar, masalan: ==) dan foydalanamiz. DigitalRead () yuqori yoki pastni qaytaradi.
If () else if / else yordamida biz ko'plab shartlarni yoki barcha shartlarni tekshira olamiz va agar siz Arduino asoslariga qaytsangiz, siz solishtiradigan ba'zi taqqoslashlarni ko'rasiz.
Endi … Bizning kodimiz to'liq ko'rinishi mumkin … Lekin bizda muammo bor.
Qarang, simulyatorda bu juda yaxshi ishlaydi. Lekin haqiqiy elektr shovqin, ayniqsa shahar elektronikasi. Shunday qilib, ba'zida bizning tugma noto'g'ri o'qishni qaytarishi mumkin. Va bu muammo, chunki sizning loyihangiz foydalanuvchi uchun to'g'ri javob bermasligi mumkin.
Keling, tuzataylik!
5 -qadam: Kichik bir chiqish
Biz tugma muammosini hal qilish uchun debounce deb nomlangan protseduradan foydalanamiz. Bu, asosan, tugma bosilgan vaqt va tugmani bosishga javob beradigan vaqt oralig'ida kutiladi. Bu foydalanuvchi uchun tabiiy tuyuladi (agar siz vaqtni juda uzoq qilmasangiz). Siz uni bosish uzunligini tekshirish uchun ham ishlatishingiz mumkin, shuning uchun siz har safar boshqacha javob bera olasiz. Hech qanday simni o'zgartirish shart emas!
Keling, kodni ko'rib chiqaylik:
#2 tugmachasini belgilang#debounceTimeout 100 ni aniqlang
Birinchi o'zgarish global miqyosda. Siz shuni esda tutasizki, aynan shu erda biz ko'p funktsiyalarni ishlatishi mumkin bo'lgan o'zgaruvchilarni aniqlaymiz yoki har safar tsikl yoqilganda tiklab bo'lmaydi. Shunday qilib, biz aniqlangan doimiylarga debounceTimeout qo'shdik. Biz bu 100 -ni qildik (keyinchalik u 100 millimetrga tarjima qilinadi), lekin u qisqaroq bo'lishi mumkin. Endi va bu g'ayritabiiy tuyuladi.
long int lastDebounceTime;
Bu o'zgaruvchi konstantalar ostida e'lon qilinadi. Bu uzoq int turi bo'lib, asosan bizga uzun raqamlarni xotirada saqlashga imkon beradi. Biz buni lastDebounceTime deb nomladik.
Void setup () funktsiyasida biror narsani o'zgartirishimiz shart emas. Keling, buni qoldiraylik.
void loop () {// raqamli pinni o'qing int tugmachasining holatini tekshirish uchun = digitalRead (tugma); long int currentTime = millis (); // tugma kodi}
Loop () funktsiyasida biz qilgan birinchi o'zgarish tugmani o'qish uchun chaqiruv ostida bo'ladi. Biz hozirgi vaqtni kuzatib borishimiz kerak. Millis () funktsiyasi Arduino millisekundlarda yuklanganidan beri soatning hozirgi vaqtini qaytaradi. Buni uzoq int tipidagi o'zgaruvchida saqlashimiz kerak.
Endi biz tugma bosilgan vaqtdan xabardor ekanligimizga ishonch hosil qilishimiz kerak, shuning uchun taymer bosilmaganda uni qayta o'rnatamiz. Qarab qo'ymoq:
void loop () {// raqamli pinni o'qing int tugmachasining holatini tekshirish uchun = digitalRead (tugma); long int currentTime = millis (); if (== LOW bosilgan) {// tugma bosilmaganda, hisoblash vaqtini tiklash resetDebounceTime = currentTime; } // tugma kodi}
If (bosilgan == LOW) algoritmi tugma bosilmasligini tekshiradi. Agar shunday bo'lmasa, kod oxirgi marta chiqarilganidan beri joriy vaqtni saqlaydi. Shunday qilib, har safar tugma bosilganda, bizda tugma bosilganda tekshirish mumkin bo'lgan vaqt bor. Biz tugmani qancha bosilganini ko'rish va to'g'ri javob berish uchun tez matematik hisob -kitob qilishimiz mumkin. Kodning qolgan qismini ko'rib chiqaylik:
void loop () {// raqamli pinni o'qing int tugmachasining holatini tekshirish uchun = digitalRead (tugma); long int currentTime = millis (); if (== LOW bosilgan) {// tugma bosilmaganda, hisoblash vaqtini tiklash resetDebounceTime = currentTime; } // Tugma ma'lum vaqt davomida bosilgan, agar (((currentTime - lastDebounceTime)> debounceTimeout)) {// Vaqt tugagan bo'lsa, tugma bosiladi! Serial.println ("Bosildi!"); }}
Oxirgi kod bloki joriy vaqtni oladi, oxirgi o'chirish vaqtini olib tashlaydi va uni biz o'rnatgan tanaffus bilan taqqoslaydi. Agar u kattaroq bo'lsa, kod shu vaqt uchun tugma bosilgan deb hisoblaydi va javob beradi. Pokiza!
Kodni ishga tushiring va uning ishlashini tekshiring. Agar sizda xatolar bo'lsa, kodingizni tekshiring!
Endi amaliy misolni ko'rib chiqaylik.
6 -qadam: Menyu tuzish
Tugmalar qiziqarli, chunki ular bilan imkoniyatlar juda ko'p! Bu misolda menyu tuzamiz. Aytaylik, siz haqiqatan ham ajoyib qurilmani yaratdingiz va foydalanuvchilar ba'zi narsalarni yoqish yoki o'chirish uchun parametrlarni o'zgartirishi yoki sozlash uchun ma'lum bir qiymatni o'rnatishi kerak. Bu uchta tugmachali dizayn bunga qodir!
Shunday qilib, ushbu loyiha uchun bizga kerak:
- Uchta tugma
- Uch qarshilik 10 kΩ ga o'rnatildi
Bizda ulardan bittasi bor, qolgan ikkitasi kerak. Shunday qilib, ularni taxtaga qo'shing. Ulanish biroz murakkabroq, lekin men uni chindan ham ixcham qilib saqlamoqchi bo'lganim uchun. Siz birinchi tugma uchun xuddi shu naqshga amal qilishingiz yoki yuqoridagi rasmga amal qilishingiz mumkin.
Uch tugma - bu menyu ochish/keyingi variant, o'zgartirish opsiyasi (sozlamani o'zgartirish kabi) va menyuni saqlash/yopish tugmasi.
Ruxsat bering, kodni ko'rib chiqaylik!
7 -qadam: Kodni taqsimlash - global
OK, bu uzoq qadam bo'ladi, lekin men kodning har bir bo'limidan o'taman.
Birinchidan, global o'zgaruvchilarni ko'rib chiqaylik.
// Konstantalarni aniqlang #menyuni belgilangButton 2 #menyuni belgilang 3 #menyuni belgilangSave 4 #debunini aniqlang Vaqtni uzating 50 // o'zgaruvchilarni belgilang int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Menyu parametrlari char * menuOptions = {"Haroratni tekshirish", "Chiroqni tekshirish"}; bool featureSetting = {noto'g'ri, noto'g'ri}; bool menuMode = noto'g'ri; bool menuNeedsPrint = noto'g'ri; int optionSelected = 0;
Bu uchta blok biz ko'rgan narsalarga juda o'xshash. Birinchisida men uchta tugma va vaqt tugashini aniqladim. Loyihaning bu qismi uchun men uni 50ms qilib qo'ydim, shuning uchun uni ishlashi uchun ataylab bosish kerak.
Ikkinchi blok - bu barcha o'zgaruvchilar. Biz tugmaPreviousState -ni kuzatib borishimiz va lastDebounceTime -ni kuzatib borishimiz kerak. Bularning barchasi int tipidagi o'zgaruvchilar, lekin oxirgisi uzoq tur, chunki men xotirada bo'sh joy kerak deb o'ylayman.
Menyu parametrlari bloki bir nechta yangi xususiyatlarga ega. Birinchidan, char * (ha, bu qasddan qilingan yulduzcha), bu belgi/satrning so'zma -so'z o'zgaruvchisi. Bu xotiradagi statik saqlash uchun ko'rsatgich. Siz uni o'zgartira olmaysiz (masalan, Pythonda bo'lgani kabi). Bu char *menuOptions qatori string harflari majmuasini yaratadi. Siz xohlaganingizcha menyu elementlarini qo'shishingiz mumkin.
Bool featureSetting o'zgaruvchisi - bu har bir menyu elementini ifodalovchi qiymatlar majmuasi. Ha, siz xohlagan narsani saqlashingiz mumkin, faqat o'zgaruvchining turini o'zgartiring (ularning barchasi bir xil bo'lishi kerak). Lug'atlar yoki tuplar kabi, buni boshqarishning yaxshiroq usullari bo'lishi mumkin, lekin bu dastur uchun bu oddiy. Ehtimol, joylashtirilgan ilovada ikkinchisidan birini yaratgan bo'lardim.
Men menuMode rejimini kuzatib borganman, shuning uchun agar men displeyimda boshqa narsalarni xohlasam, buni qila olardim. Bundan tashqari, agar menda sensorli mantiq bo'lsa, men biror narsa ziddiyatli bo'lsa, menyu ishini to'xtatib qo'yardim. Menda menuNeedsPrint o'zgaruvchisi bor, chunki men menyuni har doim emas, balki ma'lum vaqtlarda chop etmoqchiman. Nihoyat, menda variantSelected o'zgaruvchisi bor, shuning uchun men tanlangan variantni bir qancha joylarga kirganimda kuzatib boraman.
Keling, keyingi funktsiyalar to'plamini ko'rib chiqaylik.
8 -qadam: Kodni taqsimlash - sozlash va maxsus funktsiyalar
Setup () funktsiyasi etarlicha oson, faqat uchta kirish deklaratsiyasi:
void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menyuni tanlang, kiriting); Serial.begin (9600); }
Keyingi uchta maxsus funktsiyalar. Keling, birinchi ikkisini, keyin ikkinchisini alohida ko'rib chiqaylik.
Bizga ba'zi ma'lumotlarni qaytaradigan ikkita funktsiya kerak. Buning sababi shundaki, biz buni odamlar o'qishi mumkinligiga ishonch hosil qilishni xohlaymiz. Agar bizda muammo bo'lsa, bu kodni tuzatishga yordam beradi. Kod:
// Joriy tanlangan variantni qaytarish funktsiyasi *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Qaytish opsiyasi Tanlangan qaytish menyusiOption; } // Joriy tanlangan variantning holatini qaytarish funktsiyasi char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Noto'g'ri"; } else {optionSettingVal = "To'g'ri"; } // Qaytish opsiyasi Qaytish variantini sozlashSettingVal; }
Char *ReturnOptionSelected () funktsiyasi tanlangan variantni tekshiradi (agar siz yuqorida ko'rsangiz, biz buni kuzatib borish uchun o'zgarmaydiganni o'rnatamiz) va biz yaratgan qatordan satrning harfini chiqaradi. Keyin uni char turi sifatida qaytaradi. Biz buni bilamiz, chunki funksiya qaytish turini ko'rsatadi.
Ikkinchi funktsiya, char *ReturnOptionStatus () qatorda saqlangan parametr holatini o'qiydi va qiymatni ifodalovchi mag'lubiyatni qaytaradi. Masalan, agar biz saqlagan sozlama noto'g'ri bo'lsa, men "False" ni qaytarardim. Buning sababi shundaki, biz foydalanuvchiga bu o'zgaruvchini ko'rsatamiz va bu mantiqni birgalikda saqlash yaxshiroqdir. Men buni keyinroq qila olardim, lekin buni bu erda qilish mantiqan.
// Amaldagi variantni almashtirish funktsiyasi ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; haqiqatga qaytish; }
Bool ToggleOptionSelected () funktsiyasi menyuda biz tanlagan sozlamaning qiymatini o'zgartirish uchun qulaylik funktsiyasi. Bu shunchaki qiymatni o'zgartiradi. Agar sizda yanada murakkab variantlar bo'lsa, bu butunlay boshqacha bo'lishi mumkin. Men bu funksiyada rostni qaytaraman, chunki mening qayta qo'ng'irog'im (keyinchalik bu funktsiyani o'chiradigan kodda) haqiqiy/noto'g'ri javobni kutadi. Men bu ishlay olishiga 100% aminman, shuning uchun men buni ishlamagan deb hisoblamadim, lekin men joylashtirilgan dasturda bo'lardim (har holda).
9 -qadam: Loop …
Loop () funktsiyasi ancha uzun, shuning uchun biz uni qismlarga ajratamiz. Siz bu funktsiyadagi uyalar ostidagi hamma narsani qabul qilishingiz mumkin:
void loop () {
// Bu erda ishlang <-----}
OK, biz bu narsalarni oldin ko'rganmiz:
// tugmalarini o'qing int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // joriy vaqtni oling int int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// tugma bosilmay qolganda, hisoblash vaqtini qayta o'rnatish lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }
Bu erda men qilishim kerak bo'lgan uchta raqamli raqamli raqamli qo'ng'iroqlarni qo'shish edi, va agar tugmalar past bo'lsa, biz taymerni qayta tiklashimiz kerak (lastDebounceTime = currentTime) va oldingi holatlarni past holatga qo'yish. Men millis () ni ham currentTime -da saqlayman.
Keyingi qism chiziq ichida joylashadi
agar (((currentTime - lastDebounceTime)> debounceTimeout)) {
// Bu erda ishlang <----}
Uchta bo'lim mavjud. Ha, men ularni o'z vazifalariga o'tkazishim mumkin edi, lekin soddalik uchun men uchta asosiy tugma algoritmini bu erda saqladim.
if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Foydalanuvchiga Serial.println ("Menyu faol") haqida xabar bering; } if if (menuMode == true && optionSelected = 1) {// Variantni asl holatiga qaytarishSelected = 0; } // Menyu menyusini chop etingNeedsPrint = true; // Oldingi tugmani almashtiring. faqat menyuni ko'rsatish uchun holat // faqat tugma qo'yib yuborilsa va yana bosilsa menuButtonPreviousState = menuButtonPressed; // yuqori bo'lardi}
Menyu tugmachasi yuqori bo'lsa yoki menyu tugmasi bosilsa, bu birinchi bo'ladi. Shuningdek, u avvalgi holat LOW ekanligini tekshiradi, shuning uchun tugma qayta bosilmasdan oldin qo'yib yuborilishi kerak edi, bu esa dasturni o'sha hodisani qayta -qayta o'chirishni to'xtatadi.
Keyin menyu faol bo'lmasa, uni faollashtirishini tekshiradi. U tanlangan birinchi variantni chop etadi (bu sukut bo'yicha menyuning Opsionlar qatoridagi birinchi elementi. Agar siz tugmani ikkinchi yoki uchinchi marta (va hokazo) bosgan bo'lsangiz, ro'yxatda keyingi variant paydo bo'ladi. Men tuzatadigan narsa Agar u oxirigacha bo'lsa, u boshiga qaytadi, bu qatorning uzunligini o'qishi va agar siz variantlar sonini o'zgartirsangiz, velosipedni qaytarishni osonlashtirishi mumkin edi, lekin hozircha bu oddiy edi.
Oxirgi kichik bo'lim (// menyuni chop etadi), aniqki, menyuni chop etadi, lekin u ham oldingi holatni HIGH holatiga qo'yadi, shuning uchun ham xuddi shu funktsiya ishlamaydi (tugmani ilgari LOW pastligini tekshirish haqidagi yuqoridagi eslatmani ko'ring).
// menuSelect bosiladi, mantiqiy ((menuSelectPressed == YUQORI) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Tanlangan variantni o'zgartiring // Hozircha bu to'g'ri/noto'g'ri // har qanday narsa bo'lishi mumkin bool toggle = ToggleOptionSelected (); if (o'tish) {menuNeedsPrint = true; } else {Serial.println ("Xatolik yuz berdi. Qaytadan urinib ko'ring"); }} // Vaziyatni o'zgartirish faqat agar qo'yib yuborilsa va yana bosilsa menuSelectPreviousState = menuSelectPressed; }
Bu kod biti menyuSelectPressed tugmachasini xuddi shunday boshqaradi, faqat shu vaqt ichida biz ToggleOptionSelected () funktsiyasini o'chiramiz. Yuqorida aytib o'tganimdek, siz bu funktsiyani o'zgartirishingiz mumkin, shunda u ko'proq narsani amalga oshiradi, lekin men buni qilishim kerak.
E'tibor qilish kerak bo'lgan asosiy narsa - bu qayta qo'ng'iroqning muvaffaqiyatini kuzatadigan va agar to'g'ri bo'lsa, menyuni bosib chiqaradigan o'zgaruvchan o'zgaruvchi. Agar u hech narsa yoki noto'g'ri qaytarsa, xato xabari chop etiladi. Bu erda siz qayta qo'ng'iroq qilishingiz va boshqa narsalarni qilishingiz mumkin.
if ((menuSavePressed == YUQORI) && (menuSavePreviousState == LOW)) {// Menyudan chiqish // Bu erda siz har qanday tartibga solishni // yoki EEPROM menuMode = false ga saqlashingiz mumkin; Serial.println ("Menyudan chiqish"); // Vaziyatni o'zgartirish uchun menyu faqat bir marta chiqadi menuSavePreviousState = menuSavePressed; }}
Bu funksiya menyudan chiqish tugmachasini boshqaradi. Bu erda siz bekor qilish yoki saqlash variantiga ega bo'lishingiz mumkin, ehtimol tozalash yoki EEPROM -ga saqlashingiz mumkin. Men shunchaki "Menyu chiqdi" ni chop etaman va tugma holatini "YUQORI" ga qo'yaman, shunda u aylanmaydi.
if (menuMode && menuNeedsPrint) {// Biz menyuni chop qildik, shuning uchun biror narsa sodir bo'lmaguncha // uni qayta chop etishning hojati yo'q menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Tanlangan:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }
Bu menuPrint algoritmi, faqat menyu faol bo'lganda va menuNeedsPrint o'zgaruvchisi rost holatiga kelganda yonadi.
Bu, albatta, o'z vazifasiga o'tkazilishi mumkin, lekin soddaligi uchun..!
Xo'sh, hammasi shu! Butun kod bloki uchun keyingi bosqichga qarang.
10 -qadam: Yakuniy kod bloki
// Konstantalarni aniqlang
#define menuButton 2 #define menuSelect 3 #define menuSave 4 #deune debuneTimeout 50 int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // long int lastDebounceTime o'zgaruvchilarini aniqlang; bool lightSensor = rost; bool tempSensor = rost; // Menyu parametrlari char * menuOptions = {"Haroratni tekshirish", "Chiroqni tekshirish"}; bool featureSetting = {noto'g'ri, noto'g'ri}; bool menuMode = noto'g'ri; bool menuNeedsPrint = noto'g'ri; int optionSelected = 0; // O'rnatish funktsiyasi
void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menyuni tanlang, kiriting); Serial.begin (9600); }
// Joriy tanlangan variantni qaytarish funktsiyasi char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Qaytish opsiyasi Tanlangan qaytish menyusiOption; } // Joriy tanlangan variantning holatini qaytarish funktsiyasi char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Noto'g'ri"; } else {optionSettingVal = "To'g'ri"; } // Qaytish opsiyasi Qaytish variantini sozlashSettingVal; } // Joriy parametr boolni almashtirish funktsiyasi ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; haqiqatga qaytish; } // Asosiy halqa
void loop () {// tugmalarini o'qing int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // joriy vaqtni oling int int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// tugma bosilmay qolganda, hisoblash vaqtini qayta o'rnatish lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } if (((currentTime - lastDebounceTime)> debounceTimeout)) {// Vaqt tugagan bo'lsa, tugma bosiladi!
// menuButton bosiladi, mantiq beradi
// Faqat tugma qo'yib yuborilganda yonadi, agar ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Foydalanuvchiga Serial.println ("Menyu faol") haqida xabar bering; } if if (menuMode == true && optionSelected = 1) {// Variantni asl holatiga qaytarishSelected = 0; } // Menyu menyusini chop etingNeedsPrint = true; // Oldingi tugmani almashtiring. faqat menyuni ko'rsatish uchun holat // faqat tugma qo'yib yuborilsa va yana bosilsa menuButtonPreviousState = menuButtonPressed; // YUQORI bo'lardi} // menuSelect bosilsa, mantiqni if ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Tanlangan variantni o'zgartirish // Hozirgi vaqtda bu faqat true/false // lekin har qanday narsa bo'lishi mumkin bool toggle = ToggleOptionSelected (); if (o'tish) {menuNeedsPrint = true; } else {Serial.print ("Xatolik yuz berdi. Qaytadan urinib ko'ring"); }} // Vaziyatni o'zgartirish faqat agar qo'yib yuborilsa va yana bosilsa menuSelectPreviousState = menuSelectPressed; } if ((menuSavePressed == YUQORI) && (menuSavePreviousState == LOW)) {// Menyudan chiqish // Bu erda har qanday tartibga solish // yoki EEPROM menuMode = false ga saqlash mumkin; Serial.println ("Menyudan chiqish"); // Vaziyatni o'zgartirish uchun menyu faqat bir marta chiqadi menuSavePreviousState = menuSavePressed; }} // Joriy menyu variantini faol chop eting, lekin uni faqat bir marta chop eting, agar (menuMode && menuNeedsPrint) {// Biz menyuni chop etgan bo'lsak, agar biror narsa // sodir bo'lmasa, uni qayta chop etishning hojati yo'q menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Tanlangan:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }}}
O'chirish Tinkercad saytida mavjud. Men ham siz ko'rishingiz uchun quyidagi sxemani joylashtirdim!
Har doimgidek, agar sizda savollar yoki muammolar bo'lsa, menga xabar bering!
Tavsiya:
Tanlash imkoniyati bo'lgan Arduino OLED displey menyusi: 8 qadam
Tanlash imkoniyati bilan Arduino OLED -displey menyusi: Ushbu qo'llanmada biz OLED -displey va Visuino -dan foydalanib tanlov varianti bilan menyu tuzishni o'rganamiz
Arduino uchun qadam tezligini boshqarish menyusi: 6 qadam
Arduino uchun qadam tezligini boshqarish menyusi: Bu SpeedStepper kutubxonasi qadam dvigatelining tezligini nazorat qilish uchun AccelStepper kutubxonasining qayta yozilishi. SpeedStepper kutubxonasi sizga belgilangan dvigatel tezligini o'zgartirishga imkon beradi, so'ngra xuddi shu algoritm yordamida yangi belgilangan tezlikka tezlashadi/sekinlashadi
Windows 7: kontekst menyusi elementlari yo'q: 3 qadam
Windows 7: Kontekst menyusi elementlari yo'q: Qachonki biz oynalarda 15 dan ortiq faylni tanlasak. Kontekst menyusidagi ba'zi elementlar yo'qoladi … Bu darslik sizga ularni kontekst menyusiga qanday qaytarish kerakligini ko'rsatib beradi
Arduino bilan 360 ° RPLIDAR lazer skaneridan qanday foydalanish kerak: 3 qadam (rasmlar bilan)
Arduino bilan 360 ° RPLIDAR lazer skaneridan qanday foydalanish kerak: Men sumo robotlarini yaratishni yaxshi ko'raman va men har doim yangi, yangi sensorlar va materiallarni qidirib, yaxshiroq, tezroq va aqlli robot yaratish uchun foydalanaman. Men RPLIDAR A1 haqida bilib oldim, uni 99 dollarga DFROBOT.com saytidan olishingiz mumkin. Men aqlli ekanligimni aytdim
Nokia 5110 Lcd -dagi Arduino menyusi aylanadigan kodlovchi yordamida: 6 qadam (rasmlar bilan)
Nokia 5110 Lcd -dagi Arduino menyusi aylanadigan kodlovchi yordamida: Aziz do'stlar, boshqa darslikka xush kelibsiz! Ushbu videoda biz Nokia 5110 LCD displeyi uchun o'z menyusimizni qanday yaratishni o'rganamiz, bu esa loyihalarimiz foydalanuvchilarga qulay va qobiliyatli bo'lishi uchun. Boshlaylik! Bu loyiha