Mündəricat:
- Addım 1: Paneli qurun
- Addım 2: Düyməni və Rezistoru əlavə edin
- Addım 3: Düymə Bağlantıları
- Addım 4: Kod…
- Addım 5: Biraz Çıxış
- Addım 6: Menyu hazırlanması
- Addım 7: Kod Dağılımı - Qlobal
- Addım 8: Kod Dağılımı - Quraşdırma və Xüsusi Funksiyalar
- Addım 9: Döngə…
- Addım 10: Son Kod Bloku
Video: Arduinoda Menyu və Düymələrdən Necə İstifadə Edilir: 10 Addım (Şəkillərlə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:46
Arduino 101 dərsliyimdə sizə Tinkercad -da mühitinizi necə quracağınız öyrədiləcək. Tinkercad -dan istifadə edirəm, çünki tələbələrə sxem qurmaq üçün bir sıra bacarıqlar nümayiş etdirməyimə imkan verən olduqca güclü bir onlayn platformadır. Arduino IDE və əsl Arduino istifadə edərək bütün dərslərimi qurmaqdan çekinmeyin!
Bu təlimatda düymələri öyrənəcəyik! Bilməliyik:
- Onları necə bağlamaq olar
- Onların dəyərini oxumaq
- Çıxın və bunun nə üçün vacib olduğunu
- Praktik bir tətbiq (menyu yaratmaq)
Əksər insanlar bir düymə ilə etmənin ən praktik işığının işığı yandırıb söndürmək olduğunu düşünür. Biz, burada yox! Bir menyu yaratmaq və Arduino -da bəzi seçimlər etmək üçün özümüzdən istifadə edəcəyik.
Hazırsınız? Gəlin başlayaq!
Addım 1: Paneli qurun
İlk addım, prototip sahəsinə bir Arduino və Breadboard Small qoymaqdır. Elektrik raylarını necə bağlayacağınızı görmək üçün yuxarıdakı şəkillərə baxın.
Breadboard Mini -nin yuxarı və aşağı hissəsində iki elektrik rayı var. Daha çox komponentə enerji verə bilmək üçün bunları Arduino'ya bağlayırıq. Daha sonra bu təlimatda daha çox gücə ehtiyacımız olacaq 3 düymədən istifadə edəcəyik. Diqqət yetirilməli olan şey, kiçik bir çörək taxtasında, elektrik relslərinin taxtadan üfüqi şəkildə keçməsidir. Bu ortadakı əsas prototip sahəsindəki sütunlardan fərqlidir; bunlar şaquli hərəkət edir. Ortadakı əsas sahədə hər hansı bir sütuna enerji vermək üçün hər hansı bir güc pinindən istifadə edə bilərsiniz.
Güc əlavə edərkən, mənfi və müsbət olaraq qara və qırmızı tellərdən istifadə edin. Lövhənin digər tərəfinə güc verən tellər əlavə edin. Bu tərəfi istifadə etməyəcəyik, amma yaxşı təcrübədir.
Addım 2: Düyməni və Rezistoru əlavə edin
Komponentlər tepsisindən kiçik bir düymə əlavə edin. Şəkildəki kimi görünməlidir. Bunun bir keçid olmadığından əmin olun! Bir rezistor da əlavə edin. Bunun üzərinə vurun və dəyərini 10kΩ olaraq təyin edin. Pimi bağlamadığınız zaman aşağıya çəkmək üçün kifayətdir ki, bu da sonradan kodda çox vacibdir.
Komponenti çörək taxtasının ortasına qoyun. Bir düymənin işləmə qaydası belədir:
- Küncdən küncə, düymə bağlı deyil. Düyməni basmaq kontaktları bağlayır və küncləri birləşdirir.
- Düymənin tərəfləri bağlıdır. Sol yuxarı və aşağı sola bir tel bağlasanız, dövrə bağlanacaq.
Bu səbəbdən komponenti ortadakı boşluq boyunca qoyduq. Künclərin lövhədəki sancaqlar altına bağlanmadığından əmin olur.
Növbəti addım bu nöqtələri göstərən bir neçə şəkil təqdim edir.
Rezistoru sağ alt pimdən sütunların arasına yerləşdirin ki, üfüqi şəkildə otursun.
Addım 3: Düymə Bağlantıları
Yuxarıdakı şəkillər, düymələrin necə bağlandığını aydın şəkildə göstərir. Bir şeyin yaxşı olduğunu və heç bir şeyin işləmədiyini düşündüyünüz zaman həmişə bir qarışıqlıq idi!
İndi telləri əlavə edək.
- Müsbət bir elektrik pinindən qırmızı bir ucu düymənin sağ alt pimi ilə eyni sütuna yerləşdirin
- Mənfi bir güc pinindən rezistorla eyni sütuna qara bir tel qoyun.
- Sol üst pimdən Arduino'ya Digital Pin 2 -ə rəngli bir tel qoyun (qırmızı/qara deyil)
Kabelinizin düzgün olduğundan əmin olmaq üçün yuxarıdakı şəkilləri yoxlayın.
Addım 4: Kod…
Əsas düymənin koduna baxaq.
Kod redaktorunu açın və Bloklardan Mətnə keçin. Gələn xəbərdarlığı silin. Mətndən məmnunuq!
Əsas quruluşu bilirsiniz, buna görə düyməni təyin edək və əsas oxu edək. Çıxışı Seriala çap edəcəyik.
Aşağıdakı koda bir neçə əlavə şərh yazdım ki, şəkildən oxumaq daha asandır.
// Sabitləri təyin edin
#define düyməsini 2 boş quraşdırma () {pinMode (düymə, GİRİŞ); Serial.begin (9600); } void loop () {// int düyməsinin vəziyyətini yoxlamaq üçün rəqəmsal pin oxuyun = digitalRead (düymə); // Düymə basıldığı təqdirdə YÜKSƏK, əks halda LOW (basıldığında == YÜKSƏK) {Serial.println ("Basıldı!"); }}
Tamam, yaxşı işləyir!
Əslində, etdiyimiz şey, hər dəfə kod döngələrində rəqəmsal pin vəziyyətini yoxlamaqdır. Simulyasiyaya Başla düyməsini basarsanız, Serial Monitoru (kodun altındakı düyməni basın) "Basıldı!" dəfələrlə.
Yuxarıdakı kodda görə biləcəyiniz bir xüsusiyyət, if () vəziyyətinin qiymətləndirilməsidir. Kodun etdiyi hər şey bir sual vermək və bu vəziyyətdə doğru olub olmadığını qiymətləndirməkdir. Dəyişənin dəyərinin müəyyən bir dəyərə bərabər olub olmadığını yoxlamaq üçün bərabərdir (ikiqat bərabər işarələr, məsələn: ==). A DigitalRead () ya YÜKSƏL, ya da DÜŞÜK qaytarır.
İf () else if / else istifadə edərək bir çox şərtləri və ya bütün şərtləri yoxlaya bilərik və Arduino Basics -ə qayıtsanız, edə biləcəyiniz bəzi müqayisələri görəcəksiniz.
İndi… Kodumuz tamam görünə bilər … Amma bir problemimiz var.
Bax, bu simulyatorda olanda həqiqətən yaxşı işləyir. Ancaq əsl elektrik enerjisinin səs -küyü var, xüsusən DC elektronikası. Buna görə düyməmiz bəzən səhv oxunuşu qaytara bilər. Və bu bir problemdir, çünki layihəniz istifadəçi üçün düzgün cavab verə bilməz.
Gəlin düzəldək!
Addım 5: Biraz Çıxış
Düymə problemimizi aradan qaldırmaq üçün debounce adlı bir prosedurdan istifadə edirik. Bu, düymənin basıldığı ilə əslində itələməyə cavab verdiyi vaxt arasında müəyyən bir müddət gözləyir. İstifadəçi üçün hələ də təbii hiss olunur (vaxtınızı çox uzatmasanız). Həm də mətbuatın uzunluğunu yoxlamaq üçün istifadə edə bilərsiniz, buna görə hər dəfə fərqli cavab verə bilərsiniz. Kabellərin heç birini dəyişdirməyə ehtiyac yoxdur!
Kodu nəzərdən keçirək:
#2 düyməsini təyin edin#debounceTimeout 100 təyin edin
İlk dəyişiklik qlobal miqyasdadır. Xatırlayacaqsınız ki, çoxlu funksiyalarımızın istifadə edə biləcəyi dəyişənləri təyin etdiyimiz və ya döngə hər dəfə sıfırlana bilməyənləri təyin edəcəyik. Beləliklə, müəyyən edilmiş sabitlərə debounceTimeout əlavə etdik. Bunu 100 etdik (daha sonra 100 ms -ə çevriləcək), amma daha qısa ola bilər. Artıq və qeyri -təbii hiss edəcəksiniz.
long int lastDebounceTime;
Bu dəyişən sabitlərin altında elan olunur. Bu, uzun nömrələri yaddaşda saxlamağa imkan verən uzun bir int tipidir. Buna lastDebounceTime adını verdik.
Void setup () funksiyasında heç nəyi dəyişməyimizə ehtiyac yoxdur. Gedək o birini.
void loop () {// int düyməsinin vəziyyətini yoxlamaq üçün rəqəmsal pin oxuyun = digitalRead (düymə); uzun int currentTime = millis (); // Düymə kodu}
Loop () funksiyasında etdiyimiz ilk dəyişiklik düyməni oxumaq çağırışı altındadır. Cari vaxtı izləmək lazımdır. Millis () funksiyası, Arduinonun milisaniyələrdə başladığından bəri saatın indiki vaxtını qaytarır. Bunu uzun int tipli dəyişənlərdə saxlamalıyıq.
İndi düyməyə basıldığı vaxtdan xəbərdar olduğumuzdan əmin olmalıyıq, buna görə də düyməni basıldıqda sıfırlayırıq. Bax:
void loop () {// int düyməsinin vəziyyətini yoxlamaq üçün rəqəmsal pin oxuyun = digitalRead (düymə); uzun int currentTime = millis (); if (basıldığında == LOW) {// düyməsinə basılmadığı müddətdə sayma müddətini sıfırlayın lastDebounceTime = currentTime; } // Düymə kodu}
If (basıldığında == LOW) alqoritmi düymənin basılmadığını yoxlayır. Əks təqdirdə, kod son debundan sonra cari vaxtı saxlayır. Beləliklə, hər dəfə düyməyə basıldıqda, düymənin nə vaxt basıldığını yoxlaya biləcəyimiz bir nöqtəyə sahibik. Düymənin nə qədər basıldığını görmək və düzgün cavab vermək üçün sürətli bir riyazi hesablama edə bilərik. Kodun qalan hissəsinə baxaq:
void loop () {// int düyməsinin vəziyyətini yoxlamaq üçün rəqəmsal pin oxuyun = digitalRead (düymə); uzun int currentTime = millis (); if (basıldığında == LOW) {// düyməsinə basılmadığı müddətdə sayma müddətini sıfırlayın lastDebounceTime = currentTime; } // Düymə müəyyən bir müddətə basıldı, əgər ((((currentTime - lastDebounceTime)> debounceTimeout)) {// Zaman aşımına çatılıbsa, düyməyə basıldı! Serial.println ("Basıldı!"); }}
Son kod bloku cari vaxtı alır, son çıxılma vaxtını çıxarır və qoyduğumuz zaman aşımı ilə müqayisə edir. Daha böyükdürsə, kod o vaxt üçün düyməni basıldığını qəbul edir və cavab verir. Səliqəli!
Kodunuzu işə salın və işlədiyini yoxlayın. Səhvləriniz varsa, kodunuzu yoxlayın!
İndi praktik bir nümunəyə baxaq.
Addım 6: Menyu hazırlanması
Düymələr maraqlıdır, çünki onlarla çoxlu imkanlar var! Bu nümunədə bir menyu hazırlayacağıq. Tutaq ki, bu möhtəşəm cihazı yaratmısınız və istifadəçilərin müəyyən şeyləri açmaq və ya söndürmək və ya bir parametr üçün xüsusi bir dəyər təyin etmək üçün seçimləri dəyişdirə bilmələrinə ehtiyac duyurlar. Bu üç düyməli dizayn bunu edə bilər!
Beləliklə, bu layihə üçün bizə lazımdır:
- Üç düymə
- Üç rezistor 10 kΩ -a bərabərdir
Onlardan birinə sahibik, digər ikisinə ehtiyacımız var. Odur ki, bunları lövhəyə əlavə edin. Kabel qurmaq bir az daha mürəkkəbdir, ancaq onu həqiqətən yığcam saxlamaq istədiyim üçün. İlk düymə üçün eyni nümunəni izləyə və ya yuxarıdakı şəkli izləyə bilərsiniz.
Üç düymə bir menyu aç/sonrakı seçim, bir dəyişdirmə seçimi (olduğu kimi, ayarı dəyişdirin) və bir saxla/bağla menyu düyməsidir.
Kabel bağlayın, koda baxaq!
Addım 7: Kod Dağılımı - Qlobal
Tamam, bu uzun bir addım olacaq, amma kodun hər hissəsindən keçəcəyəm.
Əvvəlcə lazım olan qlobal dəyişənlərə baxaq.
// Sabitləri təyin edin #menyu təyin et Düymə 2 #menyunu təyin et 3 #menyunu təyin etSave 4 #debunu tərif etTimeout 50 // dəyişənləri təyin et int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Menyu seçimləri char * menuOptions = {"İstiliyi yoxla", "İşığı yoxla"}; bool featureSetting = {yalan, yanlış}; bool menuMode = yanlış; bool menuNeedsPrint = yanlış; int optionSelected = 0;
Bu üç blok əvvəllər gördüyümüzə bənzəyir. Birincisində, üç düyməni və zaman aşımını təyin etdim. Layihənin bu hissəsi üçün bunu 50ms olaraq təyin etdim, buna görə də işləmək üçün qəsdən bir mətbuat lazımdır.
İkinci blok bütün dəyişənlərdir. Biz düyməni izləməliyikPreviousState və sonDebounceTime -ı izləməliyik. Bunlar hamısı int tipli dəyişənlərdir, amma sonuncusu uzun bir tipdir, çünki yaddaşdakı yerə ehtiyacımız olduğunu düşünürəm.
Menyu seçim bloku bir neçə yeni xüsusiyyətə malikdir. Birincisi, simvol/simli hərfi dəyişən olan char * (bəli, qəsdən ulduzdur). Yaddaşdakı statik yaddaşa işarədir. Bunu dəyişdirə bilməzsiniz (məsələn, Pythonda olduğu kimi). Bu char *menuOptions xətti bir sıra simli hərflər yaradır. İstədiyiniz qədər çox menyu əlavə edə bilərsiniz.
Bool featureSetting dəyişən hər bir menyu elementini təmsil edən dəyərlər sırasıdır. Bəli, istədiyiniz hər şeyi saxlaya bilərsiniz, dəyişən növünü dəyişdirin (hamısı eyni tipdə olmalıdır). Bunu idarə etmək üçün lüğətlər və ya tuplar kimi daha yaxşı yollar ola bilər, amma bu tətbiq üçün bu sadədir. Yəqin ki, yerləşdirilən bir tətbiqdə ikincisindən birini yaradardım.
Menyu Modunu izlədim, buna görə də ekranda başqa şeylər istəsəydim bunu edə bilərdim. Ayrıca, sensor məntiqim olsaydı, bir şey ziddiyyət təşkil edərsə, menyu işləyərkən bunu dayandıra bilərdim. Menyu hər zaman yox, müəyyən vaxtlarda çap etmək istədiyim üçün menuNeedsPrint dəyişənim var. Nəhayət, bir seçimSeçilmiş dəyişənim var, buna görə də bir neçə yerdə daxil olarkən seçilmiş seçimi izləyə bilərəm.
Növbəti funksiyalar dəstinə baxaq.
Addım 8: Kod Dağılımı - Quraşdırma və Xüsusi Funksiyalar
Setup () funksiyası kifayət qədər asandır, yalnız üç giriş bəyannaməsi:
void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menuSelect, INPUT); Serial.begin (9600); }
Sonrakı üç xüsusi funksiya. İlk ikisinə, sonra sonuncusuna ayrıca baxaq.
Bəzi məlumatları qaytaran iki funksiyaya ehtiyacımız var. Səbəb, bunun insan tərəfindən oxunan bir növ olduğundan əmin olmaq istəyirik. Bir problemimiz varsa, kodu düzəltməyə də kömək edəcək. Kod:
// Cari seçilmiş variantı qaytarmaq funksiyası *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Qayıdış seçimi Seçilmiş qaytarma menyusu Seçimi; } // Cari seçilmiş variantın vəziyyətini qaytarmaq funksiyası char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Yanlış"; } başqa {optionSettingVal = "Doğru"; } // Qayıdış seçimiSetting qaytarılması optionSettingVal; }
Char *ReturnOptionSelected () funksiyası seçilmiş seçimi yoxlayır (yuxarıda görürsünüzsə bunu izləmək üçün bir dəyişən təyin edirik) və daha əvvəl yaratdığımız massivdən simli hərfi çəkir. Daha sonra onu char tipi olaraq qaytarır. Bunu bilirik, çünki funksiya qaytarılma növünü göstərir.
İkinci funksiya char *ReturnOptionStatus (), serialda saxlanılan seçimin vəziyyətini oxuyur və dəyəri təmsil edən simli hərfi qaytarır. Məsələn, saxladığımız parametr yanlış olarsa, "Yanlış" ı qaytarardım. Bunun səbəbi, istifadəçiyə bu dəyişəni göstərdiyimiz və bütün bu məntiqi bir yerdə saxlamaq daha yaxşıdır. Daha sonra edə bilərdim, amma burada etmək daha məntiqlidir.
// Cari optionbool ToggleOptionSelected () {xüsusiyyətSetting [optionSelected] =! XüsusiyyətSetting [optionSelected]; doğru qayıtmaq; }
Bool ToggleOptionSelected () funksiyası menyuda seçdiyimiz parametrlərin dəyərini dəyişdirmək üçün bir rahatlıq funksiyasıdır. Yalnız dəyəri çevirir. Daha mürəkkəb bir seçiminiz olsaydı, bu tamamilə fərqli ola bilər. Bu funksiyada həqiqəti geri qaytarıram, çünki geri çağırışım (bu funksiyanı işə salan kodun sonrakı çağrısı) doğru/yanlış cavab gözləyir. Bunun işləyəcəyinə 100% əminəm, buna görə işləmədiyini hesab etmədim, ancaq yerləşdirilmiş bir tətbiqdə edərdim (hər halda).
Addım 9: Döngə…
Loop () funksiyası kifayət qədər uzundur, buna görə də hissə -hissə edəcəyik. Bu funksiya daxilində yuvaların altındakı hər şeyi qəbul edə bilərsiniz:
boşluq döngəsi () {
// Burada işləyin <-----}
Yaxşı, əvvəllər bunları gördük:
// düymələri oxuyun int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Cari vaxtı əldə edin int int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// düyməsinə basılmadığı zaman sayma vaxtını sıfırlayın lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }
Burada etməli olduğum şey, üç digitalRead () zənginə əlavə etmək və bütün düymələr aşağı olsaydı, taymeri sıfırlamalı olduğumuzu (lastDebounceTime = currentTime) və əvvəlki bütün vəziyyətləri aşağı səviyyəyə qoymağımdır. Mən də millis () saxlayıram currentTime.
Növbəti bölmə xəttin içərisində yuva qurur
if (((currentTime - lastDebounceTime)> debounceTimeout)) {
// Burada işləyin <----}
Üç bölmə var. Bəli, onları öz funksiyalarına köçürə bilərdim, amma sadəlik üçün üç əsas düymə alqoritmini burada saxladım.
if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // İstifadəçiyə Serial.println bildirin ("Menyu aktivdir"); } else if (menuMode == true && optionSelected = 1) {// Sıfırla seçim optionSelected = 0; } // Menyu menyusunu yazdırınNeedsPrint = doğru; // Əvvəlki düyməni dəyişin. vəziyyət yalnız menyuya baxmaq üçün // düyməsini buraxıb yenidən basıldığı təqdirdə menuButtonPreviousState = menuButtonPressed; // YÜKSEK olardı}
Bu, menuButtonPressed YÜKSƏK olduqda və ya menyu düyməsinə basıldığı zaman idarə olunur. Həm də əvvəlki vəziyyətin LOW olduğundan əmin olmaq üçün yoxlayır, buna görə də düyməni yenidən basmadan əvvəl buraxmaq lazım idi ki, bu da proqramın eyni hadisəni təkrar -təkrar atəşə tutmasını dayandırır.
Sonra menyu aktiv deyilsə onu aktivləşdirdiyini yoxlayır. Seçilmiş ilk variantı çap edəcək (bu, default olaraq menuOptions dizisindəki ilk elementdir. Düyməni ikinci və ya üçüncü dəfə (və s.) Bir dəfə basarsanız, siyahıda növbəti seçimi alacaqsınız. Düzəldə biləcəyim bir şey Bu, sona çatdıqda, başlanğıc vəziyyətinə qayıdır. Bu, dizinin uzunluğunu oxuya bilər və seçimlərin sayını dəyişdirsəniz, geri dönməyi asanlaşdıra bilər, lakin bu, hələlik sadə idi.
Sonuncu kiçik bölmə (// Menyu yazdırır) açıq şəkildə menyunu yazdırır, ancaq eyni zamanda əvvəlki funksiyanı YÜKSƏK olaraq təyin edir, eyni funksiya dönməyəcək (düymənin əvvəllər DÜŞÜK olub olmadığını yoxlamaq haqqında yuxarıdakı qeydimə baxın).
// menuSelect basıldıqda, məntiq təmin edin ((menuSelectPressed == YÜKSEK) && (menuSelectPreviousState == DÜŞÜK)) {əgər (menuMode) {// Seçilmiş seçimi dəyişdirin // Hal -hazırda bu yalnız doğru/yanlışdır // ancaq hər hansı bir şey ola bilər bool toggle = ToggleOptionSelected (); if (keçid) {menuNeedsPrint = doğru; } başqa {Serial.println ("Bir şey səhv oldu. Zəhmət olmasa yenidən cəhd edin"); }} // Vəziyyəti yalnız buraxıldıqda və yenidən basıldıqda keçmək üçün keçin menuSelectPreviousState = menuSelectPressed; }
Bu kod biti, menuSelectPressed düyməsini eyni şəkildə idarə edir, yalnız bu zaman ToggleOptionSelected () funksiyasını işə salırıq. Daha əvvəl dediyim kimi, bu funksiyanı dəyişə bilərsiniz, belə ki, daha çox iş görsün, amma bunu etməyim üçün lazım olan hamısı budur.
Diqqət etməyiniz lazım olan əsas şey, geri çağırmanın müvəffəqiyyətini izləyən və doğru olarsa menyunu yazdıran keçid dəyişənidir. Heç bir şey və ya yalan göstərməsə, səhv mesajını çap edəcək. Bura başqa şeylər etmək üçün geri zənginizi istifadə edə bilərsiniz.
if ((menuSavePressed == YÜKSƏK) && (menuSavePreviousState == DÜŞÜK)) {// Menyudan çıxın // Burada hər hansı bir səliqə yığa bilərsiniz // və ya EEPROM menuMode = saxlaya bilərsiniz; Serial.println ("Menyu çıxdı"); // vəziyyəti dəyişdirmək üçün menyu yalnız menuSavePreviousState = menuSavePressed; }}
Bu funksiya, menyudan yeni çıxan menuSave düyməsini idarə edir. Buranı ləğv edə və ya saxlaya bilərsiniz, bəlkə bir az təmizlik edə və ya EEPROM -da saxlaya bilərsiniz. Sadəcə "Menyu çıxdı" yazdırıram və düymə vəziyyətini YÜKSƏK olaraq təyin edirəm ki, dönməz.
if (menuMode && menuNeedsPrint) {// Menyu çap etdik, buna görə də bir şey // baş verməsə, yenidən çap etməyə ehtiyac yoxdur menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Seçilmiş:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }
Bu menuPrint alqoritmidir, yalnız menyu aktiv olduqda və menuNeedsPrint dəyişəni doğru olaraq təyin edildikdə yanır.
Bu, mütləq öz funksiyasına köçürülə bilər, amma sadəlik naminə..!
Yaxşı, budur! Bütün kod bloku üçün növbəti addıma baxın.
Addım 10: Son Kod Bloku
// Sabitləri təyin edin
#define menuButton 2 #define menuSelect 3 #define menuSave 4 #deune deune debuneTimeout 50 int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // long int lastDebounceTime dəyişənlərini təyin edin; bool lightSensor = doğru; bool tempSensor = doğru; // Menyu seçimləri char * menuOptions = {"İstiliyi yoxla", "İşığı yoxla"}; bool featureSetting = {yalan, yanlış}; bool menuMode = yanlış; bool menuNeedsPrint = yanlış; int optionSelected = 0; // Quraşdırma funksiyası
void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (menuSelect, INPUT); Serial.begin (9600); }
// Cari seçilmiş seçimi qaytarmaq funksiyası char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Qayıdış seçimi Seçilmiş qaytarma menyusu Seçimi; } // Cari seçilmiş variantın vəziyyətini qaytarmaq funksiyası char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Yanlış"; } başqa {optionSettingVal = "Doğru"; } // Qayıdış seçimiSetting qaytarılması optionSettingVal; } // Mövcud seçimi dəyişdirmək funksiyası bool ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; doğru qayıtmaq; } // Əsas döngə
void loop () {// düymələri oxuyun int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // Cari vaxtı əldə edin int int currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// düyməsinə basılmadığı zaman sayma vaxtını sıfırlayın lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } if (((currentTime - lastDebounceTime)> debounceTimeout)) {// Zaman aşımına çatılıbsa düyməyə basıldı!
// menuButton basıldı, məntiq təmin edin
// Yalnız düymə əvvəl buraxıldıqda yanar ((menuButtonPressed == YÜKSEK) && (menuButtonPreviousState == LOW)) {əgər (menuMode == yanlış) {menuMode = doğru; // İstifadəçiyə Serial.println bildirin ("Menyu aktivdir"); } else if (menuMode == true && optionSelected = 1) {// Sıfırla seçim optionSelected = 0; } // Menyu menyusunu yazdırınNeedsPrint = doğru; // Əvvəlki düyməni dəyişin. vəziyyət yalnız menyuya baxmaq üçün // düyməsini buraxıb yenidən basıldığı təqdirdə menuButtonPreviousState = menuButtonPressed; // YÜKSƏK olardı} // menuSelect basıldığında, məntiqi təmin edin ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Seçilmiş seçimi dəyişdirin // Hal -hazırda bu yalnız doğru/yanlış // ancaq hər hansı bir şey ola bilər bool toggle = ToggleOptionSelected (); if (keçid) {menuNeedsPrint = doğru; } başqa {Serial.print ("Bir şey səhv oldu. Zəhmət olmasa yenidən cəhd edin"); }} // Vəziyyəti yalnız buraxıldıqda və yenidən basıldıqda keçmək üçün keçin menuSelectPreviousState = menuSelectPressed; } if ((menuSavePressed == YÜKSƏK) && (menuSavePreviousState == DÜŞÜK)) {// Menyudan çıxın // Burada hər hansı bir səliqəyə salmaq // və ya EEPROM menuMode = saxlaya bilərsiniz; Serial.println ("Menyu çıxdı"); // vəziyyəti dəyişdirmək üçün menyu yalnız menuSavePreviousState = menuSavePressed; }} // Mövcud menyu seçimini aktiv olaraq çap edin, ancaq bir dəfə çap edin (menuMode && menuNeedsPrint) {// Menyu çap etdik, buna görə də bir şey // baş verməsə, yenidən çap etməyə ehtiyac yoxdur menuNeedsPrint = false; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("Seçilmiş:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }}}
Dövrə Tinkercad saytında mövcuddur. Aşağıdakı dövrəni sizin də görməyiniz üçün yerləşdirdim!
Həmişə olduğu kimi, suallarınız və ya probleminiz varsa, mənə bildirin!
Tövsiyə:
Linux Boot Sürücüsünü Necə Yaratmaq olar (və Necə İstifadə Edilir): 10 Addım
Linux Boot Sürücüsünü Necə Yaratmaq olar (və Necə İstifadə Edilir): Bu Linux, xüsusən də Ubuntu ilə necə başlayacağınıza dair sadə bir girişdir
SplatPost Yazıcısını İstifadə edərək Splatoon 2 -də Şəkil Çap etmək üçün Yeniyetmədən Necə İstifadə Edilir: 10 addım
SplatPost Yazıcısını İstifadə edərək Splatoon 2 -də Şəkil Çap etmək üçün Yeniyetmədən Necə İstifadə Edilir: Bu Təlimat kitabında, ShinyQuagsire tərəfindən SplatPost Yazıcısının necə istifadə olunacağını göstərəcəyəm. Açıq təlimatlar olmasa, komanda xətti ilə təcrübəsi olmayan birinin bir az problemi olardı. Məqsədim, aşağıya doğru addımları asanlaşdırmaqdır
Mac Terminalından Necə İstifadə Edilir və Əsas Fonksiyonlardan Necə İstifadə Edilir: 4 Addım
Mac Terminalını necə istifadə etməli və əsas funksiyaları necə istifadə etməli: MAC Terminalını necə açacağınızı sizə göstərəcəyik. Terminalda ifconfig, qovluqların dəyişdirilməsi, fayllara daxil olmaq və arp kimi bir neçə xüsusiyyət göstərəcəyik. Ifconfig, IP ünvanınızı və MAC reklamınızı yoxlamağa imkan verəcək
Sevimli və Güclü Taxta Robot Qoluna Birləşmək üçün Bir neçə Taxta Necə İstifadə Edilir: 10 Addım
Sevimli və Güclü Taxta Robot Qoluna Birləşmək üçün Bir neçə Taxta Parçadan Necə İstifadə Edilir: Robot qolunun adı WoodenArmdır. Çox yaraşıqlı görünür! WoodenArm haqqında daha ətraflı məlumat almaq istəyirsinizsə, www.lewansoul.com saytına müraciət edin. İndi WoodenArm haqqında bir giriş edə bilərik, davam edək
Şamları Sensor Olaraq İstifadə edən Kompüter Siçanı Olaraq Wiimote Necə İstifadə Edilir !!: 3 addım
Şamları Sensor Olaraq İstifadə edən Kompüter Siçanı Olaraq Wiimote -dan Necə İstifadə Edin !!: Bu təlimat Wii Uzaqdan (Wiimote) cihazınızı kompüterinizə necə bağlayacağınızı və siçan kimi necə istifadə edəcəyinizi göstərəcək