Я считаю, что мигание светодиода с плавным увеличением и уменьшением яркости - обязательно нужно включить в уроки программирования.
Регулировать будем без использования библиотеке и модулей – максимально понятными командами.
Немного теории о ШИМ-регулировании.
1. Если часто мигать светодиодом, то глаз человека не сможет заметить мерцания, картинка станет непрерывной, как кино с плёнки. У гомо сапиенс этот предел равен 24 картинки в секунду. Опытным путем я установил, что при существующей инерции кристалла светодиода и скорости Ардуины, если мигать светодиодом с паузой 23 мс, то уже мерцания не видно.
2. Изменять яркость светодиода можно зажигая его не НЕНАДОЛГО. Например, если быстро-быстро включать и выключать светодиод с равными паузами, то в него «вольётся» половина мощности (по сравнению с постоянно включенным), а за счет быстрой-быстрой смены состояний глаз не заметит мерцания, но увидит уменьшение яркости.
3. Изменяя длину паузы в выключенном состоянии и длину паузы во включенном можно менять и вкачиваемую мощность, например, 1 «тик» светодиод включен и 99 «тиков» выключено итого вкачается 1% мощности. Кстати, соотношение паузы «ОТКЛ» к паузе «ВКЛ» характеризуется скважностью импульсов.
4. Регулировать мощность (не только светодиодов) можно аналоговым способом (например, меняя уровень напряжения на выходе) или цифровым – быстро-быстро подавая в нагрузку либо полный ток, либо полное отсутствие тока. Второй метод намного экономичнее – так как на закрытом транзисторе не теряется мощность, а на открытом теряется минимально.
5. Наконец, простые методы изменения скважности (то есть, цифровой регулировки мощности) бывают со строгой частотой (это ШИМ) и с плавающей (это ЧМ). Широтно-импульсная модуляция отличается от частотной только тем, что в первой изменяется одновременно и длина паузы «ВКЛ» и длина паузы «ОТКЛ» причем так, чтобы их сумма составляла некую константу - тогда частоты периода будет всегда одинакова (нам это важно, чтобы глазу не было видно мерцания, а в электронике это удешевляет настройку фильтров); во второй же – меняется пауза только одного состояния.
Теперь, описание скетча.
Первая строка «#define ledPin 13» - лишняя, номер пина можно указывать прямо в коде, но он там встречается 6 раз, что при переназначении неудобно (см. видеоролик).
В блоке «setup» мы просто задаём режим работы пина – как выход.
Наконец, в блоке «loop» сначала запускаем цикл, где от меняем паузу включения от 0 до 22 мс, одновременно рассчитываем паузу включения от 23 до 1 мс – суммарно каждый период составляет всегда 23 мс. На последнем шаге этого цикла светодиод мы зажигаем на 22 мс, а гасим на 1 мс – то есть максимальная ШИМ-яркость.
Для удобства группирования участков кода в этом «уроке» я позволил себе разместить по два оператора в строке.
После завершения первого цикла светодиод погаснет на 1 мс и уже не включится, так как цикл закончился, поэтому зажигаем его принудительно и оставляем в таком состоянии на 200 мс (подобрано опытным путём – это приятная пауза на пике максимальной яркости).
Затем запускаем аналогичный цикл, но уже, наоборот, с уменьшением времени зажигания – это будет видно, как плавное выключение.