نوع داده unsigned long در آردوینو — آموزش کامل برای زمان و شمارنده‌های بزرگ  
آردوینو ایران | آموزش تخصصی آردوینو به فارسی

آردوینو ایران | آموزش تخصصی آردوینو به فارسی

آردوینو ایران — مرجع تخصصی آموزش آردوینو به فارسی! دوره‌های کاربردی، پروژه‌محور و گام‌به‌گام برای مبتدی‌ها تا پیشرفته‌ها: از راه‌اندازی اولین LED تا ساخت ربات، IoT و سیستم‌های هوشمند خانه. یادگیری عملی، کدنویسی ساده، پشتیبانی فنی و دسترسی مادام‌العمر به محتوا — فقط برای عاشقان الکترونیک و برنامه‌نویسی سخت‌افزاری.

اشتراک در خبرنامه

جهت عضویت در خبرنامه لطفا ایمیل خود را ثبت نمائید

Captcha

آمار بازدید

  • بازدید امروز : 18
  • بازدید دیروز : 41
  • بازدید کل : 14812

نوع داده unsigned long در آردوینو — آموزش کامل برای زمان و شمارنده‌های بزرگ


نوع داده unsigned long در آردوینو — آموزش کامل برای زمان و شمارنده‌های بزرگ

نوع داده unsigned long در آردوینو — ذخیره‌ی بزرگ‌ترین اعداد مثبت بدون نگرانی از منفی شدن

unsigned long چیست؟

در آردوینو، نوع داده‌ی unsigned long یک نوع عدد صحیح است که فقط اعداد مثبت یا صفر را ذخیره می‌کند و در تمام برد‌های رایج آردوینو (از جمله Uno، Nano، ESP32 و Due) دقیقاً ۴ بایت (۳۲ بیت) حافظه مصرف می‌کند.

محدوده‌ی مقادیر قابل ذخیره در یک متغیر unsigned long:

۰ تا ۴,۲۹۴,۹۶۷,۲۹۵

این محدوده تقریباً دو برابر بزرگ‌تر از محدوده‌ی long (که شامل اعداد منفی هم می‌شود) است و برای کارهایی که نیاز به اعداد بسیار بزرگ و فقط مثبت دارند، گزینه‌ی ایده‌آلی است.

توضیح برای مبتدی‌ها: فکر کنید یک شمارنده دارید که می‌خواهد ثانیه‌های گذشته از سال ۲۰۰۰ را بشمارد. این عدد خیلی بزرگ می‌شود — بیشتر از ۲ میلیارد! اگر از long استفاده کنید، نصف فضای عددی شما برای اعداد منفی هدر می‌رود. اما با unsigned long، همه‌ی فضای ۴ بایتی فقط برای اعداد مثبت استفاده می‌شود — پس شمارنده‌تان تا ۴ میلیارد ثانیه (بیش از ۱۳۶ سال!) کار می‌کند.

چرا به unsigned long نیاز داریم؟

در بسیاری از پروژه‌ها، اعدادی که استفاده می‌کنیم همیشه مثبت هستند و از محدوده‌ی unsigned int (در Uno: ۰–۶۵,۵۳۵) فراتر می‌روند. مثال‌های رایج:

  • زمان سیستم بلندمدت: تابع millis() بعد از ۴۹ روز سرریز می‌شود — اما تا آن زمان، مقدار آن در محدوده‌ی unsigned long است.
  • شمارش رویدادهای بسیار زیاد: مثلاً تعداد ضربان قلب در یک سال یا تعداد بسته‌های داده در یک شبکه.
  • محاسبات با اعداد بزرگ بدون نیاز به منفی: مثل شماره‌های سریال، کدهای دستگاه یا زمان‌های تایمر.

نحوه تعریف و استفاده

unsigned long currentTime = millis();        // زمان فعلی سیستم
unsigned long totalEvents = 1000000UL;       // شمارنده‌ی بزرگ
unsigned long deviceId = 3487294823UL;       // شناسه دستگاه

توجه: برای تعریف یک عدد ثابت به عنوان unsigned long، بهتر است پسوند UL یا ul به آن اضافه کنید (ترجیحاً UL بزرگ):

unsigned long bigNumber = 4000000000UL;  // مشخص می‌کند که این عدد unsigned long است

مثال کاربردی: اندازه‌گیری زمان دقیق بین دو رویداد

تابع millis() خروجی unsigned long دارد. برای محاسبه‌ی دقیق زمان سپری‌شده، باید از همان نوع استفاده کنیم:

unsigned long startTime = millis();

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned long currentTime = millis();
  unsigned long elapsedTime = currentTime - startTime; // همیشه مثبت است
  
  Serial.print("زمان سپری‌شده: ");
  Serial.print(elapsedTime / 1000);  // تبدیل به ثانیه
  Serial.println(" ثانیه");
  
  delay(1000);
}

توضیح برای مبتدی‌ها: چرا elapsedTime همیشه مثبت است؟ چون هر دو currentTime و startTime از نوع unsigned long هستند و currentTime همیشه بزرگ‌تر یا مساوی startTime است. حتی اگر millis() سرریز کند (بعد از ۴۹ روز)، تفریق به‌درستی کار می‌کند — چون حساب پیمانه‌ای (modulo) انجام می‌شود.

تفاوت unsigned long با long و unsigned int

نوع دادهاندازهمحدوده (در تمام برد‌ها)
unsigned int 2 بایت (در Uno) 0 تا 65,535
long 4 بایت −2,147,483,648 تا +2,147,483,647
unsigned long 4 بایت 0 تا 4,294,967,295

نکته طلایی ۱: unsigned long برای millis() و micros() ضروری است!

توابع millis() و micros() همیشه unsigned long برمی‌گردانند. اگر خروجی آن‌ها را در یک int یا حتی long ذخیره کنید، ممکن است: — در Uno، پس از ۳۲ ثانیه سرریز شود (اگر از int استفاده کنید)
— در محاسبات، عدد منفی تولید شود (اگر از long استفاده کنید و مقدار از ۲ میلیارد بیشتر شود)
بنابراین، همیشه از unsigned long برای ذخیره‌ی زمان استفاده کنید.

نکته طلایی ۲: unsigned long همیشه ۴ بایت است — برخلاف unsigned int!

در حالی که unsigned int در برد‌های مختلف اندازه‌ی متفاوتی دارد، unsigned long در تمام پلتفرم‌های آردوینو همیشه ۴ بایت است.
این ویژگی باعث می‌شود کدهای شما قابل انتقال‌تر (portable) باشند. اگر به اطمینان نیاز دارید که متغیر شما ۴ بایت است و فقط مثبت باشد، unsigned long گزینه‌ی ایمن‌تری نسبت به unsigned int است.

جمع‌بندی

  • unsigned long = ۴ بایت، فقط ۰ تا ۴,۲۹۴,۹۶۷,۲۹۵
  • برای زمان سیستم، شمارنده‌های بزرگ و داده‌های بدون علامت مناسب است
  • همیشه برای millis() و micros() استفاده شود
  • در تمام برد‌های آردوینو اندازه‌ی ثابتی دارد
  • هرگز منفی نمی‌شود — پس در محاسبات تفریق زمان، ایمن است

منبع رسمی

این مطلب بر اساس مستندات رسمی Arduino از بخش unsigned long – Language Reference تهیه شده است، با توضیحات ساده‌شده، مثال‌های کاربردی و نکات طلایی منحصربه‌فرد برای جامعه فارسی‌زبان.

  انتشار : ۱۳ مهر ۱۴۰۴               تعداد بازدید : 301

برچسب های مهم

دیدگاه های کاربران (0)

http://kia-ir.ir

تمام حقوق مادی و معنوی این وب سایت متعلق به "آردوینو ایران | آموزش تخصصی آردوینو به فارسی" می باشد

فید خبر خوان    نقشه سایت    تماس با ما