Зимняя детская, которую я измерял один февраль, жила по расписанию батареи: к вечеру +26 °C, влажность 24 %, а к утру у ребёнка сохли губы и закладывало нос. Термометр-гигрометр на стене говорил правду, но смотреть на него некогда: у взрослых свои заботы. Прибор в детской должен сказать словами: сейчас хорошо, или проветрите, или включите увлажнитель. Экран на 16 символов, светодиодный маячок и тумблер дня-ночи решают это ровно в три слоя — и ни одного реле, о чём ниже отдельно.
Цифры, на которые равняюсь, — не мои вкусы: педиатрические рекомендации и ВОЗ сходятся на 18-22 °C и 40-60 % относительной влажности для комнаты, где спит ребёнок. В этой полосе слизистая не пересыхает, тело не перегревается, и разница с «комнатой как у всех» — это разница между «тепло же» и «дышится легко». Зимой от батарей воздух проседает до 20-30 % — типовая картина городских квартир, и чаще всего вне нормы оказывается именно влажность, а не температура.
Зоны комфорта и слова на экране
Экран печатает вердикт одним словом, и у вердикта жёсткие приоритеты: холодно — важнее всего (t ниже 18 — «Holodno»), затем жарко (t выше 22 — «Provetrit»: форточка решает за минуту), затем сырость (h выше 60 — тоже «Provetrit», зимнее проветривание заодно подрежет влагу), и только потом сухость (h ниже 40 — «Uvlazhnit»). Если всё в полосе — «OK». Приоритет — не эстетика: перегретая комната вреднее сухой, а влажность ниже 40 бьёт по самочувствию медленнее, чем жара.
Сухость при этом — самая частая зимняя история, и увлажнитель не включают не из вредности, а потому что о нём забывают. Поэтому слово «Uvlazhnit» на экране живёт ровно до тех пор, пока влажность не вернётся в полосу: прибор не стесняется повторяться. Верхнюю границу 60 % я держу жёсткой: в тёплой комнате при 24 °C влажность за 60 комфорта уже не даёт, а риск пыли и клещей растёт.
| Показатель | Норма | Отклонение | Слово на экране |
|---|---|---|---|
| Температура | 18-22 °C | ниже 18 / выше 22 | Holodno / Provetrit |
| Влажность | 40-60 % | ниже 40 / выше 60 | Uvlazhnit / Provetrit |
| Оба в полосе | 18-22 °C и 40-60 % | — | OK, светодиод горит ровно |
Маячок вспышками и ночной режим
Светодиод на D12 — маячок для взгляда от порога: экран читают вблизи, а маячок видно от двери. Он горит ровно, когда всё в норме, и кодирует отклонение числом вспышек за двухсекундный цикл: одна — холодно, две — жарко, три — сухо, четыре — сыро. Тот же приём используют стиральные машины и роутеры там, где негде поставить экран: один пин передаёт пять состояний, и за неделю глаз выучивает код до автоматизма. Темп — DHT11 отвечает раз в секунду, но экрану и маячку хватит обновления раз в две секунды, чтобы не мельтешить.
Ночной режим — тумблер на D3: вверх — день, вниз — ночь. Ночью гаснет подсветка экрана (lcd.noBacklight() — она же самый прожорливый потребитель модуля, 20-60 мА, больше всей логики Uno) и замолкает маячок: мигающий свет в спальне хуже писка. А звуковые напоминания скетч разрешает только днём: переменная day стоит заслоном перед вызовом звука — та самая «ночная тишина», ради которой всё и затевалось. Повесите зуммер на D8 — гейт уже готов, а механика тревоги разобрана в уроке про пороги и зуммер.
#include "DHT.h"#include "LiquidCrystal_I2C.h"// DHT11 на пине 2, LCD 16x2 по I2C (A4/A5), маячок на 12,// тумблер на 3, зуммер на 8 — необязателен, без него работает так жеDHT dht(2, DHT11);LiquidCrystal_I2C lcd(0x27, 16, 2); #define LED 12#define TOG 3#define BUZ 8#define T_LO 18.0#define T_HI 22.0#define H_LO 40.0#define H_HI 60.0const unsigned long BEEP_PERIOD = 60000UL; // напоминание раз в минуту int flashes = 0; // 0 норма, 1 холодно, 2 жарко, 3 сухо, 4 сыроunsigned long lastRead = 0;unsigned long lastBeep = 0; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(TOG, INPUT); dht.begin(); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("detskaya 18-22C"); Serial.println("detskaya: mayak + lcd, tumbler = den");} void loop() { unsigned long now = millis(); bool day = digitalRead(TOG) == HIGH; if (now - lastRead >= 2000UL) { lastRead = now; float t = dht.readTemperature(); float h = dht.readHumidity(); if (t < 0.0 || t > 50.0 || h < 0.0 || h > 100.0) { Serial.println("err: sensor"); } else { // приоритет: холодно, жарко, сыро, сухо if (t < T_LO) flashes = 1; else if (t > T_HI) flashes = 2; else if (h > H_HI) flashes = 4; else if (h < H_LO) flashes = 3; else flashes = 0; lcd.setCursor(0, 0); lcd.print("t="); lcd.print(t, 1); lcd.print(" h="); lcd.print(h, 0); lcd.print("% "); lcd.setCursor(0, 1); if (flashes == 0) lcd.print("OK "); else if (flashes == 1) lcd.print("Holodno "); else if (flashes == 2) lcd.print("Provetrit "); else if (flashes == 3) lcd.print("Uvlazhnit "); else lcd.print("Provetrit "); if (day) lcd.backlight(); else lcd.noBacklight(); // звуковые напоминания только днём — ночная тишина if (day && flashes > 0 && now - lastBeep >= BEEP_PERIOD) { lastBeep = now; tone(BUZ, 1500, 200); } } } // маячок: ночью молчит, в норме горит ровно, иначе код вспышками if (!day) { digitalWrite(LED, LOW); } else if (flashes == 0) { digitalWrite(LED, HIGH); } else { int ph = (int)(now % 2000UL); bool on = false; for (int i = 0; i < flashes; i++) { if (ph >= i * 300 && ph < i * 300 + 150) on = true; } digitalWrite(LED, on ? HIGH : LOW); }}Математика маячка уместилась в пять строк: фаза цикла — это millis() % 2000, вспышка занимает первые 150 миллисекунд каждой трёхсотмиллисекундной пары, и for-loop проверяет, попала ли фаза в одну из вспышек. Ни одного delay(): маячок перерисовывается в каждом проходе loop(), экран обновляется раз в две секунды, и оба живут независимо. Если вы пропустили урок про планировщик на millis(), маячок — лучшая для него тренировка: десять строк кода, а результат видно через комнату.
Экран обновляю полными полями с хвостовыми пробелами: «OK» обязан затереть остатки «Uvlazhnit», иначе на 16-символьной строке живут призраки прошлых слов. Ширина честная: t=21.5 h=45% — тринадцать символов из шестнадцати. И про язык: латиница в скетче не от лени — контроллер HD44780 не несёт кириллицы, русские буквы рисуются только своими глифами по сетке 5x8, и это отдельная задача. Тем же способом живёт термогигрометр на LCD из раздела.
Первый запуск почти всегда спорит с ожиданиями: 24 °C и 28 % — типовые февральские показания у батареи, и экран честно стоит в «Provetrit». Проветривание вернёт температуру в полосу, но относительная влажность после него упадёт ещё ниже — воздух с улицы при нагреве до комнатной температуры высыхает, и прибор переключится на «Uvlazhnit». Это не противоречие, а правильный порядок: сначала температура, затем влага. Мой февральский вывод после недели наблюдений: увлажнитель в детской нужнее второго обогревателя.
И про место прибора в семье уроков раздела: индикация комфорта светодиодами была первой пробой светофора по двум величинам, климат-контроль — автоматом с реле, здесь же — наблюдатель со словами на экране. Три слоя комбинируются: маячок останется, экран останется, а реле добавите, когда ребёнок подрастёт и форточка перестанет быть единственным регулятором.
- Норма детской: 18-22 °C и 40-60 % — педиатры и ВОЗ сходятся на этой полосе; зимой чаще страдает влажность, падая до 20-30 %
- Вердикты с приоритетом: Holodno, затем Provetrit, затем Uvlazhnit — экран говорит одно слово, самое важное
- Маячок вспышками: 1 — холодно, 2 — жарко, 3 — сухо, 4 — сыро; один пин передаёт пять состояний, как у бытовой техники
- Ночь по тумблеру: подсветка и маячок гаснут, звук запрещён — day стоит заслоном перед вызовом звука
- Экран затирается пробелами до полной ширины: «OK» должен съесть остатки «Uvlazhnit», иначе на строке живут призраки
- 1. На экране «Provetrit». Какие пары значений могли его вызвать?
- 2. t=17 °C, h=30 %. Что покажет прибор?
- 3. Сколько вспышек за цикл у маячка при t=24, h=45?
- 4. Что гаснет ночью и почему?
- 5. Почему в скетче латиница на экране?
Частые вопросы по теме урока
- На экране «Provetrit». Какие пары значений могли его вызвать?
- Слово Provetrit стоит и при жаре (t выше 22), и при сырости (h выше 60): зимнее проветривание решает обе проблемы разом. t=24, h=55 или t=20, h=65
- t=17 °C, h=30 %. Что покажет прибор?
- Приоритет жёсткий: сначала холод, затем жара, затем сырость, потом сухость. Экран говорит ровно одно слово. Holodno: температура в приоритете
- Сколько вспышек за цикл у маячка при t=24, h=45?
- t выше 22 — жарко, код две вспышки; влажность в норме и не влияет, потому что маячок показывает самую тяжёлую причину. две: жарко
- Что гаснет ночью и почему?
- Ночной режим выключает подсветку (20-60 мА) и маячок; значения продолжают обновляться, а звук остаётся запрещён до утра. подсветка экрана и маячок: свет в спальне мешает сну, а подсветка — самый прожорливый потребитель модуля
- Почему в скетче латиница на экране?
- Знакогенератор HD44780 содержит латиницу и псевдографику; кириллицу рисуют через createChar по точкам, а для вердиктов хватает латиницы. контроллер HD44780 не несёт кириллицы — русские буквы только своими глифами 5x8