ዝርዝር ሁኔታ:

በአርዱዲኖ ውስጥ አንድ ምናሌ ፣ እና አዝራሮችን እንዴት መጠቀም እንደሚቻል -10 ደረጃዎች (ከስዕሎች ጋር)
በአርዱዲኖ ውስጥ አንድ ምናሌ ፣ እና አዝራሮችን እንዴት መጠቀም እንደሚቻል -10 ደረጃዎች (ከስዕሎች ጋር)

ቪዲዮ: በአርዱዲኖ ውስጥ አንድ ምናሌ ፣ እና አዝራሮችን እንዴት መጠቀም እንደሚቻል -10 ደረጃዎች (ከስዕሎች ጋር)

ቪዲዮ: በአርዱዲኖ ውስጥ አንድ ምናሌ ፣ እና አዝራሮችን እንዴት መጠቀም እንደሚቻል -10 ደረጃዎች (ከስዕሎች ጋር)
ቪዲዮ: On/OFF LED using Arduino Programming Full Video Basic To Advanced Languages #onoffledusingarduino 2024, ህዳር
Anonim
በአርዱዲኖ ውስጥ አንድ ምናሌ ፣ እና አዝራሮችን እንዴት እንደሚጠቀሙ
በአርዱዲኖ ውስጥ አንድ ምናሌ ፣ እና አዝራሮችን እንዴት እንደሚጠቀሙ

በእኔ Arduino 101 አጋዥ ስልጠና ውስጥ አካባቢዎን በ Tinkercad ውስጥ እንዴት እንደሚያዋቅሩ ይማራሉ። Tinkercad ን እጠቀማለሁ ምክንያቱም ወረዳዎችን ለመገንባት ለተማሪዎች የተለያዩ ክህሎቶችን ለማሳየት የሚያስችለኝ በጣም ኃይለኛ የመስመር ላይ መድረክ ነው። አርዱዲኖ አይዲኢ እና እውነተኛ አርዱዲኖን በመጠቀም ሁሉንም ትምህርቶቼን ለመገንባት ነፃ ይሁኑ!

በዚህ መማሪያ ውስጥ ስለ አዝራሮች እንማራለን! ማወቅ ያለብን

  • እነሱን እንዴት ሽቦ ማድረግ እንደሚቻል
  • ዋጋቸውን በማንበብ
  • ደደብ ፣ እና ለምን አስፈላጊ ነው
  • ተግባራዊ ትግበራ (ምናሌ መፍጠር)

ብዙ ሰዎች በአዝራር ለማድረግ በጣም ተግባራዊው ነገር መብራት ማብራት እና ማጥፋት ነው ብለው ያስባሉ። እናደርጋለን ፣ እዚህ አይደለንም! እኛ ምናሌን ለመፍጠር እና በአርዱዲኖ ላይ አንዳንድ አማራጮችን ለማዘጋጀት የእኛን እንጠቀማለን።

ዝግጁ? እንጀምር!

ደረጃ 1 - ሰሌዳውን ያዋቅሩ

ሰሌዳውን ያዋቅሩ
ሰሌዳውን ያዋቅሩ
ሰሌዳውን ያዋቅሩ
ሰሌዳውን ያዋቅሩ

የመጀመሪያው እርምጃ አርዱዲኖ እና የዳቦ ሰሌዳ ትንንሽ በፕሮቶታይፕ አካባቢው ላይ ማድረግ ነው። የኃይል መስመሮችን እንዴት ሽቦ ማገናኘት እንደሚቻል ለማየት ከላይ ያሉትን ምስሎች ይመልከቱ።

የዳቦ ሰሌዳ ሚኒ ከላይ እና ታች ሁለት የኃይል ሀዲዶች አሉት። ለተጨማሪ አካላት ኃይል መስጠት እንድንችል እነዚህን ወደ አርዱዲኖ እናገናኛለን። በኋላ በዚህ መማሪያ ውስጥ 3 አዝራሮችን እንጠቀማለን ስለዚህ የበለጠ ኃይል እንፈልጋለን። ልብ ሊባል የሚገባው ነገር በእንጀራ ሰሌዳ ላይ ትንሽ ፣ የኃይል መስመሮቹ በቦርዱ ላይ በአግድም ይሮጣሉ። ይህ በመሃል ላይ ባለው ዋናው የፕሮቶታይፕ አካባቢ ከሚገኙት ዓምዶች የተለየ ነው ፤ እነዚህ በአቀባዊ ይሮጣሉ። በመሃል ላይ ባለው ዋና ቦታ ላይ ለማንኛውም አምድ ኃይል ለመስጠት ማንኛውንም የኃይል ቁልፎችን መጠቀም ይችላሉ።

ኃይልን በሚጨምሩበት ጊዜ ጥቁር እና ቀይ ሽቦዎችን ወደ አሉታዊ እና አዎንታዊ በቅደም ተከተል ይጠቀሙ። ወደ ቦርዱ ሌላኛው ጎን ኃይል የሚያሽከረክሩትን ገመዶች መጨረሻ ላይ ያክሉ። ያንን ወገን አንጠቀምም ፣ ግን ጥሩ ልምምድ ነው።

ደረጃ 2 አዝራሩን እና ተከላካዩን ያክሉ

አዝራሩን እና ተከላካዩን ያክሉ
አዝራሩን እና ተከላካዩን ያክሉ
አዝራሩን እና ተከላካዩን ያክሉ
አዝራሩን እና ተከላካዩን ያክሉ
አዝራሩን እና ተከላካዩን ያክሉ
አዝራሩን እና ተከላካዩን ያክሉ

ከአካላት ትሪው ትንሽ የግፊት ቁልፍን ያክሉ። በምስሉ ላይ ያለውን መምሰል አለበት። መቀየሪያ አለመሆኑን ያረጋግጡ! እንዲሁም ተከላካይ ያክሉ። እሱን ጠቅ ያድርጉ እና እሴቱን ወደ 10 ኪ. ያ በማይገናኝበት ጊዜ ፒኑን ዝቅ ለማድረግ በቂ ነው ፣ ይህም በኋላ በኮዱ ውስጥ በጣም አስፈላጊ ነው።

በዳቦ ሰሌዳው መሃል ላይ ክፍሉን ያስቀምጡ። አንድ አዝራር የሚሠራበት መንገድ የሚከተለው ነው-

  • ወደ ጥግ ፣ አዝራሩ አልተገናኘም። አዝራሩን መግፋት እውቂያዎቹን ይዘጋል እና ማዕዘኖቹን ያገናኛል።
  • የአዝራሩ ጎኖች ተገናኝተዋል። ከላይ ወደ ግራ እና ከታች ግራ ሽቦ ካገናኙ ወረዳው ይዘጋል።

ለዚህም ነው ክፍሉን በመሃል ላይ ባለው ክፍተት ላይ የምናስቀምጠው። ማዕዘኖቹ በቦርዱ ውስጥ ባሉት ካስማዎች ስር አለመገናኘታቸውን ያረጋግጣል።

ቀጣዩ ደረጃ እነዚህን ነጥቦች የሚያሳዩ ሁለት ምስሎችን ይሰጣል።

አምሳያዎቹን ከታች በስተቀኝ ካለው ፒን (resistor) ያስቀምጡ ፣ ስለዚህ በአግድም ይቀመጣል።

ደረጃ 3 የአዝራር ግንኙነቶች

የአዝራር ግንኙነቶች
የአዝራር ግንኙነቶች
የአዝራር ግንኙነቶች
የአዝራር ግንኙነቶች

ከላይ ያሉት ምስሎች ቁልፎቹ እንዴት እንደሚገናኙ በትክክል ግልፅ ያደርጉታል። የሆነ ነገር ሁሉም ጥሩ ነው እና አይሰራም ብለው ሲያስቡ ሁል ጊዜ ግራ መጋባት ነበር!

አሁን ሽቦዎቹን እንጨምር።

  • በአዝራሩ ላይ ካለው የታችኛው የቀኝ ፒን ከአዎንታዊ የኃይል ፒን ወደ ተመሳሳይ አምድ ቀይ መሪን ያስቀምጡ
  • ከአሉታዊ የኃይል ፒን ወደ ተቃዋሚው ተመሳሳይ አምድ ጥቁር መሪን ያስቀምጡ።
  • ከላይኛው የግራ ፒን እስከ ዲጂታል ፒን 2 ድረስ በአርዱዲኖ ላይ ባለቀለም ሽቦ (ቀይ/ጥቁር ያልሆነ) ያስቀምጡ

ሽቦዎ ትክክል መሆኑን ለማረጋገጥ ከላይ ያሉትን ምስሎች ይመልከቱ።

ደረጃ 4: ኮዱ…

ኮዱ…
ኮዱ…
ኮዱ…
ኮዱ…

ለመሠረታዊ አዝራር ኮዱን እንመልከት።

የኮድ አርታኢውን ይክፈቱ እና ከ ብሎኮች ወደ ጽሑፍ ይለውጡ። የሚመጣውን ማስጠንቀቂያ ያፅዱ። በጽሑፍ ደስተኞች ነን!

እርስዎ መሰረታዊ ቅንብሩን ያውቃሉ ፣ ስለዚህ ቁልፉን እንገልፅ እና መሠረታዊ ንባብን እናድርግ። ውጤቱን ወደ Serial እናተምታለን።

ከምስሉ ይልቅ ለማንበብ ቀላል እንዲሆን ከዚህ በታች ባለው ኮድ ውስጥ ጥቂት ተጨማሪ አስተያየቶችን አስቀምጫለሁ።

// ቋሚዎችን ይግለጹ

#ገላጭ አዝራር 2 ባዶነት ማዋቀር () {pinMode (አዝራር ፣ ግቤት) ፤ Serial.begin (9600); } ባዶነት loop () {// የአዝራር ሁኔታን ለመፈተሽ ዲጂታል ፒኑን ያንብቡ / ተጭኗል = digitalRead (አዝራር) ፤ // አዝራሩ ከተጫነ HIGH ይመለሳል ፣ ካልሆነ ካልሆነ (ከተጫነ == ከፍተኛ) {Serial.println (“ተጭኗል!”) ፤ }}

ደህና ፣ ያ ይሠራል!

በዋናነት እኛ እያደረግን ያለነው ኮዱ በሚዞርበት ጊዜ ሁሉ የዲጂታል ፒኑን ሁኔታ ማረጋገጥ ነው። ማስመሰል ጀምርን ጠቅ ካደረጉ እና አዝራሩን ከተጫኑ ተከታታይ ማሳያውን (ከኮዱ በታች ያለውን አዝራር ጠቅ ያድርጉ) ማሳያ “ተጭኗል!” በተደጋጋሚ።

ከላይ ባለው ኮድ ውስጥ የሚያዩት አንድ ባህሪ () ሁኔታ ግምገማ እየተካሄደ ከሆነ ነው። ኮዱ እያደረገ ያለው ሁሉ ጥያቄ መጠየቅ እና እውነት ከሆነ መገምገም ነው ፣ በዚህ ጉዳይ ላይ። የተለዋዋጩ እሴት ከተወሰነ እሴት ጋር እኩል መሆኑን ለመፈተሽ እኩል (እኩል ድርብ ምልክቶች ፣ እንደዚህ ያለ ==) እንጠቀማለን። ዲጂታል አንባቢ () ከፍ ያለ ወይም ዝቅተኛ ይመለሳል።

እኛ (/) ሌላ ከሆነ / እኛ ብዙ ሁኔታዎችን ወይም ሁሉንም ሁኔታዎች መፈተሽ ከቻልን ፣ እና ወደ አርዱinoኖ መሠረታዊ ነገሮች ከተመለሱ ፣ ሊያደርጓቸው የሚችሏቸው አንዳንድ ንፅፅሮችን ያያሉ።

አሁን… ኮዳችን የተጠናቀቀ ሊመስል ይችላል… ግን ችግር አለብን።

ተመልከቱ ፣ በማስመሰል ውስጥ በሚሆንበት ጊዜ በትክክል ይሠራል። ነገር ግን እውነተኛ ኤሌክትሪክ ጫጫታ አለው ፣ በተለይም የዲሲ ኤሌክትሮኒክስ። ስለዚህ የእኛ አዝራር አንዳንድ ጊዜ የሐሰት ንባብን ሊመልስ ይችላል። እና ያ ችግር ነው ፣ ምክንያቱም ፕሮጀክትዎ ለተጠቃሚው ትክክለኛውን መንገድ ላይመልስ ይችላል።

እናስተካክለው!

ደረጃ 5 - ትንሽ መዘግየት

ትንሽ መዘግየት
ትንሽ መዘግየት

የእኛን የአዝራር ችግር ለማሸነፍ debounce የሚባል አሰራርን እንጠቀማለን። ይህ በመሠረቱ ቁልፉ በተገፋበት እና በእውነቱ ለገፋው ምላሽ በሚሰጥበት ጊዜ መካከል የተወሰነ ጊዜን ይጠብቃል። አሁንም ለተጠቃሚው ተፈጥሮአዊ ይመስላል (ጊዜውን በጣም ረጅም ካላደረጉ በስተቀር)። እንዲሁም የፕሬስ ርዝመትን ለመፈተሽ ሊጠቀሙበት ይችላሉ ፣ ስለዚህ በእያንዳንዱ ጊዜ በተለየ መንገድ ምላሽ መስጠት ይችላሉ። ማንኛውንም ሽቦ መለወጥ አያስፈልግዎትም!

እስቲ ኮዱን እንመልከት -

#ገላጭ አዝራር 2#debounceTimeout 100 ን ይግለጹ

የመጀመሪያው ለውጥ በአለምአቀፍ ስፋት ላይ ነው። ብዙ ተግባሮቻችን ሊጠቀሙባቸው የሚችሉትን ወይም የሉፕ እሳት በሚነሳበት በእያንዳንዱ ጊዜ ዳግም ማስጀመር የማይችሉትን ተለዋዋጮች የምንገልጽበት ያንን ያስታውሳሉ። ስለዚህ ፣ ወደ ተለዩ ቋሚዎች (debounceTimeout) አክለናል። ይህንን 100 አድርገናል (በኋላ ወደ 100ms ይተረጉማል) ፣ ግን አጭር ሊሆን ይችላል። ከአሁን በኋላ እና ከተፈጥሮ ውጭ ሆኖ ይሰማዋል።

ረጅም int lastDebounceTime;

ይህ ተለዋዋጭ ከቋሚዎቹ በታች ይገለጻል። ይህ ረጅም የ int ዓይነት ነው ፣ እሱም በመሠረቱ ረጅም ቁጥሮችን በማስታወስ ውስጥ ለማከማቸት ያስችለናል። እኛ የመጨረሻውDebounceTime ብለን ጠራነው።

በባዶ ማዋቀር () ተግባር ውስጥ ማንኛውንም ነገር መለወጥ አያስፈልገንም። ያንን እንተወው።

ባዶነት loop () {// የአዝራር ሁኔታን ለመፈተሽ ዲጂታል ፒኑን ያንብቡ / ተጭኗል = digitalRead (አዝራር) ፤ long int currentTime = millis (); // የአዝራር ኮድ}

በ loop () ተግባር ውስጥ የምናደርገው የመጀመሪያው ለውጥ አዝራሩን ለማንበብ ከጥሪው በታች ነው። የአሁኑን ጊዜ መከታተል አለብን። ሚሊዱ () ተግባሩ አርዱዲኖ በሚሊሰከንዶች ውስጥ ከተነሳበት ጊዜ ጀምሮ የአሁኑን የሰዓት ሰዓት ይመልሳል። ይህንን በረጅም የ int ዓይነት ተለዋዋጭ ውስጥ ማከማቸት አለብን።

አሁን ፣ አዝራሩ ከተጫነበት ጊዜ ጀምሮ ጊዜውን እንዳወቅን ማረጋገጥ አለብን ፣ ስለዚህ እሱ ካልተጫነ ሰዓት ቆጣሪውን እናስጀምራለን። ተመልከት:

ባዶነት loop () {// የአዝራሩን ሁኔታ ለመፈተሽ ዲጂታል ፒኑን ያንብቡ / ተጭኗል = digitalRead (አዝራር) ፤ long int currentTime = millis (); ከሆነ (ተጭኖ == LOW) {// አዝራሩ እስካልተጫነ ድረስ የመቁጠሪያ ሰዓቱን ዳግም ያስጀምሩት lastDebounceTime = currentTime; } // የአዝራር ኮድ}

አዝራሩ ካልተጫነ የ (ተጭኖ == LOW) ስልተ ቀመር ይፈትሻል። ካልሆነ ፣ ከዚያ ኮዱ የአሁኑን ጊዜ ያከማቻል። በዚያ መንገድ ፣ አዝራሩ በተጫነ ቁጥር ፣ አዝራሩ ሲጫን የምንፈትሽበት የጊዜ ነጥብ አለን። ከዚያ አዝራሩ ለምን ያህል እንደተጫነ ለማየት እና በትክክል ምላሽ ለመስጠት ፈጣን የሂሳብ ስሌት ማድረግ እንችላለን። ቀሪውን ኮድ እንመልከት -

ባዶነት loop () {// የአዝራሩን ሁኔታ ለመፈተሽ ዲጂታል ፒኑን ያንብቡ / ተጭኗል = digitalRead (አዝራር) ፤ long int currentTime = millis (); ከሆነ (ተጭኖ == LOW) {// አዝራሩ እስካልተጫነ ድረስ የመቁጠሪያ ሰዓቱን ዳግም ያስጀምሩት lastDebounceTime = currentTime; } // አዝራር ለተወሰነ ጊዜ ተጭኗል (((currentTime - lastDebounceTime)> debounceTimeout)) {// የጊዜ ማብቂያው ከተደረሰ አዝራሩ ተጭኗል! Serial.println ("ተጭኗል!"); }}

የመጨረሻው የኮድ እገዳ የአሁኑን ጊዜ ይወስዳል ፣ የመጨረሻውን የመልቀቂያ ጊዜን በመቀነስ እና እኛ ካደረግነው የጊዜ ማብቂያ ጋር ያወዳድራል። የሚበልጥ ከሆነ ኮዱ ለዚያ ጊዜ ቁልፉ ተጭኖ መልስ ይሰጣል ብሎ ይገምታል። ንፁህ!

ኮድዎን ያሂዱ እና የሚሰራ መሆኑን ያረጋግጡ። ስህተቶች ካሉዎት ኮድዎን ይፈትሹ!

አሁን ፣ ተግባራዊ ምሳሌን እንመልከት።

ደረጃ 6 - ምናሌን ማዘጋጀት

የምናሌ ዝግጅት
የምናሌ ዝግጅት

አዝራሮች አስደሳች ናቸው ፣ ምክንያቱም ከእነሱ ጋር ብዙ ዕድሎች አሉ! በዚህ ምሳሌ ውስጥ ምናሌ እናደርጋለን። እስቲ ይህን በጣም ጥሩ መሣሪያ ፈጥረዋል እንበል ፣ እና ተጠቃሚዎች የተወሰኑ ነገሮችን ለማብራት ወይም ለማጥፋት አማራጮችን መለወጥ ወይም ለቅንብር የተወሰነ እሴት ማዘጋጀት እንዲችሉ ይፈልጋሉ። ይህ ሶስት የአዝራር ንድፍ ያንን ማድረግ ይችላል!

ስለዚህ ለዚህ ፕሮጀክት እኛ ያስፈልገናል-

  • ሶስት አዝራሮች
  • ሶስት ተቃዋሚዎች ወደ 10 ኪ

እኛ ከእነዚህ ውስጥ አንዱ አለን ፣ ሌሎቹን ሁለት ብቻ እንፈልጋለን። ስለዚህ እነዚያን በቦርዱ ላይ ይጨምሩ። ሽቦ ማበጀት ትንሽ የበለጠ የተወሳሰበ ነው ፣ ግን በእውነቱ የታመቀ እንዲሆን ስለፈለግኩ ብቻ። ለመጀመሪያው አዝራር ተመሳሳይ ንድፍ መከተል ወይም ከላይ ያለውን ምስል መከተል ይችላሉ።

ሦስቱ አዝራሮች ምናሌ ክፍት/ቀጣዩ አማራጭ ፣ የለውጥ አማራጭ (እንደ ውስጥ ፣ ቅንብሩን ይለውጡ) እና የማስቀመጫ/ዝጋ ምናሌ ቁልፍ ናቸው።

ያገናኙት ፣ ኮዱን እንመልከት!

ደረጃ 7 የኮድ መበላሸት - ዓለም አቀፍ

ደህና ፣ ይህ ረጅም እርምጃ ይሆናል ፣ ግን እኔ በእያንዳንዱ የኮድ ክፍል ውስጥ እሄዳለሁ።

በመጀመሪያ ፣ የሚያስፈልጉትን ዓለም አቀፍ ተለዋዋጮች እንመልከት።

// ቋሚዎችን ይግለጹ #ምናሌን ይግለጹ አዝራር 2 #ምናሌን ይምረጡ 3 #ምናሌን ይግለጹ አስቀምጥ 4 #መግለፅን ማስቀረት ጊዜን 50 // ተለዋዋጮችን በ ምናሌ ውስጥ ይግለጹ ButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int ምናሌSavePreviousState = LOW; ረጅም int lastDebounceTime; // የምናሌ አማራጮች char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {ሐሰት ፣ ሐሰት}; bool menuMode = ሐሰት; bool menuNeedsPrint = ሐሰት; int optionSelected = 0;

እነዚህ ሶስት ብሎኮች ከዚህ በፊት ካየነው ጋር ተመሳሳይ ናቸው። በመጀመሪያው ውስጥ ሦስቱን አዝራሮች እና የጊዜ ማብቂያውን ገልጫለሁ። ለዚህ የፕሮጀክቱ ክፍል እኔ ወደ 50ms አስቀምጫለሁ ስለዚህ እንዲሠራ ሆን ተብሎ ፕሬስ ይፈልጋል።

ሁለተኛው እገዳ ሁሉም ተለዋዋጮች ናቸው። አዝራሩን መከታተል አለብን ቅድመ ሁኔታ ፣ እና የመጨረሻውን የ DebounceTime መከታተል አለብን። እነዚህ ሁሉም የ int ዓይነት ተለዋዋጮች ናቸው ፣ ግን የመጨረሻው ረዥም ዓይነት ነው ምክንያቱም እኔ በማስታወሻ ውስጥ ቦታ እንፈልጋለን ብዬ ስለምገምታ።

የምናሌ አማራጮች እገዳ ጥቂት አዳዲስ ባህሪዎች አሉት። በመጀመሪያ ፣ ቻር * (አዎ ፣ ያ ሆን ተብሎ ኮከብ ምልክት ነው) ፣ እሱም የቁምፊ/ሕብረቁምፊ ቃል በቃል ተለዋዋጭ ነው። በማህደረ ትውስታ ውስጥ ወደ የማይንቀሳቀስ ማከማቻ ጠቋሚ ነው። እርስዎ መለወጥ አይችሉም (ለምሳሌ በ Python ውስጥ እንደ ማድረግ)። ይህ የቻር *ምናሌ አማራጮች መስመር የሕብረቁምፊ ሥነ -ጽሑፍ ድርድርን ይፈጥራል። የፈለጉትን ያህል የምናሌ ንጥሎችን ማከል ይችላሉ።

የባሌ ባህሪ ቅንብር ተለዋዋጭ እያንዳንዱን ምናሌ ንጥል የሚያመለክቱ የእሴቶች ድርድር ብቻ ነው። አዎ ፣ የሚወዱትን ማንኛውንም ነገር ማከማቸት ይችላሉ ፣ ልክ ተለዋዋጭውን ዓይነት ይለውጡ (ሁሉም አንድ ዓይነት መሆን አለባቸው)። አሁን ፣ እንደ መዝገበ -ቃላት ወይም ቱፕልስ ያሉ ይህንን ለማስተዳደር የተሻሉ መንገዶች ሊኖሩ ይችላሉ ፣ ግን ይህ ለዚህ መተግበሪያ ቀላል ነው። እኔ በተዘረጋ ትግበራ ውስጥ ከሁለተኛው አንዱን እፈጥራለሁ።

ምናሌውን ሞዶን እከታተላለሁ ፣ ስለዚህ በማሳያዬ ላይ ሌሎች ነገሮችን ከፈለግኩ ያንን ማድረግ እችላለሁ። እንዲሁም ፣ የአነፍናፊ አመክንዮ ቢኖረኝ ፣ የሆነ ነገር ቢጋጭ ፣ በማውጫ ሥራው ወቅት ያንን ለአፍታ አቆማለሁ። ምናሌው ሁል ጊዜ ብቻ ሳይሆን በተወሰኑ ጊዜያት ምናሌውን ማተም ስለምፈልግ ምናሌNeedsPrint ተለዋዋጭ አለኝ። በመጨረሻም ፣ እኔ የተመረጠ ተለዋጭ አለኝ ፣ ስለዚህ እኔ በበርካታ ቦታዎች ላይ ስደርስ የተመረጠውን አማራጭ መከታተል እችላለሁ።

የሚቀጥለውን የተግባሮች ስብስብ እንመልከት።

ደረጃ 8 - የኮድ ብልሽት - ማዋቀር እና ብጁ ተግባራት

የማዋቀር () ተግባሩ በቂ ቀላል ነው ፣ ሶስት የግቤት መግለጫዎች ብቻ

ባዶነት ማዋቀር () {pinMode (ምናሌSelect ፣ INPUT) ፤ pinMode (ምናሌ አስቀምጥ ፣ ግቤት); pinMode (ምናሌ ይምረጡ ፣ ግቤት); Serial.begin (9600); }

ቀጥሎ ሦስቱ ብጁ ተግባራት ናቸው። የመጀመሪያዎቹን ሁለት ፣ ከዚያም የመጨረሻውን ለየብቻ እንመልከት።

አንዳንድ መረጃዎችን የሚመልሱ ሁለት ተግባራት ያስፈልጉናል። ምክንያቱ ፣ ይህ ሰው ሊነበብ የሚችል ዓይነት መሆኑን ማረጋገጥ እንፈልጋለን። ችግር ካጋጠመን ኮዱን ለማረም ይረዳል። ኮድ ፦

// የአሁኑን የተመረጠ አማራጭ ቻርጅ የመመለስ ተግባር *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // የመመለሻ አማራጭ የተመረጠ የመመለሻ ምናሌ ምርጫ; } // የአሁኑ የተመረጠ አማራጭ ቻር ሁኔታ የመመለስ ተግባር *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; ቻር *አማራጭ SettingVal; ከሆነ (optionSetting == false) {optionSettingVal = "ሐሰተኛ"; } ሌላ {optionSettingVal = "True"; } // የመመለሻ አማራጭ የመመለሻ አማራጭ ማቀናበር SettingVal; }

የ char *ReturnOptionSelected () ተግባር የተመረጠውን አማራጭ ይፈትሻል (ከላይ ካዩ ያንን ለመከታተል አንድ ተለዋዋጭ እናስቀምጣለን) ፣ እና ቀደም ሲል ከፈጠርነው ድርድር ሕብረቁምፊውን በቀጥታ ይጎትታል። ከዚያ እንደ ቻር ዓይነት ይመልሰዋል። ይህንን እናውቃለን ምክንያቱም ተግባሩ የመመለሻውን ዓይነት ያመለክታል።

ሁለተኛው ተግባር ፣ ቻር *ReturnOptionStatus () በድርድሩ ውስጥ የተቀመጠውን አማራጭ ሁኔታ ያነባል እና እሴቱን የሚወክል ሕብረቁምፊ ቃል በቃል ይመልሳል። ለምሳሌ እኛ ያከማቸነው ቅንብር ሐሰት ከሆነ እኔ ‹ሐሰተኛ› እመለስ ነበር። ይህ የሆነበት ምክንያት ይህንን ተለዋዋጭ ለተጠቃሚው ስለምናሳይ እና ይህን ሁሉ አመክንዮ አንድ ላይ ማድረጉ የተሻለ ነው። በኋላ ላይ ማድረግ እችላለሁ ፣ ግን እዚህ ማድረግ የበለጠ ምክንያታዊ ነው።

// የአሁኑን አማራጭ የመቀየሪያ ተግባር ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; እውነት ተመለስ; }

ተግባር bool ToggleOptionSelected () በምናሌው ውስጥ የመረጥነውን ቅንብር ዋጋ ለመለወጥ የምቾት ተግባር ነው። ልክ ዋጋውን ይገለብጣል። በጣም የተወሳሰቡ የአማራጮች ስብስብ ቢኖርዎት ይህ ምናልባት የተለየ ሊሆን ይችላል። በዚህ ተግባር ውስጥ እውነት እመለሳለሁ ፣ ምክንያቱም የጥሪ ጥሪዬ (በኋላ ይህንን ተግባር በሚያባርረው ኮድ ውስጥ ያለው ጥሪ) እውነተኛ/የሐሰት መልስ ይጠብቃል። እኔ እንደሚሰራ 100% እርግጠኛ ነኝ ፣ ስለዚህ አልሰራም ብዬ አልቆጠርኩም ፣ ግን በተዘረጋ ማመልከቻ ውስጥ (እንደዚያ ከሆነ)።

ደረጃ 9 - ሉፕ…

የ loop () ተግባር በጣም ረጅም ነው ፣ ስለዚህ እኛ በክፍሎች እናደርገዋለን። በዚህ ተግባር ውስጥ ከዚህ በታች ያሉትን ሁሉንም ጎጆዎች መገመት ይችላሉ-

ባዶነት loop () {

// እዚህ ውስጥ ይስሩ <-----}

ደህና ፣ ከዚህ በፊት ይህንን ነገር አይተናል-

// አዝራሮቹን ያንብቡ ምናሌ ምናሌ ButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (ምናሌSelect); int menuSavePressed = digitalRead (ምናሌSave); // የአሁኑን ጊዜ ረጅም int currentTime = millis () ያግኙ። ከሆነ (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// አዝራሩ ሳይጫን ቆጥሮ ጊዜውን ዳግም ያስጀምሩDebounceTime = currentTime; menuButtonPreviousState = LOW; ምናሌSelectPreviousState = LOW; ምናሌSavePreviousState = LOW; }

እዚህ ማድረግ ያለብኝ በሦስቱ ዲጂታል ሪአርድ () ጥሪዎች ውስጥ ማከል እና ሁሉም አዝራሮች ዝቅተኛ ከሆኑ ሰዓት ቆጣሪውን (lastDebounceTime = currentTime) እንደገና ማቀናበር እና ሁሉንም ቀዳሚ ግዛቶች ወደ ዝቅተኛ ማቀናበሩን እርግጠኛ ነኝ። እኔ ደግሞ ሚሊስን () በአሁን ሰዓት ውስጥ አከማቻለሁ።

ቀጣዩ ክፍል በመስመሩ ውስጥ ጎጆ ያደርጋል

ከሆነ (((currentTime - lastDebounceTime)> debounceTimeout)) {

// እዚህ ውስጥ ይስሩ <----}

ሶስት ክፍሎች አሉ። አዎ ፣ እኔ ወደየራሳቸው ተግባራት ልገፋቸው እችል ነበር ፣ ግን ለቅላልነት እዚህ ሶስት ዋና የአዝራር ስልተ ቀመሮችን አስቀምጫለሁ።

ከሆነ ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // ተጠቃሚው Serial.println ን (“ምናሌ ገባሪ ነው”) ያሳውቅ ፤ } ሌላ ከሆነ (menuMode == true && optionSelected = 1) {// አማራጭን ዳግም አስጀምርSelected = 0; } // የማውጫ ምናሌውን ያትሙ NeedsPrint = እውነት; // የአዝራሩን ቀዳሚ ቀያይር። ምናሌን ለማሳየት ብቻ ይግለጹ // አዝራሩ ከተለቀቀ እና እንደገና ከተጫነ ምናሌ ButtonPreviousState = menuButtonPressed; // ከፍተኛ ይሆናል}

ምናሌው ButtonPressed ከፍተኛ በሚሆንበት ጊዜ ወይም የምናሌው ቁልፍ ሲጫን ይህ የመጀመሪያው ያካሂዳል። እንዲሁም የቀድሞው ሁኔታ LOW መሆኑን ለማረጋገጥ ይፈትሻል ፣ ስለሆነም ቁልፉ እንደገና ከመጫንዎ በፊት መልቀቅ ነበረበት ፣ ይህም መርሃግብሩ ተመሳሳይ ክስተት ያለማቋረጥ ደጋግሞ እንዳይተኮስ ያቆማል።

ከዚያ ምናሌው ገባሪ ካልሆነ ያነቃዋል የሚለውን ይፈትሻል። የተመረጠውን የመጀመሪያውን አማራጭ ያትማል (ይህም በምናሌው ውስጥ የመጀመሪያው ንጥል ምርጫዎች ድርድር በነባሪነት ነው። ቁልፉን በሰከንድ ወይም በሦስተኛ (ወዘተ) ጊዜ ከተጫኑ በዝርዝሩ ውስጥ የሚቀጥለውን አማራጭ ያገኛሉ። እኔ ማስተካከል የምችለው ነገር አለ ወደ መጨረሻው ሲደርስ ወደ መጀመሪያው ይመለሳል። ይህ የአቀራረብን ርዝመት ማንበብ እና የአማራጮችን ብዛት ከቀየሩ ብስክሌትን መልሰው ቀላል ሊያደርግ ይችላል ፣ ግን ይህ ለአሁን ቀላል ነበር።

የመጨረሻው ትንሽ ክፍል (// ምናሌውን ያትማል) ምናሌውን በግልፅ ያትማል ፣ ግን እሱ ደግሞ የቀደመውን ሁኔታ ወደ HIGH ያዋቅራል ስለዚህ ተመሳሳይ ተግባር እንዳይዘዋወር (አዝራሩ ቀደም ሲል ዝቅተኛ መሆኑን ስለመፈተሽ ከላይ ያለውን ማስታወሻዬን ይመልከቱ)።

// ምናሌ ይምረጡ ተጭኗል ፣ አመክንዮ ((ምናሌSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {{ከሆነ (ምናሌMode) {// የተመረጠውን አማራጭ ይለውጡ // በአሁኑ ጊዜ ይህ እውነት/ውሸት // ግን ማንኛውም ሊሆን ይችላል bool toggle = ToggleOptionSelected (); ከሆነ (መቀያየር) {menuNeedsPrint = true; } ሌላ {Serial.println («የሆነ ችግር ተፈጥሯል። እባክዎ እንደገና ይሞክሩ») ፤ }} // ከተለወጡ እና እንደገና ከተጫኑ ብቻ ለመቀያየር ሁኔታውን ይቀያይሩSelectPreviousState = menuSelectPressed; }

እኛ የ ToggleOptionSelected () ተግባርን የምናቃጥለው ይህ ጊዜ ካልሆነ በስተቀር የኮድ ቢት በተመሳሳይ መንገድ ምናሌውን ይምረጡ። ቀደም ብዬ እንደነገርኩት ፣ የበለጠ እንዲሠራ ይህንን ተግባር መለወጥ ይችላሉ ፣ ግን እኔ ማድረግ ያለብኝ ይህ ብቻ ነው።

ልብ ሊባል የሚገባው ዋናው ነገር የመቀየሪያውን ስኬት የሚከታተል እና ምናሌው እውነት ከሆነ የሚለወጠው ተለዋዋጭ መቀየሪያ ነው። ምንም ወይም ሐሰትን ካልመለሰ የስህተት መልዕክቱን ያትማል። ሌሎች ነገሮችን ለማድረግ የእርስዎን ጥሪ መመለስ የሚጠቀሙበት ቦታ ይህ ነው።

ከሆነ ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// ከምናሌው ይውጡ // እዚህ ማንኛውንም ማሻሻል / ማድረግ ወይም ወደ EEPROM ምናሌ ሙድ = ሐሰት ማስቀመጥ ይችላሉ ፤ Serial.println ("ምናሌ ወጥቷል"); // ሁኔታ ቀይር ስለዚህ ምናሌ አንዴ ብቻ ምናሌ ይወጣል SavePreviousState = menuSavePressed; }}

ይህ ተግባር ከምናሌው የሚወጣውን የማዳን ቁልፍን ይቆጣጠራል። ይህ የመሰረዝ ወይም የማዳን አማራጭ ሊኖርዎት ይችላል ፣ ምናልባት አንዳንድ ጽዳት ያድርጉ ወይም ወደ EEPROM ያስቀምጡ። እኔ ብቻ “ምናሌ ወጥቷል” እና እንዳይታጠፍ የአዝራሩን ሁኔታ ወደ HIGH አዘጋጅቼዋለሁ።

ከሆነ (ምናሌMode && menuNeedsPrint) {// እኛ ምናሌውን አተምን ፣ ስለዚህ አንድ ነገር // ካልተከሰተ በስተቀር እንደገና ማተም አያስፈልግም ምናሌNeedsPrint = ሐሰት; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("የተመረጠ:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }

ይህ ምናሌው ንቁ በሚሆንበት ጊዜ እና ምናሌው NeedsPrint ተለዋዋጭ ወደ እውነት ሲዋቀር ብቻ የሚቃጠል የ ‹MenuPrint› ስልተ ቀመር ነው።

ይህ በእርግጠኝነት ወደ ራሱ ተግባር ሊዛወር ይችላል ፣ ግን ለቀላልነት..!

ደህና ፣ ያ ብቻ ነው! ለጠቅላላው የኮድ ማገጃ ቀጣዩን ደረጃ ይመልከቱ።

ደረጃ 10 የመጨረሻ ኮድ አግድ

// ቋሚዎችን ይግለጹ

#ገላጭ ምናሌ Button 2 #ገላጭ ምናሌ ይምረጡ 3 #ገላጭ ምናሌን አስቀምጥ 4 #ዲፊን ዲቢዚን 50 ደቂቃ ምናሌ ButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int ምናሌSavePreviousState = LOW; // ተለዋዋጮችን ረጅም int lastDebounceTime ን ይግለጹ ፤ bool lightSensor = እውነት; bool tempSensor = እውነት; // የምናሌ አማራጮች char * menuOptions = {"Check Temp", "Check Light"}; bool featureSetting = {ሐሰት ፣ ሐሰት}; bool menuMode = ሐሰት; bool menuNeedsPrint = ሐሰት; int optionSelected = 0; // የማዋቀር ተግባር

ባዶነት ማዋቀር () {pinMode (ምናሌSelect ፣ INPUT) ፤ pinMode (ምናሌ አስቀምጥ ፣ ግቤት); pinMode (ምናሌ ይምረጡ ፣ ግቤት); Serial.begin (9600); }

// የአሁኑን የተመረጠ አማራጭ ቻር የመመለስ ተግባር *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // የመመለሻ አማራጭ የተመረጠ የመመለሻ ምናሌ ምርጫ; } // የአሁኑ የተመረጠ አማራጭ ቻር ሁኔታ የመመለስ ተግባር *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; ቻር *አማራጭ SettingVal; ከሆነ (optionSetting == false) {optionSettingVal = "ሐሰተኛ"; } ሌላ {optionSettingVal = "True"; } // የመመለሻ አማራጭ የመመለሻ አማራጭ ማቀናበር SettingVal; } // የአሁኑን አማራጭ bool ለመቀየር ተግባር ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; እውነት ተመለስ; } // ዋናው ዙር

ባዶነት loop () {// አዝራሮቹን ያንብቡ ምናሌ ውስጥ ButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (ምናሌSelect); int menuSavePressed = digitalRead (ምናሌSave); // የአሁኑን ጊዜ ረጅም int currentTime = millis () ያግኙ። ከሆነ (menuButtonPressed == LOW && menuSelectPressed == LOW && menuSavePressed == LOW) {// አዝራሩ ሳይጫን ቆጥሮ ጊዜውን ዳግም ያስጀምሩDebounceTime = currentTime; menuButtonPreviousState = LOW; ምናሌSelectPreviousState = LOW; ምናሌSavePreviousState = LOW; } ከሆነ (((currentTime - lastDebounceTime)> debounceTimeout)) {// የጊዜ ማብቂያው ከተደረሰ አዝራሩ ተጭኗል!

// ምናሌ አዝራር ተጭኗል ፣ አመክንዮ ይስጡ

// ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {ከሆነ (menuMode == ሐሰት) {menuMode = እውነት; // ተጠቃሚው Serial.println ን (“ምናሌ ገባሪ ነው”) ያሳውቅ ፤ } ሌላ ከሆነ (menuMode == true && optionSelected = 1) {// አማራጭን ዳግም አስጀምርSelected = 0; } // የማውጫ ምናሌውን ያትሙ NeedsPrint = እውነት; // የአዝራሩን ቀዳሚ ቀያይር። ምናሌን ለማሳየት ብቻ ይግለጹ // አዝራሩ ከተለቀቀ እና እንደገና ከተጫነ ምናሌ ButtonPreviousState = menuButtonPressed; // ከፍተኛ ይሆናል} // ምናሌ ይምረጡ ተጭኗል ፣ ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {ከሆነ (ምናሌMode) {// የተመረጠውን አማራጭ ይለውጡ // በአሁኑ ጊዜ ይህ ነው ልክ እውነት/ሐሰት // ግን ማንኛውም ሊሆን ይችላል bool toggle = ToggleOptionSelected (); ከሆነ (መቀያየር) {menuNeedsPrint = true; } ሌላ {Serial.print («የሆነ ችግር ተፈጥሯል። እባክዎ እንደገና ይሞክሩ») ፤ }} // ከተለወጡ እና እንደገና ከተጫኑ ብቻ ለመቀያየር ሁኔታውን ይቀያይሩSelectPreviousState = menuSelectPressed; } ከሆነ ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// ከምናሌው ይውጡ // እዚህ ማንኛውንም ማሻሻል / ማድረግ ወይም ወደ EEPROM ምናሌ ሙድ = ሐሰት ማስቀመጥ ይችላሉ ፤ Serial.println ("ምናሌ ወጥቷል"); // ሁኔታ ቀይር ስለዚህ ምናሌ አንዴ ብቻ ምናሌ ይወጣል SavePreviousState = menuSavePressed; }} // የአሁኑን ምናሌ አማራጭ ገባሪ ያትሙ ፣ ግን አንዴ (ምናሌMode && menuNeedsPrint) {// ምናሌውን አተመነው ፣ ስለዚህ አንድ ነገር // ካልተከሰተ በስተቀር ፣ እንደገና ማተም አያስፈልግም ምናሌNeedsPrint = ሐሰት ፤ char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); Serial.print ("የተመረጠ:"); Serial.print (optionActive); Serial.print (":"); Serial.print (optionStatus); Serial.println (); }}}

ወረዳው በ Tinkercad ጣቢያ ላይ ይገኛል። እርስዎም እንዲያዩ ከዚህ በታች ያለውን ወረዳ አካትቻለሁ!

እንደተለመደው ፣ ጥያቄዎች ወይም ጉዳዮች ካሉዎት እባክዎን ያሳውቁኝ!

የሚመከር: