# WIRING.md — схема подключения и выбор пинов

## 1. Резистор — расчёт

Каждый светодиод в этой схеме подключается через **токоограничительный резистор
220 Ом** (анод светодиода → резистор 220 Ом → GPIO; катод → GND, либо GPIO → резистор
→ анод, катод → GND, в зависимости от того, "втекает" или "вытекает" ток из пина —
для простого мигания на 3.3В/5В разница непринципиальна).

Как именно посчитано число 220 Ом (закон Ома, формула `R = (Vcc - Vled) / I`) —
см. [THEORY.md, раздел 1](THEORY.md#1-от-физики-к-коду). Здесь не повторяем формулу,
только итоговое значение, которое используется в примерах модуля.

## 2. Пины, используемые в примерах модуля

| Роль | Пин(ы) | Где используется |
|---|---|---|
| Один светодиод | `GPIO2` | [src/main.cpp](src/main.cpp), [example_sketch.ino](example_sketch.ino) |
| Группа "бегущий огонь" (5 шт.) | `GPIO14, GPIO18, GPIO21, GPIO22, GPIO23` | [src/main.cpp](src/main.cpp), [example_sketch.ino](example_sketch.ino) |

Эти 6 пинов выбраны так, чтобы **одна и та же схема и один и тот же код** собирались
и работали без конфликтов на всех трёх платах, под которые настроен `platformio.ini`:
`esp32dev` (классический ESP32), `esp32-s3-devkitc-1`, `esp32-c6-devkitc-1`.

### Почему не любые другие пины

На ESP32 есть три категории пинов, которые в общем случае лучше не занимать под
светодиоды в учебном примере, рассчитанном сразу на три платы:

1. **Strapping-пины** — их состояние при включении платы (HIGH/LOW) влияет на режим
   загрузки (какая память используется, обычный запуск или прошивка). Если на такой
   пин что-то подключено, что тянет его в другое состояние, плата может не загрузиться.
2. **Пины встроенного Flash/PSRAM** — физически заняты внутри модуля, недоступны
   на разъёмах платы, использовать их как GPIO нельзя вообще.
3. **Пины Native USB** — если сборка (как эта) собрана с `ARDUINO_USB_CDC_ON_BOOT=1`,
   Serial-монитор идёт через USB-разъём напрямую, а не через отдельный чип-переходник.
   Если занять эти пины под что-то ещё, ломается либо Serial, либо загрузка.

| Плата | Strapping (избегать) | Flash/PSRAM (недоступны) | Native USB (избегать) |
|---|---|---|---|
| `esp32dev` (ESP32) | GPIO0, 2, 5, 12, 15 | GPIO6–11 | — (Serial через отдельный USB-UART чип) |
| `esp32-s3-devkitc-1` | GPIO0, 3, 45, 46 | GPIO26–32 | GPIO19 (D−), GPIO20 (D+) |
| `esp32-c6-devkitc-1` | GPIO4, 5, 8, 9, 15 | — (SPI flash не выведен на GPIO) | GPIO12 (D−), GPIO13 (D+) |

`GPIO14, 18, 21, 22, 23` не попадают ни в одну из этих категорий ни на одной из трёх
плат — поэтому выбраны для группы "бегущий огонь".

`GPIO2` — единственное сознательное исключение: на классическом ESP32 это
strapping-пин, но одновременно это стандартный пин встроенного светодиода на
большинстве отладочных плат (в том числе используется в `Components/3. LED_simple`
этого репозитория) — на практике он не мешает загрузке, если ничего внешнего не тянет
его в HIGH до и во время старта платы. Если на реальном занятии сборка на `esp32dev`
не запускается при подключённом на GPIO2 светодиоде — переключите его на любой пин
из строки `esp32dev` в таблице выше, кроме перечисленных как избегаемые.

## 3. Принципиальная схема (один светодиод из группы, остальные — по аналогии)

```text
                 220 Ом
   GPIOxx ───────/\/\/\──────┬──────► Анод светодиода
                              │
                              ▼
                            Катод
                              │
                             GND
```

Повторить для каждого из 6 пинов из таблицы в разделе 2 — каждый светодиод получает
свой резистор 220 Ом, общий провод GND один на все.

## 4. Связь со схемой из кода

Список пинов группы задаётся один раз в массиве и передаётся в конструктор класса —
см. [`LedController(const int* pins, int count)`](src/LedController.cpp#L14-L30) и его
использование в [`src/main.cpp`](src/main.cpp) или через фасад в
[`example_sketch.ino`](example_sketch.ino). Если распаяли светодиоды на других пинах —
меняются только числа в этом массиве, логика мигания не меняется.
