Рассаду на утеплённом балконе я потерял за два жарких дня. Самое обидное — датчик DHT11 работал безупречно: исправно писал в Serial свои 33, 34, 35 градусов каждые две секунды. Данные были. Сигнала не было. Я не сидел перед монитором порта, и потому честный поток честных чисел оказался дневником погибшего проекта, а не охраной. После этого я сформулировал правило: если показание может стоить урожая, денег или аквариума — устройство обязано кричать само, а не вести протокол для тех, кто придёт читать.
Кричать будем зуммером. Разберёмся, чем пассивный корпус отличается от активного, почему у каждой причины тревоги должен быть собственный ритм писка, и что делать с самой противной частью пороговой логики — дребезгом на границе, когда показание скачет через порог туда-обратно и сигнализация заикается, как испорченный будильник.
Пассивный или активный: кто задаёт ноту
Активный зуммер — коробочка с встроенным генератором: подали HIGH на пин — пищит фиксированной нотой, убрали — молчит. Пассивный — это просто пьезопластинка, ноту задаёт ваш скетч функцией tone(). Мы берём пассивный: во-первых, tone() позволяет выбирать частоту, а во-вторых — именно разные частоты и ритмы дадут нам различать причины тревоги на слух, не заглядывая в Serial.
Про числа. tone() отправляет на пин прямоугольные импульсы заданной частоты; для тревоги я беру 2500 герц — ухо ловит эту ноту даже сквозь телевизор в соседней комнате, а пьезопластинка на ней звучит громче всего. Потребляет зуммер порядка 20–30 миллиампер при пищании; пин Uno отдаёт до 40, поэтому короткие писки напрямую допустимы, но я всегда ставлю резистор 100 Ом в разрыв — он крадёт у звука меньше, чем сгоревший пин стоит нервов. Если зуммер должен орать долго и громко — транзистор и отдельное питание, но для домашней тревоги это уже перебор.
Подключение занимает десять секунд: плюс пассивного зуммера — в пин 8 через резистор 100 Ом, минус — на GND, полярности у пьезо нет. Сложнее отличить пассивный корпус от активного при покупке, потому что внешне они близнецы. Рабочий тест без Arduino: приложите к выводам батарейку на 3–5 вольт — активный запищит, пассивный ответит одним тихим щелчком. Второй подсказкой служит маркировка на дне: у активных под герметичной крышкой виден генераторный чип и есть надпись вроде active buzzer.
Порог — самое ответственное число в скетче, и выбирать его надо по задаче, а не по красивой круглой цифре. Разброс у меня получился такой: рассада и комнатные растения всерьёз страдают выше 30 градусов, хранение овощей на утеплённом балконе требует не выше 25, а ванная живёт по влажности — там порог 70 процентов. Между нормальным режимом комнаты и порогом оставляйте запас в два-три градуса: если днём у вас стабильно держится 27–28, порог 29 будет срабатывать от каждого сквозняка и от руки, приложившей к датчику тёплый чай. Сигнализация, которая орёт без причины, через неделю выключается навсегда — а отключённая тревога хуже отсутствующей: она приучает всех в доме игнорировать писк.
И проверяйте порог в обе стороны не только на столе, но и на месте: датчик в теплице у самого стекла покажет на пять градусов больше, чем датчик в центре, а сенсор над душевой кабиной видит пар раньше, чем тот, что у двери. Пороги подбираются под место установки, а не наоборот.
| Ситуация | Условие | Частота | Ритм | Что делать человеку |
|---|---|---|---|---|
| Жара | t выше 30 °C | 2500 Гц | писк 150 мс, пауза 100 мс | открыть форточку, спасать урожай |
| Сырость | h выше 70 % | 1200 Гц | писк 400 мс, пауза 300 мс | проверить конденсат и вентиляцию |
| Норма | оба показания в границах | — | тишина | ничего |
| Датчик не ответил | isnan по температуре | — | тишина, пометка в Serial | проверить провод и питание |
Две причины — два голоса
Один непрерывный писк — плохой интерфейс. Через минуту хочется его выключить, а через два — уже не помнишь, зачем он вообще пищал. Поэтому каждая причина получает свой голос: жара — частые короткие писки на высокой ноте, будто стрекот; сырость — редкий низкий гул, будто гудит трансформатор. Через неделю вы будете различать их из другой комнаты, а стоять и читать монитор порта в момент аварии обычно некогда.
Частоты выбраны не случайно. Пьезопластинка отыгрывает громче всего в районе своего резонанса — обычно это 2–4 килогерца, потому стрекот жары на 2500 герцах получается звонким и пробивным. А вот низкие частоты пьезо проигрывает: на 1200 герцах гул сырости выходит заметно тише — и это как раз хорошо, сырая тревога деликатнее, её не хочется глушить первым делом. Ниже 500 герц пьезопластинка почти замолкает совсем — если захотите третий голос, берите частоты между 1500 и 3500 герцами и различайте их ритмом, а не высотой.
Логика выбора в скетче — цепочка if / else if: сначала проверяем жару, потом сырость, и только если ни то ни то — молчим. Порядок не случайный: если жара и сырость случились одновременно, стрекот важнее гула, жару нужно видеть первой. Внутри каждой ветки стоят tone(BUZZ, частота), пауза delay() и noTone(BUZZ) — без noTone пластинка продолжит звучать до бесконечности, это первая вещь, которую стоит проверить, если зуммер замолчать отказывается.
Пороги выбрал 30 градусов и 70 процентов не с потолка: 30 °C — это линия, выше которой большинство комнатных растений и рассада начинают всерьёз страдать, а 70 % влажности — граница, за которой на стеклах и стенах начинается конденсат. Границу сырости можно посчитать точнее через точку росы — мы это делали в уроке про точку росы по формуле Магнуса, а тяжесть жары для человека хорошо описывает индекс жары.
if (t > 30.0) { Serial.println("alarm=zhar"); tone(BUZZ, 2500); delay(150); noTone(BUZZ); delay(100);} else if (h > 70.0) { Serial.println("alarm=syro"); tone(BUZZ, 1200); delay(400); noTone(BUZZ); delay(300);} else { Serial.println("alarm=net"); noTone(BUZZ); delay(600);}delay(1500);Отдельно про nan. Датчик иногда не отвечает — провод дрогнул, питание просело, опрос пришёлся слишком рано. Тревога на такой ошибке должна молчать: в скетче выше ветка isnan пропускает цикл целиком, без неё одиночный сбой чтения звучал бы как ложная сирена. Полный список причин пропадания данных разобран в диагностике nan — пройдитесь по нему, прежде чем винить зуммер в истерике.
Дребезг на границе лечится и другим способом — подтверждением: тревога считается настоящей только после трёх опросов подряд за порогом. Реализация — один счётчик без массивов: порог превышен — увеличиваете счётчик, не превышен — обнуляете, а писк разрешаете при счётчике три и больше. При опросе раз в две секунды это шесть секунд задержки — для климата, который меняется минутами, ничего, а от одиночного выброса или дрожи на границе спасает полностью. В устройствах, которые живут без меня, я ставлю оба приёма сразу: гистерезис убирает заикание, подтверждение — разовые сирены.
И последнее: пороги, зашитые в скетч, приходится перепрошивать под каждую комнату. Вынесите их в энергонезависимую память и настраивайте кнопками на ходу, без компьютера — как это устроено, разобрано в уроке про пороги в EEPROM.
Что добавить дальше. Световая дублировка тревоги светодиодами хороша там, где звук заглушён, — приём показан в уроке про индикацию комфорта. А чтобы каждый момент тревоги не терялся во времени, прикрутите сюда кольцевой журнал показаний из предыдущего урока: пусть рядом с alarm= пишется температура на момент первого писка — утром будет что читать.
- 1. Чем пассивный зуммер отличается от активного?
- 2. Зачем давать жаре и сырости разные ритмы писка?
- 3. При 30.1 градусе тревога писнула, при 29.9 замолчала, при 30.0 снова пищит. Что добавить в скетч?
- 4. Датчик вернул nan. Как должна вести себя тревога?
- 5. Зуммер потребляет около 25 мА при пищании. Как включить его правильно?
- Данные без сигнала — дневник, а не охрана: если показание чего-то стоит, добавляйте зуммер.
- Пассивный зуммер плюс tone() дают выбор частоты; 2500 Гц — рабочая тревожная нота, резистор 100 Ом в разрыве обязателен.
- Одна причина — один голос: жара стрекочет часто и высоко, сырость гудит редко и низко, различаете на слух.
- На границе порога логика дребезжит из-за шума показаний — разводите пороги гистерезисом.
- nan — не авария: пропускайте цикл молча, а упорные срывы лечите по чек-листу диагностики.
Частые вопросы по теме урока
- Чем пассивный зуммер отличается от активного?
- Пассивный — просто пьезопластинка, ноту задаёт ваш скетч. Активный содержит генератор и звучит всегда одинаково. Частоту пассивного задаёт tone() из скетча, активный пищит фиксированной нотой от HIGH
- Зачем давать жаре и сырости разные ритмы писка?
- В момент аварии читать Serial некогда. Стрекот и гул различаются из другой комнаты — это и есть весь смысл разных ритмов. Чтобы различать причины тревоги на слух, не открывая монитор порта
- При 30.1 градусе тревога писнула, при 29.9 замолчала, при 30.0 снова пищит. Что добавить в скетч?
- Показания дрожат на плюс-минус 0,2 градуса, и порог дребезжит. Гистерезис разводит пороги включения и выключения — дребезг исчезает. Гистерезис: включение на 30, выключение на 29
- Датчик вернул nan. Как должна вести себя тревога?
- Одиночный срыв чтения — не повод для сирены. Пропускаем цикл, логируем пометку, а упорные nan ищем проводами по чек-листу диагностики. Пропустить цикл: молчать и пометить сбой в Serial
- Зуммер потребляет около 25 мА при пищании. Как включить его правильно?
- Пин отдаёт до 40 мА, зуммер вписывается, но резистор 100 Ом снимает риск. Постоянное пищание или мощная сирена — уже через транзистор. Через пин с резистором 100 Ом в разрыв, для долгого ора — транзистор