Делаю подсветку в коридор
- Войдите на сайт для отправки комментариев
Сб, 31/12/2016 - 21:37
Здравствуйте! Хочу сделать подсветку в коридор. Выключатели расположены крайне неудобно и постоянно приходится идти на ощупь
Нашёл в интернете код который при срабатывании датчика движения сравнивает состояние входа АЦП от фоторезистора и если всё ОК то включает реле на заданное время к примеру 5 сек. По истечению этого времени проверяется состояние входа от PIR датчика и если есть движение то - повтор заданного времени работы. В принципе всё отлично, но как то скучно. Моих познаний хватило лишь на добавление нескольких каналов на выход, последовательное их включение/выключение и начальная яркость пока выбрана -100 (потом подберу более оптимальну).

Помогите пожалуйста добавить ещё один функционал.
В основном мы просто пересекаем коридор и редко когда нужен полный накал свечения ламп/лед лент, поэтому было бы не плохо что бы ленты загорались к примеру в пол накала, а если задержались то после повторной проверки присутствия разгорались бы так же последовательно уже на полную мощность.
int const Pot = A5; //Потенцинометр 10к: int const Light = A7; //Датчик света: int const Led1 = 4; int const Led2 = 5; int const Led3 = 9; int const Led4 = 10; int const Pirsens = 3; // Цифровой датчик движения: int const pause = 5000; // время работы 5 сек. long unsigned int lowIn; boolean lockLow = true; boolean takeLowTime; void setup() { // Определяем входы и выходы: pinMode(Pirsens, INPUT); pinMode(Led1, OUTPUT); pinMode(Led2, OUTPUT); pinMode(Led3, OUTPUT); pinMode(Led4, OUTPUT); // определяем состояние: digitalWrite(Led1, HIGH); digitalWrite(Led2, HIGH); digitalWrite(Led3, HIGH); digitalWrite(Led4, HIGH); } void loop() { int pirsensVal = digitalRead(Pirsens); int lightVal = analogRead(Light); int potVal = analogRead(Pot); int lightLimit = map(potVal, 0, 1023, 200, 500); if (pirsensVal == HIGH && lightVal < lightLimit) { if (lockLow) { lockLow = false; analogWrite(Led1, 100); delay(100); analogWrite(Led2, 100); delay(100); analogWrite(Led3, 100); delay(100); analogWrite(Led4, 100); delay(100); } takeLowTime = true; } else { if (takeLowTime) { lowIn = millis(); takeLowTime = false; } if (!lockLow && millis() - lowIn > pause) { lockLow = true; digitalWrite(Led1, HIGH); delay (100); digitalWrite(Led2, HIGH); delay (100); digitalWrite(Led3, HIGH); delay (100); digitalWrite(Led4, HIGH); } } }
Код написал но не проверял
С Новым Годом! Спасибо за помощь, но программа не работает. При включении загораются Led1, 3, и 4. Горят постоянно и никакой реакции на движения.
Ну там ошибки. Надо тестировать на железе. Попробуйте протестировать и разобраться в этом коде. Он рабочий.
Светодиоды загораются независимо от освещённости. С циклом примерно три секунды становятся ярче, потом темнее и затем тухнут. Так как датчик движения держит на выходе высокий уровень минимум 5 сек. то заменил в коде время с 3000 на 6000. Теперь разгорается на 6 сек. и если нет движения то гаснет, если есть движение то увеличивается яркость. Затем ждём пока истечёт время и светодиоды должны последовательно потухнуть, но выключение происходит сначала понижением яркости, а потом уж окончательным. Ещё один момент. Повторно активировать включение возможно тольке после паузы. И иногда код ведёт себя крайне не стабильно. Тоесть при явном движении может потухнуть, не отработать некоторые светодиоды.
Светодиоды загораются независимо от освещённости. С циклом примерно три секунды становятся ярче, потом темнее и затем тухнут. Так как датчик движения держит на выходе высокий уровень минимум 5 сек. то заменил в коде время с 3000 на 6000. Теперь разгорается на 6 сек. и если нет движения то гаснет, если есть движение то увеличивается яркость. Затем ждём пока истечёт время и светодиоды должны последовательно потухнуть, но выключение происходит сначала понижением яркости, а потом уж окончательным. Ещё один момент. Повторно активировать включение возможно тольке после паузы. И иногда код ведёт себя крайне не стабильно. Тоесть при явном движении может потухнуть, не отработать некоторые светодиоды.
Думаю, что дело в засветке подсветкой датчика света.
Пишите данные с датчика освещённости в глобальную переменную при обнаружении движения, и НЕ обновляйте её пока подсветка горит.
замените цифры 500,700,1000,1500 на 0 и светодиоды будут реагировать сразу на движение. Или малыми величинами. Большие величины просто делают веселье в подсветке, какое вы и хотели, когда открыли тему.
Да с этими цифрами то всё нормально. Их можно опытным путём подобрать. Проблема в другом. 1) Срабатывает при любом освещении. 2) Если освещение 100% то гаснет сначала на 50% и потом через паузу до 0%. Если бы гасла без паузы то было бы очень замечательно, но так как эта же пауза заявлена и на разгорание то тут просто изменить константы не прокатит. 3) В режиме выключения иногда (чаще всего) 3 и 4 лед гаснут сразу в 0% - выглядит не симпатично. 4) После выключения код выдерживает паузу в 4-5 секунд. Только по истечении этой паузы можно опять активировать включение лед. В практическом применении это совсем плохо, можно оказаться в полной темноте.
Ну так "обрабатывай напильником". У меня нет вашего "железа" , так что практика и еще практика.
на 1- отработайте работу на кнопке. А потом сведите ваши датчики к иммтации работы кнопки.# Замечание нажатие кнопки 0
на 2- так и предусмотрено. 0-50-100-50-0
на 3 там все светодиоды равноцены. А класс даже стирает отличия подностью
на 4 . это вы путаете. то у вас см пунк 2, то смотри пунк 4
ПС: Я выложил эволюцию развития такого скетча(3 варианта). Разбирайтесь сами. Программирование это не только залить "чужой скетч", но и наладка под ваши условия и поиск глюков в чужом скетче. Приехать я к вам лично не смогу, даже если у меня было бы желание.
ПС2: А еще выкрутите ваш пирометр на мин паузу. Это пауза тоже сбивает работу.
Ну здесь мои глюки. Я пишу в своем стиле и под свою концепцию программирования. Не потому что не могу иначе, а потому что надо развивать именно эту. Попробуй разобраться со своим вариантом. Направление я указал, осталась ваша реализация. Может другие предложат другое. Я не возражаю, тем более это ваша тема, а не моя. Да и форум тоже не мой. Я такой же как и вы, приходящий.
Попробуйте такой код. Может его Вам будет проще понять