Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Управляющие конструкции chevron_right Switch (case) Statement с вводом через Serial

Switch (case) Statement с вводом через Serial

Разбираем оператор switch/case на практике: управляем несколькими светодиодами, отправляя символы через Serial Monitor в Arduino IDE.

Оператор if хорош, когда нужно выбрать между двумя вариантами — TRUE или FALSE. Но что делать, если вариантов больше? Можно нагромоздить несколько if/else if, а можно воспользоваться куда более элегантным решением — оператором switch. Он позволяет компактно описать любое количество дискретных ветвей выполнения.

В этом уроке мы используем switch/case, чтобы зажигать один из нескольких LEDs в зависимости от символа, пришедшего через последовательный порт. Скетч слушает Serial, и при получении символа a, b, c, d или e включает соответствующий светодиод. Любой другой символ гасит все.

Необходимое оборудование

  • Arduino Board
  • 5 LEDs
  • 5 резисторов 220 Ом
  • соединительные провода
  • макетная плата

Схема подключения

Пять LEDs подключены к цифровым пинам 2, 3, 4, 5 и 6 через токоограничивающие резисторы 220 Ом. Каждый светодиод — последовательно со своим резистором, второй вывод — в GND.

Чтобы скетч работал, плата должна быть подключена к компьютеру. Откройте Serial Monitor в Arduino IDE, выберите нужную скорость (9600 baud) и отправляйте символы a, b, c, d или e — загорится соответствующий светодиод. Любой другой символ выключит все.

Схема подключения: Arduino UNO соединён с макетной платой, на которой установлены пять светодиодов с токоограничивающими резисторами 220 Ом на пинах 2–6.

Принципиальная схема

Принципиальная схема: Arduino UNO подключён к пяти светодиодам через резисторы 220 Ом (резисторы 220 Ом — между пинами и анодами светодиодов, катоды — на GND).

Код

/*

  Оператор switch с вводом через Serial

  Демонстрирует использование оператора switch, который позволяет

  выбирать действие в зависимости от значения переменной. Это похоже на

  серию операторов if.

  Чтобы увидеть скетч в действии, откройте монитор Serial и отправьте любой символ.

  Символы a, b, c, d и e включат светодиоды. Любой другой символ

  выключит их.

  Схема:

  - пять светодиодов подключены к цифровым пинам 2–6 через резисторы 220 Ом

  создан 1 июля 2009 г.

  автор Tom Igoe

  Код примера находится в открытом доступе.

  https://www.arduino.cc/en/Tutorial/SwitchCase2

*/

void setup() {

  // инициализация Serial:

  Serial.begin(9600);

  // инициализация пинов светодиодов:

  for (int thisPin = 2; thisPin < 7; thisPin++) {

    pinMode(thisPin, OUTPUT);

  }
}

void loop() {

  // чтение данных с датчика:

  if (Serial.available() > 0) {

    int inByte = Serial.read();

    // выполняем разные действия в зависимости от полученного символа.

    // Оператор switch ожидает числовые значения для каждого case; в данном

    // примере используются одинарные кавычки, чтобы получить

    // ASCII-код символа. Например, 'a' = 97, 'b' = 98

    // и так далее:

    switch (inByte) {

      case 'a':

        digitalWrite(2, HIGH);

        break;

      case 'b':

        digitalWrite(3, HIGH);

        break;

      case 'c':

        digitalWrite(4, HIGH);

        break;

      case 'd':

        digitalWrite(5, HIGH);

        break;

      case 'e':

        digitalWrite(6, HIGH);

        break;

      default:

        // выключаем все светодиоды:

        for (int thisPin = 2; thisPin < 7; thisPin++) {

          digitalWrite(thisPin, LOW);

        }

    }

  }
}

Как это работает

Оператор switch принимает одно значение — в нашем случае байт, прочитанный из Serial, — и сравнивает его последовательно с каждым case. Как только находит совпадение, выполняет соответствующий блок кода и выходит через break. Если ни один case не совпал, выполняется блок default — он гасит все светодиоды.

Это гораздо читаемее, чем цепочка if/else if, особенно когда вариантов пять и больше.

Типичные ошибки

  • Забытый break — без него выполнение «провалится» в следующий case, и загорятся сразу несколько светодиодов. Всегда ставьте break в конце каждой ветки, если не задумываете сквозное выполнение намеренно.
  • Неправильная скорость Serial — убедитесь, что скорость в коде (Serial.begin(...)) совпадает со скоростью, выбранной в Serial Monitor. Иначе вместо символов придут нечитаемые данные.
  • Символы в кавычках — в switch/case для сравнения с символами используйте одинарные кавычки: 'a', а не "a". Двойные кавычки — это строка, одинарные — тип char.
  • Светодиод не светится — проверьте полярность: длинная ножка (анод) через резистор к пину, короткая (катод) к GND.

Как проверить результат

  1. Загрузите скетч на плату.
  2. Откройте Serial Monitor (Ctrl+Shift+M или через меню Tools → Serial Monitor).
  3. Установите скорость 9600 baud и режим отправки No line ending.
  4. Введите a и нажмите Send — должен загореться первый светодиод.
  5. Поочерёдно отправьте b, c, d, e — каждый раз будет загораться следующий.
  6. Отправьте любой другой символ, например z — все светодиоды погаснут.

Где пригодится

switch/case отлично подходит для любых задач, где нужно реагировать на набор фиксированных команд: управление по Serial, обработка кодов кнопок, конечные автоматы (state machine), меню на дисплее. Это один из самых часто используемых паттернов в прошивках Arduino.

Дополнительные материалы

Больше базовых примеров — в разделе built-in examples.

Подробное описание всех конструкций языка Arduino — в language reference.

Последнее обновление: 11.08.2015, SM