Оператор 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