ساختارهای کنترلی و تصمیمگیری
دستورات شرطی و حلقههای تکرار
در این بخش چه میآموزیم؟
ساختارهای کنترلی برای مدیریت جریان اجرای برنامه و تصمیمگیری بر اساس شرایط مختلف به کار میروند. این ساختارها نقش مهمی در ایجاد برنامههای پویا و هوشمند دارند.
ساختارهای کنترلی در برنامهنویسی آردوینو به دو گروه اصلی تقسیم میشوند:
دستورات شرطی
if, else, else if, switch-case
حلقههای تکرار
for, while, do-while
۲-۱ دستورات شرطی
دستورات شرطی برای انتخاب بین مسیرهای مختلف اجرای برنامه به کار میروند. بر اساس شرایط، تصمیم میگیرند که کدام بخش از کد اجرا شود.
دستور if
دستور if یک شرط را بررسی میکند و در صورت درست بودن آن، دستورات داخل آن اجرا میشوند.
if (sensorValue > 500) { digitalWrite(ledPin, HIGH); // اگر مقدار سنسور بیشتر از ۵۰۰ بود، LED روشن میشود }
نکته: شرط داخل پرانتز باید یک عبارت بولی (true یا false) باشد.
دستور if...else
دستور if...else یک شرط را بررسی میکند. اگر شرط درست بود، دستورات if و در غیر این صورت، دستورات else اجرا میشوند.
if (buttonState == HIGH) { digitalWrite(ledPin, HIGH); // اگر کلید فشرده شده } else { digitalWrite(ledPin, LOW); // اگر کلید فشرده نشده }
کاربرد: کنترل LED با کلید فشاری – یکی از رایجترین کاربردهای if-else در آردوینو.
دستور else if
دستور else if برای بررسی چندین شرط مختلف استفاده میشود. اگر شرط اول درست نبود، شرط دوم بررسی میشود.
if (sensorValue > 800) { // خیلی روشن digitalWrite(ledPin, HIGH); } else if (sensorValue > 400) { // نسبتاً روشن digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); } else { // تاریک digitalWrite(ledPin, LOW); }
دستور switch...case
دستور switch...case برای انتخاب چندمسیره استفاده میشود. بر اساس مقدار یک متغیر، یکی از گزینهها اجرا میشود.
switch (buttonNumber) { case 1: // کلید شماره ۱ فشرده شده digitalWrite(led1, HIGH); break; case 2: // کلید شماره ۲ فشرده شده digitalWrite(led2, HIGH); break; case 3: // کلید شماره ۳ فشرده شده digitalWrite(led3, HIGH); break; default: // هیچ کلیدی فشرده نشده digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); }
نکته: دستور break برای خروج از switch استفاده میشود. default زمانی اجرا میشود که هیچ کدام از caseها برقرار نباشد.
۲-۲ حلقههای تکرار
حلقهها برای اجرای مکرر مجموعهای از دستورات استفاده میشوند. هر کدام از حلقهها کاربرد خاصی دارند.
حلقه for
حلقه for برای تکرار با شمارنده مشخص استفاده میشود. تعداد دفعات تکرار از قبل مشخص است.
// LED را ۱۰ بار چشمک میزند for (int i = 0; i < 10; i++) { digitalWrite(ledPin, HIGH); delay(200); digitalWrite(ledPin, LOW); delay(200); }
ساختار: for (شروع; شرط; افزایش) { دستورات }
حلقه while
حلقه while تا زمانی که شرط درست باشد، دستورات را تکرار میکند. اگر شرط در ابتدا نادرست باشد، هیچگاه اجرا نمیشود.
int count = 0; while (count < 5) { // تا زمانی که count کمتر از ۵ است اجرا میشود digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); count++; // افزایش شمارنده }
حلقه do...while
حلقه do...while ابتدا دستورات را حداقل یک بار اجرا میکند و سپس شرط را بررسی میکند.
int count = 0; do { // حداقل یک بار اجرا میشود digitalWrite(ledPin, HIGH); delay(100); digitalWrite(ledPin, LOW); delay(100); count++; } while (count < 3);
تفاوت: do...while حداقل یک بار اجرا میشود، اما while ممکن است هیچگاه اجرا نشود.
۲-۳ دستورات کنترلی حلقه
دستور break
دستور break برای خروج از حلقه استفاده میشود. هنگامی که break اجرا شود، حلقه بلافاصله پایان مییابد.
for (int i = 0; i < 10; i++) { if (i == 5) { break; // وقتی i به ۵ رسید، از حلقه خارج میشود } Serial.println(i); } // خروجی: 0, 1, 2, 3, 4
دستور continue
دستور continue برای پرش به تکرار بعدی حلقه استفاده میشود. دستورات بعد از آن در همان تکرار اجرا نمیشوند.
for (int i = 0; i < 5; i++) { if (i == 2) { continue; // وقتی i=2 است، این تکرار را رد میکند } Serial.println(i); } // خروجی: 0, 1, 3, 4
دستور return
دستور return برای بازگشت مقدار از تابع و خروج از آن استفاده میشود.
int maxValue(int a, int b) { if (a > b) { return a; // مقدار a را برمیگرداند } else { return b; // مقدار b را برمیگرداند } }
۲-۴ مثالهای عملی
مثال ۱: کنترل LED با کلید فشاری (if-else)
در این مثال، یک LED با استفاده از یک کلید فشاری روشن و خاموش میشود.
int ledPin = 13; int buttonPin = 2; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); // مقاومت بالاکش داخلی } void loop() { int buttonState = digitalRead(buttonPin); if (buttonState == LOW) { digitalWrite(ledPin, HIGH); // کلید فشرده شده → LED روشن } else { digitalWrite(ledPin, LOW); // کلید آزاد → LED خاموش } }
مثال ۲: چشمکزن LED با حلقه for
در این مثال، LED با استفاده از حلقه for، ۵ بار چشمک میزند.
int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { // LED را ۵ بار چشمک میزند for (int i = 0; i < 5; i++) { digitalWrite(ledPin, HIGH); delay(200); digitalWrite(ledPin, LOW); delay(200); } delay(2000); // ۲ ثانیه صبر کن و دوباره تکرار کن }
مثال ۳: تشخیص محدوده دما با if-else if
در این مثال، بر اساس مقدار خوانده شده از سنسور دما، وضعیت LED تغییر میکند.
int sensorPin = A0; int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { int sensorValue = analogRead(sensorPin); float temperature = (sensorValue * 5.0 / 1023.0) * 100; Serial.println(temperature); if (temperature > 30) { digitalWrite(ledPin, HIGH); // خیلی گرم → LED روشن } else if (temperature > 20) { digitalWrite(ledPin, HIGH); // گرم → LED چشمکزن delay(500); digitalWrite(ledPin, LOW); delay(500); } else { digitalWrite(ledPin, LOW); // خنک → LED خاموش } delay(1000); }
تمرین: برنامهای بنویسید که با استفاده از حلقه while، یک LED را ۳ بار چشمک بزند و سپس متوقف شود.
خلاصه ساختارهای کنترلی
خلاصه بخش دوم
دستورات شرطی
if, else, else if, switch-case
حلقههای تکرار
for, while, do-while
دستورات کنترلی
break, continue, return
مثالهای عملی
کنترل LED، چشمکزن، تشخیص دما