- PVSM.RU - https://www.pvsm.ru -

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

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

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

Для изготовления счетчика были приобретены два ИК датчика расстояния E18-D80NK и Arduino Pro Mini. Стоимость на момент покупки была 250 руб. и 60 руб. соответственно.

ИК датчик

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

Схема


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

Врезанные датчики

Так как автоматизация освещения ванной комнаты является частью системы [1] умного дома, устройство было разделено на две части. Первая часть, это собственно сама логика датчика определения направления движения, а подсчетом количества зашедшихвышедших и включением освещения занимается уже вторая часть — контроллер освещения (КО).
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"); // Отправляем данные на сервер
    }
  }

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

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

Автор: instalator

Источник [2]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/umny-j-dom/110842

Ссылки в тексте:

[1] системы: https://geektimes.ru/post/270012/

[2] Источник: https://geektimes.ru/post/270140/