Агуулгын хүснэгт:

Arduino дахь цэс ба товчлуурыг хэрхэн ашиглах вэ: 10 алхам (зурагтай)
Arduino дахь цэс ба товчлуурыг хэрхэн ашиглах вэ: 10 алхам (зурагтай)

Видео: Arduino дахь цэс ба товчлуурыг хэрхэн ашиглах вэ: 10 алхам (зурагтай)

Видео: Arduino дахь цэс ба товчлуурыг хэрхэн ашиглах вэ: 10 алхам (зурагтай)
Видео: SKR PRO V1.1 TFT35 V2 2024, Арваннэгдүгээр
Anonim
Arduino дахь цэс, товчлуурыг хэрхэн ашиглах талаар
Arduino дахь цэс, товчлуурыг хэрхэн ашиглах талаар

Миний Arduino 101 гарын авлагад танд Tinkercad дээр орчноо хэрхэн тохируулахыг зааж өгөх болно. Би Tinkercad -ийг ашигладаг, учир нь энэ нь оюутнуудад хэлхээ бий болгох олон ур чадварыг харуулах боломжийг олгодог нэлээд хүчирхэг онлайн платформ юм. Миний бүх хичээлийг Arduino IDE болон жинхэнэ Arduino ашиглан бүтээхэд бэлэн байгаарай!

Энэ гарын авлагад бид товчлууруудын талаар сурах болно! Бид мэдэх хэрэгтэй:

  • Тэднийг яаж утсаар холбох вэ
  • Тэдний үнэ цэнийг уншиж байна
  • Дебунга хийх, энэ нь яагаад чухал вэ
  • Практик програм (цэс үүсгэх)

Ихэнх хүмүүс гэрлийг асаах, унтраах нь товчлуураар хийх хамгийн практик зүйл гэж боддог. Бид энд байх болно! Бид өөрсдийнхөө гараар цэс үүсгэж Arduino дээр зарим сонголтыг тохируулах болно.

Бэлэн үү? Эхэлцгээе!

Алхам 1: Удирдах зөвлөлийг тохируулах

Удирдах зөвлөлийг тохируулах
Удирдах зөвлөлийг тохируулах
Удирдах зөвлөлийг тохируулах
Удирдах зөвлөлийг тохируулах

Эхний алхам бол Arduino болон Breadboard Small загварыг загварчлах хэсэгт байрлуулах явдал юм. Цахилгаан шугамыг хэрхэн яаж холбохыг харахын тулд дээрх зургуудыг үзээрэй.

Breadboard Mini нь дээд ба доод гэсэн хоёр цахилгаан төмөр замтай. Бид эдгээрийг Arduino руу холбодог бөгөөд ингэснээр бид илүү олон бүрэлдэхүүн хэсгүүдийг эрчим хүчээр хангах боломжтой болно. Хожим нь энэ гарын авлагад бид 3 товчлуур ашиглах тул бидэнд илүү их хүч хэрэгтэй болно. Анхаарах зүйл бол жижигхэн талхны тавцан дээр цахилгааны төмөр зам нь хөндлөн чиглэлд самбар дээгүүр өнгөрдөг. Энэ нь дунд хэсэгт байгаа үндсэн загварчлах хэсгийн багануудаас ялгаатай; эдгээр нь босоо чиглэлд ажилладаг. Та дунд хэсэгт байрлах үндсэн баганын аль ч баганыг цахилгаан тэжээлийн зүүгээр ашиглаж болно.

Эрчим хүч нэмэх үед хар ба улаан утсыг сөрөг ба эерэг утгаар нь ашигла. Төгсгөлд нь самбарын нөгөө талд хүчдэл өгдөг утаснуудыг нэмнэ үү. Бид энэ талыг ашиглахгүй, гэхдээ энэ бол сайн туршлага юм.

Алхам 2: Товчлуур ба резисторыг нэмнэ үү

Товчлуур ба резисторыг нэмнэ үү
Товчлуур ба резисторыг нэмнэ үү
Товчлуур ба резисторыг нэмнэ үү
Товчлуур ба резисторыг нэмнэ үү
Товчлуур ба резисторыг нэмнэ үү
Товчлуур ба резисторыг нэмнэ үү

Бүрэлдэхүүн хэсгүүдийн тавиур дээрээс жижиг товчлуурыг нэмнэ үү. Энэ нь зураг дээрх шиг харагдах ёстой. Энэ нь унтраалга биш эсэхийг шалгаарай! Мөн резистор нэмнэ үү. Үүнийг товшоод 10kΩ болгож тохируулна уу. Энэ нь холбогдоогүй үед зүүг доош татахад хангалттай бөгөөд энэ нь кодын сүүлд маш чухал юм.

Бүрэлдэхүүн хэсгийг талхны хавтангийн дунд байрлуулна. Товчлуурын ажиллах арга нь:

  • Булангаас булан хүртэл, товчлуур холбогдоогүй байна. Товчлуурыг дарах нь контактуудыг хааж, булангуудыг холбоно.
  • Товчлуурын талууд хоорондоо холбогдсон байна. Хэрэв та зүүн дээд ба зүүн доод хэсэгт утас холбосон бол хэлхээ хаагдах болно.

Тиймээс бид бүрэлдэхүүн хэсгийг зайны дунд байрлуулна. Энэ нь самбар дээрх тээглүүр дор булангуудыг холбоогүй эсэхийг шалгадаг.

Дараагийн алхам нь эдгээр санааг харуулсан хэд хэдэн зургийг өгөх болно.

Резисторыг баруун доод тээглүүрээс баганын хооронд байрлуул, ингэснээр хэвтээ байрлана.

Алхам 3: Товчлуурын холболтууд

Товчлуурын холболтууд
Товчлуурын холболтууд
Товчлуурын холболтууд
Товчлуурын холболтууд

Дээрх зургууд нь товчлуурууд хэрхэн холбогдож байгааг тодорхой харуулдаг. Хэрэв та ямар нэгэн зүйл сайн гэж бодож байвал энэ нь ажиллахгүй байгаа нь үргэлж төөрөгдөлд оруулдаг байсан!

Одоо утаснуудаа нэмье.

  • Эерэг тэжээлийн зүүгээс улаан туяаг товчлуур дээр баруун доод зүүтэй ижил багана дээр байрлуулна
  • Сөрөг тэжээлийн зүүгээс резистортой ижил багана руу хар тугалга тавь.
  • Өнгөт утсыг (улаан/хар биш) зүүн дээд булнаас Arduino дээрх Digital Pin 2 руу байрлуулна

Дээрх зургуудыг шалгаад таны утас зөв эсэхийг шалгаарай.

Алхам 4: Код…

Код…
Код…
Код…
Код…

Үндсэн товчлуурын кодыг харцгаая.

Код засварлагчийг нээгээд Блокоос Текст болгон өөрчилнө үү. Ирж буй анхааруулгыг арилгана уу. Бид текстэнд баяртай байна!

Та үндсэн тохиргоог мэддэг тул товчлуурыг тодорхойлоод үндсэн уншилтыг хийцгээе. Бид гаралтыг Цуваа руу хэвлэх болно.

Би доорх код дээр хэдэн нэмэлт тайлбар оруулсан тул зурагнаас илүү уншихад хялбар болно.

// Тогтмол утгыг тодорхойлох

#define товчлуур 2 хүчингүй тохиргоо () {pinMode (товчлуур, INPUT); Цуваа эхлэх (9600); } void loop () {// int товчлуурын статусыг шалгахын тулд дижитал зүүг уншина уу = digitalRead (товчлуур); // Товчлуур дарагдсан бол HIGH буцаана, хэрэв үгүй бол LOW (дарагдсан == HIGH) {Serial.println ("Дарагдсан!"); }}

За, энэ ажиллана!

Үндсэндээ бидний хийх ёстой зүйл бол кодыг гогцоо хийх бүрт дижитал зүүний байдлыг шалгах явдал юм. Хэрэв та Simulation Start товчлуурыг дараад товчлуурыг дарвал Serial Monitor (кодын доорх товчлуур дээр дарна уу) "Дарагдсан!" дахин дахин.

Дээрх кодоос харах нэг онцлог бол if () нөхцлийн үнэлгээ хийгдэж байгаа явдал юм. Энэ тохиолдолд хийх ёстой бүх зүйл бол асуулт асуух, үнэн эсэхийг үнэлэх явдал юм. Хувьсагчийн утга нь тодорхой утгатай тэнцүү эсэхийг шалгахын тулд бид тэнцүү (давхар тэнцүү тэмдгийг, жишээ нь: ==) ашигладаг. DigitalRead () нь HIGH эсвэл LOW -ийг буцаана.

If () else if / else -ийг ашигласнаар бид олон нөхцөл эсвэл бүх нөхцлийг шалгах боломжтой бөгөөд хэрэв та Arduino -ийн үндсэн ойлголт руу буцаж очвол хийж болох зарим харьцуулалтыг харах болно.

Одоо … Манай код бүрэн харагдаж магадгүй … Гэхдээ бидэнд асуудал байна.

Энэ нь симулятор дээр байхдаа үнэхээр сайн ажилладаг болохыг хараарай. Гэхдээ жинхэнэ цахилгаан нь дуу чимээтэй байдаг, ялангуяа DC электроник. Тиймээс бидний товчлуур заримдаа буруу уншилтыг буцааж өгдөг. Энэ бол асуудал, учир нь таны төсөл хэрэглэгчдэд зөв хариулахгүй байж магадгүй юм.

Үүнийг засъя!

Алхам 5: Бяцхан дөнгөх

Бяцхан Debounce
Бяцхан Debounce

Бид товчлуурын асуудлаа даван туулахын тулд debounce гэж нэрлэдэг процедурыг ашигладаг. Энэ нь товчлуурыг дарах болон түлхэлтэд хариу өгөх хооронд тодорхой хугацаанд хүлээгддэг. Энэ нь хэрэглэгчдэд байгалийн мэт санагддаг (хэрвээ та цагийг хэтэрхий урт болгохгүй бол). Та үүнийг хэвлэлийн уртыг шалгахад ашиглаж болно, ингэснээр та өөр өөр хариу өгөх боломжтой болно. Та утсыг солих шаардлагагүй!

Кодыг харцгаая:

#тодорхойлох товчлуур 2#debounceTimeout 100 -ийг тодорхойлох

Эхний өөрчлөлт нь дэлхийн цар хүрээтэй холбоотой юм. Энд бидний олон функц ашиглаж болох эсвэл давталт асах бүрт дахин тохируулах боломжгүй хувьсагчдыг тодорхойлдог гэдгийг та санаж байх болно. Тиймээс бид debounceTimeout -ийг тодорхойлсон тогтмолуудад нэмсэн. Бид үүнийг 100 болгосон (энэ нь дараа нь 100 мс болж орчуулагдах болно), гэхдээ богино байж магадгүй. Удалгүй энэ нь ер бусын мэт санагдах болно.

long int lastDebounceTime;

Энэ хувьсагчийг тогтмолуудын доор зарласан болно. Энэ бол урт int төрөл бөгөөд үндсэндээ урт тоог санах ойд хадгалах боломжийг бидэнд олгодог. Бид үүнийг lastDebounceTime гэж нэрлэсэн.

Void setup () функц дээр бид юу ч өөрчлөх шаардлагагүй. Үүнийг орхиё.

void loop () {// int товчлуурын статусыг шалгахын тулд дижитал зүүг уншина уу = digitalRead (товчлуур); long int currentTime = millis (); // Товчлуурын код}

Loop () функц дээр бидний хийдэг анхны өөрчлөлт бол товчлуурыг унших дуудлага юм. Бид одоогийн цагийг хянах хэрэгтэй. 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 -ийг тодорхойлох #дебунгийн хугацааг тодорхойлох 50 Цаг // хувьсагчийг тодорхойлох int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Цэсийн сонголтууд char * menuOptions = {"Температурыг шалгах", "Гэрлийг шалгах"}; bool featureSetting = {худал, худал}; bool menuMode = худал; bool menuNeedsPrint = худал; int optionSelected = 0;

Эдгээр гурван блок нь бидний өмнө нь үзсэнтэй төстэй юм. Эхнийх нь би гурван товчлуур болон хугацаа дуусах хугацааг тодорхойлсон. Төслийн энэ хэсэгт би үүнийг 50ms болгож тохируулсан тул үүнийг ажиллуулахын тулд зориудаар дарах шаардлагатай болно.

Хоёрдахь блок бол бүх хувьсагч юм. Бид buttonPreviousState -ийг хянаж байх ёстой бөгөөд lastDebounceTime -ийг хянаж байх хэрэгтэй. Эдгээр нь бүгд int төрлийн хувьсагчид боловч сүүлийнх нь урт төрөл юм, учир нь бидэнд санах ойд зай хэрэгтэй гэж бодож байна.

Цэсийн сонголтын хэсэг нь хэд хэдэн шинэ боломжуудтай. Нэгдүгээрт, тэмдэгт/мөрийн шууд хувьсагч болох char * (тийм ээ, энэ бол санаатай од юм). Энэ нь санах ой дахь статик хадгалалтын заагч юм. Та үүнийг өөрчилж чадахгүй (жишээ нь Python дээр хийж болно). Энэ char *menuOptions мөр нь мөрт үсгийн утгуудын массивыг үүсгэдэг. Та хүссэн хэмжээгээрээ цэсийн зүйл нэмж болно.

Bool featureSetting хувьсагч нь цэсийн зүйл бүрийг илэрхийлдэг утгуудын массив юм. Тийм ээ, та дуртай зүйлээ хадгалах боломжтой, зөвхөн хувьсагчийн төрлийг өөрчлөх боломжтой (бүгд ижил төрөл байх ёстой). Үүнийг удирдах толь бичиг, эмхтгэл гэх мэт илүү сайн аргууд байж болох ч энэ нь энэ програмын хувьд энгийн зүйл юм. Би суулгасан аппликешнд сүүлийн хувилбаруудын нэгийг үүсгэх болно.

Би menuMode -ийг хянаж байсан тул хэрэв миний дэлгэц дээр өөр зүйл хийхийг хүсч байвал би үүнийг хийж чадна. Түүнчлэн, хэрэв надад мэдрэгчийн логик байсан бол ямар нэгэн зүйл зөрчилдсөн тохиолдолд цэсийг ажиллуулах явцад үүнийг түр зогсоох боломжтой. Би цэсийг үргэлж биш, тодорхой цагт хэвлэхийг хүсдэг учраас menuNeedsPrint хувьсагчтай. Эцэст нь надад optionSelected хувьсагч байгаа тул би хэд хэдэн газарт хандаж байхдаа сонгосон сонголтыг хянах боломжтой.

Дараагийн функцуудыг авч үзье.

Алхам 8: Кодын задаргаа - Тохиргоо ба захиалгат функцууд

Setup () функц нь хангалттай хялбар бөгөөд ердөө гурван оролтын мэдүүлэг юм.

void setup () {pinMode (menuSelect, INPUT); pinMode (menuSave, INPUT); pinMode (цэсSelect, INPUT); Цуваа эхлэх (9600); }

Дараа нь гурван өөрчлөн тохируулсан функцууд байна. Эхний хоёрыг, дараа нь сүүлийнхийг тусад нь авч үзье.

Бидэнд зарим мэдээллийг буцааж өгдөг хоёр функц хэрэгтэй. Үүний шалтгаан нь бид үүнийг хүн төрөлхтөн унших боломжтой болгохыг хүсч байна. Хэрэв бидэнд асуудал гарвал энэ нь кодыг дибаг хийхэд тусална. Код:

// Одоогийн сонгосон optionchar -ийг буцаах функц *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Буцах сонголтСонгосон буцах цэсOption; } // Одоогийн сонгосон сонголтын статусыг буцаах функц char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Худал"; } өөр {optionSettingVal = "Үнэн"; } // 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 currentTime = millis (); if (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// товчлуур дарагдаагүй байхад тоолох хугацааг дахин тохируулна lastDebounceTime = currentTime; menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }

Энд хийх ёстой зүйл бол гурван digitalRead () дуудлагад нэмж оруулаад, хэрэв бүх товчлуурууд бага байвал бид таймерыг (lastDebounceTime = currentTime) дахин тохируулж, өмнөх бүх төлөвийг хамгийн доод түвшинд тохируулах ёстойг анхаарсан байх ёстой. Би мөн millis () -ийг currentTime -д хадгалдаг.

Дараагийн хэсэг нь шугамын дотор үүрээ засдаг

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

// Энд ажиллаарай <----}

Гурван хэсэг байдаг. Тийм ээ, би тэдгээрийг өөрийн функцэд шилжүүлж болох байсан, гэхдээ хялбар болгох үүднээс би товчлуурын гурван үндсэн алгоритмыг энд хадгалсан.

if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // Хэрэглэгчид Serial.println ("Цэс идэвхтэй байна") мэдэгдээрэй; } if if (menuMode == true && optionSelected = 1) {// Дахин тохируулах сонголт optionSelected = 0; } // цэсийн цэсийг хэвлэх хэрэгтэйNeedsPrint = true; // Өмнөх товчлуурыг асаах. төлөвийг зөвхөн цэсийг харуулах // товчлуурыг суллаад дахин дарвал menuButtonPreviousState = menuButtonPressed; // Өндөр байх болно}

Энэ нь menuButtonPressed HIGH өндөр байх үед эсвэл цэсийн товчлуур дарагдсан үед хийгддэг. Энэ нь мөн өмнөх төлөв LOW байсан эсэхийг шалгадаг бөгөөд ингэснээр товчлуурыг дахин дарахаас өмнө суллах шаардлагатай болдог бөгөөд энэ нь нэг үйл явдлыг дахин дахин асаахаас сэргийлдэг.

Дараа нь хэрэв цэс идэвхгүй бол түүнийг идэвхжүүлдэг эсэхийг шалгадаг. Энэ нь сонгосон эхний сонголтыг хэвлэх болно (энэ нь анхдагчаар цэсийн сонголтуудын массивын эхний зүйл юм. Хэрэв та товчлуурыг хоёр дахь эсвэл гурав дахь удаагаа дарвал жагсаалтын дараагийн сонголтыг авах болно. Миний засах боломжтой зүйл бол Энэ нь дуусах үед эхлэл рүүгээ буцдаг. Энэ нь массивын уртыг уншиж, хэрэв та сонголтуудын тоог өөрчилсөн бол дугуй унах ажлыг хөнгөвчлөх болно, гэхдээ энэ нь одоогоор энгийн зүйл юм.

Сүүлчийн жижиг хэсэг (// Цэсийг хэвлэнэ) нь цэсийг хэвлэх нь ойлгомжтой боловч өмнөх төлөвийг HIGH болгож тохируулах тул ижил функц ажиллахгүй болно (товчлуур нь өмнө нь LOW байсан эсэхийг шалгах тухай миний тэмдэглэлийг үзнэ үү).

// menuSelect дарагдсан бол логикийг ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Сонгосон сонголтыг өөрчлөх // Одоогийн байдлаар энэ нь үнэн/худал // гэхдээ юу ч байж болно bool toggle = ToggleOptionSelected (); if (сэлгэх) {menuNeedsPrint = үнэн; } өөр {Serial.println ("Алдаа гарлаа. Дахин оролдоно уу"); }} // Төлөвийг зөвхөн суллаж дахин дарсан тохиолдолд л сэлгэнэ. }

Энэ бит код нь menuSelectPressed товчлуурыг мөн адил зохицуулдаг, гэхдээ энэ удаад бид зөвхөн ToggleOptionSelected () функцийг унтраана. Өмнө нь хэлсэнчлэн, та энэ функцийг өөрчилж чадна, ингэснээр илүү ихийг хийх болно, гэхдээ надад үүнийг хийхэд л хангалттай.

Анхаарах гол зүйл бол шилжүүлгийн амжилтыг хянаж, үнэн бол цэсийг хэвлэх явдал юм. Хэрэв энэ нь буруу эсвэл буцааж өгөхгүй бол алдааны мэдэгдлийг хэвлэх болно. Эндээс та дуудлага хийх замаар бусад зүйлийг хийж болно.

if ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// Цэсээс гарах // Энд та ямар ч цэгцлэх ажлыг хийж болно // эсвэл EEPROM menuMode = false дээр хадгална уу; Serial.println ("Цэсээс гарсан"); // Нөхцөл байдлыг өөрчлөх тул цэс зөвхөн menuSavePreviousState = menuSavePressed; }}

Энэ функц нь menuSave товчлуурыг ажиллуулдаг бөгөөд энэ нь цэснээс гарахад л дөхөм болно. Энд та цуцлах эсвэл хадгалах сонголтыг хийх боломжтой, магадгүй цэвэрлэгээ хийх эсвэл EEPROM -д хадгалах боломжтой. Би зүгээр л "Цэсээс гарлаа" гэж хэвлээд товчлуурын төлөвийг HIGH болгож тохируулна.

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 хувьсагчийг үнэн гэж тохируулсан үед л ажилладаг.

Үүнийг өөрийн функцэд шилжүүлэх нь гарцаагүй, гэхдээ энгийн байх үүднээс..!

За ингээд боллоо! Дараагийн алхамыг бүхэлд нь кодын блокоос үзнэ үү.

Алхам 10: Эцсийн кодын блок

// Тогтмол утгыг тодорхойлох

#define menuButton 2 #define menuSeve 3 #define menuSave 4 #deune debuneTimeout 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 (цэсSelect, INPUT); Цуваа эхлэх (9600); }

// Одоогийн сонгосон сонголтыг буцаах функц char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // Буцах сонголтСонгосон буцах цэсOption; } // Одоогийн сонгосон сонголтын статусыг буцаах функц char *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; if (optionSetting == false) {optionSettingVal = "Худал"; } өөр {optionSettingVal = "Үнэн"; } // 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 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 ("Цэс идэвхтэй байна") мэдэгдээрэй; } if if (menuMode == true && optionSelected = 1) {// Дахин тохируулах сонголт optionSelected = 0; } // цэсийн цэсийг хэвлэх хэрэгтэйNeedsPrint = true; // Өмнөх товчлуурыг асаах. төлөвийг зөвхөн цэсийг харуулах // товчлуурыг суллаад дахин дарвал menuButtonPreviousState = menuButtonPressed; // Өндөр байх болно} // menuSelect дарагдсан бол логик өг ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {if (menuMode) {// Сонгосон сонголтыг өөрчлөх // Одоогийн байдлаар энэ нь зүгээр л үнэн/худал // гэхдээ юу ч байж болно bool toggle = ToggleOptionSelected (); if (сэлгэх) {menuNeedsPrint = үнэн; } өөр {Serial.print ("Алдаа гарлаа. Дахин оролдоно уу"); }} // Төлөвийг зөвхөн суллаж дахин дарсан тохиолдолд л сэлгэнэ. } 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 сайт дээрээс авах боломжтой. Би бас доорх хэлхээг суулгасан бөгөөд та ч бас үүнийг хараарай!

Урьдын адил, хэрэв танд асуулт, асуудал байвал надад мэдэгдээрэй!

Зөвлөмж болгож буй: