Автоматическое освещение в туалете
- Войдите на сайт для отправки комментариев
Здравствуйте уважаемые специалисты, только начинаю изучать огромный мир ардуино, хотелось бы вашей помощи, а то никак не получается до конца вникнуть. Проблема такая: нужно, чтобы свет в туалете включался при открытии двери, и если после закрытия двери обнаружено движение в течении 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);
}
}
Вы не правильно сформулировали задачу! Алгоритм давно известен, при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери
В смысле?Мне нужно, чтобы всегда при открытой двери свет горел.А если закрытая дверь и движение есть, то свет горит не выключаясь, даже если никто не двигается. Если при закрытой двери, движения нет, то свет в туалете выключается.Про вентилятор не слова, пока хочу наладить только свет.
Т.е алгоритм такой-при открытой двери -свет всегда.А при закрытой в зависимости от состояния датчика движения, только двинулся, и свет будет гореть всегда, пока не откроешь заново дверь, и при закрытой двери , а также отсутствии движения, должен выключится.
геркон вообще нафиг не нужен.неправильная у вас методология. тут при нечете будет загоратся при чете гаснуть.
тупо надо проверять движение в туалете ж у вас никто не живет и так.
есть движение включилось. срать и ссать за 3сек явно никто не успеет. так наверно включать надо как раз на пару минут.
а потом если был свет и уже если хочется то при открытие двери и выключать. т.е. при выходе.
А зачем свет при открытой двери?
все решается без ардуины, нужен концевик на дверь (220в) который при открытой двери обеспечивает постоянный свет, и датчик движения в котором настроить задержку выключения, вот и все.
алгоритм такой:
движение - включилось;
горит 2мин;
дверь открылась и свет горит - выключили
и если в течение последних 30сек было движение то прибавим еще минуту.
все. если опять движение уже цикл ваш сначала.
алгоритм такой:
движение - включилось;
горит 2мин;
дверь открылась и свет горит - выключили
и если в течение последних 30сек было движение то прибавим еще минуту.
все. если опять движение уже цикл ваш сначала.
Спасибо. А как написать код, .....и если в течение последних 30сек было движение то прибавим еще минуту....с помощью millis()
1) надо понять на датчиках в какой момент и сколько держиться сигнал.
а) геркон закрыт открыт 0 или 1 сколько сек
б) датчик движения
иначе ваше миллис попадет в промежуток этих сигналов и вообще будет не понятно открывали дверь и было ли движение.
а потом уже строит алгоритм работы и писать программу
а так у вас тут два момента нжно параллельно решать 1) проверка на открытие закрытие двери и 2) движение внутри туалета
для это и нужно решить а) и б).
А зачем свет при открытой двери?
все решается без ардуины, нужен концевик на дверь (220в) который при открытой двери обеспечивает постоянный свет, и датчик движения в котором настроить задержку выключения, вот и все.
Ну я думал так, что если дверь открылась, и в течении 3 сек обнаружено движение, то свет остаётся, а включается сразу как дверь открывается. А если дверь только что закрылась и нет движения, то свет выключить.Т.е как будто датчик движения если срабатывает, то это равносильно открытию двери и выпуску человека, а если после срабатывания геркона движения не обнаружено, то это равносильно закрытию двери и выпуску человека. Может запутанной объяснил, хотят как можно лучше объяснить)
1) надо понять на датчиках в какой момент и сколько держиться сигнал.
а) геркон закрыт открыт 0 или 1 сколько сек
б) датчик движения
иначе ваше миллис попадет в промежуток этих сигналов и вообще будет не понятно открывали дверь и было ли движение.
а потом уже строит алгоритм работы и писать программу
а так у вас тут два момента нжно параллельно решать 1) проверка на открытие закрытие двери и 2) движение внутри туалета
для это и нужно решить а) и б).
Как в программном виде написать ...только 3 секунды после открытия двери, чтобы в остальное время если датчик движения будет срабатывать, при открытой или закрытой двери эти срабатывания не учитывались.
:))) я ж вам писал все уже выше.
ответит на а и б и поймете все сразу.
иначе в вашем лооп надо проверять со скоростью частоты работы платы.
и время тогда нужен не миллис а тачик вреиени отсчитывать и сравнивать разницы.
миллис нельзя будет применять для задержек отчета горения света. потом что в этом момент не сможете проверить и движение и факт котрытия закрытия двери
:))) я ж вам писал все уже выше.
ответит на а и б и поймете все сразу.
иначе в вашем лооп надо проверять со скоростью частоты работы платы.
и время тогда нужен не миллис а тачик вреиени отсчитывать и сравнивать разницы.
миллис нельзя будет применять для задержек отчета горения света. потом что в этом момент не сможете проверить и движение и факт котрытия закрытия двери
Примерчик не могли бы скинуть )
Вообще то лучше считать когда свет должен быть погашен. 1 когда дверь закрыта и 2 когда не было движения в течении 3 минут, от времени закрытия двери . всего 2 булевые переменные соединеные логическим И
Вот ваше объяснение мне как то более понятно!Спасибо.
Код не проверял
Код не проверял
Большое спасибо за помощь, сейчас проверю и отпишусь
А в чем может быть ошибка, если для меги код идёт, я для нано нет? Не хватает аппаратных средств?или может что в коде поправить?я как то размерность переменных менял, может от этого не идти, типа памяти много уходит?
Я же под обычную пишу.
Заработал, я поменял ide на более старую 1.0.6.Спасибо вам ещё раз.
С санузлом (горшок + душ) я поступил следующим образом. 3 группы освещения: основное (потолок диодная лампа 10 вт), ночник (диодная лампа 4 вт) и суперночник (обычный сверхяркий светодиод 5мм, подключен постоянно). Ими управляет ардуинка + часы + релюшки + датчик света (у меня свой дом, датчик стоит на фасаде). По датчику света зажигается основной свет, далее горит до 22-00. Потом основной гаснет и загорается ночник. в час ночи ночник гаснет, остается светить суперночник. Так же к ардуинке подключен выключатель без фиксации. Могу в любой момент включить основной свет. Но он будет гореть 30 минут.
Мне этот режим удобен. Плюс для выходных я чуть по другому настроил. Датчики движения мне не нравятся резким зажиганием света и большим временем для раскачки. Чуть засиделся на горшке - свет погас, надо руками махать. Основной трафик в санузле - вечером. ночью достаточно тусклого светика чтоб мимо горшка не попасть и руки вымыть. Электроэнергия - так светодиодные лампы мизер потребляют.
34
if (Door_old && ! Door) { // дверь закрылась
Не совсем понял, почему && если дверь закрылась, может door_old=!door, если закрылась, ведь произошла инверсия
С санузлом (горшок + душ) я поступил следующим образом. 3 группы освещения: основное (потолок диодная лампа 10 вт), ночник (диодная лампа 4 вт) и суперночник (обычный сверхяркий светодиод 5мм, подключен постоянно). Ими управляет ардуинка + часы + релюшки + датчик света (у меня свой дом, датчик стоит на фасаде). По датчику света зажигается основной свет, далее горит до 22-00. Потом основной гаснет и загорается ночник. в час ночи ночник гаснет, остается светить суперночник. Так же к ардуинке подключен выключатель без фиксации. Могу в любой момент включить основной свет. Но он будет гореть 30 минут.
Мне этот режим удобен. Плюс для выходных я чуть по другому настроил. Датчики движения мне не нравятся резким зажиганием света и большим временем для раскачки. Чуть засиделся на горшке - свет погас, надо руками махать. Основной трафик в санузле - вечером. ночью достаточно тусклого светика чтоб мимо горшка не попасть и руки вымыть. Электроэнергия - так светодиодные лампы мизер потребляют.
можно еще каждому на лоб фонарик и все . никаких проблем вообще :)))
можно еще каждому на лоб фонарик и все . никаких проблем вообще :)))
Прям священная чаша вдохновения)))
Геркон обеспечивает контакт, когда попадает в магнитное поле. Если у вас программная подтяжка, то это резистор на питание(PULLUP). Так что если дверь закрыта то Door ==0 или ! Door. Если (Door_old && ! Door) то раньше (прошлый опрос)дверь была открыта, а сейчас закрыта. Ну и дальше время начала процесса ловить сигналы с датчика движения.
Понял- это чтобы определить именно момент не срабатывания геркона, а факт закрытия двери, т.е сначала в начальных установках задаем что дверь открыта
pinMode(Door_pin, INPUT_PULLUP);
Door = digitalRead(Door_pin); т.е если бы она была открыта было бы 1, а потом если её закрыли выполняется условиеDoor_old = Door;
Door = digitalRead(Door_pin);
if (Door_old && ! Door)
Вы не правильно сформулировали задачу! Алгоритм давно известен, при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери
а можно "давно известный алгоритм" продублировать?!я уже все интернеты перерыл в его поисках-везде одни датчики.
а можно "давно известный алгоритм" продублировать?!я уже все интернеты перерыл в его поисках-везде одни датчики.
Пожалуйста:
при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери
Пожалуйста:
при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери
Пожалуйста - постройте матрицу событий. Их всего 2 - т.е. всего 4 варианта. Каждый вариант опишите оператором if(). И принимайте решения. А вообще - в песочницу...
Пожалуйста - постройте матрицу событий. Их всего 2 - т.е. всего 4 варианта. Каждый вариант опишите оператором if(). И принимайте решения. А вообще - в песочницу...
Уважаемый, а вы, собственно, кто такой, что тут по всему форуму раскомандовались?
Пожалуйста:
при первом открытии-закрытии двери свет включается, при втором, выключается, при включенном свете работает вентилятор и открывается приточная задвижка на входной двери
Пожалуйста - постройте матрицу событий. Их всего 2 - т.е. всего 4 варианта. Каждый вариант опишите оператором if(). И принимайте решения. А вообще - в песочницу...
Гм, а я вроде ничего не спрашивал. Человек попросил продублировать алгоритм, его желание выполнено.
А геркон зачем? Датчик движения видит шебуршение - свет горит ... не видит - через несколько секунд выключить.