Плавное затухание светодиода с PWM на ESP32
Плавное изменение яркости светодиода от 0 до максимума и от максимума до 0. PWM управляется через analogWrite(), как в Arduino, — тот же синтаксис без проблем работает в ESP32 Arduino Core 3.0+. Достаточно определения пина, pinMode и analogWrite.

Видео
Схема

Исходный код
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Плавное затухание светодиода с PWM на ESP32
4// ─────────────────────────────────────────
5// С помощью PWM через analogWrite() плавно поднимает яркость светодиода от
6// 0 до 255, затем плавно опускает обратно до 0.
7//
8// Пины:
9// GPIO 5 -> Синий светодиод (с резистором 330 ohm)
10// GND -> Короткая ножка светодиода (катод)
11
12const int LED_PIN = 5; // Выход PWM
13
14void setup() {
15 pinMode(LED_PIN, OUTPUT);
16}
17
18void loop() {
19 // Разгорание
20 for (int brightness = 0; brightness <= 255; brightness++) {
21 analogWrite(LED_PIN, brightness);
22 delay(8); // 8 мс на шаг, всего ~2 с
23 }
24 // Затухание
25 for (int brightness = 255; brightness >= 0; brightness--) {
26 analogWrite(LED_PIN, brightness);
27 delay(8);
28 }
29}
30
Частые вопросы
Действительно ли `analogWrite` работает на ESP32?
Да, analogWrite() поддерживается в ESP32 Arduino Core 3.x, а также в некоторых версиях 2.x и использует аппаратный блок LEDC. Проверь поддержку в своей версии ядра; ledcSetup и ledcAttachPin нужны не во всех версиях 2.x.
Какие пины поддерживают PWM?
Почти все пины GPIO ESP32, которые могут быть выходами, умеют генерировать PWM. GPIO 34–39 работают только на вход, поэтому PWM на них нет.
Яркость меняется нелинейно — почему?
Глаз воспринимает яркость логарифмически; изменения на малых значениях заметнее. Если преобразовать значения по гамма-таблице, переход будет выглядеть естественнее.
Можно ли изменить частоту PWM?
Да, частоту и разрешение можно настроить функциями analogWriteFrequency() или LEDC. Высокая частота, например 5 kHz, полностью убирает мерцание светодиода.
