# План занятия: «Невидимый провод» — nRF24L01+

Формат: один урок 40-45 минут, работа в парах (каждой паре нужны **две**
платы ESP32 с двумя модулями nRF24L01+). Аудитория — 14-17 лет, базовое
знакомство с Arduino/C++ и ESP32 приветствуется, но не обязательно.

Цель занятия: собрать работающий беспроводной канал связи между двумя
контроллерами, увидеть вживую, как ухудшается радиосвязь при удалении и
помехах, и разобраться, почему "качество связи" здесь — это не то же самое,
что шкала сигнала на телефоне.

## Блок I. Зачем радио, если есть провода (5-7 минут)

Вопрос классу: «Почему пульт от телевизора работает без проводов, а зарядка
телефона — нет?» — подвести к разнице между передачей энергии (нужен провод
или контакт) и передачей информации (можно по радиоволнам).

- nRF24L01+ — маленький радиочип, который умеет и слать, и принимать данные
  на частоте 2.4 ГГц — том же диапазоне, где работает Wi-Fi.
- Показать [WIRING.md](WIRING.md): всего 5 проводов управления (плюс питание) —
  чип разговаривает с ESP32 по протоколу SPI.

## Блок II. Роли: кто говорит, кто слушает (7-10 минут)

- Разбить класс на пары. У каждой пары — две платы: одна станет
  **передатчиком**, другая **приёмником**.
- Показать, что это не два разных устройства, а одна и та же прошивка с
  разным флагом сборки (`ROLE_TRANSMITTER`/`ROLE_RECEIVER`,
  [platformio.ini](platformio.ini)) — обсудить, зачем так сделано (один код,
  меньше дублирования, легче поддерживать).
- Прошить обе платы: `pio run -e transmitter -t upload` на одну,
  `pio run -e receiver -t upload` на другую.
- Открыть Serial Monitor на обеих — увидеть первые пакеты.

## Блок III. Auto-ACK и честная метрика качества (10-12 минут)

- Обсудить: как передатчик вообще узнаёт, что сообщение дошло? (Аналогия:
  ты крикнул другу через двор — откуда ты знаешь, что он услышал, если он не
  крикнул в ответ?) Ввести понятие Auto-ACK — подробнее в
  [THEORY.md, раздел 2](THEORY.md#2-auto-ack-как-понять-что-пакет-дошёл).
- Показать строку у передатчика: `Seq:.., AckRate:.., Sent:.., Acked:..`.
- Ключевой момент: у этого чипа **нет** измерения силы сигнала (RSSI), как у
  Wi-Fi. `AckRate` — это единственная доступная метрика, и она косвенная —
  см. [THEORY.md, раздел 3](THEORY.md#3-почему-качество-связи--это-не-rssi).

## Блок IV. Практика: разносим платы (10-15 минут)

- Запустить визуализацию на передатчике:
  ```bash
  cd tools && pip install -r requirements.txt
  python3 link_quality_view.py <порт> --role tx
  ```
- Задание парам: постепенно увеличивать расстояние между платами (выйти в
  коридор, на другой этаж) и наблюдать, как падает `AckRate` на графике.
- Затем — закрыть антенну передатчика или приёмника ладонью/металлическим
  предметом на близком расстоянии. Обсудить, почему металл экранирует сигнал
  сильнее, чем просто расстояние.
- Кто первым потеряет связь полностью (`AckRate` → 0%) на минимальной
  мощности (`RF24_PA_MIN`, уже стоит по умолчанию в `main.cpp`)?

## Вопросы для обсуждения

1. **Почему нельзя просто сказать "пакет отправлен успешно" сразу после
   `radio.write()`, не дожидаясь ACK?**
   Потому что сам факт отправки ничего не говорит о том, дошёл ли сигнал —
   в радиоэфире потери обычные. Только подтверждение от приёмника даёт
   уверенность, что данные реально получены.

2. **Почему `AckRate` — не то же самое, что "сила сигнала" на экране
   телефона?**
   Потому что это не прямое измерение мощности принятого сигнала (RSSI), а
   статистика успешности протокола подтверждений — косвенная метрика,
   которая коррелирует с качеством связи, но измеряет другое.

3. **Почему у пакета телеметрии ограничение в 32 байта?**
   Это аппаратный лимит самого чипа nRF24L01+, а не выбор программиста —
   см. [THEORY.md, раздел 4](THEORY.md#4-payload-сколько-данных-влезает-в-один-пакет).

4. **Почему в коде есть отдельный класс `NrfLink`, если библиотека `RF24` уже
   умеет отправлять и принимать данные?**
   `RF24` — это транспорт (говорит с чипом по SPI), а `NrfLink` — прикладной
   уровень (типизированные пакеты, статистика, единый `isAlive()`). Это тот
   же принцип разделения, что в компонентах с I2C-датчиками.

## Материалы для раздачи

- Схема подключения из [WIRING.md](WIRING.md).
- Таблица типичных проблем оттуда же — полезна во время сборки.
- Готовый шаблон кода ([src/main.cpp](src/main.cpp)) — ученики фокусируются
  на эксперименте с дальностью и помехами, а не на написании протокола с нуля.
