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

از حلقه if arduino خارج شوید. آردوینو - دستورات کنترل. شرح حلقه for در آردوینو با یک مثال

"، ما یاد گرفتیم که چگونه از حلقه "for" برای سازماندهی کار کنترلر استفاده کنیم. این نوع حلقه در همه جا استفاده می شود و بیش از اینکه "نیاز به عملیات حلقه" را پوشش دهد. با این حال، نوع دیگری از حلقه وجود دارد - "در حالی که". بهتر از یک حلقه for نیست، فقط از اصول مختلفی در کار استفاده می کند.

در بیشتر موارد، شما می توانید انتخاب کنید که کدام یک از دو نوع چرخه استفاده شود. در ما از "while" برای توقف برنامه تا زمانی که کاربر داده های مورد نیاز را وارد کند استفاده کردیم. در این آموزش، نگاه دقیق تری به نحوه کار این چرخه با استفاده از پلتفرم آردوینو به عنوان مثال خواهیم داشت.

ما با یک مدار متشکل از 2 LED به کار ادامه می دهیم.

علاوه بر این، با کدی که در درس 14 نهایی کردیم به کار ادامه خواهیم داد.

بازگشت به گذشته: کنترلر از کاربر درخواست ورودی می کند، منتظر ورودی می ماند و سپس مقادیر دریافتی را به متغیرها اختصاص می دهد. blinkNumberGreenو blinkNumberRed. این به کاربر اجازه می دهد تا تعداد فلاش های هر یک از 2 ال ای دی را کنترل کند.

برای گسترش جهان بینی برنامه نویس، ارزش یادگیری نحوه استفاده از دو نوع چرخه برای اجرای وظایف مشابه را دارد و در آینده می توانید همدردی با یک یا نوع دیگر را نشان دهید.

بیایید بفهمیم که چگونه کار می کند:

بین المللی z= 1; // یک متغیر را اعلام کنید و مقدار 1 را به آن اختصاص دهید

در حالی که (z<=10) { //запускаем цикл در حالی که

سریال. println(z) //مقدار فعلی متغیر را چاپ کنیدz از طریق پورت سریال

z= z+1 // مقدار متغیر را افزایش دهیدzبرای 1

) // حلقه را پایان دهید

تا زمانی که "شرط" توضیح داده شده در پرانتز درست باشد، حلقه while به اجرای دستورات ادامه می دهد. در مثال بالا، تا زمانی که z کمتر یا مساوی 10 باشد، حلقه به اجرای دستورات ادامه می دهد. بدنه حلقه 2 دستور را اجرا می کند:

  • نمایش مقدار یک متغیر از طریق پورت سریال.
  • افزایش مقدار یک متغیر به اندازه 1 (علمی - افزایشی).

با افزایش مقدار متغیر، برنامه در نهایت از حلقه خارج می شود. اگر برای لحظه‌ای تصور کنید که فراموش کرده‌ایم این خط را مشخص کنیم یا نوعی خرابی رخ دهد، برنامه با خیال راحت لوپ می‌شود (به عبارت دیگر، هنگ می‌کند).

حلقه با بررسی درست بودن شرط شروع می شود. اگر z کمتر یا مساوی 10 باشد، برنامه حلقه را اجرا می کند. سپس شرایط دوباره بررسی می شود و غیره. وقتی مقدار متغیر به z = 11 رسید، شرط دیگر درست نخواهد بود. برنامه حلقه را کامل نمی کند و بلافاصله بعد از بریس حلقه حلقه به خط بعدی می رود.

تئوری بس است، بیایید به سراغ عمل برویم. بیایید حلقه‌های for را در کد منبع با حلقه‌های while جایگزین کنیم.

فلاشر در اجرای حلقه FOR:

برای (int i = 1; i<= blinkNumberGreen; i++) // راه اندازی چرخهبرای

{

سریال. چاپ("سبز چشمک زد")؛

Serial.println(i);

digitalWrite (greenLed، HIGH); //روشن کن سبز دیود ساطع نور

تاخیر (timeOnGreenLed)؛ //ما منتظریم

digitalWrite (سبز، LOW)؛ //خاموش کردن سبز دیود ساطع نور

تاخیر (timeOffGreenLed)؛ //ما منتظریم

}

فلاشر در اجرای چرخه WHILE:

بین المللی من=1; //اعلان یک متغیر و اختصاص مقدار 1 به آن

در حالی که (من<= blinkNumberGreen)

{ // راه اندازی چرخهدر حالی که

Serial.print("سبز چشمک زد «);

Serial.println(i);

digitalWrite (greenLed، HIGH); //روشن کن سبز دیود ساطع نور

تاخیر (timeOnGreenLed)؛ //ما منتظریم

digitalWrite (سبز، LOW)؛ //خاموش کردن سبز دیود ساطع نور

تاخیر (timeOffGreenLed)؛ //ما منتظریم

من= من+1 //مقدار متغیر را 1 افزایش دهید

}

ما برنامه را ذخیره می کنیم و سیستم عامل را در کنترلر آپلود می کنیم. بیایید به نتیجه نگاه کنیم.

حلقه ها با استفاده از دستورات برایو در حالی کهیکی از مهم ترین ساختارهای زبان C++ زیر بنای آردوینو هستند. آنها کاملاً در هر طرح ظاهر می شوند، حتی اگر شما آن را ندانید. در این مقاله نگاهی دقیق‌تر به حلقه‌ها خواهیم داشت، متوجه می‌شویم که تفاوت بین for و while چیست، چگونه می‌توانید نوشتن یک برنامه را با کمک آنها ساده کنید و از چه اشتباهاتی باید اجتناب کرد.

اگر هنوز یک برنامه نویس مبتدی هستید و می خواهید بفهمید چرخه چیست و چرا به آن نیاز است، بخش بعدی این مقاله را با توضیحات مفصل ببینید.

عملگر WHILE در C++ و Arduino برای تکرار همان دستورات به تعداد دلخواه بارها استفاده می شود. در مقایسه با FOR، حلقه WHILE ساده‌تر به نظر می‌رسد، معمولاً در جایی استفاده می‌شود که نیازی به شمارش تعداد تکرارها در یک متغیر نداریم، بلکه فقط باید کد را تکرار کنیم تا چیزی تغییر کند، رویدادی رخ دهد.

نحو WHILE

در حالی که(<условие или список условий>)
{
<программный блок, который будет повторяться>
}

هر ساختار زبانی که مقدار بولی را برمی گرداند می تواند به عنوان شرایط استفاده شود. شرایط می تواند عملیات مقایسه، توابع، ثابت ها، متغیرها باشد. مانند هر عملیات منطقی دیگری در آردوینو، هر مقداری غیر از صفر به عنوان درست (درست)، صفر - نادرست (نادرست) درک می شود.

// حلقه بی نهایت while(true)( Serial.println("در انتظار..."); ) // حلقه ای که تا زمانی که مقدار تابع checkSignal() تغییر کند اجرا می شود while(!checkSignal())( Serial.println("Waiting… "))

توجه داشته باشید که دستور while را می توان بدون پرانتزهای فرفری در اطراف بلوک استفاده کرد، در این صورت اولین دستوری که بعد از حلقه با آن مواجه شد، تکرار می شود. استفاده از آن در حالی که بدون بریس مجعد است بسیار منع می شود، زیرا در این صورت اشتباه کردن بسیار آسان است. مثال:

while(true) Serial.print("در انتظار وقفه"); تاخیر (1000);

در این حالت، کتیبه در یک حلقه بی نهایت بدون مکث نمایش داده می شود، زیرا دستور delay(1000) تکرار نمی شود. شما می توانید زمان زیادی را صرف تشخیص چنین خطاهایی کنید - استفاده از بریس فرفری بسیار ساده تر است.

نمونه ای از استفاده از حلقه while

اغلب اوقات، while برای انتظار برای برخی رویدادها استفاده می شود. به عنوان مثال، آمادگی جسم سریال برای کار.

Serial.begin(9600); در حالی که (!Serial) ( ; // برخی از بردهای آردوینو باید منتظر بمانید تا پورت سریال آزاد شود )

نمونه ای از انتظار برای ورود یک کاراکتر از دستگاه های خارجی از طریق UART:

while(Serial.available())( int byteInput = Seria.read(); // کار دیگری انجام دهید)

در این مورد، ما مقادیر را می خوانیم تا زمانی که Serial.available() یک مقدار غیر تهی را برگرداند. به محض تمام شدن تمام داده های بافر، حلقه متوقف می شود.

حلقه FOR در آردوینو

در حلقه FOR، ما این فرصت را داریم که نه تنها شرایط مرزی را تنظیم کنیم، بلکه بلافاصله یک متغیر برای شمارنده تعریف کنیم، نشان دهیم که چگونه مقدار آن در هر تکرار تغییر می کند.

برای نحو حلقه

در اینجا ساخت و ساز کمی پیچیده تر خواهد بود:
برای (<начальное значение счетчика>;<условие продолжения выполнения цикла>;<изменение значения счетчика на каждом шаге>){
<список_команд>
}

ساده ترین مثال:

برای(int i=5;i<10;i++){ // Конструкция «3 в одном» pinMode(i, OUTPUT); }

ما بلافاصله یک متغیر ایجاد کردیم، آن را مقداردهی اولیه کردیم، نشان دادیم که در پایان هر چرخه، مقدار شمارنده باید یک افزایش یابد. و تمام - اکنون می توانید از متغیر داخل حلقه استفاده کنید.

مرحله متغیر ممکن است متفاوت باشد. در اینجا چند نمونه آورده شده است:

  • برای (int i=0; i<10; i=i+2) // Шаг 2
  • برای (int i=0; i<10; i+=2) // Аналогичен предыдущему
  • for(int i=10; i>0; i–) // برگردید - از 10 به 1

حلقه while انجام دهید

در برخی موارد، ما باید حلقه را به گونه ای سازماندهی کنیم که دستورالعمل های بلوک حداقل یک بار اجرا شوند و سپس بررسی از قبل انجام شود. برای چنین الگوریتم هایی می توانید از ساخت do while استفاده کنید. مثال:

Do ( Serial.println("Working"); ) while (checkSomething());

این نسخه از حلقه هیچ مشکلی ندارد - ما به سادگی بلوک را با شرایط به پایین منتقل کردیم، بنابراین همه چیزهایی که در داخل پرانتزهای فرفری بعد از دستور do قرار دارند، قبل از اولین بررسی اجرا می‌شوند.

ادامه و شکستن عبارات

شرایطی وجود دارد که باید فوراً اجرای حلقه را در داخل بلوک حلقه شکست دهید، بدون اینکه منتظر بمانید تا به بلوک آزمایش شرط بپرید. برای این کار می توانید از اپراتور استفاده کنید زنگ تفريح:

while (true) (اگر (checkSomething()) ( break; ) )

اگر فقط بخواهیم پیشرفت تکرار فعلی را متوقف کنیم، اما از حلقه خارج نشویم، بلکه به بلوک بررسی شرط برویم، باید از عملگر استفاده کنیم. ادامه هید:

while (true) (اگر (checkSomething()) (ادامه دهید؛ ))

دستورهای continue و break را می توان با تمام حلقه های FOR و WHILE استفاده کرد.

حلقه های تودرتو در آردوینو

هر گونه از چرخه ها را می توان به راحتی با یکدیگر ترکیب کرد و ساختارهای تودرتو ایجاد کرد. متغیرهای تعریف شده در بلوک حلقه "پوشاننده" در حلقه داخلی در دسترس خواهند بود. رایج ترین نمونه از این نوع حلقه، پیمایش آرایه های دو بعدی است. در مثال زیر، از یک حلقه دوتایی استفاده می‌کنیم: حلقه اول روی ردیف‌ها (متغیر i) و دومی، تودرتو، ستون‌های (متغیر j) آرایه‌ای که در متغیر arr تعریف کرده‌ایم تکرار می‌شود.

Int arr; void setup() ( برای (int i = 0; i< 10; i++) { for (int j = 0; j < 3; j++) { arr[i][j] = i * j; Serial.println(arr[i][j]); } } }

بیشتر در مورد چرخه ها

اگر تا به حال با حلقه ها کار نکرده اید، بیایید کمی به دنیای تئوری شیرجه بزنیم و بفهمیم که حلقه ها چیست و چرا به این ساختارهای زبانی مرموز نیاز داریم.

چرا به چرخه نیاز داریم؟

در واقع وظیفه اصلی حلقه این است که ساختارهای یک زبان را چندین بار تکرار کند. چنین نیازی تقریباً در هر برنامه ای ایجاد می شود و مطمئناً هیچ طرح آردوینو نمی تواند بدون چرخه انجام دهد - تابع حلقه () نیز در یک حلقه بی نهایت نامیده می شود.

بیایید به مثال زیر نگاه کنیم. شما باید به طور همزمان 5 ال ای دی متصل به برد آردوینو را از پایه های 5 تا 9 تامین کنید. واضح ترین گزینه برای این کار قرار دادن پنج دستورالعمل در یک ردیف است:

digitalWrite (5، HIGH);

digitalWrite (6، HIGH);

digitalWrite (7، HIGH);

digitalWrite (8، HIGH);

digitalWrite (9، HIGH);

در حال حاضر، اجازه دهید از سوال در مورد ریسک چنین اقدامی صرف نظر کنیم، زیرا روشن شدن همزمان چنین تعداد LED باعث افزایش بار در مدار برق برد می شود. نکته اصلی در حال حاضر برای ما این است که ما پنج خط کد ایجاد کرده ایم که هر کدام با بقیه فقط یک رقم متفاوت است. این رویکرد دارای معایب زیر است:

  • با هر تغییری، باید همزمان در بسیاری از خطوط تغییراتی ایجاد کنید. به عنوان مثال، اگر باید LED ها را روی پایه های 2 تا 6 قرار دهیم یا روشن نشوند، اما ولتاژ را خاموش کنیم، باید 5 تغییر در کد ایجاد کنیم. و اگر دستورالعمل ها و تغییرات بیشتری وجود دارد؟
  • کد حجیم با تعداد زیادی دستورالعمل از همان نوع، خواندن ناخوشایند و ناخوشایند است. پنج خط یکسان - نه خیلی ترسناک. اما عادت به کدهای کثیف در نهایت منجر به ده ها و صدها صفحه اضافی در لیست می شود که هم شما و هم همکارانتان را در دلسردی فرو می برد.
  • در فرآیند "کپی پیست" دستورالعمل های تقریباً یکسان، اشتباه کردن آسان است، به عنوان مثال، فراموش کردن تغییر تعداد پین ها: digitalWrite(5, HIGH); digitalWrite (5، HIGH);
  • شما به راحتی می توانید با نشان دادن چنین کدی به مصاحبه کننده در هر شرکت نرم افزاری معمولی در مصاحبه شکست بخورید.

از همه اینها می توان نتیجه گرفت که تقریباً همیشه باید از استفاده مکرر از همان رشته ها اجتناب کرد و حلقه ها را جایگزین کرد. علاوه بر این، در بسیاری از موقعیت‌ها، نمی‌توان چرخه‌ها را اصولاً کنار گذاشت؛ هیچ چیز نمی‌تواند جایگزین آنها شود. در حین اجرای برنامه نمی توانید تعداد تکرارهای کد را تغییر دهید. به عنوان مثال، شما باید هر عنصر را پردازش کنید آرایه دادهدریافت شده از دستگاه های خارجی شما هرگز پیش بینی نمی کنید که چه مقدار داده خواهد بود، چند بار پردازش را تکرار کنید، و بنابراین نمی توانید تعداد دستورالعمل های لازم را در زمان نوشتن مقاله درج کنید.

اینجاست که چرخه ها به کمک می آیند.

قوانین نحوی

دوچرخه سواری در آردوینو- این یک بلوک برنامه خاص است که در زمان اجرای برنامه به تعداد معینی فراخوانی می شود. در این بلوک، ما خود دستوراتی را که فراخوانی می‌شوند و قوانینی که کنترلر تعیین می‌کند چند بار باید فراخوانی شوند را توضیح می‌دهیم.

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

تکرار فرمان دیجیتال 5 بار بنویسید

در دنیای ایده‌آل با روبات‌های برنامه‌نویس، این احتمالاً کافی است، اما از آنجایی که ما با یک کامپیوتر در C ++ صحبت می‌کنیم، باید این عبارت را به این زبان ترجمه کنیم:

تکرار فرمان - باید از دستورالعمل‌های ویژه‌ای استفاده کنید که به کنترل‌کننده می‌گویند که چیزی جالب با حلقه‌های while یا for شروع می‌شود

دیجیتال رایت - آن را همانطور که هست بگذارید، اما یک بار آن را بنویسید و در پرانتز قرار دهید. نحوه برخورد با اعداد پین - درست در زیر.

5 بار - برای این کار از یک شمارنده استفاده کنید که با هر تکرار افزایش می یابد. در ابتدا (یا انتهای) بلوک، می توانید با استفاده از عملیات مقایسه، مقدار این شمارنده را با مقدار حدی (در این مورد 5) مقایسه کنید.

بیایید به مثالی از چنین دستور حلقه "ترجمه شده" با دستور while نگاه کنیم:

int counter = 0; // متغیر برای ذخیره مقدار شمارنده // از پردازنده می‌خواهیم ساختار را در پرانتزهای فرفری تکرار کند تا شرط داخل پرانتز درست برگردد. // در مورد ما، شمارنده شمارنده ما است، 5 مقدار حد است، شرط این است که مقدار شمارنده کمتر از 5 باشد. // اما ما می توانیم عملگرهای منطقی کاملاً متفاوتی را در حالی که (counter< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

برای کسانی که متوجه خطایی در کد بالا شده اند، پنج را قرار داده و بلوک حلقه را به روش دیگری می نویسیم:

در حالی که (کنترل< 5) { // Вот теперь мы будем включать разные светодиоды, с 5 (0+5) по 9 (4+5) digitalWrite(counter + 5, HIGH); counter++; }

همین نتیجه را می توان با استفاده از یک حلقه FOR به دست آورد:

برای (int counter = 0; counter<5; counter ++){ digitalWrite(counter+5, HIGH); }

همانطور که می بینید، در این مورد، ما بلافاصله تمام عملیات لازم را با شمارنده در یک دستورالعمل FOR قرار می دهیم - در صورت نیاز به شمارش تعداد مورد نیاز، این بسیار راحت تر است.

می توانید اطلاعات دقیقی در مورد قوانین استفاده از چرخه ها در قسمت های مربوطه این مقاله کسب کنید.

نتیجه

در این مقاله، ساختارهای بسیار مهم زبان آردوینو را بررسی کردیم: حلقه‌های FOR و WHILE. تقریباً در هر طرح کم و بیش پیچیده ای قادر خواهید بود این عملگرها را ملاقات کنید، زیرا بدون حلقه ها، بسیاری از عملیات داده غیرممکن خواهد بود. هیچ چیز پیچیده ای در نحو چرخه ها وجود ندارد - شما به راحتی می توانید به آنها عادت کنید و می توانید فعالانه از آنها در پروژه های خود استفاده کنید.

هر زبان برنامه نویسی دارای مجموعه ای از دستورالعمل های کنترلی است که اجرای چندگانه یک کد (حلقه)، انتخاب قطعه کد مناسب (شرایط) و دستورالعمل های خروج از قطعه کد فعلی را ارائه می دهد.

Arduino IDE بیشتر کنترل های مورد نیاز را از C/C++ قرض گرفته است. نحو آنها با C یکسان است. در زیر نحو آنها را به اختصار شرح می دهیم.

اگر بیانیه

دستور if به شما امکان می دهد بسته به نتیجه بررسی یک شرایط خاص، یک قطعه برنامه خاص را اجرا کنید. اگر شرط برقرار باشد، کد برنامه اجرا می شود و اگر شرط برقرار نباشد، کد برنامه حذف می شود. نحو دستور if به صورت زیر است:

اگر (شرط) (گزاره 1؛ عبارت 2؛ )

یک شرط می تواند هر مقایسه ای از یک متغیر یا مقدار برگردانده شده توسط یک تابع باشد. ملاک اصلی شرط if این است که پاسخ باید همیشه یا درست (درست) یا نادرست (نادرست) باشد. نمونه هایی از شرایط یک دستور if:

If(a!=2) ( ) if(x<10) { } if(znak==’B’) { }

در داخل براکت هایی که داخل شرط نوشته شده است، می توانید کد را اجرا کنید.

افرادی که شروع به یادگیری برنامه نویسی می کنند معمولاً اشتباه می کنند که مقدار یک متغیر معین را با یک علامت "=" برابر می کنند. چنین رکوردی بدون ابهام تخصیص یک مقدار به یک متغیر را نشان می دهد، و بنابراین، شرط همیشه "درست" خواهد بود، یعنی برآورده می شود. بررسی مساوی بودن یک متغیر با مقدار معینی همیشه با علامت دو برابری (==) نشان داده می شود.

می توانید از وضعیت یک تابع به عنوان یک شرط استفاده کنید، به عنوان مثال:

If(init()) (Serial.print("ok");)

مثال بالا به صورت زیر اجرا می شود: اولین مرحله فراخوانی تابع init() است. این تابع مقداری را برمی گرداند که به صورت "true" یا "false" تفسیر می شود. بسته به نتیجه مقایسه، متن "ok" ارسال می شود یا چیزی ارسال نمی شود.

اگر... بیانیه دیگری

عبارت اگر توسعه یافته عبارت if….else است. این تضمین می کند که زمانی که شرط درست است (true) یک قطعه کد اجرا می شود و اگر شرط درست نیست (نادرست) قطعه کد دوم اجرا می شود. نحو دستور if….else به صورت زیر است:

اگر (شرط) ( // دستور A ) دیگری ( // دستور B )

دستورات "الف" فقط در صورت تحقق شرط اجرا می شود، دستور "ب" زمانی اجرا می شود که شرط برقرار نباشد. اجرای همزمان دستور «الف» و «ب» امکان پذیر نیست. مثال زیر نحوه استفاده از نحو if...else را نشان می دهد:

If (init()) (Serial.print("ok")؛ ) else (Serial.print("خطا");)

به این ترتیب می توانید اجرای صحیح تابع را بررسی کرده و به کاربر اطلاع دهید.

روش معمول نفی شرط است. این به این دلیل است که تابعی که به درستی اجرا می شود 0 را برمی گرداند، در حالی که تابعی که به دلایلی از کار بیفتد مقدار غیر صفر را برمی گرداند.

توضیح این "عارضه زندگی" ساده است. اگر تابع به درستی اجرا شود، این تنها اطلاعاتی است که ما نیاز داریم. در صورت بروز خطا، گاهی اوقات ارزش دارد که بفهمیم چه چیزی اشتباه رخ داده است، چرا عملکرد به درستی اجرا نشده است. و در اینجا اعدادی که با صفر تفاوت دارند به کمک می آیند، یعنی با کمک کدهای دیجیتال می توانیم نوع خطا را مشخص کنیم. به عنوان مثال، 1 - مشکل در خواندن مقداری، 2 - فضایی در حافظه یا دیسک وجود ندارد و غیره.

آخرین مثال اصلاح شده نحوه فراخوانی تابعی را نشان می دهد که در صورت اجرای صحیح صفر را برمی گرداند:

If (!init()) (Serial.print("ok"); ) else (Serial.print("خطا"); )

عبارت switch case

دستور if به شما امکان می دهد فقط یک شرط را بررسی کنید. گاهی اوقات لازم است یکی از اقدامات بسته به مقدار برگشتی یا خوانده شده انجام شود. دستور چند گزینه ای سوئیچ برای این کار ایده آل است. سینتکس دستور switch در زیر نشان داده شده است:

سوئیچ (var) (مورد 1: // دستورالعمل برای var=1 شکست؛ مورد 2: // دستورالعمل برای var=2 شکست؛ پیش‌فرض: // دستورالعمل به‌طور پیش‌فرض (اگر var با 1 و 2 متفاوت باشد)

بسته به مقدار متغیر var، دستورالعمل ها در بلوک های خاصی اجرا می شوند. برچسب case به معنای ابتدای بلوک برای مقدار مشخص شده است. به عنوان مثال، مورد 1: به این معنی است که بلوک داده شده برای مقدار متغیر متغیر برابر با یک اجرا می شود.

هر بلوک باید با دستور break خاتمه یابد. اجرای بیشتر دستور switch را قطع می کند. اگر دستور break حذف شود، دستورالعمل ها در بلوک های بعدی تا دستور break اجرا می شوند. برچسب پیش‌فرض مانند موارد دیگر در عبارت if اختیاری است. دستورالعمل های بلوک پیش فرض تنها زمانی اجرا می شوند که مقدار var با هیچ الگوی مطابقت نداشته باشد.

اغلب اتفاق می افتد که دستورالعمل های یکسانی باید برای یکی از چندین مقدار اجرا شود. این را می توان به این صورت به دست آورد:

سوئیچ (x) (مورد 1: // عبارت برای x=1 شکست؛ مورد 2: مورد 3: مورد 5: // عبارت برای x=2 یا 3 یا 4 شکست؛ مورد 4: // عبارت برای x=4 شکست ؛ مورد 6: // دستورالعمل برای شکستن x=6؛ پیش‌فرض: // دستورالعمل پیش‌فرض (اگر x با 1،2،3،4،5،6 متفاوت باشد)

بسته به مقدار متغیر x، بلوک دستورالعمل مربوطه اجرا خواهد شد. تکرار حالت 2: case 3: case 5: به کامپایلر اطلاع می دهد که اگر متغیر x دارای مقدار 2 یا 3 یا 5 باشد، همان قطعه کد اجرا می شود.

برای بیانیه

دستور for برای اجرای مکرر همان کد استفاده می شود. اغلب لازم است دستورالعمل های مشابهی اجرا شوند و فقط مقدار یک متغیر تغییر کند. حلقه for برای این کار مناسب است. دستور دستور به صورت زیر است:

int i; برای (i=0;i<10;i++) { // инструкции для выполнения в цикле }

اولین پارامتری که در دستور for داده می شود، مقدار اولیه متغیر است. عنصر دیگر بررسی شرایط برای ادامه اجرای حلقه است. حلقه تا زمانی اجرا می شود که شرط برقرار باشد. آخرین عنصر تغییر در مقدار متغیر است. اغلب، ما مقدار آن را افزایش یا کاهش می دهیم (در صورت نیاز). در این مثال، دستورالعمل های موجود در حلقه در i=0…9 اجرا می شوند.

اغلب یک متغیر مورد استفاده در یک حلقه در همان مکان اعلام می شود:

برای(int i=0;i<10;i++) { // инструкции для выполнения в цикле }

متغیری که برای شمارش مراحل بعدی حلقه استفاده می شود می تواند در داخل آن برای فراخوانی یک تابع با پارامترهای مناسب استفاده شود.

برای (int i=10;i>0;i—) (Serial.print(i); // اعداد 10,9,8,7,6,5,4,3,2,1 ارسال خواهند شد)

در حالی که بیانیه

حلقه for برای جایی که می خواهیم شمارش را انجام دهیم عالی است. در شرایطی که در نتیجه رویدادی که لزوماً قابل پیش‌بینی نیست، لازم است اقدامات خاصی انجام دهیم (مثلاً منتظر فشار دادن یک دکمه هستیم)، می‌توانیم از دستور while استفاده کنیم که بلوک دستور را اجرا می‌کند. تا زمانی که شرط برقرار باشد. نحو دستور while به صورت زیر است:

while(condition) (// بلوک دستور برای اجرا)

مهم است که بررسی شرایط در ابتدای حلقه انجام شود. ممکن است این اتفاق بیفتد که دستورات داخل حلقه while هرگز اجرا نشوند. همچنین امکان ایجاد یک حلقه بی نهایت وجود دارد. بیایید دو نمونه را ببینیم:

intx=2; while(x>5) ( Serial.print(x); ) —————————————- int y=5; while(y>0) (Serial.print(y); )

اولین بلوک عبارات داخل while هرگز اجرا نمی شود. متغیر x دارای مقدار دو است و از 5 بزرگتر نمی شود. در مثال دوم با یک حلقه بی نهایت روبرو هستیم. متغیر "y" دارای مقدار 5، یعنی بزرگتر از صفر است. در داخل حلقه، تغییری در متغیر 'y' وجود ندارد، بنابراین حلقه هرگز پایان نخواهد یافت.

این یک اشتباه رایج زمانی است که فراموش می کنیم پارامتری که باعث خاتمه حلقه می شود را تغییر دهیم. در زیر دو مثال معتبر از استفاده از حلقه while آورده شده است:

intx=0; در حالی که (x<10) { //блок инструкций x++; } —————————————- while(true) { if(условие) break; // блок инструкций }

در مثال اول، ما مراقب تغییر مقدار متغیری بودیم که در شرط بررسی می شود. در نتیجه، چرخه در نهایت به پایان می رسد. در مثال دوم، یک حلقه بی نهایت عمدا ایجاد شد. این حلقه معادل تابع loop() در Arduino IDE است. علاوه بر این، یک بررسی شرط در داخل حلقه معرفی می شود که پس از آن حلقه با دستور break به پایان می رسد.

انجام ... در حالی که بیانیه

یک تغییر از حلقه while، حلقه do...while است. علاوه بر نحو، در مکانی که شرط بررسی می شود نیز متفاوت است. در مورد do...while، پس از اجرای بلوک دستور، شرط بررسی می شود. این بدان معنی است که بلوک دستور در بدنه حلقه حداقل یک بار اجرا می شود. دستور زیر دستور do...while است:

انجام (// بلوک عبارت ) while(condition)

هر چیزی که در مورد دستور while نوشته شده است برای do...whil نیز صدق می کند. مثال زیر نمونه ای از استفاده از حلقه do...while است:

intx=10; do ( // بلوک دستورالعمل x—; ) while(x>0); —————————————- do ( // بلوک دستورالعمل if(condition) break; ) while(true);

بیانیه شکست

دستور break به شما امکان می دهد از حلقه خارج شوید (do...while, for, while) و از گزینه switch خارج شوید. در مثال زیر اجرای دستور break را در نظر بگیرید:

برای(i=0;i<10;i++) { if(i==5) break; Serial.print(i); }

حلقه باید برای اعداد از 0 تا 9 اجرا شود، اما برای عدد 5، شرط برقرار است که دستور break را راه‌اندازی می‌کند. این از حلقه خارج می شود. در نتیجه فقط اعداد 0،1،2،3،4 به پورت سریال (Serial.print) ارسال می شود.

ادامه بیانیه

عملگر ادامه باعث می شود که دستورات حلقه (do...while, for, while) برای مقدار فعلی اجرا را متوقف کند و به مرحله بعدی حلقه برود. مثال زیر نحوه عملکرد عبارت continue را نشان می دهد:

برای(i=0;i<10;i++) { if(i==5) continue; Serial.print(i); }

همانطور که مشاهده می کنید حلقه برای مقدار 0 تا 9 اجرا می شود و برای مقدار 5 دستور continue اجرا می شود که در نتیجه دستورالعمل های بعد از این دستور اجرا نمی شود. در نتیجه اعداد 0,1,2,3,4,6,7,8,9 به پورت سریال (Serial.print) ارسال می شود.

بیانیه بازگشت

دستور return اجرای تابع فراخوانده شده را خاتمه می دهد و مقداری از نوع خاصی را برمی گرداند. به عنوان یک پارامتر فرمان، می توانید یک عدد، کاراکتر یا یک متغیر از نوع خاصی را مشخص کنید. مهم است که مقدار بازگشتی با نوع تابع اعلام شده مطابقت داشته باشد. مثال زیر نحوه استفاده از دستور return را نشان می دهد:

Int checkSensor()(اگر (analogRead(0) > 400) (// خواندن ورودی آنالوگ 1؛ // برای مقادیر بیشتر از 400، 1 برگردانده می شود دیگری (بازگرداندن 0؛ // برای دیگران، 0 برگردانده می شود) )

همانطور که می بینید، می توانید از چندین دستور بازگشت در یک تابع استفاده کنید، اما فقط یکی از آنها همیشه کار می کند. استفاده از دستور بازگشت بدون پارامتر مجاز است. این به شما امکان می دهد تا عملکردی را که هیچ مقداری را بر نمی گرداند، به طور پیش از موعد خاتمه دهید.

Void function_name() ( statement1; if(x==0) return; statement2; statement3; )

در مثال بالا، دستور1 هر زمان که تابع فراخوانی شود اجرا خواهد شد. اجرای instruction2 و instruction3 به نتیجه دستور if بستگی دارد. اگر شرط برقرار باشد (true)، دستور بازگشت اجرا شده و تابع خارج خواهد شد.

در شرایطی که شرط برقرار نیست، دستور بازگشت نیز اجرا نمی شود، اما دستورات instruction2 و instruction3 اجرا می شوند و پس از آن تابع به کار خود پایان می دهد.

بیانیه goto

به دلایل ایدئولوژیک باید از این توصیف صرف نظر کرد... دستور goto دستوری است که در برنامه نویسی معمولی نباید از آن استفاده کرد. این باعث پیچیدگی کد می شود و یک عادت بد برنامه نویسی است. اکیدا توصیه می کنیم از این دستور در برنامه های خود استفاده نکنید. با توجه به اینکه goto در مستندات رسمی در سایت arduino.cc قرار دارد به توضیح مختصری در مورد آن می پردازیم. نحو دستور goto این است:

…. برچسب goto; // پرش به خط با برچسب "metka" ….. …. …. metka: // برچسب جایی که برنامه به کار خود ادامه می دهد ...

دستور اجازه می دهد تا به برچسب تعیین شده، یعنی به مکان در برنامه بپرید.

امروز بخش مهمی از زبان برنامه نویسی را به عنوان حلقه مطالعه خواهیم کرد. برای چه چیزی مورد نیاز هستند. برای خودمان هدف تعیین کنیم. لازم است شش ال ای دی به نوبت با بازه زمانی 50 میلی ثانیه روشن شود و سپس به نوبت با همان فاصله خاموش شود. خوب، چه چیزی می تواند ساده تر باشد. کد زیر را می نویسیم:
void setup() (pinMode(2, OUTPUT)؛ pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT)؛ pinMode(6, OUTPUT)؛ pinMode(7, OUTPUT)؛ ) حلقه خالی () ( digitalWrite (2، HIGH)؛ تاخیر (50)؛ digitalWrite (3، HIGH)؛ تاخیر (50)؛ digitalWrite (4، HIGH)؛ تاخیر (50)؛ digitalWrite (5، HIGH)؛ تاخیر (50) ؛ digitalWrite (6, HIGH)؛ تاخیر (50)؛ digitalWrite (7, HIGH)؛ تاخیر (50)؛ digitalWrite (2، LOW)؛ تاخیر (50)؛ digitalWrite (3، LOW)؛ تاخیر (50) DigitalWrite (4، LOW)؛ تاخیر (50)؛ digitalWrite (5، LOW)، تاخیر (50)؛ digitalWrite (6، LOW)؛ تاخیر (50)؛ digitalWrite (7، LOW)؛ تاخیر (50)؛ ) ابتدا ما حدود شش پین دیجیتال از دوم تا هفتم را به عنوان خروجی مقدار دهی اولیه کردند و در برنامه اصلی به طور متناوب شش بار روشن کردن LED، تاخیر و غیره نوشتند. بعد از همان کار اما هر بار LED خاموش می شد. حالا آردوینو را پر می کنیم و از کار لذت می بریم. اما باز هم اینجا چیزی اشتباه است. اگر به کد برنامه دقت کنید متوجه می شوید که قسمت هایی از کد وجود دارد که در طول برنامه تکرار می شود. به عنوان مثال، تکرار یک مکث باید بلافاصله نظر شما را جلب کند. و هنگامی که پین ​​ها مقداردهی اولیه می شوند، فقط تعداد آن تغییر می کند. وقتی آن را روشن و خاموش می کنید، فقط شماره آن تغییر می کند. برای چنین برنامه کوچکی، البته، می توانید آن را به همین شکل رها کنید، کنترلر آن را غوطه ور می کند و خفه نمی شود، اما اگر لازم است یک کد تکراری، مثلاً 1000 بار اجرا کنید. من فکر می کنم صبر کافی برای پر کردن آن وجود خواهد داشت، اما آیا MK حافظه کافی خواهد داشت؟ البته می توانید بپرسید چرا ما به 1000 عملیات یکسان نیاز داریم؟ خب، بله، تصورش سخت است.) اما این مشکلی نیست، اما اگر آرایه ای از 1000 سلول داشته باشیم. این اغلب اتفاق می افتد، به عنوان مثال، چندین سنسور پارامترها را در یک آرایه می نویسند و چگونه می گویند این آشفتگی را درک کنید. لازم است طبق برخی پارامترها به نحوی آن را جدا کنید. برای چنین حوادثی است که چرخه ها اختراع شدند. حلقه قطعه ای از کد است که چند بار اجرا می شود. یک قسمت اجرا شده از برنامه در یک حلقه تکرار نامیده می شود. تعداد تکرارها می تواند از 0 تا بی نهایت باشد. برای اجرای چرخه ها در زبان برنامه نویسی، در حال حاضر سه نوع از چرخه وجود دارد. باور کنید، اما این برای هر کدنویسی پیچیده برای چشم کافی است. بیایید همه اینها را با جزئیات بیشتری بررسی کنیم.
  • در حالی که (شرط) ()
  • do () while(condition);
  • برای (متغیر تعداد؛ شرط؛ متغیر تعداد افزایش) ()
سیکل اول در حالی که (شرط) (). او چگونه کار می کند. بعد از کلمه در حالی کهباید یک شرط در پرانتز وجود داشته باشد. شرط می تواند هر چیزی باشد، تا زمانی که درست باشد. به محض اینکه شرط نادرست شد، حلقه متوقف می شود و برنامه از خط بعدی بعد از حلقه به کار خود ادامه می دهد. بیایید یک مثال بزنیم.
char i = 0; در حالی که (مندر واقع همان چیزی است که ما اینجا نوشته ایم. ابتدا متغیر count را مقداردهی اولیه می کنیم منو آن را ریست کنید. بعد، وارد حلقه می شویم و شروع به بررسی شرایط داخل پرانتز می کنیم. اگر ارزش منکمتر از 10، سپس بدنه حلقه را اجرا کنید. در خود حلقه، به سادگی مقدار متغیر شمارش را یک بار افزایش می دهیم و دوباره شرایط را بررسی می کنیم. در مورد ما، حلقه 10 بار اجرا می شود. یعنی اول مقدار منبرابر با صفر است. صفر کمتر از ده است. بعد متغیر را یک افزایش دادیم و با هم مقایسه کردیم، یک کمتر از ده است و به همین ترتیب. به محض اینکه متغیر شمارش برابر با ده شد، بررسی می کنیم که آیا ده کمتر از ده است؟ البته نه، و پس از بررسی حلقه از کار خواهد افتاد. چرخه اینگونه عمل می کند. و اگر نیاز به اجرای کد در بدنه حلقه برای هر بار داشته باشید، حتی اگر با شرایط مطابقت نداشته باشد، چه می شود. چرخه دیگری برای این وجود دارد به نام انجام () while (شرط). دقیقاً مانند چرخه قبلی کار می کند، به استثنای یک اما. در این حلقه ابتدا بدنه حلقه اجرا می شود و سپس تست انجام می شود. بیایید ببینیم در کد چگونه به نظر می رسد.
char i = 0; انجام دهید ( i++; ) while ((i > 0) & (iببین چقدر جالب ابتدا مانند قبل، متغیر شمارش را با صفر مقداردهی اولیه می کنیم، اما در شرایطی که می نویسیم منبزرگتر از صفر و کمتر از ده بود. یعنی مقدار متغیر باید در بازه یک تا نه باشد. اگر با استفاده از حلقه قبلی به این شکل نوشته بودیم، هرگز اجرا نمی شد. اما ما کلمه جادویی را داریم انجام دادن. همین اتفاق خواهد افتاد. ابتدا در بدنه حلقه، مقدار متغیر شمارش افزایش می یابد و یک می شود و این بزرگتر از صفر است، شرط درست می شود. بر این اساس، حلقه تا زمانی که متغیر شمارش برابر با ده شود، به اجرای آن ادامه خواهد داد. و در نهایت، نسخه سوم از چرخه. او چگونه کار می کند:
چاری; برای (i = 0; iچگونه کار می کند. ابتدا، دوباره متغیر شمارش را شروع می کنیم، اما بدون مقدار مشخص. بعد کلمه را می نویسیم برای، اما در پرانتز ابتدا متغیر شمارش خود را می نویسیم و مقدار اولیه را به آن اختصاص می دهیم. سپس شرط را بررسی می کنیم و اگر درست باشد بدنه حلقه را اجرا می کنیم و مقدار متغیر شمارش را افزایش می دهیم. در اصل، این همان است در حالی که()()بنابراین از کدام حلقه استفاده کنید به شما بستگی دارد. چند کلمه در مورد چند نکته. مثلا اگر بنویسید while(1);، سپس حلقه برای همیشه اجرا می شود. یا اگر با برای، سپس به این شکل خواهد بود برای(؛؛)؛. مراقب باش. گاهی اوقات، هنگام اجرای یک حلقه، شما واقعاً می خواهید همه چیز را رها کنید و از آن خارج شوید، اما شرط اجازه نمی دهد. چگونه بودن؟ دستور دیگری برای این کار وجود دارد زنگ تفريح؛. به محض اینکه MK با این دستور در بدنه حلقه برخورد کرد، بلافاصله از حلقه خارج شده و اجرای برنامه را از خط بعدی بعد از حلقه ادامه می دهد. اما اگر در حین کار چرخه، شرایطی ایجاد شود که شرایط را برآورده نمی کند، یا مثلاً لحظه ای که در آن نیازی به ادامه اجرای پایان بدنه چرخه نباشد، چه؟ در اینجا تیم به ما کمک خواهد کرد ادامه هید؛. به محض اینکه MK به این دستور برخورد کرد، همه چیز را رها می کند و به اجرای تکرار بعدی حلقه ادامه می دهد. امیدوارم همه چیز را واضح توضیح داده باشم. اکنون، با دریافت این دانش، بیایید برنامه خود را بازنویسی کنیم، اما با استفاده از حلقه ها.
void setup() (بایت i = 2; // متغیر شمارش while(i // اگر i کمتر از 8 باشد، بدنه حلقه را اجرا کنید ( pinMode(i, OUTPUT); // شروع کردن پین هایی که از 2 شروع می شوند i++; // متغییر تعداد افزایش یک عدد) ) void loop() (بایت i = 2؛ while(iبیایید نگاه دقیق تری بیندازیم. ابتدا متغیر count را مقداردهی اولیه کردیم منو مقدار دو را به آن اختصاص داد. چرا دوتا؟ و چون من به طور خاص پین های دوم تا هفتم را انتخاب کردم تا مطمئن شوم که مقدار اولیه مهم نیست. نوعی جناس معلوم شد) خب، البته، بله. بعد شرط چرخه را می نویسیم. ما باید شش تکرار انجام دهیم زیرا شش LED داریم. عالی، شمارش دو به اضافه شش می شود هشت. بله، بنابراین باید متغیر count را تا زمانی که کمتر از هشت شود بررسی کنیم. پس نوشتند در حالی که (i. حالا حلقه ما شش بار کار می کند. کاری که باید در داخل بدنه حلقه انجام دهیم. بله، هیچ چیز پیچیده ای نیست، فقط تابع مقداردهی اولیه خروجی به خروجی را وارد کنید، فقط متغیر شمارش را به جای خروجی جایگزین کنید. عدد. تمرکز چیست. به محض اینکه MK وارد چرخه بدنه شد، قبل از اجرای تابع مقداردهی اولیه خروجی، به آرگومان های ارسال شده نگاه می کنیم. یکی از آنها باید عدد خروجی را حمل کند و ما یک متغیر شمارش در آنجا داریم. برای انجام؟عدد.و ما یک دو داریم.خوب، عالی، اجازه دهید خروجی دوم را مقداردهی اولیه کنیم.بعد از آن، مقدار متغیر شمارش را یک بار دیگر افزایش می دهیم و شرط را بررسی می کنیم. بله، سه کمتر از هشت است، اجازه دهید همه چیز را دوباره و برای همیشه انجام دهید، اکنون فقط سه عدد در متغیر وجود دارد، بنابراین خروجی سومی را مقداردهی اولیه می کنیم و سپس متغیر شمارش را 1 افزایش می دهیم. به این ترتیب با عبور از حلقه، همه را تنظیم می کنیم. خروجی هایی که ما نیاز داریم. علاوه بر این، افزایش یک متغیر شمارش شرط سختی نیست. هیچ کس حوصله نوشتن را به این شکل نمی دهد: i = ((127*i)/31) & 0xF4;و اگر شرط بعد از اجرا درست باشد، این نیز کار خواهد کرد. برای حلقه، مهم نیست که در بدن چه اتفاقی می افتد، علاقه دارد که آیا شرط درست است یا نه. همین. در درس بعدی، توابع، چرایی نیاز به آنها را تجزیه و تحلیل خواهیم کرد و سعی می کنیم خودمان را بنویسیم.