
В сети много статей по автоматизации освещения в ванной комнате, большая их часть основана на датчиках движения или объема. Кто-то даже делал на основе видео камеры, вариант интересный, но есть шанс стать «звездой» youtube'а. Изучив различные варианты их преимущества и недостатки я задался вопросом, а почему практически никто не делает автоматическое включение света на основе обычного счетчика посетителей. Ведь посчитав входящих и выходящих можно однозначно судить есть ли кто в помещении или нет и соответственно включать или выключать свет.
Для изготовления счетчика были приобретены два ИК датчика расстояния E18-D80NK и Arduino Pro Mini. Стоимость на момент покупки была 250 руб. и 60 руб. соответственно.

Принципиальная схема (кликабельно).

Датчики врезаны в дверную коробку.

Так как автоматизация освещения ванной комнаты является частью системы умного дома, устройство было разделено на две части. Первая часть, это собственно сама логика датчика определения направления движения, а подсчетом количества зашедших\вышедших и включением освещения занимается уже вторая часть — контроллер освещения (КО).
Arduino ProMini фиксирует направление движения и формирует на выходе импульсы, которые поступают на КО, тот в свою очередь занимается подсчетом и включением\отключением света.
bool flag = 0;
bool flag2 = 0;
bool state = 0;
bool state2 = 0;
int DoorPin = 10; //Геркон
int pause = 500;
int StatusDoor = 0;
int status1 = 0;
int status2 = 0;
void setup() {
  pinMode(13, OUTPUT); // Импульс если зашли
  pinMode(12, OUTPUT); // Импульс если вышли
  pinMode(DoorPin, INPUT);
  digitalWrite(DoorPin, HIGH);  // включить подтягивающий резистор
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  digitalWrite( 12 , LOW );
  digitalWrite( 13 , LOW );
}
void loop() {
  StatusDoor = digitalRead(DoorPin);    // узнаём состояние двери
  if (StatusDoor == HIGH) {             // Если Дверь открыта, считаем сколько зашло
    if (!digitalRead(2) && !flag) {
      delay(5);
      flag = 1;
      if (flag2 == 0) {
        state = 1;
      }
    }
    if (!digitalRead(3) && !flag2) {
      delay(5);
      flag2 = 1;
      if (flag == 0) {
        state2 = 1;
      }
    }
    if (digitalRead(3) && digitalRead(2)) {
      if (!flag || !flag2) {
        state = 0;
        state2 = 0;
        flag = 0;
        flag2 = 0;
      }
      if (flag && state2) { //Зашли
        digitalWrite( 13 , HIGH );
        delay(pause);
        digitalWrite( 13 , LOW );
        flag = 0;
        flag2 = 0;
        state2 = 0;
      }
      if (flag2 && state) { //Вышли
        digitalWrite( 12 , HIGH );
        delay(pause);
        digitalWrite( 12 , LOW );
        flag = 0;
        flag2 = 0;
        state = 0;
      }
    }
  }
}
КО управляет освещением и от обычного выключателя установленного перед дверью. В функции КО входит управление освещением всей квартиры от выключателей, передача данных о состоянии освещения и прием команд от сервера умного дома по протоколу MQTT.
 if (digitalRead(22) != pre1) { //если произошло событие от выключателя
    delay(pause);
    digitalWrite(33, !digitalRead(33)); //инвертируем состояние пина т.е. включаем или выключаем свет
    pre1 = digitalRead(22); //Запоминаем текущее положение выключателя
    int out1 = digitalRead(33);
    String char_out1 = String(out1);
    char_out1.toCharArray(b, 2);
    client.publish("myhome/Lighting/BathRoom_Main", b); //отправляем состояние на сервер
    if (digitalRead(33) == HIGH) {
      posetitel = 1;
      bathswitch = 1;
    }
    else if (digitalRead(33) == LOW) {
      posetitel = 0;
      bathswitch = 0;
    }
  }
  if (digitalRead(2) == 1 && (millis() - previousMillis > 3000)) { //Если кто то зашел в ванную то
    previousMillis = millis();
    if (bathswitch == 1) {
      posetitel = 0;
      bathswitch = 0;
    }
    posetitel++; 
    if (posetitel > 0) {
      delay(50);
      digitalWrite(33, 1);//Включаем свет
      if (posetitel > 5) {
        posetitel = 5;
      }
      delay(5);
      client.publish("myhome/Lighting/BathRoom_Main", "1"); // Отправляем данные на сервер
    }
  }
  if (digitalRead(3) == 1 && (millis() - previousMillis > 3000)) { //Если кто то вышел из ванной то
    previousMillis = millis();
    posetitel--;
    if (posetitel <= 0) {
      posetitel = 0;
      delay(50);
      digitalWrite(33, 0);//Выключаем свет
      delay(5);
      client.publish("myhome/Lighting/BathRoom_Main", "0"); // Отправляем данные на сервер
    }
  }
Из опыта эксплуатации можно сделать выводы, что представленная система вполне работоспособна. Бывают правда иногда ложные не срабатывания в основном на черной одежде, но редко и если при входе\выходе датчик не сработал достаточно махнуть рукой мимо датчиков или просто щелкнуть выключателем.
Ну и напоследок видео работы.
Первая часть — Умный дом, начало.
Комментарии (60)

fuCtor
30.01.2016 15:00+1А куда спрятан Arduino?
Arduino ProMini фиксирует направление движения и формирует на выходе импульсы, которые поступают на КО, тот в свою очередь занимается подсчетом и включением\отключением света.
Т.е. для того чтобы отправить импульс была использована целая Arduino? Понимаю что так меньше мороки и быстрее, но как-то расточительно это. Для всей этой задачи достаточно же примитивнейшего МК.
А так прикольно )
instalator
30.01.2016 16:58+1Если вы читали первую часть то там был ответ на ваш вопрос.
Изначально планировал делать все на микроконтроллерах, но узнав о существовании Arduino выбор пал именно на нее, т.к. упрощалось изготовление конечных устройств, не нужно было изготавливать платы самостоятельно.

spc
30.01.2016 15:42+3почему практически никто не делает автоматическое включение света на основе обычного счетчика посетителей
Потому, что по моему мнению, за разумные деньги ни одна технология не способна однозначно определять нахождение и количество людей в помещении. Неразумные деньги, опять же, по моему мнению — стоимость датчика присутствия.
И, наконец, раз уж я тут нарциссирую, то третье личное мнение: датчика движения с дополнительным контроллером хватает просто за глаза (почти второй год работает и радует).
Obukhoff
30.01.2016 16:36Датчики присутствия действительно дорогие, а вот датчик движения, на подобие такого goo.gl/lj1sf4 — вполне себе годное решение.
Ну да, если заснул на унитазе, то это будет фейл, но сами посудите, для выключения света вам нужно не двигаться в течении 5-7 минут ;)
Не выдержит столько человек ;)
dkv
30.01.2016 19:28+1Можно совместить датчик движения с СМК (сигнализатор магнитоконтактный), формирующим событие открывания двери. Убиваем двух зайцев — свет включаться будет сразу при открытии двери и не будет ложных несрабатываний. Вероятность наличия второго человека отрабатывать таймаутом выключения света с контролем по датчику движения в помещении. При наличии душевой кабины будут проблемы, но их можно решить с помощью СМК — если двери душевой закрылись при включенном свете и не открывались — считать, что в ней кто-то есть. В общем, вариантов куча. В этом и прелесть открытых решений.

instalator
30.01.2016 19:30Можно совместить датчик движения с СМК (сигнализатор магнитоконтактный), формирующим событие открывания двери. Убиваем двух зайцев — свет включаться будет сразу при открытии двери и не будет ложных несрабатываний.
Да, но иногда дверь не закрываю вообще, как быть в таком случае?
dkv
30.01.2016 19:38Просто. Когда заходите внутрь, закрываете же. Вот вам событие по закрыванию двери и сработке датчика движения после факта закрытия двери. Если просто руки помыть и не закрываете — то тут хватит датчика движения за глаза — за раковиной обычно не замирает человек и даже таймаута в 30 сек. хватит.

instalator
30.01.2016 18:25+1Меня мое решение тоже радует. С датчиком движения все равно свет остается гореть какое то время, когда уже никого нет в помещение, незначительно но лишний киловатт набегает)

kawabunga
30.01.2016 18:51Давайте посчитаем.
Если даже мы вошли и вышли сразу же, то свет горит еще, ну предположим, 5 минут.
Возьмем энергопотребление на уровне 20Вт (у нас наверняка энергосберегающие стоят)
Вы зашли в туалет 20 раз в день.
Итого примерно 35 ватт
учитывая цену за киловатт на уровне 0,13 евро
короче считать лень даже.
kawabunga
30.01.2016 18:55на мой взгляд такая система нужна только в общественном туалете, и не для экономии, но для того, чтобы никто не трогал лишний раз выключатели и не разносил бактерии.
24 часа освещения туалета в течение года!!! будет стоить ну может 50 евро.
ploop
30.01.2016 23:1624 часа освещения туалета в течение года!!! будет стоить ну может 50 евро.
По текущему тарифу светодиодная 11Вт лампочка (аналог 75Вт накаливания) работая 24/7 в течении года скушает 313 рублей. Сберегайка в два раза больше.
Ну это не для общественного туалета, но там тоже не накладно будет.

tmin10
30.01.2016 19:48А почему редко кто рассматривает вариант УЗ дальномера? Для детекта человека в туалете, мне кажется, это идеальный вариант. Стоит недорого, точность выдаёт сантиметровую. Единственное, нужно поэкспериментировать с расположением: на стене напротив двери вроде лучший вариант. Так можно определять открытость/закрытость двери и стоящего/сидящего человека.

instalator
30.01.2016 19:49В туалете где ширина 1 метр почему бы и нет.

tmin10
30.01.2016 19:51Популярный HC SR04 имеет 4 метровый диапазон измерений, т.е. подходит для многих туалетов. Сам заказал такой, чтобы попробовать что-то соорудить.

instalator
30.01.2016 19:54Я про ширину говорил, а если туалет 3 на 3 метра?

Celtis
01.02.2016 02:10Можно поставить 3 дальномера под разными углами. SR-04 бьет не лучом, а довольно широким конусом, так что покрытие будет практически полным.

opencart-cms
30.01.2016 22:30+1вот у меня как раз метровый дальномер над дверью и стоит, на унитаз смотрит.
Вот только, кот не любит ультразвук, приходиться его туалет держать в другом месте) из-за этого сейчас больше склоняюсь к датчику движения+счетчик посетителей.
Celtis
01.02.2016 02:07Кот коту рознь, видимо. Мою кошку уз-дальномер совершенно не смущает, в отличии от меня(явно слышу щелчки импульсов).
Установлен так же, как и у Вас.
opencart-cms
01.02.2016 02:24вполне может быть) для экспериментов, у меня всего одна единица котов)
Хотя, на тематических форумах и сайтах, не единожды встречал такую проблему у пользователей уз дальномеров.
Celtis
01.02.2016 23:05Возможно, имеет значение периодичность импульсов. У меня замеры идут дважды в секунду.
Сам же алгоритм работы такой: если дверь открыта(геркон в роли датчика) — работает дежурное освежение(светодиоды на 25% мощности); если после закрытия двери сработал дальномер — значит, внутри кто-то есть и светим NN% пока дверь не откроется(в чудеса исчезновения из закрытого туалета система не верит). Таким образом борюсь с глюками SR-04, периодически выдающего мусор. Да, NN%, а не 100% потому, что ночью предпочитаю подсветку по минимуму. NN выбирается исходя из освещенности комнат(в качестве контроллеров не ардуины, а 8266, увязанные в сеть через MQTT)

nerudo
30.01.2016 16:07+3Надо еще статистику собирать: максимальное и минимальное время прибывания, максимальное количество лиц одновременно и т.д.

Obukhoff
30.01.2016 16:33А как у вас решена проблема с ситуацией, когда человек постоял в дверях и ушел?
С вариантами, когда внутри кто-то есть или нету.

Caustic
30.01.2016 17:02А можете рассказать, какую функцию выполняет геркон в этой схеме? Наверно, можно использовать для включения света при открывании двери, но она не вседа бывает закрыта, так что скорее всего не для этого. Сам как раз на днях думал о таком же счетчике посетителей для ванной, спасибо за статью.

instalator
30.01.2016 17:03Герконы у меня стоят на каждой двери и окне, эта дверь не была исключением.

opencart-cms
30.01.2016 22:37В первой статье не увидел зачем они в окнах стоят, ну или не внимательно смотрел.
Ну как я думаю, герконы в окнах и дверях можно как элемент сигнализации использовать.
instalator
31.01.2016 08:58В окнах для предупреждения при уходе из дома об открытых окнах, так же предупреждение если на улице начался дождь и естественно сигнализация.

Barma2012
30.01.2016 17:11Сделал нечто подобное для кухни, но только вместо датчиков расстояния использовал два ИК-светодиода и один TSOP-1736, который ловил сигналы с обоих светодиодов. Никаких ардуин — всё на хардкорном ассемблере ))))
Работает эта штука достаточно надежно в случае ламп накаливания, а вот для ЭСЛ — начинает сбоить, как правило, при входе первого человека, когда лампа только зажигается. От неё идут такие помехи, что не спасает даже 16-битная коррекция ошибок, которую позже добавил в код. При этом так ведут себя не новые лампы, а отработавшие какое-то (небольшое) время. От производителя ламп сей дефект мало зависит — из 4-х ламп глючить начинали все, раньше или позже.
Пока проблему решить не смог (менять TSOP на другой, с другой частотой — лениво, да и не факт что поможет), и когда очень сильно начинает напрягать неверный подсчет — вкручиваю обычную лампочку, нервы сразу успокаиваются ))))

infernadium
30.01.2016 18:11Владимир, Вас не затруднит проверить, насколько хорошо эти E18-D80NK срабатывают на пустую прозрачную (не цветную) пластиковую (PET) бутыль? Интересует сам материал бутыли, не этикетка. Заранее благодарю.

instalator
30.01.2016 18:16Проверил, Бутыль из не крашенного прозрачного пластика, объемом 3 литра, этикетки нет. Датчик видит бутылку с 30 сантиметров при установленной чувствительности.

ov7a
30.01.2016 18:29+2А если заходить по одному, а выходить тесно обнявшись — сработает система?

eta4ever
30.01.2016 19:02+2Нвоборот! Входить обнявшись, а выходить по одному.
… потому уволил одного, и стало их FF.

Dmitry_Th
30.01.2016 19:43Встречал решение на основе кнопки включения от советского телевизора: откроешь дверь — свет зажигается, еще раз откроешь — выключается.

ed007
30.01.2016 20:12+1Бывают правда иногда ложные не срабатывания
Эта фраза дала от вет на вопрос в начале статьи.

D_T
31.01.2016 08:55Отличная идея. Давно стоят датчики движения в сан.узлах. Из минусов: если дверь открыта, проходишь мимо — свет включился. Второй — пока в душе моешься он не «видит» движения и вырубает свет. Приходится махать. Максимальных 7 минут не хватает.
Для защиты от несрабатываний я бы добавил таймер минут на 20, т.е. вошел свет включился, вышел — выключился, за 20 минут никто не вышел — тоже выключился.

VanyaKokorev
31.01.2016 09:55+1Я сделал два датчика движения — они стоят у двери, (1) направлен на выход, (2) — внутрь ванной. Свет горит бесконечно долго, если (2) видел человека менее давно, чем (1)

Jmann
31.01.2016 12:59Самое простое что может быть PIR датчик, например HC-SR501, у него два режима работы. Импульсы или таймер на 300 сек вроде. Я такой заюзал в комплексе с Attiny 13+ фотодатчик на фототранзисторе, сигнал которого усиливает Rail-to-Rail ОУ, правда в гараж. Кстати, можно было применить ИК приемо-передатчик в одном корпусе на отражение. Там угол работы хороший, врезать туда. где вероятность нахождения человека больше, сделать программную задержку от ложных срабатываний.

instalator
31.01.2016 13:00Фотодатчик можно было сделать на обычном фоторезисторе подключив его к АЦП контроллера, и не нужно было бы ставить дополнительно операционник.

Jmann
31.01.2016 13:02Учитывая что фоторезистор от головного девайса на расстоянии 10 метров, я все же не рискнул и сделал усилитель 0-5В аккурат подключенные к АЦП 8битки.

instalator
31.01.2016 13:05Непонятно что изменилось? Что так 5 вольт, что так.

Jmann
31.01.2016 13:13Прям аксиома Эскобара =) Это называется фен-шуй, вы получаете стабильный линейный сигнал на АЦП которую я могу еще и регулировать потенциометром. Тут все зависит от характеристик фототранзистора и номинала R между Vcc и коллектором. В каких-то моментах может ОУ и не нужен, но потери на длине в 10м на аналоговой линии меня побудили сделать полноценный датчик.

instalator
31.01.2016 13:16Тут скорее нужна защита от наводок, 10 метров могут поймать наводку от рядом проходящего кабеля.

Jmann
31.01.2016 13:20Ну в хендмейде простейшая RC — цепь стоит на входе АЦП МК. Плюс логика там такая, что фотодатчик работает в тандеме с PIR (если темно, PIR работает — светло PIR не работает, чувствительность регулирую вторым каналом АЦП через опорные 5В, такой себе программный компаратор), ну а приоритет всегда у клавиши включения света.

aivs
31.01.2016 20:21Интересно можно ли подобную систему сделать на паре акустических датчиков HC-SR04?

Или для более точного определения прерывания сигнала лучше использовать лазерный датчик? Хотя стоит он раз в 5-10 дороже чем акустический.


opencart-cms
31.01.2016 21:34Если домашние животные по квартире гуляют, то УЗ дальномер не стоит использовать.
Ситуацию описал тут geektimes.ru/post/270140/#comment_8976070

instalator
01.02.2016 13:20Второй на фото датчик я покупал, если делать на них то нужно разносить их между собой далеко чтобы отраженный лазер от одного датчика не попадал на второй, а приемник у них чувствительный и ловит даже слабо отраженный свет. Поэтому я от них отказался в сторону ИК. Ну и минус этого датчика — видно свет от лазера.
          
 
opencart-cms
Интересно!
На мой взгляд, добавив к счетчикам датчик движения внутри комнаты, можно будет избавиться от ложных не срабатываний.
instalator
Вообщем да, и в принципе ничего не мешает добавить его в систему.