در کدنویسی همواره بخشی از کد شما به تاخیر های زمانی و تایمرها برای دسته بندی و نظم اجرایی در برنامه اختصاص دارد، به همین منظور در این بخش از سری آموزش برنامه میکروپایتون در برد های ESP32 قصد داریم به شما نحوه استفاده از Delay و Timer یعنی تایمر و تاخیر زمانی را آموزش دهیم. در ادامه این آموزش با مرجع تخصصی ESP32 به زبان فارسی، دیجی اسپارک همراه باشید.
راه اندازی Delay و Timer
اکثر برنامه نویسان C تابع sleep () و در آردوینو ()delay را می شناسند که اجرای برنامه را به مدت چند ثانیه متوقف می کند. ثانیه ها بخش بزرگی از زمان هستند، به ویژه در رایانه ای که همه چیز به سرعت اتفاق می افتد. بنابراین نیاز به عملکردی وجود دارد که اجرا را برای برش های کوچکتر از زمان به تاخیر بیاندازد. به همین دلیل در میکروپایتون توابعی به نام تایمر نیز بوجود آمده، هرچند در زبان c و در کدنویسی آردوینو نیز این توانایی را داریم، اما در این آموزش قصد داریم از دید یک برنامه نویس میکرو پایتون به این توابع نگاه کنیم. تاخیر های زمانی برای ایجاد اتفاقات به طور خودکار در برنامه های میکروکنترلر مفید هستند و می توانند به حل مشکلات زمان بندی کمک کنند. البته اگر در برنامه نویسی خود از متد super loop استفاده کنید.
تراشه ESP32
ESP32 می تواند به عنوان یک سیستم کامل مستقل یا به عنوان یک دستگاه MCU عمل کند و بار اضافی ارتباطات را در پردازنده اصلی برنامه کاهش دهد. ESP32 می تواند با سیستم های دیگر ارتباط برقرار کند تا از طریق SPI عملکرد Wi-Fi و بلوتوث را ارائه دهد. ESP32 با سوئیچ های آنتن داخلی، RF balun، تقویت کننده قدرت، تقویت کننده دریافت، فیلترها و ماژول های مدیریت توان یکپارچه شده است. ESP32 با حداقل الزامات برد مدار چاپی (PCB) ، عملکرد و تطبیق پذیری بی نظیری را به برنامه های شما اضافه می کند. برد ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
توابع delay در میکروپایتون
برای استفاده از حالت خواب در میکروپایتون از کتابخانه time استفاده میشود، که برای اضافه کردن این مورد به کد خود و دستریس به توابع از import و سپس نام پکیج استفاده خواهیم کرد.
import time
در مواقعی نیاز به تاخیر زمانی برحسب ثانیه نیاز داریم از sleep استفاده خواهیم کرد و در پرانتز مقدار زمان مدنظر را ذکر میکنیم.
time.sleep(1)
در کد های برای کوتاه بودن زمان مدنظر نیاز داریم تا واحد محاسبه زمان تاخیر ما بر حسب میلی ثانیه باشد که در این مورد از sleep_ms استفاده خواهیم کرد.
time.sleep_ms(100)
در پروژه هایی برای مثال راهاندازی اسپر ها به تاخیر زمانی با واحد میکرو ثانیه نیاز داریم که برای این منظور از sleep_us استفاده میشود تا زمان بر حسب میکرو ثانیه محاسبه شود.
time.sleep_us(50)
برای ساخت یک شمارنده با استفاده از میکروپایتون و پکیج timer از time.ticks_ms استفاده میشوند، برای نمونه کد زیر را مشاهده کنید که ابتدا شمارنده را شروع و محاسبات را در خط بعدی تکمیل کردیم و مقادیر را بدست آوردیم.
start = time.ticks_ms() delta = time.ticks_diff(time.ticks_ms(), start)
توابع timer در میکروپایتون
برد های ESP32 دارای ۴ تایمر سخت افزار هستند که در این بخش نحوه استفاده از این تایمر ها را با استفاده از زبان میکروپایتون بررسی خواهیم کرد. در مرحله اول پکیج مورد نیاز را به روش همیشکی یعنی import معرفی میکنیم، در ادامه از پکیج machine کلاس timer را فراخوانی را میکنیم. تایمرهای سخت افزاری با زمان بندی دوره ها و رویدادها سروکار دارند. تایمرها شاید انعطاف پذیرترین و ناهمگن ترین نوع سخت افزار در MCU ها و SoC ها هستند که از مدل تا مدل بسیار متفاوت هستند. کلاس Timer یک عملیات اولیه برای اجرای یک callback با یک دوره معین را تعریف می کند و به برد های خاص اجازه می دهد رفتارهای غیر استاندارد بیشتری را تعریف کنند.
from machine import Timer
ابتدا باید تایمر سخت افزاری مدنظر را با استفاده از یکی از ID های بین ۰ تا ۳ به کد معرفی کنیم.
tim0 = Timer(0)
در کد پایین یک تایمر با استفاده از پین های تایمر ESP32 ایجاد کردیم کردیم که بر حسب میلی ثانیه کار خواهد کرد، با استفاده از ساختار زیر قادر خواهید بود تایمر خود را در کد های مختلف ایجاد کنید. در خط اول تایمر یکبار اجرا می شود تا مدت زمان پیکربندی شده و به پایان میرسد. اما در خط دوم تایمر به صورت دوره ای در فرکانس پیکربندی شده کار می کند.
tim0 = Timer(0) tim0.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(0)) tim1 = Timer(1) tim1.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(1))
لوازم مورد نیاز
کلام آخر با سایفر
در این قسمت از آموزش های میکروپایتون به تاخیر زمانی و delay پرداختیم که در سناریو های super loop به کمک این قابلیت ها میتوانیم نظم مشخصی متناسب با عملکرد فانکشن ها با برنامه خود اضافه کنیم. البته که در راهاندازی بسیاری از ماژول ها و قطعات الکترونیکی ناخود آگاه به این قابلیت یعنی تاخیر زمانی نیاز خواهیم داشت.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.