Arduino multitasking နှင့်အချိန်စီမံခန့်ခွဲမှု

Mildi ဖြင့် multitask လုပ်ရန် Arduino ကိုစမ်းသပ်သည်

ငါ Arduino ကျွမ်းကျင်သူမဟုတ်ပါဘူးငါအချိန်ကြာမြင့်စွာအဘို့အပန်းကန်ရှိခြင်းနေသော်လည်းငါစုံစမ်းစစ်ဆေးကြပြီ။ ငါအသုံးပြုခဲ့တဲ့အချိန်ကတည်းကဖန်တီးပြီးသားကုဒ်တွေကိုကူးယူခြင်းနှင့်ကူးထည့်ခြင်းကိရိယာတခုအဖြစ်ခဲ့တယ်။ ဒါပေမဲ့သူအလုပ်လုပ်ပုံကိုလေ့လာဖို့စိတ်မ ၀ င်စားဘဲ၊ အဲဒါကိုအလုပ်လုပ်အောင်လုပ်ဖို့နဲ့ငါ့အတွက်အသုံး ၀ င်ဖို့ဖြစ်တယ်။ ဒီခရစ္စမတ်ပွဲမှာ Nativity မြင်ကွင်းကို LEDs အချို့နှင့် HC-SR04 ultrasound sensor ဖြင့်နည်းနည်းညှိထားသည်။ ငါဘာလုပ်ရမယ်ဆိုတာကိုမကြည့်တော့ဘူး။

signal တစ်ခုတည်းကနေ LEDs နှစ်ခုဖြင့်မတူညီသောအရာများကိုလုပ်ချင်ခဲ့တယ်။ မင်္ဂလာပါ။ ငါချက်ချင်းပဲငါဖြစ်လိမ့်မည်ဟုထင်သောအရာကိုထိမိ။ လဲ Arduino နဲ့စပြီးဆက်သွယ်တဲ့အခါသင်ကြုံတွေ့ရတဲ့ပထမဆုံးကန့်သတ်ချက်တစ်ခု။ ပြီးတော့အဲဒါကိုအရမ်းရှုပ်ထွေးအောင်လုပ်ဖို့မလိုပါဘူး။ ငါအချို့ LEDs တွေအကြောင်းပြောနေတာပဲ၊ မင်းလိုချင်တာမှန်မှန်ကန်ကန်မလုပ်နိုင်ဘူးဆိုတာမင်းသိတယ်။

အစကနေရှင်းရှင်းလင်းလင်းလုပ်ကြည့်ရအောင် Multitasking လုပ်ခြင်းသည် Arduino တွင်မရှိပါ, အလုပ်နှစ်ခုအပြိုင်အပြောင်းအလဲနဲ့မရနိုင်ပါ။ သို့သော်ဖုန်းခေါ်ဆိုမှုများကိုမြန်အောင်ပြုလုပ်ရန်နည်းစနစ်များရှိပြီး၎င်းတို့သည်တစ်ချိန်တည်းတွင်အလုပ်လုပ်ပုံရသည်။

ငါအမှုကိုပိုမိုအသေးစိတ်ပြောပြပါ။ ခရစ္စမတ်ပွဲမှာ Nativity Scene ကို set up လုပ်ပြီးသမီးတွေချဉ်းကပ်လာတဲ့အချိန်မှာ Nativity မီးတချို့မီးထွန်းစေချင်တယ်။ အဘယ်အရာကိုမျှရှုပ်ထွေး။ ငါအလင်းရောင်၏အကိုင်းအခက်နှစ်ခုသည် proximity sensor ၏တန်ဖိုးနှင့်ကွဲပြားခြားနားစွာအလုပ်လုပ်စေလိုသည်။

တစ်ယောက်ယောက်က ၁၀ စင်တီမီတာထက်ပိုနီးတဲ့အချိန်မှာငါလိုချင်တယ်

  • ကြယ်များသို့ပြန်သွားမည့်အလင်း၏အကိုင်းအခက်တစ်ခုသည် ၁၀ စက္ကန့်တွင်ဆက်ရှိနေလိမ့်မည်
  • အိမ်များအတွင်းသို့ဝင်မည့်အခြားတစ်ခုမှာ ၁၀ စက္ကန့်မျှကြာမည်ဖြစ်သော်လည်း၎င်းတို့သည်မွေးရာပါမြင်ကွင်းမှကွဲထွက်သွားသောကြောင့်ဖြစ်သည်။

ရိုးရှင်းပါတယ်မဟုတ်လား? ဒါကကြီးမားတဲ့ပြproblemsနာတွေဖြစ်စေနိုင်တယ်။ ဘာကြောင့်လဲဆိုတော့ Arduino ဟာ multitasking မလုပ်နိုင်လို့ command တစ်ခုပြီးတစ်ခုပြီးမြောက်တယ်။

 

လျှပ်တစ်ပြက်နှင့် ultrasonic multitasking circuit ကို mounting LEDs

ငါလုပ်ပြီးပြီ HC-SR04 ultrasonic sensor နှင့်အတူ mounting နှစ်ခု LEDs, တစ်ခုချင်းစီကိုဗက်လင်မြို့၏ဌာနခွဲတူညီလိမ့်မယ်။ LOOP ရှိ ultrasound sensor ၏တည်ဆောက်မှုနှင့်လည်ပတ်မှုကိုပြုပြင်ရန်အတွက်ပထမအပိုင်းသည်အလွန်ရယ်စရာမဟုတ်ပါ။ သို့သော်ထောင်ပေါင်းများစွာသောနေရာများတွင်ယင်းကိုသင်တွေ့ရှိနိုင်သည်။ အခြားစုံစမ်းစစ်ဆေးမှုများပြုလုပ်ပါကအခြားအထူးနေ့တစ်နေ့ကဲ့သို့ပင်ကျွန်ုပ်အထူးပြုလုပ်ပါသည်။ ယခုတွင်သင်သည်နေရာတွင်ရှိပါသည် (ခရက်ဒစ်မထားသည့်အတွက်စိတ်မကောင်းပါ၊ ကျွန်ုပ်မည်သည့်နေရာမှရရှိသည်ကိုမမှတ်မိပါ)

Arduino အပေါ် HC-SR04 ကုဒ်

int ledPin1 = 8; int ledPin2 = 7; ရှည်လျားသောအကွာအဝေး; အချိန်ကြာမြင့်စွာ; ကြာမြင့်စွာသောအချိန်၊ ရှည်လျားသော timepast; ပျက်ပြယ် setup ကို () {// တစ်ခု output ကိုအဖြစ်ဒီဂျစ်တယ် pin ကို LED_BUILTIN စတငျ။ pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); Serial.begin (9600); pinMode (3, OUTPUT); / * output 9 အဖြစ် pin ကို 2 activation: အ ultrasonic သွေးခုန်နှုန်း * / pinMode (8, INPUT); / * pin 3 ကို input အဖြစ် input: ultrasound bounce time * /} // loop function သည်အမြဲတမ်းပျက်ပြယ် loop () {digitalWrite (5, LOW); အာရုံခံတည်ငြိမ်မှုအတွက် * * / delayMicroseconds (3)၊ digitalWrite (10, HIGH); / * ultrasonic သွေးခုန်နှုန်းပေးပို့ခြင်း * / delayMicroseconds (2); အချိန် = pulseIn (12, HIGH); / * ဝင်လာသောသွေးခုန်နှုန်း၏အရှည်ကိုတိုင်းတာရန် function ကို။ အဆိုပါ ultrasonic သွေးခုန်နှုန်းပေးပို့ခြင်းနှင့်အာရုံခံက bounce လက်ခံရရှိသည့်အခါကြာသောအချိန်, ဆိုလိုသည်မှာ: pin ကို 0.017 အ bounce ကိုလက်ခံရရှိစတင်ခဲ့သည့်အခါ, အမြင့်, သည်အထိအဲဒီလိုလုပ်နေတာကိုရပ်တန့်သည်အထိ LOW, ဝင်လာသောသွေးခုန်နှုန်း၏အရှည် * / အကွာအဝေး = int (1000 * အချိန်); / * Serial.println ("Distance") မှစင်တီမီတာအတွင်းကိန်းဂဏန်းတစ်ခုလုံး၏တန်ဖိုးကိုတွက်ချက်ရန်အကွာအဝေးကိုတွက်ချက်ရန် / * ဖော်မြူလာ; Serial.println (အကွာအဝေး); Serial.println ("စင်တီမီတာ"); နှောင့်နှေး (XNUMX);

ဤနည်းဖြင့် ultrasound sensor မှတိုင်းတာသောအကွာအဝေးကိုပြန်လည်စစ်ဆေးပြီးသိမ်းဆည်းလိမ့်မည်

LEDS စစ်ဆင်ရေးဖြေရှင်းချက်

စိတ်ထဲပထမဆုံးရောက်လာတာကနှောင့်နှေးတာကိုစတင်တာပါ။ ဘာလို့လဲဆိုတော့ဒါပေမယ့်အရင်ကဆိုရင်နှောင့်ယှက်မှု () အကြောင်းစဉ်းစားထားပေမယ့်ဒီ option တွေကအများကြီးကိုကန့်သတ်ထားတာပါ။ ဘာကြောင့်လဲဆိုတော့ဘုတ်အဖွဲ့ကအလုပ်လုပ်နေတုန်းပဲ။ ဒါကြောင့်ဒီဆိုင်းငံ့ချိန်မှာဘာမှမလုပ်နိုင်တော့ဘူး။ ဖြေရှင်းချက်မှာ millis () ကိုသုံးခြင်းဖြစ်သည်။

ဒီမှာ if and counters အရရိုးရှင်းလွယ်ကူတဲ့အဖြေတစ်ခုတွေ့ပြီ။ ကျွန်တော့်ဆရာတစ်ယောက်ပြောခဲ့ဖူးတဲ့အရာမှန်သမျှကို ifs များစွာနဲ့ပရိုဂရမ်လုပ်နိုင်ပါတယ်။ ဒါပေမယ့်အမှန်တရားကတော့သိပ်ကိုကြမ်းတမ်းလွန်းတယ်။

// အကွာအဝေး 10 ထက်နည်းလျှင်, ငါတို့နှစ်ခု LEDs သို့မဟုတ်အကိုင်းအခက်ကိုဖွင့်နှင့် (အကွာအဝေး <10) {digitalWrite (ledPin1, HIGH) လျှင် millis () နှင့်အတူအချိန်ရေတွက်စတင်; digitalWrite (ledPin2, HIGH); currenttime = millis (); } // အကယ်၍ အကွာအဝေးသည် ၁၀ ထက်ကြီးလျှင်၊ ၎င်းကိုဖွင့်ပြီးချိန်ကိုစစ်ဆေးပါမည်။ ညွှန်ပြထားသည်ထက်ကြီးသည်ဆိုပါက (အကွာအဝေး> ၁၀) {timepast = millis () - currenttime ; digitalWrite (ledPin10, LOW); // အကွာအဝေး 1 ထက်သာ။ ကြီးမြတ်ပါလျှင်ကျနော်တို့ (timepast> 10) {digitalWrite (ledPin1, LOW) LED10000 ကို turn off ပါလိမ့်မယ်; }}}

ဒီကုဒ်ကရည်ရွယ်ထားတာက Arduino ကဒီ ifs သုံးခုကိုအဆက်မပြတ်ကွပ်ကဲနေတယ်၊ ​​ဒါကြောင့်သူတို့တွေမြန်မြန်ဆန်ဆန်ဖြတ်သန်းသွားနိုင်ပြီးတစ်ချိန်တည်းမှာအရာများစွာလုပ်နေပုံရတယ်။ ဒါပေမယ့်ငါတို့သိပြီးသားအတိုင်းအတာတစ်ခုစီကိုစာကြောင်းများ ဆက်လက်၍ ဆက်လက်ပြီး ဆက်လက်၍ ဆက်လက်စီရင်သည်။

ပြီးတာနဲ့အကွာအဝေးကိုတိုင်းတာနှင့် variable ကိုထဲမှာသိမ်းထားတဲ့ဖြစ်ပါတယ် အကွာအဝေး, ထို ifs အကဲဖြတ်မည်ဖြစ်သည်:

  • ပထမအကွာအဝေးသည်လိုချင်သော ၁၀ စင်တီမီတာထက်နည်းသည်ကိုစစ်ဆေးသည်။ သို့ဆိုလျှင် LEDs နှစ်ခုကိုဖွင့်ပြီး millis () ဖြင့်အချိန်ကိုရေတွက်ပါ။
  • 10 cm ထက်ကြီးတဲ့အကွာအဝေးအတွက်ဆိုရင်ဒုတိယကိုသွားလိမ့်မယ်။ အကယ်၍ ၎င်းသည်လိုက်လျောပါက၊ ကုန်သွားသောအချိန်ကာလကိုတွက်ချက်ပြီးအငှားယာဉ် 1 ကိုအကွာအဝေးပေါ်တွင်သာ မူတည်၍ တွက်ချက်သည်။
  • ကောင်တာဖွင့်ပြီးကတည်းက ၁၀ စက္ကန့်ကျော်ကုန်လွန်သွားပြီဆိုလျှင်တတိယသို့သွားမည်ဆိုပါက pin 10 ကိုပိတ်ပါ။
  • ဒီတော့ကွင်းဆက်ကိုဆက်သွားသည်။ တဖန်တုံ။

နောက်ဆုံးမှာတော့အဖြေကအလုပ်မလုပ်ပေမယ့်ဒီပြproblemနာကိုလူအများတွေ့ကြုံခဲ့ရပြီးနောက်ပြီးရှေးရိုးစွဲဖြေရှင်းချက်တွေရှိရမယ်ဆိုတာကျွန်တော်ရှင်းပါတယ်။ ငါရှာနေတဲ့ကောင်လေးတွေထဲကကောင်းတဲ့အရာတစ်ခု (ဒါကတစ်ခုတည်းမဟုတ်တဲ့) တစ်မျိုးကိုငါရှာခဲ့တယ် Adafruit နှင့် object-oriented programming။ ၎င်းတွင်သတ်မှတ်ထားသောအတန်းများရှိအရာဝတ္ထုများကိုဖန်တီးခြင်းသည်အမြန်ခေါ်ဆိုမှုများပြုလုပ်ရန်နှင့်ကျွန်ုပ်တို့၏ပရိုဂရမ်တွင်ကုဒ်အကြိမ်ပေါင်းများစွာထပ်ခါတလဲလဲလုပ်ရန်မလိုအပ်ပါ။

အဆုံး၌ if + counters နှင့်ကျွန်ုပ်၏ဖြေရှင်းနည်းနှင့်အတူတူပင်ဖြစ်သည်။ သို့သော်၎င်းသည် ပို၍ ဖတ်ရန်လွယ်ကူပြီးပိုမိုထိရောက်သောကုဒ်ကိုပေးသည်။

multitasking ကိုစီမံခြင်းသည်မလွှဲမရှောင် Arduino တွင်အချိန်စီမံခန့်ခွဲမှုဆီသို့ ဦး တည်စေသည်။ အစပိုင်းတွင်ဤဆောင်းပါး၌မပါရှိခဲ့သော်လည်း၎င်းသည်အလွန်စိတ်ဝင်စားဖွယ်ဖြစ်သည်ဟုကျွန်ုပ်ထင်သည်။

Arduino နှင့်အချိန်လုပ်ဆောင်ချက်များကို

ငါပြီးသားမှတ်ချက်ချသကဲ့သို့ နှောင့်နှေးမှုနဲ့ကြီးမားတဲ့မှီခိုမှုရှိတယ်လို့ငါထင်တယ် () အစမှလူများသောအားဖြင့် blink မှမည်သည့် traffic light သို့မဟုတ် LEDS ၏ခြယ်လှယ်မှုများသို့မဟုတ်ပိတ်ခြင်းအားဖြင့်ဒီလုပ်ဆောင်မှုကိုတွေ့မြင်နိုင်သည်။

နှောင့်နှေးခြင်းသည် အလွန်ကြီးမားသော ပြဿနာတစ်ခုဖြစ်ပြီး ၎င်းမှာ အချိန်အတိုင်းအတာတစ်ခုအထိ delay() ကိုခေါ်ဆိုသည့်အခါ အရာအားလုံးရပ်တန့်သွားခြင်းပင်ဖြစ်သည်။ ဘုတ်သည် မည်သည့်အာရုံခံအားမျှ မဖတ်ရ၊ စာကြောင်းများကို ဆက်လက်လုပ်ဆောင်မည်မဟုတ်သလို၊ ၎င်းသည် မည်သည့်အရာမှ လုပ်ဆောင်မည်မဟုတ်ပါ၊ ကျွန်ုပ်တို့သည် သင့်အား ပြောထားသည့်အချိန်ကို စောင့်ဆိုင်းပြီး အရာတစ်ခုထက်ပို၍ ဘုတ်ကို အသုံးပြုလိုပါက၊ တစ်ချိန်တည်းတွင်၊ ဤအရာသည်မဖြစ်နိုင်ပါ။

ကျနော်တို့ကြည့်ရှုရန်ရှိသည်လိမ့်မယ် မီလီ () delayMicroseconds() တွင်ပင် ကျွန်ုပ်တို့တွင် ပရိုဂရမ်ကို စတင်လုပ်ဆောင်ချိန်မှစ၍ microseconds အရေအတွက်ကို ပြန်ပေးသည့် micros() လည်း ရှိပါသည်။

နှောင့်နှေးခြင်းမရှိဘဲမျက်တောင်ခတ်

ဘယ်လိုအလုပ်လုပ်လဲဆိုတာကြည့်ဖို့ကောင်းတဲ့ဥပမာပါ အဆိုပါဒဏ္myာရီ Blink run ပေမယ့်နှောင့်နှေးခြင်းမရှိဘဲ။ အဓိကကွာခြားချက်ကတော့ delay () function ကိုမေ့သွားပြီးစစ်ဆင်ရေးကြားအချိန်ကိုရေတွက်နိုင်ဖို့ millis () ကိုသုံးသည်။

အကယ်၍ သင်သည် ကျွန်ုပ်တို့ကဲ့သို့ စိတ်မငြိမ်မသက်ဖြစ်နေပြီး ပရောဂျက်၏ ပြုပြင်ထိန်းသိမ်းမှုနှင့် တိုးတက်မှုများတွင် ပူးပေါင်းပါဝင်လိုပါက လှူဒါန်းနိုင်ပါသည်။ ငွေအားလုံးသည် စာအုပ်များနှင့် ပစ္စည်းများဝယ်ယူရန် သွားပြီး သင်ခန်းစာများ လေ့ကျင့်မှုများ ပြုလုပ်မည်ဖြစ်သည်။

3 မှတ်ချက်များ "Arduino multitasking and time management"

  1. arduino တွင် interrupts များရှိနေခြင်းကိုသိရှိထားခြင်းဖြင့်သင်သည် multitasking လုပ်ခြင်းနှင့်အတူအစီအစဉ်များကိုအကောင်အထည်ဖော်ရန်ကူညီနိုင်သည်။

    အဖွေ
    • Leandro မင်္ဂလာပါ။ ကျေးဇူးတင်ပါတယ်။ ငါကြားဖြတ်၏ဘာသာရပ်မသိရပါဘူး။ ငါကြည့်ဖို့စုံစမ်းစစ်ဆေးလိမ့်မယ် :)

      အဖွေ
  2. တစ်ချိန်တည်းမှာမြောက်မြားစွာသောကွင်းဆက်များကိုခွင့်ပြုသည့်အစီအစဉ်ဇယားတစ်ခုရှိသည်။

    အဖွေ

မှတ်ချက် Leave