Умный дом на Arduino: реле, датчики — сначала в симуляторе
Умный дом на Arduino гибнет на старте двумя способами: новичок сразу лезет в 220 В или собирает «кучу датчиков без сюжета» — всё подключено, ничего не решает. Рабочий вход — один маленький сценарий с понятной логикой: свет включается от движения и сам гаснет через минуту тишины. Такой сценарий собирается в браузере за полчаса и переносится на железо без единой правки кода.
Ниже — состав стенда с пинами и токами, логика авто-света на millis(), скетч и честная граница: что делается на слаботочке, а что — только через реле-модуль и с холодной головой. Все три героя — реле, PIR, DHT — лежат в палитре «Макетка» нашего симулятора: реле щёлкает, PIR переключается тумблером, ползунки DHT крутятся.
Состав стенда: три устройства, один сценарий
- Модуль реле на пин 7: вход срабатывает от 5 В, катушка берёт 70-75 мА — пину это не по зубам, поэтому реле всегда идёт как модуль с транзистором и оптопарой, а не голой катушкой.
- PIR-датчик HC-SR501 на пин 2: выдаёт HIGH при движении; первые 30-60 секунд после подачи питания — калибровка, датчик может сыпать ложными срабатываниями.
- DHT22 на пин 4: температура и влажность для следующего шага — «в комнате душно, включаем вентилятор» вторым релейным каналом.
- Свет: в симуляторе — лампочка карточки реле; на макетке — светодиодная лента 12 В или USB-ночник, то есть слаботочка, к которой не страшно подойти.
| Устройство | Пин | Сигнал | Роль в сценарии |
|---|---|---|---|
| Модуль реле | D7 | HIGH — замкнуто, LOW — разомкнуто | коммутирует свет (пока слаботочный) |
| PIR HC-SR501 | D2 | HIGH при движении | триггер включения света |
| DHT22 | D4 | однопроводный протокол | климат в Serial: температура и влажность |
Логика авто-света: движение плюс таймаут
Сценарий звучит так: движение поймано — свет включён, отсчёт таймаута перезапущен; движения нет N секунд — свет погас. Вся хитрость в том, что таймаут живёт на millis(): каждое новое движение обнуляет отсчёт, а loop() при этом не блокируется и успевает опрашивать DHT и печатать климат в Serial. Порог подбирается под комнату: коридору хватает 10-15 секунд, для ванной меньше 90 уже неудобно — свет гаснет, пока вы полощете руки.
Скетч: свет по PIR с таймаутом на millis()
#include <DHT.h> const byte PIN_PIR = 2; // выход PIR: HIGH — движениеconst byte PIN_RELE = 7; // вход модуля релеconst unsigned long TIMEOUT = 60000UL; // гасим после 60 с тишины DHT dht(4, DHT22);bool svet = false;unsigned long tSvet = 0, tDht = 0; void setup() { pinMode(PIN_PIR, INPUT); pinMode(PIN_RELE, OUTPUT); digitalWrite(PIN_RELE, LOW); // старт с погашенным светом dht.begin(); Serial.begin(9600);} void loop() { bool dvizhenie = digitalRead(PIN_PIR) == HIGH; if (dvizhenie && !svet) { // движение появилось — включаем svet = true; digitalWrite(PIN_RELE, HIGH); } if (dvizhenie) tSvet = millis(); // каждое движение продлевает отсчёт if (svet && millis() - tSvet > TIMEOUT) { svet = false; // минута тишины — гасим digitalWrite(PIN_RELE, LOW); } if (millis() - tDht > 5000) { // климат раз в 5 с, без блокировок tDht = millis(); Serial.print("t="); Serial.print(dht.readTemperature(), 1); Serial.print("C h="); Serial.print(dht.readHumidity(), 0); Serial.println("%"); }}В симуляторе сценарий проверяется руками: тумблер «движение есть» в карточке PIR поднимает пин в HIGH — реле щёлкает и зажигает лампу на стенде. Отожмите тумблер и подождите: через минуту (для проверки временно урежьте TIMEOUT до 5000, чтобы не ждать) реле отщёлкнет обратно. Если реле на вашей плате активируется LOW — поменяйте HIGH и LOW местами: это самая частая правка при переносе на железо.
Куда расширять сценарий
- Второй релейный канал на вентилятор: DHT в скетче уже опрашивается — условие «влажность выше 65 %» превращается в автоматическую вытяжку.
- Ночной режим: потенциометр из палитры «Макетка» в роли фоторезистора — analogRead ниже порога, и таймаут света укорачивается с 60 до 15 секунд.
- Журнал срабатываний: отметка каждого включения света в Serial или на SD-карту — за неделю собирается честная таблица привычек.
- Контроль нагрузки: датчик тока ACS712 в разрыве питания светильника покажет, что лампа действительно горит, а не только реле щёлкнуло.
Куда расти: урок про PIR-светильник HC-SR501 разбирает подстроечники чувствительности и задержки, ток нагрузки покажет датчик ACS712 — контроль «лампа перегорела» становится реальным, а ниша целиком (MQTT, сцены, голос) собрана в лендинге про умный дом на Arduino. Стенд без железа — в симуляторе: палитра «Макетка», три карточки, полчаса.