Isi kandungan:

Kaedah Pemasaan Arduino Dengan Millis (): 4 Langkah
Kaedah Pemasaan Arduino Dengan Millis (): 4 Langkah

Video: Kaedah Pemasaan Arduino Dengan Millis (): 4 Langkah

Video: Kaedah Pemasaan Arduino Dengan Millis (): 4 Langkah
Video: BELAJAR ARDUINO #94 - Millis Dengan Jeda Berbeda 2024, Julai
Anonim
Kaedah Pemasaan Arduino Dengan Millis ()
Kaedah Pemasaan Arduino Dengan Millis ()

Dalam artikel ini kami memperkenalkan milis (); berfungsi dan gunakan untuk membuat pelbagai contoh masa.

Millis? Tidak ada kaitan dengan penyegerak bibir … semoga anda mengiktiraf milli sebagai awalan berangka untuk seperseribu; iaitu mengalikan satuan ukuran dengan 0.001 (atau sepuluh hingga kekuatan negatif 3).

Menariknya sistem Arduino kami akan mengira bilangan milisaat (ribuan saat) dari awal lakaran berjalan sehingga kiraannya mencapai bilangan maksimum yang mampu disimpan dalam jenis pemboleh ubah panjang yang tidak ditandatangani (bilangan bulat 32-bit [empat bait] - yang berkisar antara sifar hingga (2 ^ 32) -1. (2 ^ 32) -1, atau 4294967295 milisaat bertukar menjadi 49.71027-hari ganjil.

Kaunter diset semula apabila Arduino diset semula, ia mencapai nilai maksimum atau lakaran baru dimuat. Untuk mendapatkan nilai pembilang pada titik tertentu, panggil fungsi - sebagai contoh:

permulaan = milis ();

Di mana permulaan adalah pemboleh ubah panjang yang tidak ditandatangani. Berikut adalah contoh yang sangat mudah untuk menunjukkan kepada anda tindakan milis ():

/ * demonstrasi millis () * /

permulaan lama yang belum ditandatangani, selesai, berlalu;

persediaan tidak sah ()

{Serial.begin (9600); }

gelung kosong ()

{Serial.println ("Mula …"); permulaan = milis (); kelewatan (1000); selesai = milis (); Serial.println ("Selesai"); berlalu = selesai-mula; Cetakan bersiri (berlalu); Serial.println ("milisaat berlalu"); Bersiri.println (); kelewatan (500); }

Sketsa menyimpan jumlah millis semasa pada mulanya, kemudian menunggu satu saat, kemudian menyimpan nilai millis sekali lagi dalam bentuk siap. Akhirnya ia mengira masa kelewatan yang telah berlalu. Dalam paparan skrin monitor bersiri berikut, anda dapat melihat bahawa durasinya tidak selalu tepat 1000 milisaat, seperti yang ditunjukkan dalam gambar.

Langkah 1:

Imej
Imej

Ringkasnya, fungsi millis menggunakan kaunter dalaman di dalam mikrokontroler ATmega di tengah-tengah Arduino anda. Kaunter ini meningkatkan setiap pusingan jam - yang berlaku (dalam Arduino standard dan sesuai) pada kelajuan jam 16 Mhz. Kelajuan ini dikawal oleh kristal di papan Arduino (barang perak dengan cap T16.000 di atasnya).

Langkah 2:

Imej
Imej

Ketepatan kristal boleh berbeza-beza bergantung pada suhu luaran, dan toleransi kristal itu sendiri. Ini seterusnya akan mempengaruhi ketepatan hasil milis anda. Pengalaman anekdot telah melaporkan peningkatan ketepatan masa sekitar tiga atau empat saat untuk tempoh dua puluh empat jam.

Sekiranya anda menggunakan papan atau versi anda sendiri yang menggunakan resonator seramik dan bukannya kristal, perhatikan bahawa ia tidak tepat dan akan memperkenalkan kemungkinan tahap drift yang lebih tinggi. Sekiranya anda memerlukan tahap ketepatan masa yang jauh lebih tinggi, pertimbangkan IC pemasa tertentu seperti Maxim DS3231.

Sekarang kita dapat memanfaatkan milis untuk pelbagai fungsi pemasaan. Seperti yang ditunjukkan dalam lakaran contoh sebelumnya, kita dapat mengira masa berlalu. Untuk meneruskan idea ini, mari buat jam randik ringkas. Melakukannya boleh sesederhana atau rumit yang diperlukan, tetapi untuk kes ini kita akan beralih ke arah sederhana.

Dari sudut perkakasan, kami akan mempunyai dua butang - Mula dan Berhenti - dengan perintang tarik 10k ohm masing-masing disambungkan ke pin digital 2 dan 3. Apabila pengguna menekan memulakan lakaran akan mencatat nilai untuk mil - kemudian setelah berhenti ditekan, lakaran akan kembali mencatat nilai untuk mil, mengira dan menunjukkan masa yang berlalu. Pengguna kemudian boleh menekan mula untuk mengulangi proses, atau berhenti untuk mengemas kini data. Inilah lakarannya:

/ * Jam randik super asas menggunakan millis (); * /

permulaan lama yang belum ditandatangani, selesai, berlalu;

persediaan tidak sah ()

{Serial.begin (9600); pinMode (2, INPUT); // butang mula pinMode (3, INPUT); // butang berhenti Serial.println ("Tekan 1 untuk Mula / tetapkan semula, 2 untuk masa berlalu"); }

paparan kosong Hasil ()

{float h, m, s, ms; lama tidak ditandatangani; berlalu = selesai-mula; h = int (berlalu / 3600000); lebih = berlalu% 3600000; m = int (lebih / 60000); lebih = lebih% 60000; s = int (lebih / 1000); ms = melebihi% 1000; Serial.print ("Masa berlalu mentah:"); Serial.println (berlalu); Serial.print ("Masa berlalu:"); Cetakan bersiri (h, 0); Cetakan bersiri ("h"); Cetakan bersiri (m, 0); Cetakan bersiri ("m"); Cetakan bersiri (s, 0); Serial.print ("s"); Cetakan bersiri (ms, 0); Serial.println ("ms"); Bersiri.println (); }

gelung kosong ()

{if (digitalRead (2) == TINGGI) {start = millis (); kelewatan (200); // untuk debounce Serial.println ("Bermula …"); } jika (digitalRead (3) == TINGGI) {selesai = milis (); kelewatan (200); // untuk debounce displayResult (); }}

Panggilan untuk menunda () digunakan untuk melepaskan suis - ini adalah pilihan dan penggunaannya bergantung pada perkakasan anda. Gambar adalah contoh output monitor bersiri sketsa - jam randik telah dimulakan, dan kemudian butang dua ditekan enam kali sepanjang jangka masa.

Langkah 3: Speedometer…

Image
Image

Sekiranya anda mempunyai sensor pada awal dan akhir jarak tetap, kelajuan dapat dihitung: kelajuan = jarak ÷ masa.

Anda juga boleh membuat speedometer untuk bentuk gerakan beroda, seperti basikal. Pada masa ini kami tidak mempunyai basikal untuk dipusingkan, namun kami dapat menggambarkan proses untuk melakukannya - ia cukup mudah. (Penafian - melakukannya dengan risiko anda sendiri dll.)

Pertama sekali, mari kita mengkaji matematik yang diperlukan. Anda perlu mengetahui lilitan roda. Perkakasan - anda memerlukan sensor. Contohnya - suis buluh dan magnet. Anggap suis buluh sebagai butang terbuka biasanya, dan sambungkan seperti biasa dengan perintang tarik 10k ohm.

Yang lain mungkin menggunakan sensor kesan-masing-masing - masing-masing). Ingat dari kelas matematik, untuk mengira lilitan - gunakan formula: lilitan = 2πr di mana r adalah jejari bulatan.

Sekarang kerana anda mempunyai lilitan roda, nilai ini boleh dianggap sebagai 'jarak tetap' kami, dan oleh itu kelajuan dapat dikira dengan mengukur masa yang berlalu antara putaran penuh.

Sensor anda - setelah dipasang - harus bertindak dengan kaedah yang sama seperti butang terbuka biasanya yang mendorong setiap putaran. Sketsa kami akan mengukur masa yang berlalu antara setiap denyut nadi dari sensor.

Untuk melakukan ini, contoh kita akan menghubungkan output sensor ke pin digital 2 - kerana ia akan mencetuskan gangguan untuk mengira kelajuan. Sketsa akan menunjukkan kelajuan pada modul LCD antara muka I2C biasa. Antaramuka I2C disarankan kerana ini hanya memerlukan 4 wayar dari papan Arduino ke LCD - semakin kurang wayar semakin baik.

Berikut adalah lakaran untuk anda fahami:

/ * Speedometer asas menggunakan milis (); * /

#sertakan "Wire.h" // untuk LCD bas I2C

#include "LiquidCrystal_I2C.h" // untuk modul LCD bas I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // tetapkan alamat LCD ke 0x27 untuk paparan 16 bar dan 2 baris

permulaan apungan, selesai;

apungan berlalu, masa; float circMetric = 1.2; // lilitan roda relatif dengan kedudukan sensor (dalam meter) litar pelampungImperial; // menggunakan 1 kilometer = 0.621371192 batu float speedk, speedm; // menahan nilai kelajuan yang dikira dalam metrik dan imperial

persediaan tidak sah ()

{attachInterrupt (0, speedCalc, RISING); // gangguan dipanggil apabila sensor menghantar digital 2 tinggi (setiap putaran roda) mula = milis (); // persediaan LCD lcd.init (); // inisialisasi lcd lcd.backlight (); // hidupkan lampu latar LCD lcd.clear (); lcd.println ("Pakai topi keledar!"); kelewatan (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric *.62137; // ubah metrik ke imperial untuk pengiraan MPH}

kelajuan kekosongan Calc ()

{berlalu = milis () - mula; permulaan = milis (); speedk = (3600 * circMetric) / berlalu; // km / j speedm = (3600 * circImperial) / berlalu; // Batu per jam }

gelung kosong ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km / j"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (berlalu)); lcd.print ("ms / rev"); kelewatan (1000); // sesuaikan untuk pilihan peribadi untuk mengurangkan kerlipan}

Tidak banyak yang berlaku - setiap kali roda menyelesaikan satu revolusi, isyarat dari sensor akan turun dari rendah ke tinggi - mencetuskan gangguan yang memanggil fungsi speedCalc ().

Ini memerlukan bacaan milis () dan kemudian mengira perbezaan antara bacaan semasa dan bacaan sebelumnya - nilai ini menjadi masa untuk menempuh jarak (yang merupakan lilitan roda relatif terhadap sensor - disimpan di

float circMetric = 1.2;

dan diukur dalam meter). Ini akhirnya mengira kelajuan dalam km / j dan MPH. Antara gangguan, lakaran memaparkan data kelajuan yang dikemas kini pada LCD serta nilai waktu mentah untuk setiap revolusi demi rasa ingin tahu. Dalam kehidupan nyata saya tidak menyangka ada yang memasang LCD pada basikal, mungkin paparan LED akan lebih relevan.

Sementara itu, anda dapat melihat bagaimana contoh ini berfungsi dalam klip video pendek berikut. Daripada kombinasi roda basikal dan suis reed / magnet reed, saya telah menghubungkan output gelombang persegi dari penjana fungsi ke pin interupsi untuk mensimulasikan denyutan dari sensor, jadi anda boleh mendapatkan idea bagaimana ia berfungsi.

Langkah 4:

Ini hanya merangkumi penggunaan milis () buat masa ini. Terdapat juga mikro (); fungsi yang mengira mikrodetik.

Oleh itu, anda memilikinya - fungsi praktikal lain yang membolehkan lebih banyak masalah dapat diselesaikan melalui dunia Arduino. Seperti biasa, kini terserah kepada anda dan imaginasi anda untuk mencari sesuatu untuk dikawal atau dihadiri oleh shenanigans lain.

Catatan ini disampaikan kepada anda oleh pmdway.com - semuanya untuk pembuat dan peminat elektronik, dengan penghantaran percuma ke seluruh dunia.

Disyorkan: