Arduino Proqramında Paralel Tapşırıqları (Mövzular) Necə Yerinə Yetirmək Olar

Mündəricat:

Arduino Proqramında Paralel Tapşırıqları (Mövzular) Necə Yerinə Yetirmək Olar
Arduino Proqramında Paralel Tapşırıqları (Mövzular) Necə Yerinə Yetirmək Olar

Video: Arduino Proqramında Paralel Tapşırıqları (Mövzular) Necə Yerinə Yetirmək Olar

Video: Arduino Proqramında Paralel Tapşırıqları (Mövzular) Necə Yerinə Yetirmək Olar
Video: Arduino Uno with DHT11 temperature and humidity sensor Arduino code for beginners 2024, Aprel
Anonim

Mikroprosessor texnologiyasında paralel işləyən işlərə Threads deyilir. Bu, çox rahatdır, çünki eyni vaxtda bir neçə əməliyyat yerinə yetirmək lazımdır. Arduino mikrokontrolunun həqiqi bir prosessor kimi bir anda bir neçə işi yerinə yetirməsi mümkündürmü? Görək.

Arduino proqramında paralel axınlar
Arduino proqramında paralel axınlar

Vacibdir

  • - Arduino;
  • - 1 LED;
  • - 1 piezo zil.

Təlimat

Addım 1

Ümumiyyətlə, Arduino həqiqi paralelləşməni və ya çox işlənməyi dəstəkləmir.

Ancaq mikro nəzarətçiyə "loop ()" dövrünün hər təkrarında əlavə, arxa plan tapşırığının yerinə yetirilmə vaxtının gəldiyini yoxlamasını söyləyə bilərsiniz. Bu vəziyyətdə istifadəçiyə eyni anda bir neçə tapşırıq yerinə yetirildiyi görünür.

Məsələn, müəyyən bir tezlikdə bir LED-i yanıb söndürək və paralel olaraq, piezoelektrik yayıcıdan gələn bir siren kimi yüksələn və düşən səslər buraxaq.

Həm LED, həm də piezo emitentini Arduinoya bir dəfədən çox bağladıq. Şəkildə göstərildiyi kimi dövrəni yığaq. Bir LED'i "13" xaricindəki rəqəmsal bir pinə bağlayırsınızsa, təxminən 220 ohm bir cərəyan məhdudlaşdıran bir rezistor olduğunuzu unutmayın.

Zil səsi və LED üçün Arduino-ya qoşulma diaqramı
Zil səsi və LED üçün Arduino-ya qoşulma diaqramı

Addım 2

Gəlin belə bir eskiz yazaq və Arduinoya yükləyək.

Lövhəni yüklədikdən sonra eskizin tam olaraq lazım olduğumuz şəkildə yerinə yetirilmədiyini görə bilərsiniz: siren tam işləyənə qədər LED yanıb-sönməyəcək və siren səslənən zaman LED-in yanıb-sönməsini istəyirik. Burada problem nədir?

Həqiqət budur ki, bu problem adi qaydada həll edilə bilməz. Tapşırıqlar mikrokontroller tərəfindən ciddi şəkildə ardıcıllıqla yerinə yetirilir. "Delay ()" operatoru proqramın icrasını müəyyən bir müddətə təxirə salır və bu müddət bitənə qədər aşağıdakı proqram əmrləri yerinə yetirilməyəcəkdir. Bu səbəbdən, proqramın "döngüsü ()" ndə hər tapşırıq üçün fərqli bir icra müddəti təyin edə bilmərik.

Buna görə çox vəzifəli bir şəkildə simulyasiya etməlisiniz.

Səs siqnalı və LED nəzarət ardıcıllıqla
Səs siqnalı və LED nəzarət ardıcıllıqla

Addım 3

Arduinonun yalançı paralel olaraq tapşırıqları yerinə yetirəcəyi seçim Arduino inkişaf etdiriciləri tərəfindən https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay məqaləsində təklif olunur.

Metodun mahiyyəti ondadır ki, "loop ()" döngüsünün hər təkrarlanması ilə LED-in yanıb-sönməsinin (arxa plan tapşırığını yerinə yetirmək üçün) vaxtının gəldiyini yoxlayırıq. Və belə olarsa, LED vəziyyətini tərsinə çevirərik. Bu bir növ "gecikmə ()" operatorunu atlamaqdır.

Bu metodun əhəmiyyətli bir dezavantajı, LED idarəetmə vahidinin qarşısındakı kod hissəsinin "ledInterval" LED-in yanıb sönən vaxt aralığından daha sürətli yerinə yetirilməsidir. Əks təqdirdə, yanıp sönmə zərurətdən daha az baş verəcək və tapşırıqların paralel icrasının təsirini almayacağıq. Xüsusilə, eskizimizdə siren səsi dəyişmə müddəti 200 + 200 + 200 + 200 = 800 msn-dir və LED yanıb-sönən intervalını 200 msec olaraq təyin etdik. Ancaq LED, təyin etdiyimizdən 4 dəfə fərqli 800 msec müddətində yanıb-sönəcəkdir. Ümumiyyətlə, kodda "gecikmə ()" operatoru istifadə olunursa, psevdo-paralelliyi simulyasiya etmək çətindir, ona görə də bundan çəkinmək məsləhətdir.

Bu vəziyyətdə siren səsi idarəetmə vahidinin vaxtın gəlib çatmadığını da yoxlaması və "gecikmə ()" istifadə etməməsi lazımdır. Ancaq bu kod miqdarını artıracaq və proqramın oxunaqlığını pisləşdirəcəkdir.

LED gecikmədən yanıb sönür () operatoru
LED gecikmədən yanıb sönür () operatoru

Addım 4

Bu problemi həll etmək üçün asanlıqla yalançı paralel proseslər yaratmağa imkan verən gözəl ArduinoThread kitabxanasından istifadə edəcəyik. Bənzər bir şəkildə işləyir, ancaq vaxtı yoxlamaq üçün kod yazmamağa imkan verir - bu dövrədə tapşırığı yerinə yetirməyinizə ehtiyacınız olub-olmaması. Bu kod miqdarını azaldır və eskizin oxunaqlılığını artırır. Fəaliyyətdə olan kitabxanaya baxaq.

Hər şeydən əvvəl kitabxana arxivini rəsmi saytdan https://github.com/ivanseidel/ArduinoThread/archive/master.zip yükləyin və Arduino IDE-nin "kitabxanalar" qovluğuna açın. Sonra "ArduinoThread-master" qovluğunu "ArduinoThread" adlandırın.

ArduinoThread kitabxanasının quraşdırılması
ArduinoThread kitabxanasının quraşdırılması

Addım 5

Bağlantı diaqramı eyni qalacaq. Yalnız proqram kodu dəyişəcək. İndi yan çubuqdakı kimi olacaq.

Proqramda, hər biri öz işini yerinə yetirən iki axın yaradırıq: biri LED ilə yanıb-sönür, ikincisi sirenin səsini idarə edir. Döngünün hər təkrarında, hər bir iplik üçün yerinə yetirilmə vaxtının gəlib çatmadığını yoxlayırıq. Gəlirsə, "run ()" metodundan istifadə edilərək işə salınır. Əsas odur ki, "gecikmə ()" operatorunu istifadə etməyin.

Kodda daha ətraflı izahatlar verilmişdir.

Kodu Arduino yaddaşına yükləyək, işə salaq. İndi hər şey lazım olduğu kimi işləyir!

Tövsiyə: