Sadržaj:

Arduino metode mjerenja s Millisom (): 4 koraka
Arduino metode mjerenja s Millisom (): 4 koraka

Video: Arduino metode mjerenja s Millisom (): 4 koraka

Video: Arduino metode mjerenja s Millisom (): 4 koraka
Video: Бесконтактный датчик температуры дальнего действия MLX90614-DCI с Arduino 2024, Srpanj
Anonim
Arduino metode mjerenja s Millisom ()
Arduino metode mjerenja s Millisom ()

U ovom članku predstavljamo millis (); funkciju i staviti je u funkciju stvaranja različitih primjera mjerenja vremena.

Millis? Nema veze sa usnim sincerima … nadamo se da ste prepoznali milli kao numerički prefiks za tisućinke; to je množenje mjerne jedinice s 0,001 (ili deset na stupanj minus 3).

Zanimljivo je da će naši Arduino sustavi brojati broj milisekundi (tisuće sekundi) od početka izvođenja skice sve dok broj ne dosegne najveći broj koji se može pohraniti u varijablu tipa unsigned long (32-bitni [četiri bajta] cijeli broj -to se kreće od nule do (2^32) -1. (2^32) -1, ili 4294967295 milisekundi pretvara se u 49.71027-neparnih dana.

Brojač se resetira kada se Arduino resetira, dostigne maksimalnu vrijednost ili se prenese nova skica. Da biste dobili vrijednost brojača u određenom trenutku, samo pozovite funkciju - na primjer:

početak = millis ();

Gdje je start bezznačna duga varijabla. Evo vrlo jednostavnog primjera koji vam prikazuje millis () na djelu:

/ * demonstracija millis () */

nepotpisani dugi početak, završen, protekao;

void setup ()

{Serial.begin (9600); }

void loop ()

{Serial.println ("Pokreni …"); početak = millis (); kašnjenje (1000); gotov = millis (); Serial.println ("Završeno"); proteklo = gotov start; Serijski.ispis (proteklo); Serial.println ("protekle milisekunde"); Serial.println (); kašnjenje (500); }

Skica sprema trenutni broj milisa u početak, zatim čeka jednu sekundu, a zatim vrijednost milisa ponovno sprema u gotovom. Na kraju izračunava proteklo vrijeme kašnjenja. Na sljedećem ispisu zaslona serijskog monitora možete vidjeti da trajanje nije uvijek bilo točno 1000 milisekundi, kao što je prikazano na slici.

Korak 1:

Slika
Slika

Jednostavno rečeno, funkcija millis koristi unutarnji brojač unutar ATmega mikrokontrolera u srcu vašeg Arduina. Ovaj brojač povećava svaki ciklus takta - što se događa (u standardnom Arduinu i kompatibilnim uređajima) pri taktu od 16 Mhz. Ovom brzinom upravlja kristal na Arduino ploči (srebrna stvar s utisnutim T16.000).

Korak 2:

Slika
Slika

Točnost kristala može varirati ovisno o vanjskoj temperaturi i toleranciji samog kristala. To će opet utjecati na točnost vašeg rezultata u milisima. Anegdotsko iskustvo je izvijestilo da odstupanje u točnosti mjerenja vremena može biti oko tri ili četiri sekunde u razdoblju od dvadeset četiri sata.

Ako koristite ploču ili vlastitu verziju koja koristi keramički rezonator umjesto kristala, imajte na umu da nisu toliko točni i da će uvesti mogućnost veće razine zanošenja. Ako vam je potrebna mnogo veća razina točnosti mjerenja vremena, razmislite o specifičnim IC mjeračima vremena, poput Maxim DS3231.

Sada možemo koristiti milise za različite funkcije mjerenja vremena. Kao što je pokazano u prethodnom primjeru skice, možemo izračunati proteklo vrijeme. Kako bismo ovu ideju unaprijedili, napravimo jednostavnu štopericu. To može biti jednostavno ili složeno koliko je potrebno, ali u ovom slučaju ćemo skrenuti prema jednostavnom.

Što se tiče hardvera, imat ćemo dva gumba-Start i Stop-s 10k ohmskim pull-down otpornicima spojenim na digitalne pinove 2 odnosno 3. Kada korisnik pritisne start, skica će zabilježiti vrijednost za milise - tada će nakon pritiska na skicu skica ponovno zabilježiti vrijednost za milise, izračunati i prikazati proteklo vrijeme. Korisnik tada može pritisnuti start da ponovi postupak ili zaustaviti radi ažuriranja podataka. Evo skice:

/* Super-bazična štoperica pomoću millis (); */

nepotpisani dugi početak, završen, protekao;

void setup ()

{Serial.begin (9600); pinMode (2, INPUT); // gumb za pokretanje pinMode (3, INPUT); // gumb za zaustavljanje Serial.println ("Pritisnite 1 za start/reset, 2 za proteklo vrijeme"); }

void displayResult ()

{float h, m, s, ms; bez potpisa odavno; proteklo = gotov start; h = int (proteklo/3600000); preko = proteklo%3600000; m = int (preko/60000); preko = preko 600000; s = int (više od/1000); ms = preko%1000; Serial.print ("Sirovo proteklo vrijeme:"); Serial.println (proteklo); Serial.print ("Proteklo vrijeme:"); Serijski ispis (h, 0); Serial.print ("h"); Serijski.tisak (m, 0); Serial.print ("m"); Serijski.ispis (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

void loop ()

{if (digitalRead (2) == HIGH) {start = millis (); kašnjenje (200); // za debounce Serial.println ("Započeto …"); } if (digitalRead (3) == HIGH) {gotov = millis (); kašnjenje (200); // za debounce displayResult (); }}

Pozivi delay () koriste se za uklanjanje prekidača - oni su izborni i njihova će uporaba ovisiti o vašem hardveru. Slika je primjer izlaza serijskog monitora skice - štoperica je pokrenuta, a zatim je dva puta pritisnuta tipka dva šest puta.

Korak 3: Brzinomjer …

Image
Image

Ako ste imali senzor na početku i na kraju fiksne udaljenosti, brzina bi se mogla izračunati: brzina = udaljenost ÷ vrijeme.

Također možete napraviti brzinomjer za oblik kretanja na kotačima, na primjer bicikl. U ovom trenutku nemamo bicikl s kojim bismo se mogli petljati, međutim možemo opisati postupak za to - prilično je jednostavan. (Odricanje od odgovornosti - učinite to na vlastitu odgovornost itd.)

Prije svega, pregledajmo potrebnu matematiku. Morat ćete znati opseg kotača. Hardver - trebat će vam senzor. Na primjer - trska i magnet. Smatrajte da je trska sklopka normalno otvoreni gumb i spojite je kao i obično s otpornikom od 10 k ohma.

Drugi mogu koristiti senzor Hall-efekta-svaki za sebe). Zapamtite iz matematike, za izračun opsega - upotrijebite formulu: opseg = 2πr gdje je r polumjer kruga.

Sada kada imate opseg kotača, ova se vrijednost može smatrati našom 'fiksnom udaljenošću', pa se stoga brzina može izračunati mjerenjem proteklog vremena između potpune rotacije.

Vaš senzor-jednom postavljen-trebao bi djelovati na isti način kao i normalno otvoreni gumb koji se pritisne pri svakom okretanju. Naša skica će mjeriti vrijeme koje je proteklo između svakog impulsa sa senzora.

Kako bismo to učinili, u našem primjeru izlaz osjetnika bit će spojen na digitalni pin 2 - jer će pokrenuti prekid za izračunavanje brzine. Skica će inače prikazivati brzinu na normalnom LCD modulu sa sučeljem I2C. Predlaže se I2C sučelje jer za to su potrebne samo 4 žice od Arduino ploče do LCD -a - što manje žica to bolje.

Evo skice za vaš pregled:

/*Osnovni brzinomjer pomoću millis (); */

#include "Wire.h" // za I2C sabirnicu LCD

#include "LiquidCrystal_I2C.h" // za LCD modul sabirnice I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // postavite LCD adresu na 0x27 za prikaz od 16 znakova i 2 retka

float start, završio;

float proteklo, vrijeme; plovak circMetric = 1,2; // opseg kotača u odnosu na položaj senzora (u metrima) float circImperial; // pomoću 1 kilometra = 0,621371192 milja float speedk, speedm; // drži izračunate valove brzine u metričkim i imperijalnim vrijednostima

void setup ()

{attachInterrupt (0, speedCalc, RISING); // prekid koji se poziva kada senzori pošalju digitalno 2 visoko (pri svakom okretanju kotača) start = millis (); // postavljanje LCD lcd.init (); // inicijalizira lcd lcd.backlight (); // uključivanje LCD pozadinskog osvjetljenja lcd.clear (); lcd.println ("Nosite kacigu!"); kašnjenje (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // pretvori metričko u imperijalno za MPH izračune}

void speedCalc ()

{elapsed = millis ()-početak; početak = millis (); speedk = (3600*circMetric)/proteklo; // km/h brzinam = (3600*circImperial)/proteklo; // Milja na sat }

void loop ()

{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 (proteklo)); lcd.print ("ms/rev"); kašnjenje (1000); // prilagođavanje prema osobnim željama kako bi se smanjilo treperenje}

Ne događa se toliko - svaki put kada kotač završi jedan okretaj signal s senzora preći će s niskog na visoko - pokrećući prekid koji poziva funkciju speedCalc ().

Ovo uzima očitanje u milisu (), a zatim izračunava razliku između trenutnog očitanja i prethodnog očitanja - ta vrijednost postaje vrijeme za prelazak udaljenosti (što je opseg kotača u odnosu na senzor) - pohranjeno u

plovak circMetric = 1,2;

a mjeri se u metrima). Konačno izračunava brzinu u km/h i MPH. Između prekida skica prikazuje ažurirane podatke o brzini na LCD -u, kao i sirovu vrijednost vremena za svaki okret radi znatiželje. U stvarnom životu mislim da nitko ne bi montirao LCD na bicikl, možda bi LED zaslon bio relevantniji.

U međuvremenu možete vidjeti kako ovaj primjer funkcionira u sljedećem kratkom video isječku. Umjesto kotača bicikla i sklopke trska/magneta, spojio sam izlaz kvadratnog vala iz generatora funkcija na iglu za prekid kako bih simulirao impulse s senzora, tako da možete steći predodžbu o tome kako to radi.

Korak 4:

To zasad sumira uporabu millis () za sada. Tu je i mikro ((); funkcija koja broji mikrosekunde.

Evo ga - još jedna praktična funkcija koja može omogućiti rješavanje više problema putem svijeta Arduina. Kao i uvijek, sada je na vama i vašoj mašti da pronađete nešto čime ćete kontrolirati ili doći do drugih smicalica.

Ovaj post vam donosi pmdway.com - sve za proizvođače i ljubitelje elektronike, uz besplatnu dostavu diljem svijeta.

Preporučeni: