Урок 3: Плавное управление яркостью светодиода (PWM)

1. Что такое PWM?

Принцип работы
Импульсы разной скважности

ШИМ-сигнал переключается между 0 В и 5 В. Доля времени «высокого» уровня называется скважностью (duty cycle). Среднее напряжение и яркость нагрузки пропорциональны этой доле.

Скважность → напряжение
Скважность и среднее напряжение
  • 75 % → ≈ 3.75 В

  • 50 % → ≈ 2.5 В

  • 20 % → ≈ 1.0 В

На Arduino UNO аппаратный PWM доступен на выводах 3 ~, 5 ~, 6 ~, 9 ~, 10 ~, 11 ~ (значок «~» на шелкографии).

2. Что понадобится

Кол-во

Компонент

1

Плата Arduino UNO

1

Светодиод 5 мм (красный)

1

Резистор 220 Ω

1

Макетная плата

6

Перемычки «папа–папа»

1

USB-кабель A-B

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

Подключение светодиода к D9
  • Анод LED → резистор 220 Ω → D9

  • Катод LED → GND

4. Скетч

breathing_led.ino
 //PWM
 int ledPin = 9;

 void setup() {
   pinMode(ledPin, OUTPUT);
 }

 void loop() {
   // плавное увеличение яркости
   for (int value = 0; value < 255; value++) {
     analogWrite(ledPin, value);
     delay(5);
   }
   // плавное уменьшение яркости
   for (int value = 255; value > 0; value--) {
     analogWrite(ledPin, value);
     delay(5);
   }
 }

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

  • analogWrite(ledPin, value) задаёт скважность: 0 (0 %) … 255 (100 %).

  • Первый цикл плавно увеличивает яркость, второй — снижает.

  • Задержка 5 мс между шагами даёт ~2,5 с на полный «вдох–выдох».

5. Пошагово

  1. Соберите схему.

  2. В Arduino IDE выберите плату Arduino UNO и COM-порт.

  3. Откройте скетч, нажмите Upload.

  4. Светодиод начнёт плавно «дышать».

6. Если не работает

Симптом

Причина

Что проверить

LED не горит

Перепутаны анод/катод

Подключения

Яркость не меняется

Использован не PWM-вывод

D3/5/6/9/10/11

Сильно мерцает

Слишком малая задержка

Увеличить delay до 10 мс

7. Эксперименты

  • Измените задержку, чтобы ускорить или замедлить «дыхание».

  • Подключите второй LED к D6 и управляйте им в противофазе (255 - value).

  • Подключите потенциометр к A0: читайте analogRead(A0) и передавайте результат в analogWrite() — получите ручной диммер.