Orodha ya maudhui:

Njia za Majira ya Arduino Na Milioni (): Hatua 4
Njia za Majira ya Arduino Na Milioni (): Hatua 4

Video: Njia za Majira ya Arduino Na Milioni (): Hatua 4

Video: Njia za Majira ya Arduino Na Milioni (): Hatua 4
Video: UKIZIONA DALILI HIZI MAMA MJAMZITO BASI UTAJIFUNGUA MTOTO WA KIUME 2024, Julai
Anonim
Njia za Majira ya Arduino na Milioni ()
Njia za Majira ya Arduino na Milioni ()

Katika kifungu hiki tunatambulisha millis (); kazi na uitumie kuunda mifano anuwai ya wakati.

Millis? Hakuna chochote cha kufanya na viboreshaji vya midomo… tunatumahi ulitambua milli kama kiambishi cha nambari kwa elfu moja; hiyo ni kuzidisha kitengo cha kipimo kwa 0.001 (au kumi kwa nguvu ya hasi 3).

Cha kufurahisha ni kwamba mifumo yetu ya Arduino itahesabu idadi ya milliseconds (maelfu ya sekunde) kutoka mwanzo wa mchoro unaoendesha hadi hesabu ifikie nambari ya juu inayoweza kuhifadhiwa katika aina ya kutofautisha isiyosainiwa kwa muda mrefu (32-bit [nne byte] integer - hiyo ni kati ya sifuri hadi (2 ^ 32) -1. (2 ^ 32) -1, au 4294967295 milliseconds hubadilika kuwa siku 49.71027-isiyo ya kawaida.

Kaunta huweka upya wakati Arduino inapowekwa upya, inafikia kiwango cha juu au mchoro mpya unapakiwa. Ili kupata thamani ya kaunta kwa wakati fulani, piga simu tu kazi - kwa mfano:

Anza = millis ();

Ambapo kuanza ni tofauti isiyosainiwa kwa muda mrefu. Hapa kuna mfano rahisi sana kukuonyesha millis () in action:

/ * millis () maandamano * /

kuanza kusainiwa kwa muda mrefu, kumaliza, kupita;

kuanzisha batili ()

{Serial.begin (9600); }

kitanzi batili ()

{Serial.println ("Anza…"); Anza = millis (); kuchelewesha (1000); kumaliza = millis (); Serial.println ("Imemalizika"); ilipita = kumaliza-kuanza; Serial.print (ilipita); Serial.println ("milisekunde imepita"); Serial.println (); kuchelewesha (500); }

Mchoro huo huhifadhi hesabu ya millissi ya sasa mwanzoni, kisha inasubiri sekunde moja, kisha huhifadhi thamani ya millis tena katika kumaliza. Mwishowe inakokotoa wakati uliopita wa ucheleweshaji. Katika dampo la skrini ifuatayo ya mfuatiliaji wa serial, unaweza kuona kwamba muda haukuwa sawa milliseconds 1000, kama inavyoonekana kwenye picha.

Hatua ya 1:

Picha
Picha

Kuiweka kwa urahisi, kazi ya millis hutumia kaunta ya ndani ndani ya mdhibiti mdogo wa ATmega kwenye moyo wa Arduino yako. Kaunta hii inaongeza kila mzunguko wa saa - ambayo hufanyika (kwa kiwango cha kawaida cha Arduino na zinazofanana) kwa kasi ya saa ya 16 Mhz. Kasi hii inadhibitiwa na kioo kwenye ubao wa Arduino (kitu cha fedha kilicho na mhuri wa T16.000).

Hatua ya 2:

Picha
Picha

Usahihi wa kioo unaweza kutofautiana kulingana na joto la nje, na uvumilivu wa kioo yenyewe. Hii nayo itaathiri usahihi wa matokeo yako ya millisisi. Uzoefu wa hadithi umeripoti kuteleza kwa usahihi wa muda kunaweza kuwa karibu sekunde tatu au nne kwa muda wa saa ishirini na nne.

Ikiwa unatumia bodi au toleo lako mwenyewe ambalo linatumia resonator ya kauri badala ya kioo, kumbuka kuwa sio sahihi na itaanzisha uwezekano wa viwango vya juu vya kuteleza. Ikiwa unahitaji kiwango cha juu zaidi cha usahihi wa muda, fikiria ICs maalum kama vile Maxim DS3231.

Sasa tunaweza kutumia millis kwa kazi anuwai za muda. Kama inavyoonyeshwa katika mchoro wa mfano uliopita, tunaweza kuhesabu wakati uliopita. Ili kupeleka wazo hili mbele, wacha tufanye saa rahisi ya kusimama. Kufanya hivyo inaweza kuwa rahisi au ngumu kama inahitajika, lakini kwa kesi hii tutaelekea rahisi.

Kwa mtazamo wa vifaa, tutakuwa na vifungo viwili - Anza na Simama - na vipikizi vya kuvuta-chini vya 10k ohm vilivyounganishwa na pini za dijiti 2 na 3 mtawaliwa. Wakati vyombo vya habari vya mtumiaji vinaanza mchoro utaona thamani ya millis - kisha baada ya kubonyeza kituo, mchoro utaona tena thamani ya milisiti, kuhesabu na kuonyesha wakati uliopitiliza. Mtumiaji anaweza kubonyeza kuanza kurudia mchakato, au kuacha data iliyosasishwa. Hapa kuna mchoro:

/ * Saa ya saa ya juu-msingi kwa kutumia millis (); * /

kuanza kusainiwa kwa muda mrefu, kumaliza, kupita;

kuanzisha batili ()

{Serial.begin (9600); pinMode (2, Pembejeo); // PINMode ya kifungo cha kuanza (3, INPUT); // kitufe cha kuacha Serial.println ("Bonyeza 1 kwa Anzisha / kuweka upya, 2 kwa muda uliopita"); }

onyesha batiliResult ()

{kuelea h, m, s, ms; haijasajiliwa kwa muda mrefu; ilipita = kumaliza-kuanza; h = int (ilipita / 3600000); juu = ilipita% 3600000; m = int (zaidi ya / 60000); zaidi ya = zaidi ya% 60000; s = int (zaidi ya / 1000); ms = zaidi ya% 1000; Serial.print ("Wakati uliopotea mbichi:"); Serial.println (imepita); Serial.print ("Muda Uliopita:"); Printa ya serial (h, 0); Serial.print ("h"); Printa ya serial (m, 0); Serial.print ("m"); Printa ya serial (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

kitanzi batili ()

{if (digitalRead (2) == HIGH) {start = millis (); kuchelewesha (200); // kwa kujiondoa Serial.println ("Imeanza…"); } ikiwa (digitalRead (3) == HIGH) {kumaliza = millis (); kuchelewesha (200); // kwa kufuta maonyeshoResult (); }}

Simu za kuchelewesha () hutumiwa kuondoa swichi - hizi ni za hiari na matumizi yao yatategemea vifaa vyako. Picha hiyo ni mfano wa pato la mfuatiliaji wa mfululizo wa sketch - saa ya kuanza imeanza, kisha bonyeza kitufe cha mara mbili kushinikizwa mara sita kwa vipindi vya muda.

Hatua ya 3: Speedometer…

Image
Image

Ikiwa ungekuwa na sensorer mwanzoni na mwisho wa umbali uliowekwa, kasi inaweza kuhesabiwa: kasi = umbali ÷ wakati.

Unaweza pia kutengeneza kipima kasi kwa aina ya mwendo wa magurudumu, kwa mfano baiskeli. Kwa wakati huu wa sasa hatuna baiskeli ya kuchezea, hata hivyo tunaweza kuelezea mchakato wa kufanya hivyo - ni rahisi sana. (Kanusho - fanya hivyo kwa hatari yako mwenyewe n.k.)

Kwanza kabisa, hebu tuangalie hesabu zinazohitajika. Utahitaji kujua mzunguko wa gurudumu. Vifaa - utahitaji sensorer. Kwa mfano - swichi ya mwanzi na sumaku. Fikiria swichi ya mwanzi kuwa kitufe kilicho kawaida kufunguliwa, na unganisha kama kawaida na kipikizi cha 10k ohm cha kushuka.

Wengine wanaweza kutumia sensa ya athari ya ukumbi - kila mmoja kwao). Kumbuka kutoka kwa darasa la hesabu, kuhesabu mzunguko - tumia fomula: mzingo = 2πr wapi r ni eneo la duara.

Sasa kwa kuwa una mduara wa gurudumu, thamani hii inaweza kuzingatiwa kama 'umbali wetu uliowekwa', na kwa hivyo kasi inaweza kuhesabiwa kwa kupima muda uliopita kati ya mzunguko kamili.

Sensorer yako - mara moja imewekwa - inapaswa kutenda kwa njia sawa na kitufe cha kawaida-wazi ambacho kinasukumwa kila mzunguko. Mchoro wetu utapima wakati uliopita kati ya kila pigo kutoka kwa sensa.

Ili kufanya hivyo, mfano wetu utakuwa na pato la sensorer iliyounganishwa na pini ya dijiti 2 - kwani itasababisha usumbufu ili kuhesabu kasi. Mchoro utakuwa unaonyesha kasi kwenye moduli ya kawaida ya LCD ya I2C. Muunganisho wa I2C unapendekezwa kwani hii inahitaji waya 4 tu kutoka bodi ya Arduino hadi LCD - waya chini ni bora.

Hapa kuna mchoro wa uchunguzi wako:

/ * Speedometer ya msingi kwa kutumia millis (); * /

# pamoja na "Wire.h" // kwa I2C basi ya LCD

# pamoja na "LiquidCrystal_I2C.h" // kwa moduli ya LCD ya basi ya I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // weka anwani ya LCD kwa 0x27 kwa chars 16 na onyesho la laini 2

kuanza kuelea, kumaliza;

kuelea ilipita, wakati; kuelea mzunguko Metriki = 1.2; // mduara wa gurudumu inayohusiana na msimamo wa sensorer (kwa mita) kuelea mzungukoImperial; // kutumia kilomita 1 = 0.621371192 maili kuelea kasi, kasi; // inashikilia vali za kasi zilizohesabiwa katika metri na kifalme

kuanzisha batili ()

{ambatisha kukatiza (0, speedCalc, RISING); // usumbufu ulioitwa wakati sensorer zinapotuma dijiti 2 juu (kila mzunguko wa gurudumu) start = millis (); // kuanzisha LCD lcd.init (); // kuanzisha lcd lcd. taa ya nyuma (); // washa LCD backlight LCD.. wazi (); lcd.println ("Vaa kofia ya chuma!"); kuchelewesha (3000); lcd wazi (); Serial. Kuanza (115200); circImperial = mzungukoMetric *.62137; // badilisha metri kuwa kifalme kwa mahesabu ya MPH}

kasi ya utupuCalc ()

{ilipita = millis () - kuanza; Anza = millis (); speedk = (3600 * circMetric) / ilipita; // km / h speedm = (3600 * circImperial) / ilipita; // Maili kwa saa}

kitanzi batili ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km / h"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (ilipita)); lcd.print ("ms / rev"); kuchelewesha (1000); // rekebisha upendeleo wa kibinafsi ili kupunguza kuangaza}

Hakuna kinachoendelea sana - kila wakati gurudumu linakamilisha mapinduzi moja ishara kutoka kwa sensa itatoka chini hadi juu - ikisababisha usumbufu ambao huita kasi ya kaziCalc ().

Hii inachukua usomaji wa millis () na kisha kuhesabu tofauti kati ya usomaji wa sasa na usomaji uliopita - thamani hii inakuwa wakati wa kufunika umbali (ambao ni mzingo wa gurudumu inayohusiana na sensa iliyohifadhiwa ndani

kuelea mzunguko Metriki = 1.2;

na hupimwa kwa mita). Hatimaye huhesabu kasi katika km / h na MPH. Kati ya kukatiza mchoro unaonyesha data ya kasi iliyosasishwa kwenye LCD na vile vile thamani ya wakati mbichi kwa kila mapinduzi kwa sababu ya udadisi. Katika maisha halisi sidhani kama mtu yeyote angeweka LCD kwenye baiskeli, labda onyesho la LED litafaa zaidi.

Wakati huo huo, unaweza kuona jinsi mfano huu unavyofanya kazi katika klipu fupi ya video ifuatayo. Badala ya gurudumu la baiskeli na mchanganyiko wa kubadili mwanzi / sumaku, nimeunganisha pato la mawimbi ya mraba kutoka kwa jenereta ya kazi hadi pini ya kukatiza ili kuiga mapigo kutoka kwa sensa, ili uweze kupata wazo la jinsi inavyofanya kazi.

Hatua ya 4:

Hiyo ni tu juu ya matumizi ya millis () kwa sasa. Pia kuna micros (); kazi ambayo inahesabu microseconds.

Kwa hivyo unayo - kazi nyingine inayofaa ambayo inaweza kuruhusu shida zaidi kutatuliwa kupitia ulimwengu wa Arduino. Kama kawaida, sasa ni juu yako na mawazo yako kupata kitu cha kudhibiti au kuamka kwa shenanigans wengine.

Chapisho hili limeletwa kwako na pmdway.com - kila kitu kwa watengenezaji na wapenda umeme, na uwasilishaji wa bure ulimwenguni.

Ilipendekeza: