M'inix espert ta 'Arduino, minkejja li għandi l-pjanċa għal żmien twil bilkemm investigajt. Iż-żminijiet li kont nużaha kienet bħala għodda li tikkopja u twaħħal kodiċi diġà maħluqa imma mingħajr ħafna interess li titgħallem verament kif taħdem imma sempliċement bl-intenzjoni li tagħmilha taħdem u tkun utli għalija. Dan il-Milied irranġajt xi ftit ix-xena tan-Natività b'xi LEDs u senser tal-ultrasound HC-SR04. U waqaft biex nosserva dak li kellu jsir.
Ridt biss nagħmel affarijiet differenti b'żewġ LEDs mill-istess sinjal. Whoops. Malajr ħriġt fuq dak li naħseb li se jkun waħda mill-ewwel limitazzjonijiet li tiltaqa 'magħhom meta tibda tħawwad ma' Arduino. U m'għandekx bżonn tagħmilha kkumplikata wisq. Qed nitkellem biss dwar xi LEDs, tinduna li ma tistax tagħmel dak li trid b'mod korrett.
Ejja nagħmluha ċara mill-bidu multitasking ma jeżistix f'Arduino, żewġ impjiegi ma jistgħux jiġu pproċessati b'mod parallel. Iżda hemm tekniki biex jagħmlu sejħiet tant veloċi li jidhru li jaħdmu flimkien.
Jien ngħid il-każ f'aktar dettall. Fil-Milied waqqaf Xena tan-Natività u ridt li ċertu dwal tan-Natività jinxtegħlu meta t-tifel tiegħi avviċina. Xejn ikkumplikat. Ridt biss żewġ fergħat ta 'dwal wasslu biex jaħdmu b'mod differenti għall-valuri ta' sensur ta 'prossimità.
Xtaqt meta xi ħadd resaq eqreb minn 10 cm
- Waħda mill-fergħat tad-dwal li jmorru għall-istilel tibqa 'mixgħula għal 10 sekondi
- Li l-ieħor li kien imur ġewwa d-djar jibqa 'mixgħul għal 10 sekondi imma peress li sseparaw mix-xena tan-natività.
Sempliċi le? għax dan jista 'jikkawżalek problemi kbar. Minħabba li Arduino mhux kapaċi multitasking, jeżegwixxi kmand wara l-ieħor.
Jien għamilt immuntar bis-sensor ultrasoniku HC-SR04 u 2 LEDs, kull wieħed ikun ekwivalenti għal fergħa tal-Betlem. L-ewwel parti mhix umoristika ħafna, peress li hija biex tikkonfigura s-setup u l-operat tas-senser tal-ultrasound fil-LOOP, imma tista 'ssib dan f'eluf ta' postijiet. Bħal ġurnata oħra jekk nistaqsi aktar nagħmel speċjali, għalissa hawn int (jiddispjaċini li ma tpoġġi krediti, imma ma niftakarx minn fejn ġibtha)
Kodiċi HC-SR04 fuq Arduino
int ledPin1 = 8; int ledPin2 = 7; Distanza twila; żmien twil; kurrenti twil; timepast twil; void setup () {// inizjalizza l-pin diġitali LED_BUILTIN bħala output. pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); Serial.begin (9600); pinMode (3, OUTPUT); / * attivazzjoni tal-pin 9 bħala output: għall-impuls ultrasoniku * / pinMode (2, INPUT); / * attivazzjoni tal-pin 8 bħala input: ħin tal-bounce tal-ultrasound * /} // il-funzjoni tal-linja terġa 'titħaddem għal darb'oħra għal dejjem void loop () {digitalWrite (3, LOW); / * Minħabba l-istabbilizzazzjoni tas-sensor * / delayMikrosekondi (5); digitalWrite (3, HIGH); / * tibgħat il-polz ultrasoniku * / delayMikrosekondi (10); ħin = pulseIn (2, HIGH); / * Funzjoni biex tkejjel it-tul tal-polz li jkun dieħel. Kejjel il-ħin li jgħaddi bejn li tibgħat il-polz ultrasoniku u meta s-sensor jirċievi l-bounce, jiġifieri: minn meta l-pin 12 jibda jirċievi l-bounce, GĦOLJA, sakemm jieqaf jagħmel hekk, BAXX, it-tul tal-polz li jkun dieħel * / distanza = int (0.017 * ħin); / * formula biex tikkalkula d-distanza li tikseb valur sħiħ * / / * Monitoraġġ f'ċentimetri mill-monitor serjali * / Serial.println ("Distanza"); Serial.println (distanza); Serial.println ("cm"); dewmien (1000);
B'dan, id-distanza mkejla mis-senser tal-ultrasound tiġi riveduta u maħżuna
Soluzzjoni ta 'operazzjoni LEDS
L-ewwel ħaġa li tiġi f'moħħna hi li tibda tqiegħed id-dewmien. Ma nafx għalfejn iżda l-prinċipjanti kollha jaħsbu dwar dewmien () u dan jillimita bil-kbir l-għażliet għax waqt li qed tuża dewmien () il-bord ma jkomplix jaħdem u għalhekk ma tistax tagħmel xi ħaġa oħra f'dak il-ħin ta 'sospensjoni. Is-soluzzjoni hija li tuża millis ()
Hawnhekk sibt soluzzjoni sempliċi bbażata fuq if u counters. Kif kien jgħid għalliem tiegħi, kull ħaġa tista 'tiġi programmata b'ħafna IFs wara xulxin. Imma ovvjament il-verità mhix eleganti ħafna.
// jekk id-distanza hija inqas minn 10, nixgħelu ż-żewġ LEDs jew fergħat u nibdew ngħoddu l-ħin bil-millis () jekk (distanza <10) {digitalWrite (ledPin1, HIGH); digitalWrite (ledPin2, HIGH); currenttime = millis (); } // jekk id-distanza hija akbar minn 10 aħna niċċekkjaw il-ħin mgħoddi minn meta nxtegħel u jekk huwa akbar minn dak indikat nitfgħu l-LED1 jekk (distanza> 10) {timepast = millis () - currenttime ; digitalWrite (ledPin1, LOW); // jekk id-distanza hija akbar minn 10000 nitfgħu l-LED2 jekk (timepast> 10000) {digitalWrite (ledPin2, LOW); }}}
Dak li għandu l-intenzjoni dan il-kodiċi huwa li Arduino qiegħed kontinwament jeżegwixxi dawk it-tliet ifs sabiex jgħaddi minnhom tant malajr li jidher li qed jagħmel bosta affarijiet fl-istess ħin. Imma kif diġà nafu, tkompli teżegwixxi sentenzi waħda waħda.
Ladarba d-distanza titkejjel u tinħażen fil-varjabbli distanza, l-ifs jiġu evalwati:
- L-ewwel jiċċekkja jekk id-distanza hijiex inqas mill-10 cm mixtieqa. Jekk iva, nixgħelu ż-żewġ LEDs u nibdew ngħoddu l-ħin bil-millis ()
- u mmorru għat-tieni kieku għad-distanza akbar minn 10 cm. Jekk tikkonforma, aħna nikkalkulaw il-ħin li għadda u ddiżattivaw il-led 1, li jiddependi biss mid-distanza.
- Immorru għat-tielet jekk fejn niċċekkjaw jekk għaddewx aktar minn 10 sekondi minn meta ġie attivat il-counter, u jekk iva, itfi l-pin 2
- U allura l-linja tkompli. U għal darb'oħra.
Fl-aħħar, u għalkemm is-soluzzjoni ħadmet, kien ċar għalija li din il-problema żgur li ġiet esperjenzata minn ħafna nies u li kellu jkun hemm soluzzjoni aktar ortodossa. Bdejt infittex u sibt waħda tajba (li żgur mhix l-unika waħda) mis-subien ta ' Programmar Adafruit u orjentat lejn l-oġġett. Din tikkonsisti fil-ħolqien ta 'oġġetti bi klassijiet definiti biex tagħmel telefonati malajr u ma jkollokx tirrepeti l-kodiċi mijiet ta' drabi fil-programm tagħna.
Li fl-aħħar mill-aħħar huwa "l-istess" bħas-soluzzjoni tiegħi ma 'if + counters imma ħafna iktar eleganti u li jipprovdi kodiċi ħafna aktar leġġibbli u ħafna aktar effiċjenti.
Il-ġestjoni tal-multitasking inevitabbilment twassal għal ġestjoni tal-ħin f'Arduino. Għall-ewwel dan ma kienx inkluż fl-artiklu imma naħseb li huwa interessanti ħafna.
Arduino u funzjonijiet tal-ħin
Kif diġà kkummentajt Naħseb li hemm dipendenza kbira b'dewmien () , possibilment minħabba li n-nies li jibdew jaraw din il-funzjoni fl-eżempji kollha li ġeneralment jitpoġġew mill-blink għal kwalunkwe dawl tat-traffiku jew kwalunkwe manipulazzjoni ta 'LEDS mixgħula u mitfija.
Id-dewmien għandu problema kbira ħafna, u jiġifieri li meta nsejħu delay() għal ammont ta’ żmien, kollox jieqaf. Il-bord ma jaqra l-ebda sensor, u lanqas ikompli jesegwixxi sentenzi, u lanqas ma jagħmel xejn, stenna biss il-ħin li għedna biex tgħaddi u ovvjament jekk irridu nużaw il-bord għal aktar minn ħaġa waħda fl-istess ħin, dan mhuwiex vijabbli.
Se jkollna nagħtu ħarsa lejn millis () anke biex tittardjaMicroseconds() U għandna wkoll micros() li jirritorna n-numru ta 'mikrosekondi minn meta l-programm beda jesegwixxi
Teptip mingħajr dewmien
Eżempju frisk biex tara kif jaħdem hu imexxi l-Blink mitiku imma mingħajr dewmien. Id-differenza ewlenija hija li tinsa dwar il-funzjoni delay () u tuża millis () biex tkun tista 'tgħodd il-ħin li għadda bejn l-operazzjonijiet.
Li tkun taf dwar l-eżistenza ta 'interruzzjonijiet f'Arduino jista' jgħinek timplimenta programmi b'ċertu grad ta 'multitasking.
Hello Leandro, grazzi ħafna. Ma nafx is-suġġett tal-interruzzjonijiet. Se ninvestiga biex nara :)
HEMM FUNZJONI TA 'SKEDA LI TĦALLI DIVERSI LOOPS FL-ISTESS ĦIN