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

Оператор switch (case) с аналоговым датчиком

Учимся использовать оператор switch/case для выбора между несколькими дискретными состояниями на примере фоторезистора и функций map() и analogRead().

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

В этом уроке мы используем фоторезистор и разбиваем диапазон его показаний на четыре состояния освещённости: очень темно, сумерки, средний свет и ярко. Программа считывает значение с датчика, преобразует его функцией map() в одно из четырёх чисел (0, 1, 2 или 3), а затем через switch() выводит соответствующее сообщение в Serial Monitor.

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

Фоторезистор меняет своё сопротивление в зависимости от освещённости. Вместе с резистором 10 кОм он образует делитель напряжения: чем больше света — тем выше напряжение на аналоговом входе. Функция analogRead() возвращает значения от 0 до 1023, но реальный диапазон в типичном помещении составляет примерно от 0 до 600. Функция map() сжимает этот диапазон до четырёх целых значений, которые удобно обрабатывать через switch.

Необходимые компоненты

  • Arduino Board
  • фоторезистор (или другой аналоговый датчик)
  • резистор 10 кОм
  • соединительные провода
  • макетная плата

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

Фоторезистор подключается к аналоговому входу A0 по схеме voltage divider (делитель напряжения). Резистор 10 кОм включён между пином A0 и GND. В таком включении функция analogRead() в нормально освещённом помещении возвращает значения примерно от 0 до 600.

Подпись к схеме: фоторезистор и резистор 10 кОм подключены к аналоговому входу A0 платы Arduino UNO на макетной плате.

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

Подпись: фоторезистор (PHOTORESISTOR) и резистор 10 кОм (10kΩ RESISTOR) образуют делитель напряжения между 5V и GND; средняя точка подключена к A0.

Код

Практические замечания

Откалибруйте диапазон под своё помещение. Значение 600, которое используется в map(), — ориентировочное. В очень тёмной комнате максимум может быть 200, а у окна в солнечный день — все 900. Перед использованием откройте Serial Monitor, выведите сырые значения analogRead() и посмотрите реальный диапазон.

Порядок case не важен, но важны break. Если забыть break в конце блока case, выполнение «провалится» в следующий case — это частая ошибка новичков. Убедитесь, что каждый блок заканчивается break (или return).

default — ваша страховка. Добавляйте ветку default в конец switch, чтобы обработать непредвиденные значения. Это особенно полезно при отладке.

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

  • Нет break — программа проваливается через несколько case сразу.
  • Неверный диапазон в map() — если реальные значения выходят за указанный диапазон, map() вернёт числа меньше 0 или больше 3, и ни один case не сработает.
  • Фоторезистор подключён без резистора — без резистора 10 кОм делитель не работает, и analogRead() будет возвращать нестабильные значения.

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

Откройте Serial Monitor (скорость 9600 бод). Прикрывайте фоторезистор рукой или подносите его к источнику света — в мониторе должны появляться разные сообщения об уровне освещённости. Если сообщение не меняется, проверьте подключение и диапазон в map().

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

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

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

Последнее обновление: 2015/08/11, SM