В этой статье мы узнаем, как использовать другой тип условного оператора на Arduino, который называется оператором switch case.
Оператор switch case
заменяет необходимость в нескольких операторах if, когда у вас есть несколько условий, которые необходимо проверить. Код становится проще, быстрее и оптимизированнее.
Switch case
особенно полезны, когда у вас есть несколько диапазонов входных данных и для каждого диапазона нужно выполнить различный код.
Пример оператора Switch Case в arduino
Чтобы разобраться в этом лучше, давайте посмотрим на пример использования switch case
в arduino.
Сначала программа берет показания датчика температуры. И в зависимости от показаний выводит на монитор порта сообщение: низкая температура, средняя температура или высокая температура.
Как подключается модуль датчика температуры на базе ntc термистора к ардуино можно узнать в этой статье.
const int thermistorPin = A0; void setup() { Serial.begin(9600); } void loop() { int temp = analogRead(thermistorPin); temp = temp / 341; switch (temp) { case 1: Serial.print("Низкая температура!"); break; case 2: Serial.print("Средняя температура!"); break; case 3: Serial.print("Высокая температура"); break; default: Serial.print("Ошибка датчика!"); } }
В верхней части скетча мы объявляем переменную с именем thermistorPin
. Она используется для хранения номера контакта ардуино, подключенного к датчику. И устанавливаем ее равной аналоговому выводу A0.
В разделе setup()
мы инициализируем последовательный монитор. Предполагается, что аналоговые контакты являются входными, поэтому использовать здесь функцию pinMode() нам не нужно.
В разделе loop()
мы объявляем переменную с именем temp
. Она используется для хранения аналогового значения, считанного с термистора.
Arduino считывает данные с термистора и сохраняет значение в переменной temp
. Считанное значение будет находиться в диапазоне от 0 до 1023, в зависимости от измеряемой температуры.
Подробнее о том, как считать аналоговое значение с АЦП в arduino, можно прочитать вот в этой статье.
Далее используем формулу temp = temp/341
. Таким образом преобразуем значение, хранящееся в temp, в один, два или три. Эти числа представляют диапазоны низких, средних и высоких температур соответственно.
Оператор switch
просматривает переменную в круглых скобках (temp)
и сравнивает ее с каждым из операторов case
. Если значение, хранящееся в переменной, соответствует условию, будет выполнен код внутри тела оператора case
.
Например:
- Если temp равно двум, программа выполнит case 2, и выведет сообщение «Средняя температура» на последовательный монитор .
- При temp равно трем, программа выполнит case 3, и выведет сообщение «Высокая температура» на последовательный монитор .
Каждый оператор case
заканчивается ключевым словом break
. Ключевое слово break
заставляет программу выйти из оператора switch
после выполнения оператора case
. Он не позволяет программе проверять все остальные операторы case
на соответствие условию после того, как она нашла совпадение.
Оператор switch case
заканчивается оператором default
. Оператор default
будет выполнен, если ни один из операторов case
не соответствует условию switch
. Его добавлять необязательно, но в некоторых случаях может быть полезно.
Например, если ни один из операторов case
не выполняется, возможно, что-то не так с датчиком. Таким образом, код внутри оператора default выводит «Ошибка датчика!» на последовательный монитор.
Надеюсь, статья помогла вам понять, что такое операторы switch case
и как их использовать при программировании Arduino. Если у вас есть какие-либо вопросы, обязательно оставляйте комментарии ниже.
Документация
Компоненты
- Arduino NANO
- Arduino UNO
- Arduino MEGA
В статье не сказано что если swich case использовать внутри цикла, тогда brake прервет весь цикл. Несмотря на то что в c++ сказано, что не должно этого случится.
Так break и не прервет цикл, а только выйдет из конструкции switch-case. Но на всякий случай проверил. Следующий скетч заходит в loop, заходит в while, заходит в switch-case 0, изменяет переменную k на значение 4, натыкается на break, выходит из switch-case и остается в цикле while(1)