Автоматическое освещение в туалете

arduin888
Offline
Зарегистрирован: 08.02.2017

Здравствуйте уважаемые специалисты, только начинаю изучать огромный мир ардуино, хотелось бы вашей помощи, а то никак не получается до конца вникнуть. Проблема такая: нужно, чтобы свет в туалете включался при открытии двери, и если после закрытия двери обнаружено движение в течении 3 секунд, свет оставался включенным, пусть даже потом движения в туалете нет. А если после закрытия двери в туалете ,движения в течении 5 секунд не обнаружено, то свет выключается. В качестве датчика закрытия двери применяю геркон, а движение определяю по ПИР датчику движения. Помогите с кодом. Учитывая, что на плате с датчиком движения отсутствуют какие либо регулировки.
#define movePin 2
#define doorPin 3
#define lightPin 4

void setup()
{
digitalWrite(movePin, 1);
digitalWrite(doorPin, 1); // на всякий подтянем
pinMode(lightPin, OUTPUT);
}

void loop()
{
static uint32_t millis_wait;
if(digitalRead(doorPin))
{
digitalWrite(lightPin, 1);
move = 0;
millis_wait = millis();
}
else
{
if(digitalRead(movePin)) move = 1;
if(millis()-millis_wait > 3000 && !move)
digitalWrite(lightPin, 0);
}
}

ZIA
ZIA аватар
Offline
Зарегистрирован: 04.02.2017

Вы не правильно сформулировали задачу! Алгоритм давно известен, при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери

arduin888
Offline
Зарегистрирован: 08.02.2017

В смысле?Мне нужно, чтобы всегда при открытой двери свет горел.А если закрытая дверь и движение есть, то свет горит не выключаясь, даже если никто не двигается. Если при закрытой двери, движения нет, то свет в туалете выключается.Про вентилятор не слова, пока хочу наладить только свет.

arduin888
Offline
Зарегистрирован: 08.02.2017

Т.е алгоритм такой-при открытой двери -свет всегда.А при закрытой в зависимости от состояния датчика движения, только двинулся, и свет будет гореть всегда, пока не откроешь заново дверь, и при закрытой двери , а также отсутствии движения, должен выключится.

arDubino
Offline
Зарегистрирован: 12.01.2017

геркон вообще нафиг не нужен.неправильная у вас методология. тут при нечете будет загоратся при чете гаснуть.

тупо надо проверять движение в туалете ж у вас никто не живет и так.

есть движение включилось. срать и ссать за 3сек явно никто не успеет. так наверно включать надо как раз на пару минут.

а потом если был свет и уже если хочется то при открытие двери и выключать. т.е. при выходе.

evgta
Offline
Зарегистрирован: 02.09.2016

А зачем свет при открытой двери?

все решается без ардуины, нужен концевик на дверь (220в) который при открытой двери обеспечивает постоянный свет, и датчик движения в котором настроить задержку выключения, вот и все.

arDubino
Offline
Зарегистрирован: 12.01.2017

алгоритм такой:

движение -  включилось;

горит 2мин;

дверь открылась и свет горит - выключили

и если в течение последних 30сек было движение то прибавим еще минуту.

все. если опять движение уже цикл ваш сначала.

arduin888
Offline
Зарегистрирован: 08.02.2017

arDubino пишет:

алгоритм такой:

движение -  включилось;

горит 2мин;

дверь открылась и свет горит - выключили

и если в течение последних 30сек было движение то прибавим еще минуту.

все. если опять движение уже цикл ваш сначала.


Спасибо. А как написать код, .....и если в течение последних 30сек было движение то прибавим еще минуту....с помощью millis()

arDubino
Offline
Зарегистрирован: 12.01.2017

1) надо понять на датчиках в какой момент и сколько держиться сигнал.

а) геркон закрыт открыт 0 или 1 сколько сек 

б) датчик движения

иначе ваше миллис попадет в промежуток этих сигналов и вообще будет не понятно открывали дверь и было ли движение.

а потом уже строит алгоритм работы и писать программу

а так у вас тут два момента нжно параллельно решать 1) проверка на открытие закрытие двери и 2) движение внутри туалета

для это и нужно решить а) и б).

arduin888
Offline
Зарегистрирован: 08.02.2017

evgta пишет:

А зачем свет при открытой двери?

все решается без ардуины, нужен концевик на дверь (220в) который при открытой двери обеспечивает постоянный свет, и датчик движения в котором настроить задержку выключения, вот и все.


Ну я думал так, что если дверь открылась, и в течении 3 сек обнаружено движение, то свет остаётся, а включается сразу как дверь открывается. А если дверь только что закрылась и нет движения, то свет выключить.Т.е как будто датчик движения если срабатывает, то это равносильно открытию двери и выпуску человека, а если после срабатывания геркона движения не обнаружено, то это равносильно закрытию двери и выпуску человека. Может запутанной объяснил, хотят как можно лучше объяснить)

arduin888
Offline
Зарегистрирован: 08.02.2017

arDubino пишет:

1) надо понять на датчиках в какой момент и сколько держиться сигнал.

а) геркон закрыт открыт 0 или 1 сколько сек 

б) датчик движения

иначе ваше миллис попадет в промежуток этих сигналов и вообще будет не понятно открывали дверь и было ли движение.

а потом уже строит алгоритм работы и писать программу

а так у вас тут два момента нжно параллельно решать 1) проверка на открытие закрытие двери и 2) движение внутри туалета

для это и нужно решить а) и б).


Как в программном виде написать ...только 3 секунды после открытия двери, чтобы в остальное время если датчик движения будет срабатывать, при открытой или закрытой двери эти срабатывания не учитывались.

arDubino
Offline
Зарегистрирован: 12.01.2017

:))) я ж вам писал все уже выше.

ответит на а и б и поймете все сразу.

иначе в вашем лооп надо проверять со скоростью частоты работы платы.

и время тогда нужен не миллис а тачик вреиени отсчитывать и сравнивать разницы.

миллис нельзя будет применять для задержек отчета горения света. потом что в этом момент не сможете проверить и движение и факт котрытия закрытия двери

arduin888
Offline
Зарегистрирован: 08.02.2017

arDubino пишет:

:))) я ж вам писал все уже выше.

ответит на а и б и поймете все сразу.

иначе в вашем лооп надо проверять со скоростью частоты работы платы.

и время тогда нужен не миллис а тачик вреиени отсчитывать и сравнивать разницы.

миллис нельзя будет применять для задержек отчета горения света. потом что в этом момент не сможете проверить и движение и факт котрытия закрытия двери


Примерчик не могли бы скинуть )

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вообще то лучше считать когда свет должен быть погашен. 1 когда дверь закрыта и 2 когда не было движения в течении 3 минут, от времени закрытия двери . всего 2 булевые переменные соединеные логическим И

 if (a1 && a2) свет выключен;
 else свет включен;

 

arduin888
Offline
Зарегистрирован: 08.02.2017

Вот ваше объяснение мне как то более понятно!Спасибо.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Код не проверял

/*
  #1 геркон на дверь->3 (Door_pin) 1 открыта/0 закрыта
  #2 датчик движения ->2 (Move_pin)
  #3 лампа ->4(Light_pin)
*/
//#1 геркон
const byte Door_pin = 3;// нога геркона
bool Door;// состояние двери 0 закрыта /1 открыта
bool Door_old ; // прошлое Door
//#2 датчик движения
const byte  Move_pin = 2;
bool Move;// 1 было движение в начальный промежуток / 0 нет движения
const uint32_t Time_sens = 3000; // 3 секунды
bool sens; // 1 идет измеряемый промежуток / 0 он окончился
//#3 лампа
const byte Light_pin = 4;
bool Light;
void setup() {
  //#1 геркон
  pinMode(Door_pin, INPUT_PULLUP);
  Door = digitalRead(Door_pin);
  //#2 датчик движения
  pinMode(Move_pin, INPUT);
  //#3 лампа
  pinMode(Light_pin, OUTPUT);
  digitalWrite(Light_pin, Light = 0);
}

void loop() {
  //#1 геркон
  static uint32_t past;
  Door_old = Door;
  Door = digitalRead(Door_pin);
  if (Door_old && ! Door) { // дверь закрылась
    past = millis(); // взвод измерительного времени
    sens = 1;
    Move = 0;
  }
  if (sens && millis() - past >= Time_sens)  // если прошло время измерения, то его отключаем
    sens = 0;
  //#2 датчик движения
  if (sens && digitalRead(Door_pin))// если было движение в нужное время 
    Move = 1; //то вкл флаг
  //#3 лампа
  if (! Door  || ! sens || ! Move ) {  // если дверь открыта или когда не было движения
    if (! Light)digitalWrite(Light_pin, Light = 1 ); // то включить свет, если он был погашен
  }
  else if (Light)digitalWrite(Light_pin, Light = 0);
}

 

arduin888
Offline
Зарегистрирован: 08.02.2017

qwone пишет:

Код не проверял

/*
  #1 геркон на дверь->3 (Door_pin) 1 открыта/0 закрыта
  #2 датчик движения ->2 (Move_pin)
  #3 лампа ->4(Light_pin)
*/
//#1 геркон
const byte Door_pin = 3;// нога геркона
bool Door;// состояние двери 0 закрыта /1 открыта
bool Door_old ; // прошлое Door
//#2 датчик движения
const byte  Move_pin = 2;
bool Move;// 1 было движение в начальный промежуток / 0 нет движения
const uint32_t Time_sens = 3000; // 3 секунды
bool sens; // 1 идет измеряемый промежуток / 0 он окончился
//#3 лампа
const byte Light_pin = 4;
bool Light;
void setup() {
  //#1 геркон
  pinMode(Door_pin, INPUT_PULLUP);
  Door = digitalRead(Door_pin);
  //#2 датчик движения
  pinMode(Move_pin, INPUT);
  //#3 лампа
  pinMode(Light_pin, OUTPUT);
  digitalWrite(Light_pin, Light = 0);
}

void loop() {
  //#1 геркон
  static uint32_t past;
  Door_old = Door;
  Door = digitalRead(Door_pin);
  if (Door_old && ! Door) { // дверь закрылась
    past = millis(); // взвод измерительного времени
    sens = 1;
    Move = 0;
  }
  if (sens && millis() - past >= Time_sens)  // если прошло время измерения, то его отключаем
    sens = 0;
  //#2 датчик движения
  if (sens && digitalRead(Door_pin))// если было движение в нужное время 
    Move = 1; //то вкл флаг
  //#3 лампа
  if (! Door  || ! sens || ! Move ) {  // если дверь открыта или когда не было движения
    if (! Light)digitalWrite(Light_pin, Light = 1 ); // то включить свет, если он был погашен
  }
  else if (Light)digitalWrite(Light_pin, Light = 0);
}

 


Большое спасибо за помощь, сейчас проверю и отпишусь

arduin888
Offline
Зарегистрирован: 08.02.2017

А в чем может быть ошибка, если для меги код идёт, я для нано нет? Не хватает аппаратных средств?или может что в коде поправить?я как то размерность переменных менял, может от этого не идти, типа памяти много уходит?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Я же под обычную пишу.

arduin888
Offline
Зарегистрирован: 08.02.2017

Заработал, я поменял ide на более старую 1.0.6.Спасибо вам ещё раз.

yden
Offline
Зарегистрирован: 30.01.2016

С санузлом (горшок + душ) я поступил следующим образом. 3 группы освещения: основное (потолок диодная лампа 10 вт), ночник (диодная лампа 4 вт) и суперночник (обычный сверхяркий светодиод 5мм, подключен постоянно). Ими управляет ардуинка + часы + релюшки + датчик света (у меня свой дом, датчик стоит на фасаде). По датчику света зажигается основной свет, далее горит до 22-00. Потом основной гаснет и загорается ночник. в час ночи ночник гаснет, остается светить суперночник. Так же к ардуинке подключен выключатель без фиксации. Могу в любой момент включить основной свет. Но он будет гореть 30 минут. 

Мне этот режим удобен. Плюс для выходных я чуть по другому настроил. Датчики движения мне не нравятся резким зажиганием света и большим временем для раскачки. Чуть засиделся на горшке - свет погас, надо руками махать. Основной трафик в санузле - вечером. ночью достаточно тусклого светика чтоб мимо горшка не попасть и руки вымыть. Электроэнергия - так светодиодные лампы мизер потребляют.

arduin888
Offline
Зарегистрирован: 08.02.2017

34
if (Door_old && ! Door) { // дверь закрылась
Не совсем понял, почему && если дверь закрылась, может door_old=!door, если закрылась, ведь произошла инверсия

arDubino
Offline
Зарегистрирован: 12.01.2017

yden пишет:

С санузлом (горшок + душ) я поступил следующим образом. 3 группы освещения: основное (потолок диодная лампа 10 вт), ночник (диодная лампа 4 вт) и суперночник (обычный сверхяркий светодиод 5мм, подключен постоянно). Ими управляет ардуинка + часы + релюшки + датчик света (у меня свой дом, датчик стоит на фасаде). По датчику света зажигается основной свет, далее горит до 22-00. Потом основной гаснет и загорается ночник. в час ночи ночник гаснет, остается светить суперночник. Так же к ардуинке подключен выключатель без фиксации. Могу в любой момент включить основной свет. Но он будет гореть 30 минут. 

Мне этот режим удобен. Плюс для выходных я чуть по другому настроил. Датчики движения мне не нравятся резким зажиганием света и большим временем для раскачки. Чуть засиделся на горшке - свет погас, надо руками махать. Основной трафик в санузле - вечером. ночью достаточно тусклого светика чтоб мимо горшка не попасть и руки вымыть. Электроэнергия - так светодиодные лампы мизер потребляют.

можно еще каждому на лоб фонарик и все . никаких проблем вообще :)))

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

arDubino пишет:

можно еще каждому на лоб фонарик и все . никаких проблем вообще :)))

425623374_1_644x461_led-podsvetka-dlya-u

Logik
Offline
Зарегистрирован: 05.08.2014

Прям священная чаша вдохновения)))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

arduin888 пишет:
34 if (Door_old && ! Door) { // дверь закрылась Не совсем понял, почему && если дверь закрылась, может door_old=!door, если закрылась, ведь произошла инверсия

Геркон обеспечивает контакт, когда попадает в магнитное поле. Если у вас программная подтяжка, то это резистор на питание(PULLUP). Так что если дверь закрыта то Door ==0 или ! Door. Если (Door_old && ! Door) то раньше (прошлый опрос)дверь была открыта, а сейчас закрыта. Ну и дальше время начала процесса ловить сигналы с датчика движения.

arduin888
Offline
Зарегистрирован: 08.02.2017

Понял- это чтобы определить именно момент не срабатывания геркона, а факт закрытия двери, т.е сначала в начальных установках задаем что дверь открыта
pinMode(Door_pin, INPUT_PULLUP);
Door = digitalRead(Door_pin); т.е если бы она была открыта было бы 1, а потом если её закрыли выполняется условиеDoor_old = Door;
Door = digitalRead(Door_pin);
if (Door_old && ! Door)

Hans667
Offline
Зарегистрирован: 18.01.2019

ZIA пишет:

Вы не правильно сформулировали задачу! Алгоритм давно известен, при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери

а можно "давно известный алгоритм" продублировать?!я уже все интернеты перерыл в его поисках-везде одни датчики.

bwn
Offline
Зарегистрирован: 25.08.2014

Hans667 пишет:

а можно "давно известный алгоритм" продублировать?!я уже все интернеты перерыл в его поисках-везде одни датчики.

Пожалуйста:

 при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

bwn пишет:

Пожалуйста:

 при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери

Пожалуйста - постройте матрицу событий. Их всего 2 - т.е. всего 4 варианта. Каждый вариант опишите оператором if(). И принимайте решения. А вообще - в песочницу...

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

mykaida пишет:

Пожалуйста - постройте матрицу событий. Их всего 2 - т.е. всего 4 варианта. Каждый вариант опишите оператором if(). И принимайте решения. А вообще - в песочницу...

Уважаемый, а вы, собственно, кто такой, что тут по всему форуму раскомандовались?

bwn
Offline
Зарегистрирован: 25.08.2014

mykaida пишет:

bwn пишет:

Пожалуйста:

 при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери

Пожалуйста - постройте матрицу событий. Их всего 2 - т.е. всего 4 варианта. Каждый вариант опишите оператором if(). И принимайте решения. А вообще - в песочницу...

Гм, а я вроде ничего не спрашивал. Человек попросил продублировать алгоритм, его желание выполнено.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

А геркон зачем? Датчик движения видит шебуршение - свет горит ... не видит - через несколько секунд выключить.