Привет. Сегодня будем говорить про управляющие операторы if и else в языке программирования Ардуино.
Мы уже изменили стандартную программу blink из обучающего набора программ в ардуино ide. В прошлый раз мы рассмотрели оператор цикла for. Если вы пропустили или уже забыли о чем речь, пожалуйста, посмотрите эту статью здесь.
Теперь мы изменим программу blink еще раз, чтобы посмотреть на возможности управляющих операторов if и else.
If и Else в Ардуино
В прошлый раз мы сделали динамически меняющуюся задержку между включением и выключением светодиода. Но в конце цикла счетчик сбрасывался. Сегодня сделаем уменьшение задержки также более плавным.
Чтобы этого добиться, нам нужно начать уменьшать переменную i, когда она будет равна 1000. Для этого заменим число 100 в цикле for на переменную delta. И объявим переменную в области объявления переменных.
int delta = 100;
Теперь мы готовы добавить в программу управляющий оператор if. Логика в том, чтобы определить когда переменная i стала равна максимуму и начать ее изменять. Но, постараемся использовать уже готовый цикл for и не изменять программу полностью.
Для этого заменим значение шага в цикле на переменную delta, а после цикла добавим оператор if.
for(i = 100; i <= 1000; i+=delta){
digitalWrite(LED_BUILTIN, HIGH);
delay(i);
digitalWrite(LED_BUILTIN, LOW);
delay(i);
if( i == 1000 ){
delta = -delta;
}
}
В данном случае, мы сделали переменную delta равной себе, но со знаком минус. Соответственно, когда цикл for будет работать опять, то к i = 1000 будет прибавляться — 100. И задержка в функции delay будет уменьшаться.
Если загрузить программу в так виде, то мы увидим, как светодиод начинаем мигать медленнее, а потом быстрее, но только один раз.
Дело в том, что переменная i будет уменьшаться бесконечно, и через 10 итераций мы уже не увидим мигания, светодиод будет просто гореть.
Для того, чтобы разрешить эту проблему, добавим в условный оператор вторую часть. Она сработает, когда переменная i будет равна 0 и изменит знак шага опять.
else if( i == 0 ){
delta = -delta;
}
Теперь, когда переменная i дойдет до 0 знак шага delay опять изменится на положительный и цикл будет увеличиваться.
Мы объединили эти два условия в один оператор if … else if, чтобы показать, что это возможно. В данном случае можно было обойтись вторым оператором if. Вы можете использовать сколько угодно встроенных блоков else if, но, пожалуйста, не делайте так. Это превратит вашу программу в нечитабельную белиберду. В следующих статьях мы посмотрим как можно использовать управляющие конструкции с многими вариантами более удобно. Так же можно дописать условный оператор до конца использовав else{} в конце.
Итоговый код программы будет выглядеть так.
int i = 100;
int delta = 100;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
for(i = 100; i <= 1000; i+=delta){
digitalWrite(LED_BUILTIN, HIGH);
delay(i);
digitalWrite(LED_BUILTIN, LOW);
delay(i);
if( i == 1000 ){
delta = -delta;
} else if( i == 0 ){
delta = -delta;
} else{
}
}
}
Попробуйте загрузить его и проверить, все ли работает как нужно.
Заключение
Мы еще раз дополнили стандартную программу blink с помощью управляющей конструкции if else. И заставили светодиод на плате мигать с разными промежутками времени. А также познакомились с унарным оператором —
В следующий раз рассмотрим управляющую конструкцию switch case.