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, Novembar
Anonim
Arduino metode mjerenja s Millisom ()
Arduino metode mjerenja s Millisom ()

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

Millis? Nema veze sa usnim sinserima … nadamo se da ste prepoznali milli kao numerički prefiks za hiljaditi dio; to je množenje mjerne jedinice sa 0,001 (ili deset na stepen minus 3).

Zanimljivo je da će naši Arduino sistemi brojati broj milisekundi (hiljade sekundi) od početka skice koja se izvodi sve dok broj ne dosegne maksimalan broj koji se može pohraniti u varijabli 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 učita nova skica. Da biste dobili vrijednost brojača u određenom trenutku, samo pozovite funkciju - na primjer:

start = 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šeno, proteklo;

void setup ()

{Serial.begin (9600); }

void loop ()

{Serial.println ("Pokreni …"); start = millis (); kašnjenje (1000); završeno = millis (); Serial.println ("Završeno"); proteklo = gotov start; Serial.print (proteklo); Serial.println ("protekle milisekunde"); Serial.println (); kašnjenje (500); }

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

Korak 1:

Image
Image

Jednostavnije 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 sa utisnutim T16.000).

Korak 2:

Image
Image

Tačnost kristala može varirati u zavisnosti od spoljne temperature i tolerancije samog kristala. To će opet utjecati na točnost vašeg rezultata u milisima. Anegdotsko iskustvo je pokazalo da odstupanje u preciznosti mjerenja vremena može biti oko tri ili četiri sekunde u periodu 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ćih razina zanošenja. Ako vam je potreban mnogo veći nivo preciznosti mjerenja vremena, razmislite o specifičnim integriranim integriranim sklopovima tajmera, 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 prenijeli, napravimo jednostavnu štopericu. To može biti jednostavno ili onoliko 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-sa 10k ohm pull-down otpornicima spojenim na digitalne pinove 2 i 3. Kada korisnik pritisne start, skica će zabilježiti vrijednost u milisima - nakon što pritisne stop, skica će ponovno zabilježiti vrijednost u milisima, 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šeno, proteklo;

void setup ()

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

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 (preko/1000); ms = preko%1000; Serial.print ("Sirovo proteklo vrijeme:"); Serial.println (proteklo); Serial.print ("Proteklo vrijeme:"); Serial.print (h, 0); Serial.print ("h"); Serial.print (m, 0); Serial.print ("m"); Serial.print (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) {završeno = millis (); kašnjenje (200); // za debounce displayResult (); }}

Pozivi delay () koriste se za uklanjanje prekidača - oni su opcionalni i njihova upotreba ovisi o vašem hardveru. Slika je primjer izlaza serijskog monitora skice - štoperica je pokrenula, a zatim dva puta pritisnula dugme dva u različitim vremenskim periodima.

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 kretanje na kotačima, na primjer bicikl. U ovom trenutku nemamo bicikl s kojim bismo se mogli petljati, međutim možemo opisati postupak kako to učiniti - 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 trstični prekidač normalno otvoreno dugme i spojite ga kao i obično pomoću 10-ohmskog padajućeg otpornika.

Drugi mogu koristiti senzor s Hall-efektom-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 pune rotacije.

Vaš senzor-jednom postavljen-trebao bi djelovati na isti način kao i normalno otvoreno dugme koje se pritisne pri svakoj rotaciji. Naša skica će mjeriti vrijeme koje protekne između svakog impulsa sa senzora.

Da bismo to učinili, naš primjer će imati izlaz senzora spojen na digitalni pin 2 - jer će pokrenuti prekid za izračunavanje brzine. Skica će inače prikazivati brzinu na normalnom LCD modulu sa I2C interfejsom. 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š uvid:

/*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 reda

plutajući start, završeno;

plutalo proteklo, vrijeme; plovak circMetric = 1,2; // opseg kotača u odnosu na položaj senzora (u metrima) float circImperial; // koristeći 1 kilometar = 0,621371192 milja float speedk, speedm; // sadrži izračunate vrijednosti brzine u metričkim i imperijalnim veličinama

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čuje LCD pozadinsko osvjetljenje lcd.clear (); lcd.println ("Nosite kacigu!"); kašnjenje (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // pretvorimo metriku u imperijalnu za MPH proračune}

void speedCalc ()

{elapsed = millis ()-početak; start = millis (); speedk = (3600*circMetric)/proteklo; // km/h brzina m = (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 ličnim željama kako bi se smanjilo treperenje}

Ne događa se toliko - svaki put kada kotač završi jedan okretaj signal sa 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 - ova vrijednost postaje vrijeme za prelazak udaljenosti (što je opseg kotača u odnosu na senzor) - pohranjeno u

plovak circMetric = 1,2;

i 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 radoznalosti. U stvarnom životu mislim da niko ne bi montirao LCD na bicikl, možda bi LED displej bio relevantniji.

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

Korak 4:

To približno sumira upotrebu 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 pristupiti drugim smicalicama.

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

Preporučuje se: