Mundarija:
Video: Millis () bilan Arduino vaqtini aniqlash usullari: 4 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:25
Ushbu maqolada biz millis () ni tanishtiramiz; funktsiyasini bajaring va uni turli vaqt misollarini yaratish uchun ishlating.
Millis? Lablarni sinxronlash bilan hech qanday aloqasi yo'q … umid qilamanki, siz millini mingdan biriga raqamli prefiks sifatida tan oldingiz; o'lchov birligini 0,001 ga ko'paytiradi (yoki o'ntasi manfiy 3 ga teng).
Qizig'i shundaki, bizning Arduino tizimlarimiz eskiz boshlanishidan boshlab, sanoqsiz sonli (32 bitli (to'rt baytli) tamsayıli o'zgaruvchan turda saqlanishi mumkin bo'lgan maksimal songacha etib borguncha millisekundlar sonini (ming soniyalar) hisoblab chiqadi. -bu noldan (2^32) -1 gacha. (2^32) -1 yoki 4294967295 millisekund 49.71027-toq kunlarga aylanadi.
Hisoblagich Arduino qayta o'rnatilganda, u maksimal qiymatga yetganda yoki yangi eskiz yuklangach, asl holatiga qaytadi. Hisoblagichning qiymatini ma'lum bir vaqtda olish uchun funktsiyani chaqiring - masalan:
boshlash = millis ();
Qaerda start - imzosiz uzun o'zgaruvchi. Millis () ni amalda ko'rsatish uchun juda oddiy misol:
/ * millis () namoyishi */
imzosiz uzoq boshlangan, tugagan, o'tgan;
bo'sh o'rnatish ()
{Serial.begin (9600); }
bo'sh halqa ()
{Serial.println ("Boshlash …"); boshlash = millis (); kechikish (1000); tugagan = millis (); Serial.println ("Tayyor"); elapsed = tugatish-boshlash; Serial.print (o'tgan); Serial.println ("millisekundlar o'tdi"); Serial.println (); kechikish (500); }
Eskizda hozirgi millis soni sanaladi, so'ngra bir soniya kutiladi, so'ngra milis qiymati tayyor holatda saqlanadi. Nihoyat, u kechikishning o'tgan vaqtini hisoblab chiqadi. Keyingi ketma -ket monitor ekranida siz rasmda ko'rsatilgandek davomiyligi har doim ham aniq 1000 millisekund emasligini ko'rishingiz mumkin.
1 -qadam:
Oddiy qilib aytganda, millis funktsiyasi sizning Arduino markazidagi ATmega mikrokontrolleridagi ichki hisoblagichdan foydalanadi. Bu hisoblagich har bir soat tsiklini oshiradi - bu standart Arduino va mos keladiganlarda) 16 MGts soat tezligida sodir bo'ladi. Bu tezlikni Arduino taxtasidagi billur boshqaradi (T16.000 muhrlangan kumush narsa).
2 -qadam:
Kristal aniqligi tashqi haroratga va kristalning tolerantligiga qarab o'zgarishi mumkin. Bu, o'z navbatida, millis natijangizning to'g'riligiga ta'sir qiladi. Anekdot tajribasi shuni ko'rsatadiki, vaqt aniqligining o'zgarishi yigirma to'rt soatlik davrda uch yoki to'rt soniya atrofida bo'lishi mumkin.
Agar siz kristal o'rniga keramik rezonatordan foydalanadigan taxtadan yoki o'zingizning versiyangizdan foydalansangiz, ular unchalik aniq emasligini va yuqori darajadagi siljish ehtimolini bildirishini unutmang. Agar sizga yuqori aniqlikdagi vaqt aniqligi kerak bo'lsa, Maxim DS3231 kabi maxsus taymer IClarini ko'rib chiqing.
Endi biz millisdan turli xil vaqt funktsiyalari uchun foydalanishimiz mumkin. Oldingi eskizda ko'rsatilgandek, o'tgan vaqtni hisoblashimiz mumkin. Bu fikrni ilgari surish uchun, keling, oddiy soniya hisoblagichini qilaylik. Bu oddiy yoki kerakli darajada murakkab bo'lishi mumkin, lekin bu holda biz sodda tomon burilamiz.
Uskuna nuqtai nazaridan, bizda ikkita tugma bo'ladi-"Ishga tushirish va to'xtatish"-10k ohmli qarshilik rezistorlari mos ravishda 2 va 3 raqamli pimlarga ulangan. Foydalanuvchi bosishni boshlaganida, eskiz millis qiymatiga e'tibor beradi - to'xtatish tugmachasini bosgandan so'ng, eskiz yana millis qiymatini qayd qiladi, o'tgan vaqtni hisoblab chiqaradi. Foydalanuvchi jarayonni takrorlash uchun start tugmasini bosishi yoki yangilangan ma'lumotlar uchun to'xtashi mumkin. Mana eskiz:
/* Millis () yordamida super asosiy sekundomer; */
imzosiz uzoq boshlangan, tugagan, o'tgan;
bo'sh o'rnatish ()
{Serial.begin (9600); pinMod (2, Kirish); // boshlash tugmasi pinMode (3, INPUT); // to'xtatish tugmasi Serial.println ("Ishga tushirish/tiklash uchun 1 -ni, o'tgan vaqt uchun 2 -ni bosing"); }
void displayResult ()
{float h, m, s, ms; uzoq vaqt imzolanmagan; elapsed = tugatish-boshlash; h = int (o'tgan/3600000); oshdi = o'tgan%3600000; m = int (60000 dan ortiq); ortiq =%60000 dan yuqori; s = int (1000 dan ortiq); ms =%1000 dan yuqori; Serial.print ("Xom o'tgan vaqt:"); Serial.println (o'tgan); Serial.print ("O'tgan vaqt:"); Ketma -ket chop etish (h, 0); Serial.print ("h"); Ketma -ket chop etish (m, 0); Serial.print ("m"); Ketma -ket chop etish (lar, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }
bo'sh halqa ()
{if (digitalRead (2) == HIGH) {start = millis (); kechikish (200); // o'chirish uchun Serial.println ("Boshlandi …"); } if (digitalRead (3) == YUQORI) {tugallangan = millis (); kechikish (200); // displeyni o'chirish uchun displayResult (); }}
Delay () qo'ng'iroqlari kalitlarni o'chirish uchun ishlatiladi - bu ixtiyoriy va ulardan foydalanish sizning qurilmangizga bog'liq bo'ladi. Rasm eskizning ketma -ket monitoriga misol bo'la oladi - soniya hisoblagichi ishga tushdi, keyin ikki tugmani vaqt oralig'ida olti marta bosildi.
3 -qadam: tezlik o'lchagich …
Agar sizda belgilangan masofaning boshida va oxirida sensor bo'lsa, tezlikni hisoblash mumkin edi: tezlik = masofa ÷ vaqt.
Shuningdek, siz g'ildirakli harakat shakli uchun tezlik o'lchagich yasashingiz mumkin, masalan velosiped. Hozirgi vaqtda bizda velosiped yo'q, lekin biz bu jarayonni tasvirlay olamiz - bu juda oddiy. (Ogohlantirishlar - buni o'zingizning xavf -xataringiz bilan qiling va hokazo.)
Birinchidan, kerakli matematikani ko'rib chiqaylik. Siz g'ildirak atrofini bilishingiz kerak. Uskuna - sizga sensor kerak bo'ladi. Masalan - qamish kaliti va magnit. Qamish kalitini odatda ochiq tugma deb hisoblang va odatdagidek 10k ohmli pastga tushadigan qarshilik bilan ulang.
Boshqalar zal effektli sensordan foydalanishlari mumkin-har biri o'z ixtiyori bilan). Matematikadan eslang, aylanani hisoblash uchun - formuladan foydalaning: aylana = 2πr, bu erda r - aylananing radiusi.
Endi sizda g'ildirak atrofi bo'lsa, bu qiymatni "sobit masofa" deb hisoblashimiz mumkin, shuning uchun tezlikni to'liq aylanish orasidagi o'tgan vaqtni o'lchash yo'li bilan hisoblash mumkin.
Sensoringiz-bir marta o'rnatilgandan so'ng-har safar aylantirib turiladigan oddiy ochiladigan tugma bilan bir xilda harakat qilishi kerak. Bizning eskizimiz sensordan har bir zarba o'rtasida o'tgan vaqtni o'lchaydi.
Buni amalga oshirish uchun bizning misolimizda sensori chiqishi raqamli pin 2 ga ulangan bo'ladi, chunki u tezlikni hisoblash uchun uzilishni keltirib chiqaradi. Aks holda, eskiz tezlikni oddiy I2C interfeysli LCD modulida aks ettiradi. I2C interfeysi taklif qilinadi, chunki buning uchun Arduino kartasidan LCDga 4 ta sim kerak bo'ladi - simlar qancha kam bo'lsa, shuncha yaxshi bo'ladi.
Mana sizning tanishishingiz uchun eskiz:
/*Millis () yordamida asosiy tezlik o'lchagich; */
#ni qo'shing "Wire.h" // I2C avtobus LCD uchun
#ni qo'shing "LiquidCrystal_I2C.h" // I2C avtobus LCD moduli uchun - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // 16 ta belgi va 2 qatorli displey uchun LCD manzilni 0x27 ga o'rnating
suzishni boshlash, tugatish;
suzish o'tdi, vaqt; float circMetric = 1.2; // g'ildirak atrofi datchik holatiga nisbatan (metrda) float circImperial; // 1 kilometr = 0,621371192 mil tezlikda suzuvchi speedk, speedm yordamida; // metrik va imperiyada hisoblangan tezlik vallarini ushlab turadi
bo'sh o'rnatish ()
{attachInterrupt (0, speedCalc, RISING); // datchiklar raqamli 2 ta yuqori (har bir g'ildirak aylanishi) start = millis () ni yuborganda sensorlar chaqiriladi. // LCD lcd.init () ni sozlash; // lcd lcd.backlight () ni ishga tushirish; // LCD orqa yoritgichini yoqish lcd.clear (); lcd.println ("Dubulg'a taqing!"); kechikish (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // MPH hisoblari uchun metrikani imperiyaga aylantirish}
bo'sh tezlikCalc ()
{elapsed = millis ()-boshlash; boshlash = millis (); speedk = (3600*circMetric)/o'tgan; // km/soat tezlik = (3600*circImperial)/o'tgan; // Milya soatiga}
bo'sh halqa ()
{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/soat"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (o'tgan)); lcd.print ("ms/rev"); kechikish (1000); // titrashni kamaytirish uchun shaxsiy xohishingizga moslashtiring}
Bu juda ko'p narsa emas - har safar g'ildirak bir marta aylansa, sensordan signal pastdan yuqoriga o'tadi - bu uzilishni keltirib chiqaradi, bu esa speedCalc () funktsiyasini chaqiradi.
Bu millis () o'qilishini oladi, so'ngra joriy o'qish va oldingi o'qish o'rtasidagi farqni hisoblab chiqadi - bu qiymat masofani bosib o'tish vaqtiga aylanadi (bu g'ildirakning sensori ga nisbatan aylanasi).
float circMetric = 1.2;
va metr bilan o'lchanadi). Nihoyat, tezlikni km/soat va MPH bilan hisoblab chiqadi. Tanaffuslar orasida eskiz LCD displeyda yangilangan tezlik ma'lumotlarini, shuningdek qiziqish uchun har bir inqilob uchun vaqtni ko'rsatadi. Haqiqiy hayotda menimcha, LCD displeyni velosipedga hech kim o'rnatmaydi, ehtimol LED displeyi ko'proq mos keladi.
Bu orada, bu misol qanday ishlashini quyidagi qisqa videoklipda ko'rishingiz mumkin. Velosiped g'ildiragi va qamish kaliti/magnit kombinatsiyasi o'rniga, men sensordan pulslarni simulyatsiya qilish uchun funktsiya generatoridan kvadrat to'lqinli chiqishni uzilish piniga uladim, shuning uchun siz uning qanday ishlashi haqida tasavvurga ega bo'lishingiz mumkin.
4 -qadam:
Bu hozircha millis () dan foydalanishni qisqartiradi. Bundan tashqari, micros () mavjud; mikrosaniyalarni hisoblaydigan funksiya.
Demak, sizda - Arduino dunyosi orqali ko'proq muammolarni hal qilishga imkon beradigan yana bir amaliy funktsiya. Har doimgidek, endi siz va sizning tasavvuringiz nazorat qiladigan biror narsani topish yoki boshqa jinoyatchilar bilan kelishishdir.
Bu xabar sizga pmdway.com tomonidan olib kelingan - ishlab chiqaruvchilar va elektronika ixlosmandlari uchun hamma narsa, butun dunyo bo'ylab bepul etkazib berish.
Tavsiya:
Wi-Fi routeringizning ish vaqtini olish uchun UPS-ni Steam Punk: 4 qadam (rasmlar bilan)
Wi-Fi routeringiz uchun bir necha soatlik ish vaqtini olish uchun Steam Punk: UPS-ning 12V doimiy quvvat quvvatini 220V o'zgaruvchan tok quvvatiga aylantirishi bilan umuman rozi bo'lmagan narsa bor, shuning uchun yo'riqnoma va ONT tolali transformatorlari uni qayta o'zgartirishi mumkin. 12V DC! Siz ham [odatda
Eski kompyuter qismlarini qayta ishlatishning ajoyib usullari: 7 qadam (rasmlar bilan)
Kompyuterning eski qismlarini qayta ishlatishning ajoyib usullari: Men sizga bu kompyuterda hamma tashlab yuboradigan eski kompyuterlarning ayrim qismlarini qayta ishlatish bo'yicha qisqacha fikrlar beraman. to'liq bermaydi
Yuzni aniqlash va aniqlash - OpenCV Python va Arduino yordamida Arduino Face ID: 6 qadam
Yuzni aniqlash va aniqlash | OpenCV Python va Arduino yordamida Arduino Face ID: yuzni aniqlash AKA yuz identifikatori hozirgi vaqtda mobil telefonlarning eng muhim xususiyatlaridan biridir. Shunday qilib, menda "Arduino loyihasi uchun yuz identifikatori bo'lishi mumkinmi?" Degan savol bor edi. va javob ha … Mening sayohatim quyidagicha boshlandi: 1 -qadam: Bizga kirish
FTC robotlari uchun sanoat simlarini ulash usullari - usullari va maslahatlari: 4 qadam
FTC robotlari uchun sanoat simlarini ulash texnikasi - usul va maslahatlar: Ko'p FTC jamoalari o'z robotlari uchun elektronikani o'rnatish uchun simlarni ulashning asosiy texnikasi va asboblariga tayanadi. Biroq, bu asosiy usullar va materiallar, kabelning ilg'or talablari uchun etarli bo'lmaydi. Sizning jamoangiz yanada rivojlangan sezgidan foydalanadimi
Ultrasonik sensor va Funduino suv sensori yordamida Arduino suv sathini aniqlash usullari: 4 qadam
Ultrasonik sensor va Funduino suv sensori yordamida Arduino suv sathini aniqlash usullari: Ushbu loyihada men sizga ikkita usuldan foydalanib, arzon suv detektori qanday yaratilishini ko'rsataman: 1. Ultrasonik sensor (HC-SR04) .2. Funduino suv sensori