Управление освещением в ванной на основе счетчика посетителей

91cd24a3f4344ad2b9890c6ed26d53c3.jpg


В сети много статей по автоматизации освещения в ванной комнате, большая их часть основана на датчиках движения или объема. Кто-то даже делал на основе видео камеры, вариант интересный, но есть шанс стать «звездой» 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"); // Отправляем данные на сервер
    }
  }


Из опыта эксплуатации можно сделать выводы, что представленная система вполне работоспособна. Бывают правда иногда ложные не срабатывания в основном на черной одежде, но редко и если при входе\выходе датчик не сработал достаточно махнуть рукой мимо датчиков или просто щелкнуть выключателем.
Ну и напоследок видео работы.

Первая часть — Умный дом, начало.

© Geektimes