Условия if и else в Arduino

Операторы if и else в Arduino используются для создания блоков условий в тексте программы. С их помощью можно создавать интеллектуальные системы, которые самостоятельно принимают решение о том, что должна делать программа в зависимости от текущих условий. В этой статье мы рассмотрим синтаксис if в ардуино, а также примеры применения условий в разных ситуациях.

Описание синтаксиса конструкций if и else

arduino if else

if – это оператор языка C++, который активно используется и в Arduino. Для обозначения условий в ардуино используется такая конструкция:

  if (условие)
  {
    // В этом блоке список команд, выполняющихся, если условие истино или имеет значение, отличное от 0
  }
  else
  {
    // В этом блоке список команд, выполняющихся, если условие ложно или имеет значение, равное 0
  }

Условие – это некоторое логическое выражение, возвращающее истину (TRUE) или ложь (FALSE). В одном условии можно использовать несколько выражений, объединяя их специальными логическими операторами. Мы подробно рассмотрим эти операторы чуть позже. Примеры условий:

  • if(a) – вернет истину, если значение переменной a не равно 0 или FALSE
  • if(a==5 && b>5) – вернет истину, если значение a равно 5, а b больше 5.
  • if(!a) – вернет истину, если a сдержит 0 или FALSE.

Если последовательность команд состоит из одой команды, то символы { } можно не ставить (хотя категорически рекомендуется ставить их всегда во избежание глупых ошибок):

if (условие)

// Команда

else

// Команда

Можно обойтись и без блока else, если вы хотите делать что-то только при выполнении условия и не будете ничего делать, если условие не выполнилось.

if(условие)

{

// Команды

}

В следующих разделах мы познакомимся с конкретными примерами и рассмотрим варианты синтаксиса. Но сперва давайте немного поговорим о том, что же такое условия и для чего они нужны в Arduino. Если вы уже имели опыт написания программ, смело можете порпустить этот раздел.

Условия в тексте программы Arduino

Что такое условие

arduino if elseПредставьте себя на минуту вежливым роботом, который очень любит вкусные апельсины. К вам могут подходить разные люди и дарить совершенно разные сладости, но вы должны оставлять себе только круглые предметы оранжевого цвета. Какой алгоритм вы бы выбрали для своей программы?

Самый простой вариант, приходящий в голову, выглядит так:

  1. Получить предмет из рук человека.
  2. Определить цвет.
  3. Если цвет оранжевый, то взять.
  4. Иначе (если цвет не оранжевый), то не брать, но сказать спасибо.

В этом тексте мы с вами использовали слово «если», входящее в русском языке в состав любого условия. Если идет дождь, надо взять зонт. Если у светофора горит красный, надо стоять и ждать. Если нажать на выключатель, станет светло. Мы пользуемся условиями постоянно, они помогают нам выработать какое-то правило поведения, когда есть несколько вариантов действий, а мы должны выбрать один из них. В нашем конкретном примере у нас два варианта действий после проверки условия. Первый вариант возникает когда условие выполнилось (цвет оранжевый) – мы запускаем последовательность действий по приемке предмета. Если условие не выполнилось (цвет любой, но не оранжевый), то запускаем процесс возврата и благодарности.

Как же теперь отразить эти условия в программе для ардуино?

Условие и ветвление в тексте программы

Если представить алгоритм действий как последовательность команд, то в момент возникновения условия нам надо как-то разделить эту одну последовательность на две. Конечно, в момент выполнения команд контроллер всегда выполняет только одну цепочку команд. Но вот какой именно программный блок выбрать – он определяет сам, исходя из каких-то данных, полученных из окружения: сигналов датчиков, значений переменных и т.д. Каждый раз при запуске программы внешние сигналы будут разные, поэтом и выбираемая последовательность  будет отличаться.

Вариантов условий и наших ответных действий может быть множество и все они должны быть в тексте нашей программы. Мы должны придумать какой-то способ, чтобы пометить в этом тексте, какие команды в какой ситуации нужно выбрать.

Самым простым вариантом записи условий было бы использование графических методов. На языке блок-схем мы бы просто  провели линию для каждого из вариантов.

 

arduino if else

На одном листе можно нарисовать множество веток и изобразить логику принятия решения. Но когда мы пишем программу в Arduino IDE, графического способа у нас нет. Разбить текст на несколько колонок мы тоже не можем. Единственный остающийся вариант – как-то пометить те или иные последовательности команд с помощью специальных конструкций. Именно для этих целей и служат блоки if и else.

С помощью if и else мы «разделяем» список команд на те,  которые будут выполняться при одних условиях и те, которые будут выполнять при других. Мы разветвляем программу, именно поэтому блок условий часто называют реализацией ветвления.

Рассмотрим еще раз синтаксис и поясним значение каждого оператора:

if(условие){

}else{

}

  • if (условие) – здесь мы формулируем условие, которое при запуске программы может выполниться (тогда результат будет TRUE или любое число, не равное 0) или нет (тогда результат будет FALSE или 0).
  • В случае TRUE будут выполнены команды из первого блока в фигурных скобках.
  • Если условие вернет FALSE, то будет выполнен блок в фигурных скобках после слова else.

Давайте же рассмотрим примеры использования if else в реальном коде ардуино.

Примеры if и else в ардуино

Простой пример блока условия

Самый простой пример использования условий:

if(1){

Serial.println("True");

}else{

Serial.println("False");

}

В мониторе порта у нас появится надпись “True”, потому что условие всегда выдаст 1 и всегда будет выполняться только первый блок. Написав if(0), мы заставим постоянно выполняться второй блок после else.

Пример бессмысленный, потому что всегда будет выполняться вполне определенный блок и можно обойтись и без if. Но нам нужно посмотреть примеры синтаксиса, поэтому сойдет и такой вариант.

Рассмотрим следующий пример, подставив вместо конкретной константы переменную. Ардуино определит значение переменой в блоке if и выберет первый или второй блок для продолжения работы.Бессмысленность та же, но уже используем переменную, значение которой можно легко менять.

boolean b = true;

if(b){

Serial.println("True");

}

Пример if с digitalRead

А вот теперь давайте рассмотрим первый осмысленный пример. Мы получим значение цифрового датчика и просигнализируем светодиодом, если digitalRead вернет значение высокого уровня сигнала.

if(digitalRead(10)){

digitalWrite(13, HIGH);

}else{

digitalWrite(13, LOW);

}

Заметьте, мы не знаем в момент написания кода, какой вариант будет выполнен – ведь значение датчика (или уровень шума) на входе могут быть совершенно разными. В момент выполнения кода только сам контроллер решит, какие команды будут выполнены, исходя из тех значений, которые будут на входе в тот момент.

Пример if с роботом

Давайте попробуем реализовать пример с нашим любящим апельсины роботом в ардуино. Для упрощения задачи будем считать, что у нас есть функция isOrange(), возвращающая истину, если цвет оранжевый.

  if (getOrange()) {
    Serial.println("Thank you! I like it!");
  } else {
    Serial.println("Thank you! But I don’t like it!");
  }

Если функция isOrange() вернет true, то будет выполнен первый блок, иначе – второй. Вместо вывода на экран можно добавить другие команды, например, управления сервоприводами, контролирующими манипуляторы.

Пример if и сравнение диапазонов

Давайте рассмотрим пример if с функцией analogRead(). Мы получим значение с датчика и сравним его с некоторым пороговым значением.

if(analogRead(A0)>500){

Serial.println(«Ok!»);

}

Здесь ардуино в блоке if вызовет функцию analogRead, получит значение сигнала на пине A0 и выберет первый или второй вариант действий в зависимости от значения. Для сравнения значения мы используем символ «>». Нам доступны и другие варианты:

  • «>» — вернет истину, если значение «больше».
  • «>-» — вернет истину, если значение «больше или равно указанному».
  • «<» — вернет истину, если значение меньше
  • «<=» — вернет истину, если значение меньше или равно
  • «!=» — вернет истину, если значение не равно указанном, т.е. больше или меньше

Логические операторы в условиях

В блоке условий можно вставлять несколько логических выражений. Например, для того, чтобы потребовать не только оранжевый, но и круглый объект, мы должны объединить два условия с помощью оператора «&&» (нужно указать именно два символа). Использование этого оператора определяет жесткие условия, когда для выполнения логического выражения нам нужно обязательно выполнить все внутренние выражения. Рассмотрим пример для нашего робота (считаем, что у нас есть функции isOrange() и isSphere()):

if(isOrange() && isSphere()){
  Serial.println("Thank you! I like it!");
}

Список  операторов условий:

  • && — условие И
  • || — условие ИЛИ
  • ! – отрицание условия

Более подробно логические условия рассмотрены в статье про логические операторы

Несколько связанных условий

arduino if else

Завершим наш рассказ об if в ардуино описанием ситуации, когда мы по-разному должны реагировать не на два, а на большее количество вариантов условий. Например, для робота ардуино с датчиком расстояния нужно выполнить такие условия:

  • Расстояние робота до препятствия больше 2 метров – едем на максимальной скорости
  • Расстояние робота до препятствия меньше 2 метров, но больше 1 метра – уменьшаем скорость
  • Расстояние робота до препятствий меньше1 метра – еще раз уменьшаем скорость.
  • Расстояние робота до препятствия меньше 20 см – останавливаемся и поворачиваем.

В Arduino такие множественные «подусловия» реализуются сочетанием оператора else и if. Давайте рассмотрим его на нашем примере. Пусть у нас определена функция getDistance(), возвращающая расстояние в сантиметрах. Тогда условие будет выглядеть так:

  if (getDistance() > 200) {
    // Не сбавляем скорость, едем вперед
  } else if (getDistance() >= 100) {
    /*
      В этом условии мы поверяем, не больше ли значение 100. В принципе, 200 или 300 тоже больше 100, но первый блок выполнится первым, поэтому отработка при условии &amp;amp;gt;200 уже будет выполнена. Если бы значение было больше 200, то до нашего блока управление просто не дошло. Поэтому в этом блоке мы будем рассматривать ситуацию, когда значение меньше 200, но больше 100. Робот уменьшит скорость – он почувствует, что скоро препятствие.
    */

  } else if (getDistance() >= 20) {
    /*
      Расстояние меньше метра (если больше – мы бы попали в предыдущий блок), но еще больше 20. Притормозим, готовясь к препятствию.
    */

  } else {
    /*
      А вот теперь уже все понятно. Расстояние меньше 20 (иначе все верхние блоки сработали бы). Поэтому смело считаем, что перед нами препятствие и поворачиваем.
    */
  }

Таким образом, в одном блоке ветвлений мы отработали разные ситуации с роботом, заставив его действовать адаптивно, по обстоятельствам.

Заключение

Условия в любом языке программирования имеют крайне важное значение. Ни одна серьезная программа на ардуино не обходится без условий if else. Именно в блоках условий проявляется интеллект робота, автоматического устройства и программиста, который его программирует. Именно в условиях отрабатываются все тонкости алгоритмов и именно там спрятаны боьшинство логических ошибок алгоритмов. Обязательно постарайтесь понять и отработать навыки работы с блоком if на реальных примерах. И обращайтесь к учебникам, если останутся какие-то неясности и непонимания.

ПОДЕЛИТЬСЯ

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here