فهرست مطالب:

روش های زمان بندی آردوینو با Millis (): 4 مرحله
روش های زمان بندی آردوینو با Millis (): 4 مرحله

تصویری: روش های زمان بندی آردوینو با Millis (): 4 مرحله

تصویری: روش های زمان بندی آردوینو با Millis (): 4 مرحله
تصویری: Home Automation: Using 4 Push button push-ON and push-OFF 4 relays with Arduino 2024, نوامبر
Anonim
روش های زمان بندی آردوینو با Millis ()
روش های زمان بندی آردوینو با Millis ()

در این مقاله ما millis () را معرفی می کنیم. استفاده کنید و از آن برای ایجاد مثالهای مختلف زمان بندی استفاده کنید.

ملیس؟ هیچ ربطی به لب لب ندارد … امیدوارم شما میلی را به عنوان پیش شماره عددی یک هزارم تشخیص داده اید. که یک واحد اندازه گیری را در 0.001 ضرب می کند (یا ده به توان منفی 3).

جالب اینجاست که سیستم های آردوینو ما تعداد میلی ثانیه (هزاران ثانیه) از شروع طرح را تا زمانی که تعداد به حداکثر تعداد قابل ذخیره در نوع متغیر بدون علامت طولانی (عدد صحیح 32 بیتی [چهار بایت]) برسد ، شمارش می کنند. -که از صفر تا (2^32) -1. (2^32) -1 ، یا 4294967295 میلی ثانیه به 49.71027 روز فرد تبدیل می شود.

هنگامی که آردوینو ریست می شود ، شمارنده بازنشانی می شود ، به حداکثر مقدار می رسد یا طرح جدیدی بارگذاری می شود. برای به دست آوردن مقدار شمارنده در یک موقعیت خاص ، فقط تابع را فراخوانی کنید - برای مثال:

شروع = millis ()؛

جایی که شروع می شود یک متغیر طولانی بدون علامت است. در اینجا یک مثال بسیار ساده برای نشان دادن millis () در عمل وجود دارد:

/ * میلیس () تظاهرات */

شروع طولانی بدون علامت ، تمام شده ، سپری شده ؛

void setup ()

{Serial.begin (9600) ؛ }

حلقه خالی ()

{Serial.println ("شروع …") ؛ شروع = millis ()؛ تاخیر (1000) ؛ تمام = millis ()؛ Serial.println ("به پایان رسید") ؛ سپری شده = پایان راه اندازی ؛ Serial.print (سپری شده) ؛ Serial.println ("میلی ثانیه سپری شد") ؛ Serial.println ()؛ تأخیر (500) ؛ }

این طرح شمارش میلی های فعلی را در ابتدا ذخیره می کند ، سپس یک ثانیه منتظر می ماند ، سپس مقدار میلی ثانیه را دوباره در حالت نهایی ذخیره می کند. در نهایت زمان سپری شده تاخیر را محاسبه می کند. در صفحه نمایش زیر صفحه نمایش مانیتور سریال ، می توانید ببینید که مدت زمان همیشه دقیقاً 1000 میلی ثانیه نبوده است ، همانطور که در تصویر نشان داده شده است.

مرحله 1:

تصویر
تصویر

به بیان ساده تر ، عملکرد millis از شمارنده داخلی درون میکروکنترلر ATmega در قلب Arduino شما استفاده می کند. این شمارنده هر چرخه ساعت را افزایش می دهد - که در سرعت استاندارد 16 مگاهرتز (در Arduino استاندارد و سازگار) اتفاق می افتد. این سرعت توسط کریستال روی برد آردوینو (وسیله نقره ای با مهر T16.000 روی آن کنترل می شود).

گام 2:

تصویر
تصویر

دقت کریستال بسته به دمای خارجی و تحمل خود بلور می تواند متفاوت باشد. این به نوبه خود بر دقت نتیجه میلی ثانیه شما تأثیر می گذارد. تجربه حدیثی گزارش کرده است که تغییر زمان می تواند در حدود سه یا چهار ثانیه در هر بیست و چهار ساعت باشد.

اگر از تخته یا نسخه شخصی خود استفاده می کنید که به جای کریستال از رزوناتور سرامیکی استفاده می کند ، توجه داشته باشید که آنها دقیق نیستند و احتمال افزایش سطوح رانش را افزایش می دهند. اگر به سطح بسیار بیشتری از دقت زمان نیاز دارید ، IC های تایمر خاص مانند Maxim DS3231 را در نظر بگیرید.

اکنون می توانیم از میلی برای عملکردهای مختلف زمان بندی استفاده کنیم. همانطور که در طرح قبلی نشان داده شد ، می توانیم زمان سپری شده را محاسبه کنیم. برای پیشبرد این ایده ، بیایید یک کرنومتر ساده بسازیم. انجام این کار می تواند به همان اندازه ساده یا پیچیده باشد ، اما در این مورد ما به سمت ساده منحرف می شویم.

از نظر سخت افزاری ، ما دو دکمه-Start و Stop-با مقاومتهای کشویی 10k اهم به ترتیب به پایه های دیجیتال 2 و 3 داریم. هنگامی که کاربر با فشار دادن شروع می کند ، طرح مقدار میلی را در نظر می گیرد - سپس پس از فشار دادن توقف ، طرح دوباره مقدار میلی را یادداشت می کند ، زمان سپری شده را محاسبه و نمایش می دهد. سپس کاربر می تواند شروع را برای تکرار روند فشار دهد یا برای به روزرسانی داده ها توقف کند. در اینجا این طرح است:

/* کرنومتر فوق اساسی با استفاده از millis ()؛ */

شروع طولانی بدون علامت ، تمام شده ، سپری شده ؛

void setup ()

{Serial.begin (9600) ؛ pinMode (2 ، ورودی) ؛ // دکمه شروع pinMode (3 ، ورودی) ؛ // دکمه توقف Serial.println ("برای شروع/تنظیم مجدد 1 ، برای زمان سپری شده 2 را فشار دهید") ؛ }

void displayResult ()

{float h، m، s، ms؛ بدون امضا از مدتها پیش ؛ سپری شده = پایان راه اندازی ؛ h = int (سپری شده/3600000) ؛ بیش = سپری شده٪ 3600000؛ m = int (بیش از/60000) ؛ بیش از = بیش از 60000؛ s = int (بیش از/1000) ؛ ms = بیش از٪ 1000 ؛ Serial.print ("زمان خام سپری شده:")؛ Serial.println (سپری شده) ؛ Serial.print ("زمان سپری شده:") ؛ Serial.print (h، 0)؛ Serial.print ("h") ؛ Serial.print (متر ، 0) ؛ Serial.print ("m") ؛ Serial.print (s، 0)؛ Serial.print ("s")؛ Serial.print (ms، 0)؛ Serial.println ("ms") ؛ Serial.println ()؛ }

حلقه خالی ()

{if (digitalRead (2) == HIGH) {شروع = millis ()؛ تأخیر (200) ؛ // برای debounce Serial.println ("شروع شد …") ؛ } if (digitalRead (3) == HIGH) {finish = millis ()؛ تأخیر (200) ؛ // برای debounce displayResult ()؛ }}

فراخوانی های تاخیر () برای حذف سوئیچ ها استفاده می شود - اینها اختیاری هستند و استفاده از آنها به سخت افزار شما بستگی دارد. تصویر نمونه ای از خروجی نمایشگر طرح اولیه است - کرونومتر شروع شده است ، و سپس دکمه دو را شش بار در دوره های مختلف فشار می دهید.

مرحله 3: سرعت سنج…

Image
Image

اگر سنسور در ابتدا و انتهای یک فاصله ثابت داشتید ، سرعت را می توان محاسبه کرد: سرعت = فاصله. زمان.

همچنین می توانید یک سرعت سنج برای شکل حرکت چرخدار ، به عنوان مثال دوچرخه ، بسازید. در حال حاضر ما دوچرخه ای نداریم که بخواهیم با آن کار کنیم ، اما می توانیم فرایند این کار را توضیح دهیم - این بسیار ساده است. (سلب مسئولیت - این کار را با مسئولیت خود و غیره انجام دهید)

اول از همه ، بیایید ریاضیات لازم را مرور کنیم. شما باید محیط چرخ را بدانید. سخت افزار - به سنسور نیاز دارید. به عنوان مثال - سوئیچ نی و آهن ربا. سوئیچ نی را یک دکمه معمولاً باز در نظر بگیرید و طبق معمول با یک مقاومت کششی 10 کیلو اهم متصل شوید.

دیگران ممکن است از سنسور جلوه سالن استفاده کنند-هر کدام برای خودشان). برای محاسبه دور از کلاس ریاضی به یاد داشته باشید - از فرمول استفاده کنید: circumference = 2πr که r شعاع دایره است.

اکنون که دور چرخ را دارید ، این مقدار را می توان "فاصله ثابت" ما در نظر گرفت و بنابراین سرعت را می توان با اندازه گیری زمان سپری شده بین یک دور کامل محاسبه کرد.

سنسور شما-پس از نصب-باید همانند یک دکمه معمولاً باز که در هر چرخش فشار داده می شود عمل کند. طرح ما زمان سپری شده بین هر پالس سنسور را اندازه گیری می کند.

برای انجام این کار ، مثال ما خروجی سنسور را به پین دیجیتال 2 متصل می کند - زیرا وقفه ای را برای محاسبه سرعت ایجاد می کند. در غیر این صورت این طرح سرعت را روی یک ماژول LCD معمولی با رابط I2C نمایش می دهد. رابط کاربری I2C پیشنهاد می شود زیرا این مورد فقط به 4 سیم از برد آردوینو تا LCD نیاز دارد - هرچه سیم کمتر بهتر باشد.

در اینجا طرح مطالعه شما آمده است:

/*سرعت سنج اولیه با استفاده از millis () ؛ */

#شامل "Wire.h" // برای LCD گذرگاه I2C

#شامل "LiquidCrystal_I2C.h" // برای ماژول LCD گذرگاه I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C LCD (0x27 ، 16 ، 2) ؛ // آدرس LCD را روی 0x27 برای نمایش 16 کاراکتر و نمایش 2 خط تنظیم کنید

شروع شناور ، به پایان رسید ؛

شناور سپری شده ، زمان ؛ float circMetric = 1.2؛ // دور چرخ نسبت به موقعیت حسگر (بر حسب متر) float circImperial؛ // با استفاده از 1 کیلومتر = 0.621371192 مایل شناور speedk، speedm؛ // دارای سرعتهای محاسبه شده متریک و امپریالیستی است

void setup ()

{attachInterrupt (0 ، speedCalc ، RISING) ؛ // وقفه زمانی که سنسورها دیجیتال 2 بالا ارسال می کنند (هر چرخش چرخ) start = millis ()؛ // تنظیم LCD lcd.init ()؛ // مقداردهی اولیه LCD lcd.backlight ()؛ // روشن کردن نور پس زمینه LCD lcd.clear ()؛ lcd.println ("کلاه ایمنی بپوشید!") ؛ تاخیر (3000) ؛ lcd.clear ()؛ Serial.begin (115200) ؛ circImperial = circMetric*.62137؛ // تبدیل متریک به امپریالیستی برای محاسبات MPH}

void speedCalc ()

{elapsed = millis ()-شروع ؛ شروع = millis ()؛ speedk = (3600*circMetric)/سپری شده ؛ // km/h speedm = (3600*circImperial)/سپری شده ؛ // مایل بر ساعت }

حلقه خالی ()

{lcd.setCursor (0 ، 0) ؛ lcd.print (int (speedk)) ؛ lcd.print ("کیلومتر/ساعت") ؛ ال سی دی چاپ (int (سرعت)) ؛ lcd.print ("MPH") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print (int (سپری شده)) ؛ lcd.print ("ms/rev") ؛ تاخیر (1000) ؛ // تنظیم برای ترجیح شخصی برای به حداقل رساندن سوسو زدن}

چیز زیادی در جریان نیست - هر بار که چرخ یک دور را تکمیل می کند ، سیگنال سنسور از پایین به بالا می رود - وقفه ای ایجاد می شود که عملکرد را speedCalc () می نامد.

این مقدار میلی ثانیه () را می گیرد و سپس تفاوت بین قرائت فعلی و قرائت قبلی را محاسبه می کند - این مقدار زمان پوشش فاصله (که محیط چرخ نسبت به سنسور است - ذخیره شده در

float circMetric = 1.2؛

و بر حسب متر اندازه گیری می شود). در نهایت سرعت را بر حسب کیلومتر بر ساعت و MPH محاسبه می کند. بین وقفه ها ، این طرح داده های سرعت به روز شده روی LCD و همچنین مقدار زمان خام برای هر دور را برای کنجکاوی نمایش می دهد. در زندگی واقعی فکر نمی کنم کسی LCD را روی دوچرخه سوار کند ، شاید یک صفحه نمایش LED بیشتر مناسب باشد.

در همین حال ، نحوه عملکرد این مثال را می توانید در کلیپ ویدیویی کوتاه زیر مشاهده کنید. به جای ترکیب دوچرخه و کلید نی و مغناطیس ، خروجی موج مربع از ژنراتور عملکرد را به پین وقفه متصل کرده ام تا پالس های سنسور را شبیه سازی کنم ، بنابراین می توانید از نحوه عملکرد آن ایده بگیرید.

مرحله 4:

این فقط استفاده از میلی () را در حال حاضر خلاصه می کند. همچنین micros () وجود دارد. تابع که میکرو ثانیه را شمارش می کند.

بنابراین شما آن را دارید - یک عملکرد عملی دیگر که می تواند اجازه دهد مشکلات بیشتری از طریق دنیای آردوینو حل شود. مثل همیشه ، در حال حاضر به شما و تخیل شما بستگی دارد که چیزی را برای کنترل یا ارتکاب تظاهرات دیگر پیدا کنید.

این پست توسط pmdway.com برای شما ارسال شده است - همه چیز برای سازندگان و علاقه مندان به لوازم الکترونیکی ، با ارسال رایگان در سراسر جهان.

توصیه شده: