پیشرفت یادگیری
۲ ۳ ۴
بخش ۲ از ۴
بخش دوم از ۴

ساختارهای کنترلی و تصمیم‌گیری
دستورات شرطی و حلقه‌های تکرار

بخش قبلی: مفاهیم پایه بخش ۲ از ۴ بخش بعدی: توابع و عملگرها
ساختارهای کنترلی زبان فارسی C/C++ سطح: مبتدی زمان مطالعه: ۳۵ دقیقه

در این بخش چه می‌آموزیم؟

ساختارهای کنترلی برای مدیریت جریان اجرای برنامه و تصمیم‌گیری بر اساس شرایط مختلف به کار می‌روند. این ساختارها نقش مهمی در ایجاد برنامه‌های پویا و هوشمند دارند.

ساختارهای کنترلی در برنامه‌نویسی آردوینو به دو گروه اصلی تقسیم می‌شوند:

دستورات شرطی

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 شرطی اجرای شرطی if (x > 10) { ... }
if...else شرطی اجرا در صورت نبود شرط if (x) { ... } else { ... }
else if شرطی شرط دوم else if (x == 5) { ... }
switch-case شرطی انتخاب چندمسیره switch (var) { case 1: ... }
for حلقه حلقه با شمارنده for (int i=0; i<10; i++)
while حلقه حلقه با شرط while (x < 100) { ... }
do...while حلقه حداقل یک بار اجرا do { ... } while (x < 100);

خلاصه بخش دوم

دستورات شرطی

if, else, else if, switch-case

حلقه‌های تکرار

for, while, do-while

دستورات کنترلی

break, continue, return

مثال‌های عملی

کنترل LED، چشمک‌زن، تشخیص دما

بخش قبلی: مفاهیم پایه بخش ۲ از ۴ بخش بعدی: توابع و عملگرها
#ساختارهای_کنترلی_آردوینو #دستورات_شرطی_آردوینو #حلقه_های_آردوینو #if_else_آردوینو #for_while_آردوینو #برنامه_نویسی_آردوینو