В отличие от взаимодействия операторов if-else, рассмотренного в предыдущей статье, конструкция if-else-if позволяет вычислять дополнительные условные выражения.
Это означает, что мы можем добавить еще больше возможностей для принятия решений в наших скетчах Arduino. Можно проверить отдельную переменную, чтобы увидеть, содержит ли она какое-либо одно из ряда различных значений, чтобы принять решение в зависимости от того, какое значение содержит переменная.
Взаимосвязь или конструкция if-else-if показана ниже:
1 2 3 4 |
if (conditional expression 1) { } else if (conditional expression 2) { } |
Как видно, конструкция if-else-if позволяет вычислить второе условное выражение после первого if.
Если первое условное выражение истинно, то код в теле оператора if будет запущен, а код в теле оператора else-if не будет запущен.
Только если первое условное выражение оценивается как ложное, будет вычислено второе условное выражение. Если значение второго условного выражения истинно, будет выполнен код в блоке под оператором else-if. Если второе условное выражение оценивается как ложное, выполнение программы продолжится после закрывающей фигурной скобки тела оператора else-if.
Пример скетча if-else-if
В приведенном ниже скетче показано использование конструкции if-else-if. Если из окна Монитор порта отправляется символ «а», светодиод будет мигать с определенной частотой. Если будет отправлен символ «b», светодиод будет мигать быстрее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
void setup() { Serial.begin(9600); pinMode(13, OUTPUT); // Светодиод на 13 пине } char rx_byte = 0; void loop() { if (Serial.available() > 0) { // доступен ли символ? rx_byte = Serial.read(); } if (rx_byte == 'a') { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); } else if (rx_byte == 'b') { digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200); } } |
Первый оператор if получает символ из окна Монитор порта, если он доступен. За этим следует конструкция if-else-if (показано ниже).
1 2 3 4 5 6 7 8 9 10 11 12 |
if (rx_byte == 'a') { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); } else if (rx_byte == 'b') { digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200); } |
Выбор частоты мигания светодиода
Этот код просто проверяет, какой символ содержит переменная rx_byte. Если эта переменная содержит ‘a‘, тогда будет запущен код в блоке if , который будет мигать светодиодом с задержкой 500 мс. При этом светодиод включается на 500 мс с помощью функции delay (), а затем выключается на 500 мс.
Если переменная содержит значение «b», тогда светодиод будет мигать быстрее, изменив время включения и выключения светодиода на 200 мс.
Прекращение мигания светодиода
Если будет отправлен какой-либо символ, кроме «a» или «b», то светодиод перестанет мигать, потому что ни одно из условных выражений не будет оцениваться как истинное.
Когда оценивается выражение
Обратите внимание, что этот код находится в основном цикле Arduino, поэтому условные выражения будут оцениваться каждый раз в цикле. Если получен символ, который заставляет условное выражение быть истинным, то это условие будет истинным каждый раз в цикле, пока не будет получен новый символ. Это связано с тем, что символ сохраняется в переменной и не изменяется, пока не будет перезаписан новым символом.
Конструкция if-else-if-else
Точно так же, как мы могли бы добавить оператор else под оператором if, мы можем добавить оператор else под конструкцией if-else-if, как показано на рисунке ниже.
Этот скетч работает так же, как и предыдущий, за исключением того, что при отправке любого символа, кроме «a» или «b», запускается блок else, который мигает светодиодом даже быстрее, чем предыдущие две частоты мигания.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
void setup() { Serial.begin(9600); pinMode(13, OUTPUT); // Светодиод на 13 пине } char rx_byte = 0; void loop() { if (Serial.available() > 0) { // доступен ли символ? rx_byte = Serial.read(); } if (rx_byte == 'a') { // символ "а" был получен, светодиод мигает один раз в секунду digitalWrite(13, HIGH); // включение светодиода delay(500); // оставить светодиод включенным на 500 мс digitalWrite(13, LOW); // выключение светодиода delay(500); // оставить светодиод выключенным на 500 мс } else if (rx_byte == 'b') { // символ "b" был получен, светодиод мигает каждые 400 мс digitalWrite(13, HIGH); // включение светодиод delay(200); // светодиод включен на 200 мс digitalWrite(13, LOW); // выключение светодиода delay(200); // светодиод выключен на 200 мс } else { // был получен любой символ, кроме " a " или "b" digitalWrite(13, HIGH); // включение светодиода delay(100); // светодиод включен на 100 мс digitalWrite(13, LOW); // выключение светодиода delay(100); // светодиод выключен на 100 мс } } |
Когда скетч начинает работать, светодиод мигает с максимальной скоростью, запускается код в блоке else. Так происходит потому, что переменная rx_byte инициализируется значением 0, который, конечно, не является символами ‘a‘ или ‘b‘.
Если вы хотите, чтобы светодиодный индикатор мигал с минимальной скоростью при запуске скетча, то инициализируйте переменную как ‘a‘, как показано ниже:
1 |
char rx_byte = 'a'; |
Оценка большего количества условных выражений
Еще больше условных выражений можно оценить, добавив больше операторов else if после первого оператора if, как показано здесь:
1 2 3 4 5 6 7 8 9 |
if (условное выражение 1) { } else if (условное выражение 2) { } else if (условное выражение 3) { } else if (условное выражение 4) { } так далее. ... |
Задачу можно выполнить только в том случае, если ни одно из условных выражений не имеет значения истина, в конце можно добавить условие else, как показано ниже:
1 2 3 4 5 6 7 8 9 10 |
if (условное выражение 1) { } else if (условное выражение 2) { } else if (условное выражение 3) { } else if (условное выражение 4) { } else { } |
Вывод
Вот и подошла к концу наша статья о конфигурации операторов if-else-if. В следующей статье мы поговорим о логических операторах.
С Уважением, МониторБанк