آموزش کار با تایمرها در ESP32 و ESP8266
22
آذر 1404
0 نظر

آموزش کار با تایمرها در ESP32 و ESP8266

 چرا تایمرها مهم‌ترین بخش پروژه‌های ESP هستند؟

اگر تجربه کار با ESP8266 یا ESP32 را داشته باشید، احتمالاً حداقل یک بار با این مشکلات روبه‌رو شده‌اید:

  • قطع شدن ناگهانی WiFi

  • ریست شدن برد بدون دلیل مشخص

  • هنگ کردن وب‌سرور

  • از کار افتادن MQTT

  • اجرای نامنظم کدها

در بیش از ۷۰٪ این موارد، ریشه مشکل استفاده نادرست از delay و عدم شناخت تایمرهاست.

برخلاف آردوینوهای ساده، ESPها هم‌زمان در حال مدیریت:

  • ارتباط WiFi

  • استک TCP/IP

  • وقفه‌ها

  • تسک‌های سیستم

  • و در ESP32 حتی سیستم‌عامل FreeRTOS

هستند. بنابراین هر توقف بی‌دلیل CPU می‌تواند کل سیستم را ناپایدار کند.


تایمر چیست؟ (تعریف دقیق و کاربردی)

تایمر (Timer) ابزاری است که به شما اجازه می‌دهد:

  • یک عملیات را بعد از زمان مشخص اجرا کنید

  • یک تسک را به‌صورت دوره‌ای تکرار کنید

  • بدون متوقف کردن برنامه، زمان‌بندی انجام دهید

تفاوت تایمر با delay

delay Timer
CPU را متوقف می‌کند CPU آزاد می‌ماند
باعث قطع WiFi می‌شود WiFi پایدار می‌ماند
ساده ولی خطرناک حرفه‌ای و ایمن
مناسب پروژه‌های ساده مناسب IoT و صنعتی

📌 نتیجه مهم: در پروژه‌های ESP، delay تقریباً همیشه انتخاب اشتباه است.


معماری زمانی ESP8266 و ESP32 (چرا delay خطرناک است؟)

ESP8266

ESP8266 برای حفظ ارتباط WiFi نیاز دارد که CPU مرتب به سیستم شبکه سرویس بدهد. اگر:

  • delay طولانی استفاده شود

  • یا loop بلاک شود

نتیجه:

  • فعال شدن Watchdog

  • ریست ناگهانی برد

  • قطع WiFi

به همین دلیل در مقالاتی مثل
«دیباگ و رفع خطاهای رایج در ESP»
همیشه تأکید می‌شود delay دشمن پایداری است.


ESP32

ESP32 پیچیده‌تر است:

  • دو هسته پردازشی

  • FreeRTOS

  • تسک‌های موازی

  • تایمرهای سخت‌افزاری مستقل

delay می‌تواند یک هسته را بلاک کند و باعث تأخیر در تسک‌های مهم شود، مخصوصاً در پروژه‌هایی مثل:

  • وب‌سرور ESP32

  • MQTT

  • WebSocket


دسته‌بندی کامل تایمرها در ESP

در ESP8266 و ESP32 چهار روش اصلی برای مدیریت زمان داریم:

  1. تایمر مبتنی بر millis()

  2. تایمرهای نرم‌افزاری (Ticker)

  3. تایمرهای سخت‌افزاری (Hardware Timer – فقط ESP32)

  4. تایمرهای FreeRTOS (فقط ESP32)

در ادامه، هرکدام را عمیق، عملی و با تجربه واقعی بررسی می‌کنیم.


۱. تایمر با millis() – پایه‌ای اما بسیار مهم

millis چگونه کار می‌کند؟

تابع millis() تعداد میلی‌ثانیه‌هایی که از روشن شدن برد گذشته را برمی‌گرداند. این تابع:

  • برنامه را متوقف نمی‌کند

  • همیشه در حال افزایش است

  • پایه بسیاری از تایمرهای پیشرفته‌تر است

مثال پایه بدون delay

unsigned long lastTime = 0; const unsigned long interval = 1000; void loop() { if (millis() - lastTime >= interval) { lastTime = millis(); // کد مورد نظر } }

مدیریت چند تایمر هم‌زمان

unsigned long t1, t2; void loop() { if (millis() - t1 >= 1000) { t1 = millis(); // تسک اول } if (millis() - t2 >= 5000) { t2 = millis(); // تسک دوم } }

مزایا

  • ساده

  • بدون کتابخانه

  • مناسب پروژه‌های کوچک

معایب

  • کد شلوغ در پروژه‌های بزرگ

  • سختی مدیریت تسک‌ها

  • خطای overflow بعد از ~49 روز

📌 برای پروژه‌های بزرگ IoT، بهتر است از روش‌های پیشرفته‌تر استفاده شود.


۲. تایمرهای نرم‌افزاری Ticker (انتخاب طلایی IoT)

کتابخانه Ticker یکی از بهترین و پرکاربردترین روش‌ها برای زمان‌بندی در ESP است.

چرا Ticker محبوب است؟

  • کدنویسی تمیز

  • خوانایی بالا

  • مناسب پروژه‌های WiFi، MQTT و وب‌سرور

  • پشتیبانی در ESP8266 و ESP32

مثال استاندارد Ticker

#include <Ticker.h> Ticker myTimer; bool doTask = false; void timerISR() { doTask = true; } void setup() { myTimer.attach(2, timerISR); // هر 2 ثانیه } void loop() { if (doTask) { doTask = false; // اجرای تسک اصلی } }

اشتباهات مرگبار در Ticker

❌ استفاده از delay
❌ استفاده از Serial.print
❌ اجرای WiFi یا MQTT داخل تابع تایمر

✔ راه‌حل حرفه‌ای:
فقط flag تنظیم کنید، پردازش را در loop انجام دهید.


۳. تایمرهای سخت‌افزاری ESP32 (سطح صنعتی)

ESP32 دارای ۴ تایمر سخت‌افزاری مستقل است که دقت بسیار بالایی دارند.

ویژگی‌ها

  • دقت میکروثانیه

  • مستقل از loop

  • مناسب پروژه‌های real-time

  • استفاده در سیستم‌های صنعتی

مثال کامل تایمر سخت‌افزاری

hw_timer_t *timer = NULL; portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; volatile bool flag = false; void IRAM_ATTR onTimer() { portENTER_CRITICAL_ISR(&mux); flag = true; portEXIT_CRITICAL_ISR(&mux); } void setup() { timer = timerBegin(0, 80, true); timerAttachInterrupt(timer, &onTimer, true); timerAlarmWrite(timer, 1000000, true); timerAlarmEnable(timer); } void loop() { if (flag) { flag = false; // پردازش اصلی } }

قوانین طلایی ISR

  • بدون delay

  • بدون Serial

  • بدون WiFi

  • فقط متغیر ساده یا flag


۴. تایمرهای FreeRTOS (پروژه‌های بزرگ و حرفه‌ای)

ESP32 به‌صورت پیش‌فرض از FreeRTOS استفاده می‌کند.

FreeRTOS Timer چیست؟

  • تایمر نرم‌افزاری مبتنی بر سیستم‌عامل

  • مناسب پروژه‌های چندوظیفه‌ای

  • کنترل دقیق تسک‌ها

مثال FreeRTOS Timer

TimerHandle_t myTimer; void timerCallback(TimerHandle_t xTimer) { // تسک دوره‌ای } void setup() { myTimer = xTimerCreate( "MyTimer", pdMS_TO_TICKS(1000), pdTRUE, 0, timerCallback ); xTimerStart(myTimer, 0); } void loop() {}

📌 این روش برای پروژه‌هایی مثل:

  • خانه هوشمند

  • داشبورد IoT

  • سیستم‌های مانیتورینگ
    بسیار ایده‌آل است.


مقایسه نهایی تایمرها در ESP

نوع تایمر ESP8266 ESP32 دقت کاربرد پیشنهادی
millis متوسط پروژه ساده
Ticker خوب IoT
Hardware عالی صنعتی
FreeRTOS عالی پروژه بزرگ

استفاده از تایمرها در پروژه‌های واقعی IoT

۱. ارسال داده به MQTT

به‌جای delay، با تایمر هر ۱۰ ثانیه داده ارسال کنید تا اتصال پایدار بماند.
(مرتبط با مقاله اتصال ESP به MQTT)

۲. وب‌سرور بدون لگ

در پروژه‌های ساخت وب‌سرور با ESP32، تایمر باعث جلوگیری از فریز شدن رابط کاربری می‌شود.

۳. تایمر + Deep Sleep

برای کاهش مصرف انرژی در پروژه‌های باتری‌خور
(مرتبط با مقاله آموزش Deep Sleep در ESP)


خطاهای رایج هنگام کار با تایمرها

  • استفاده از delay در ISR

  • Serial.print داخل تایمر

  • عدم استفاده از volatile

  • انتخاب تایمر نامناسب

این خطاها به‌تفصیل در
دیباگ و رفع خطاهای رایج در ESP
بررسی شده‌اند.


چک‌لیست طلایی استفاده از تایمر در ESP

✔ بدون delay
✔ پردازش سنگین فقط در loop
✔ تایمر سبک
✔ انتخاب تایمر متناسب با پروژه
✔ تست طولانی‌مدت


سوالات متداول (FAQ – مناسب Featured Snippet)

بهترین تایمر برای ESP8266 چیست؟

Ticker بهترین انتخاب برای پروژه‌های IoT است.

آیا millis برای پروژه حرفه‌ای کافی است؟

برای پروژه‌های کوچک بله، برای پروژه‌های بزرگ خیر.

آیا delay کاملاً ممنوع است؟

در ESP تقریباً همیشه بله.


جمع‌بندی نهایی

اگر بخواهیم صادقانه بگوییم، تایمرها ستون فقرات پروژه‌های حرفه‌ای ESP هستند. هر توسعه‌دهنده‌ای که:

  • تایمرها را درست بشناسد

  • از delay دوری کند

  • تایمر مناسب پروژه را انتخاب کند

می‌تواند پروژه‌هایی:

  • پایدار

  • کم‌مصرف

  • حرفه‌ای

  • و قابل اعتماد

بسازد.

ارسال نظر
(بعد از تائید مدیر منتشر خواهد شد)
  • - نشانی ایمیل شما منتشر نخواهد شد.
  • - لطفا دیدگاهتان تا حد امکان مربوط به مطلب باشد.
  • - لطفا فارسی بنویسید.
  • - میخواهید عکس خودتان کنار نظرتان باشد؟ به gravatar.com بروید و عکستان را اضافه کنید.
  • - نظرات شما بعد از تایید مدیریت منتشر خواهد شد