Цикли 3 — Цикл while

Вступ

Цикл while — це конструкція, яка виконує код доти, доки задана умова є істинною. Він часто використовується у ситуаціях, коли кількість повторень наперед невідома, а завершення циклу залежить від певної події або стану.

Як працює while

Синтаксис циклу while дуже простий:


while (умова) {
  // код, який буде виконуватися
}
  

Перед кожною ітерацією циклу перевіряється умова. Якщо вона істинна (true), виконується тіло циклу, після чого умова перевіряється знову.

Нескінченний і умовний while

  • Нескінченний while — умова завжди істинна, наприклад while(true). Такий цикл працюватиме вічно, якщо його не перервати за допомогою break або перезапуску програми.
  • Умовний while — виконується доти, доки умова не стане хибною, наприклад while(digitalRead(buttonPin) == LOW).

Небезпека зациклення

Основна небезпека роботи з while — непередбачене зациклення, коли умова ніколи не стає хибною. Це може «заморозити» програму, особливо якщо цикл знаходиться всередині loop() і немає виходу з нього.

Практика

Очікування натискання кнопки


const int buttonPin = 2;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  Serial.println("Очікування натискання...");
  while (digitalRead(buttonPin) == HIGH) {
    // Чекаємо
  }
  Serial.println("Кнопка натиснута!");
  delay(1000);
}
  

Вимірювання часу утримання кнопки


const int buttonPin = 2;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  Serial.println("Натисніть і утримуйте кнопку...");
  
  while (digitalRead(buttonPin) == HIGH) {
    // Чекаємо початку натискання
  }
  
  unsigned long startTime = millis();
  
  while (digitalRead(buttonPin) == LOW) {
    // Кнопка утримується
  }
  
  unsigned long holdTime = millis() - startTime;
  Serial.print("Час утримання: ");
  Serial.print(holdTime);
  Serial.println(" мс");
  
  delay(1000);
}
  

Проєкт: «Секундомір запуску»

Після натискання кнопки запускається секундомір, який рахує час до повторного натискання.


const int buttonPin = 2;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  Serial.println("Готовий до старту! Натисніть кнопку для запуску.");
  
  while (digitalRead(buttonPin) == HIGH) {
    // Чекаємо натискання
  }
  
  unsigned long startTime = millis();
  Serial.println("Відлік розпочався!");
  
  while (digitalRead(buttonPin) == LOW) {
    // Кнопка утримується
  }
  
  while (digitalRead(buttonPin) == HIGH) {
    // Чекаємо другого натискання
  }
  
  unsigned long stopTime = millis();
  unsigned long elapsed = stopTime - startTime;
  
  Serial.print("Час: ");
  Serial.print(elapsed);
  Serial.println(" мс");
  
  delay(2000);
}
  

Висновок

Цикл while — корисний інструмент для ситуацій, коли виконання коду залежить від умов, що можуть змінюватися під час роботи програми. Однак його використання вимагає уважності, щоб уникнути зациклення і «заморожування» скетчу.

Цикли 4 — Цикл do...while

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Ремінь зубчастий 6 мм для 3D-принтера

Ремінь зубчастий 6 мм для 3D-принтера

Відрізок зубчастого ременя шириною 6 мм.Застосовується для переміщення каретки 3D-принтера або CNC п..

49.26грн.

Модуль блока питания 12В 250мА

Модуль блока питания 12В 250мА

Зручний модуль живлення з 220В AC в 12В постійного струму. Розроблений для встановлення на друковану..

155.85грн.

Розумний дім 1. Постановка задачі.

Розумний дім 1. Постановка задачі.

Розумний дім 1. Постановка задачі. Кожна людина уявляє собі свій розумний дім у відповідності зі св..

Гвинт М3х30мм оцинкований

Гвинт М3х30мм оцинкований

Гвинт оцинкований з різьбою М3 для кріплення елементів любительських проектівДовжина різьби 30 мм..

2.17грн.

Таймери та FreeRTOS на ESP32

Таймери та FreeRTOS на ESP32

Таймери та FreeRTOS на ESP32 ESP32 працює під керуванням FreeRTOS, і окрім апаратних таймерів (hw..