Циклы 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 — полезный инструмент для ситуаций, когда выполнение кода зависит от условий, которые могут изменяться в процессе работы программы. Однако его использование требует внимательности, чтобы избежать зацикливания и «заморозки» скетча.





