# Презентация: активный бузер

## Слайд 1: Один сигнал — простое управление
Активный бузер не нужно "раскачивать" переменным сигналом, как пассивный (`tone()`) —
внутри уже есть генератор. Драйверу достаточно `digitalWrite()` на один пин
(подробности физики — [THEORY.md](THEORY.md)).

## Слайд 2: Неблокирующая работа
Все сигналы строятся без `delay()` — через машину состояний в
[`update()`](src/ActiveBuzzer.cpp#L46-L84), которая сравнивает `millis()` с моментом
последнего переключения. Это значит, что пока бузер пищит, `loop()` продолжает
опрашивать датчики и читать Serial.

## Слайд 3: Один писк или готовый паттерн
- `beep(durationMs)` — включить на заданное время и выключиться самому
  ([ActiveBuzzer.cpp:28-36](src/ActiveBuzzer.cpp#L28-L36)).
- `playPattern(Pattern::Alert)` — прерывистая тревога до явного `turnOff()`.
- `playPattern(Pattern::Confirm)` — два коротких писка подтверждения.

Проверить все три можно прямо в тестовом стенде — команды `1`/`3`/`4` в
[main.cpp](src/main.cpp).

## Слайд 4: Защита от нулевой длительности
`beep(0)` ничего не делает вместо того, чтобы включить бузер навсегда —
см. проверку в [ActiveBuzzer.cpp:29](src/ActiveBuzzer.cpp#L29). Без неё случайный
ноль в коде ученика "подвесил" бы бузер во включённом состоянии.

## Слайд 5: Что бузер не умеет
У бузера нет обратной связи — программа не может узнать, оборван ли провод или
работает ли сам излучатель. Поэтому в этом драйвере (в отличие от сенсоров с
шиной) нет `isAlive()` — подробнее в [THEORY.md, раздел 4](THEORY.md#4-почему-нет-isalive).
