Если темновато и кто-то подошел, плавно включить свет
- Войдите на сайт для отправки комментариев
Ср, 25/10/2017 - 16:33
Идея не нова, но именно в такомм исполнении не нашел, пришлось сочинять самому, и чето зашел втупик и около года туплю на месте с переменным успехом.
Дано:
1. Arduino UNO или NANO Китайская - 1шт или другая, куда скетч влезет.
2. GY-30 Датчик освещенности - 1шт (А4 и А5 // выходы SDA и SCL (Add - в земле))
3. HC-SR04 Датчик измерения расстояния - 1шт (8,9// выходы для Trig и Echo)
4. Светодиодик, работающий, 1шт (как то жив на 5 вольтах)
Логика (хотелось бы): Если светло, более 500lx думает датчик GY-30, то просто ждем. Если темно в помещении, наже 500lx думает датчик GY-30, то пусть HC-SR04 измеряет расстояние до объекта и если до объекта менее 90 см, то надо потихоньку-потихоньку включить светодиодик. А когда становится больше то так же плавно выключить.
Если резко стало светло более 500lx думает датчик GY-30, вырубить светодиод и не измерять расстояние пока опять не потемнеет.
Помогите разобраться и написать код. Вот что я осилил, но все идет не так как то.
#include <Wire.h> #include <BH1750FVI.h> #include <Ultrasonic.h> BH1750FVI myBH1750; Ultrasonic ultrasonic(8,9); // выходы для Trig и Echo #define LED_PIN 3 void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); } void loop() { delay(1000); if (myBH1750.readLightLevel() >500 ) { Serial.print(ultrasonic.distanceRead(CM)); // выводим расстояние в сантиметрах Serial.println("cm"); // выводим надпись "cm" if (ultrasonic.distanceRead(CM) <30) { Serial.print("Ярко: "); Serial.print(myBH1750.readLightLevel()); Serial.println(); for(int i=255;i>=0;i--) { analogWrite(LED_PIN, i); analogWrite(LED_PIN, LOW); //delay(5); // ставим задержку для эффекта } } else { Serial.print("Тускло: "); Serial.print(myBH1750.readLightLevel()); Serial.println(); for(int i=0;i<=255;i++) { analogWrite(LED_PIN, i); analogWrite(LED_PIN, HIGH); } } } }
Попробуйте объяснить (себе - мне не надо) что у Вас делают строки 32 и 45.
Потом, просто выбросьте их.
А задержки верните на место.
Спасибо, но всеравно не работает. Светодиод загорается или сразу или чуть с задержко, но резко в обоих случаях. А в консоле вот тоже не правильно:
А когда накрываю лайтсенсор, то не идет вывод в консоль. открываю, вывод вроде возобновляется, но светодиод горит...
Спасибо, но всеравно не работает. Светодиод загорается или сразу или чуть с задержко,
Блин, Вы сегодня все как сговорились.
Давайте код в том виде в ккаком он сейчас. Откуда я знаю, что и как Вы меняли?
вот еще добавить хотел. поменял знаки больше меньше в параметрах яркости 500lx и расстояня. Стало срабатывать вроде, но если темно, то просто мигает плавно загораясь и плавно затухая, А если светло, то в консоль вообще ничего не выводит.
А если светло, то в консоль вообще ничего не выводит.
И не должно. В какой строке программы Вы что-то выводите. если светло? Ни в какой! И с чего будет что-то выводиться.
вот еще добавить хотел. поменял знаки больше меньше в параметрах яркости 500lx и расстояня. Стало срабатывать вроде, но если темно, то просто мигает плавно загораясь и плавно затухая,
Так и должно быть. Почти так. На самом деле, оно должно плавно гаснуть, потом резко загораться и снова плавно гуснуть и так постоянно. Что у Вас написано в строках 22-35? Там написано: если расстояние меньше 30, то прогнать яркость от 255 до 0. Так оно и делает.
А чего после строки 43 задержку не поставили?
Вот поставил. Теперь пишет "Ярко: 75" а это не должно быть ярко и загорается не плавно, а резко. Зато затухает плавно. Но работает как маяк.
А когда более 500lx то и в консоль не пишет и светодиод не зажигает.
А у меня задача другая была. Хотелось бы, что б светило постоянно когда меньше 500 lx и расстояние менее 30 см .
В противном случае просто в консоль писало, что оно там видит, освещенность и расстояние. Либо ничего. (но тут трудно судить пока, не висит ли онео случайно.)
Теперь пишет "Ярко: 75" а это не должно быть ярко
Кому не должно? Смотрим Вашу программу. СТроки 25-26. Вы печатаете слово "Ярко", а затем читаете "myBH1750.readLightLevel()" и печатаете что получилось. Вы нигде и никак не проверяете что там прочиталось - 75 или 175, просто читаете и печатаете.
и загорается не плавно, а резко. Зато затухает плавно. Но работает как маяк.
Ну, правильно, так и должно быть. Что у Вас написано в строках 28-33? Вы начинаете цикл с максимальной яркости - 255. Как написано так и работает.
работает как маяк.
Ну, правильно, так и должно быть
Вот поставил. Теперь пишет "Ярко: 75" а это не должно быть ярко и загорается не плавно, а резко. Зато затухает плавно. Но работает как маяк.
Ну, правильно, так и должно быть. Вы прогоняете цикл от 255 до 0, потом, при следующем проходе loop снова от 255 до 0 и так постоянно, я Вам об этом ещё в прошлом посте писал.
А когда более 500lx то и в консоль не пишет и светодиод не зажигает.
Опять же я Вам в прошлом посте писал - Вы ничего не выводите, так с чего бы чему-то выводиться? У Вас проверка в строке 17. Если < 500, то выполнять строки 18-47. А иначе - НИЧЕГО. Т.е. вообще ничего. Вот ничего и не делается.
Хотелось бы, что б светило постоянно когда меньше 500 lx и расстояние менее 30 см . В противном случае просто в консоль писало, что оно там видит, освещенность и расстояние.
Фигасе упорство ))

Может так
Спасибо огромное, vosara!
По логике работает отлично. И сразу светодиод выключен (как положено) и загорается сторого когда надо. Это Отлично. Только тепрь если он по логике правильно включился, то при увеличении дистанции свыше положенного, остается светиться на минимальном уровне и уже не гаснет совсем и если освещенность более 500 тоже не гаснет.
Только тепрь если он по логике правильно включился, то при увеличении дистанции свыше положенного, остается светиться на минимальном уровне и уже не гаснет совсем и если освещенность более 500 тоже не гаснет.
А что самому доделать свосем никак.
reanews,
Ваша задача проста как валенок (даже код от vosara излишне переусложнён, я уж не гороюу про Ваш). Делает она просто, в несколько строк, на одном дыхании, просто один в оди перекладываю Вашу хотелку.
Показать как?
Ну чего ругаешься то.?! Я и так башку сломал.
Добавил в код уважаемого vosara после 45й строки
и поставил задержку 10 .
и теперь гаснет. Отлично, по моему мнению получилось. Спасибо vosara !
А если можно лучше, конечно покажи. Только не нервничай так. Нервы их биречь надо. И спасибо, что помогаешь.
Ну чего ругаешься то.?!
Я ругаюсь? Я ещё и не начинал! Вы не видели, как я ругаюсь :)
А если можно лучше, конечно покажи.
Не столько лучше, сколько проще. А главное - Вы сами это могли сделать за 10 минут, если бы не начали придумывать сами себе сложности.
Я покажу Вам как нададо рассуждать, чтобы Вы впредь не мучились, а делали простые вещи просто, а не писали
Я и так башку сломал.
Не надо! Башка ещё пригодится шапку примеривать.
Только не нервничай так.
Я спокоен как удав, не сомневайтесь.
Сейчас напишу как бы Вам нужно было подходить к задаче. Возвращайтесь через полчасика, почитаете и удивитесь как всё просто и очевидно.
И, да, давайте общаться "на Вы", как нормальные, воспитанные люди.
Итак, чего надо-то?
Надо, чтобы при выполнении двух условий: «темно» и «кто-то рядом» плавно включался свет, а если эти условия (хотя бы одно из них) не выполняются – свет плавно гас. Правильно?
Уточним задачу. Если условия выполнились и свет начал плавно зажигаться, а в процессе зажигания (когда он ещё не успел зажечься на полную) условия перестали выполняться, он должен прекратить «зажигание» и немедленно начать плавно гаснуть. И наоборот, если в процессе угасания условия начали выполняться, он должен немедленно прекратить гаснуть, а начать разгораться. Этого нет ни в Вашем коде, ни в коде от vosara, но это разумно, согласитесь.
Ну, тогда так и пишем (просто дословно по формулировке задачи):
Обратите внимание на приписку «esli_ets_kuda» - она означает, что функция делает свет ярче (тусклее) если он ещё не на максимальной (минимальной) яркости. А если уже на максимальной (минимальной), то ничего не делает.
Собственно функция loop() готова. Больше ничего не нужно. Она полностью реализует Вашу хотелку, включая и моё дополнительное уточнение. Осталось написать функции temno(), kto_to_ryadom(), vklycharm_esli_ets_kuda() и gasim_esli_est_kuda()
До сих пор Вам всё понятно? Вам нужно просто было дословно написать хотелку, ничего не выдумывая.
Пишем недостающие функции. Первые две тривиальны:
Что касается остальных двух функций, то чтобы сделать «немножко светлее» или «немножко темнее», нужно помнить «а как оно сейчас». Потому заводим переменную «состояние фонаря». Сами функции тоже тривиальны:
Ну, вот собственно и всё! Осталась начальная инициализация, которая у Вас вроде и так сделана. Давайте соберём всё в кучу:
Вот и всё. Это вся Ваша программа с учётом моего замечания о том, что если условие поменялось, то нужно сразу менять режим, а не ждать пока предыдущее действие закончится.
Согласитесь, что я просто выписал Вашу хотелку, ничего не придумывая. Если бы Вы не полезли всё усложнять, то и Вы бы это легко и непринуждённо написали. Попробуйте впредь так и поступать.
Да, у меня нет под рукой датчиков, так что я ничего не проверял. Идейно там всё верно и работать должно. Если где-то что-то по мелочи ляпнуто, скажите как себя ведёт – поправим. А лучше – поправьте сами. Вы же всё понимаете, что написано, так ведь?
Действительно "простенько и со вкусом".
Я бы ещё попробовал убрать задержку в loop. Процедура ultrasonic.distanceRead достаточно медленная и задержка там сама по себе образуется. Как бы не слишком большая даже.
Огромное спасибо ЕвгенийП! Все круто работает! Я в восторге и от результата и от объяснения! Прямо именно так как хотелось! И правки очень к месту!
Вот сейчас сосредоточусь и попробую добавить сюда подстроечные резисторы RKT-065-201-R 200 для ручного изменения расстояния срабатывания на 11 ногу и второй уровня освещенности срабатывания, что бы в темноте срабатывало и не тухло от своего же света на 5ю ногу. (только что решил доделать.) Ведь по сути это просто ночник, что бы ночью или ранним зимним утром шею не свернуть и свет резкий по глазам не бил.
и не тухло от своего же света
При этом простой алгоритм ЕвгенийП перестаёт работать.
Если датчик засвечивается своей же лампой - любой аглоритм будет колбасить. Надо просто, чтобы датчик ею не завсвечивался.
Датчик света практически нужен только для определения "день-ночь". Днём ничего включать не надо, а ночью включать всегда при срабатывании датчика расстояния.
Ну я немного поясню изначальную задумку. Этот светильник не только для темного туалета или ванной, но и для коридора например. Т.е. туда например выходят какие то двери или другое тусклое освещение и когда ну просто пройти там или разуться/обуться яркого света не надо то и не надо. Если яркий надо то щелкну выключателем. Именно по этому я замериваю освещенность. Так бы просто фоторезистора хватило с градацией один-ноль.
есть же готовые промышленные решения датчиков движения и освещённости, так же - собранное к кучку: светильник с датчиком движения и освещённости.
Ну нет.во всех этих датчиках движения используется простая задержка. А если чуть застрял т потухло, а так обязательно случиться. То все, разучивай танец или морскую азбуку.именно так не хотел. Хотел, чтоб меня чувствовали )))) (полутейка)
Ну нет.во всех этих датчиках движения используется простая задержка. А если чуть застрял т потухло, а так обязательно случиться. То все, разучивай танец или морскую азбуку.именно так не хотел. Хотел, чтоб меня чувствовали )))) (пошутейка)
Только у обычного датчика движения область видимости 90-180 градусов, а у вашего датчика HC-SR04 узкое поле зрения, чуть от луча отклонился на сантиметр хоть, и он уже ничего не видит. Ну или больше лучшей делать как на картинке ))
Ну и если велосипед поставить неподвижный рядом, он его будет вечно подсвечивать? Датчик движения неподвижные объекты игнорирует сам. Улучшение не очень очевидно.
Про внелик само собой понятно, что надо ставить мимо велика. другой недостаток у ультразвука в почти рандомном поглащении/рассеивании "луча" . Порой при направлении на ворсистую поверхность или со сложным контуром или просто пористую, прибор "ошибается".
Вот вопрос встает об адекватной замене, на лазер например или инфракрасный...
Бывают такие приемнико/передатчики ?
Порой при направлении на ворсистую поверхность или со сложным контуром или просто пористую, прибор "ошибается".
Да, у мена кота "не видит".
Ну кота ладно, коту и нюха и кошачего зрения для ориентирования достаточно, а вот меня в свитере не видет, это плохо. пишет, что я то на 3км ушел то меньше..., а он сам так не умееет далеко смотреть. Просто проскакивает Огромное число периодически и все тут.
У лазера обзор - линия. Вот нашел инфракрасный датчик припятствия, но у него дальность зависит от цвета и дальность почти вплотную. Ну неужели, нет ничегонадежного с углом обзора хотя бы градусов 50?
Бывают такие приемнико/передатчики ?
Вам нужен датчик объема (почти датчик света только в другом диапазоне), на Алиэкспрессе стоит примерно 1$, работает на частоте 5 ГГц. Даже за тонкой стенкой работает и сквозь корпус, дырку ковырять не нужно ))
https://ru.aliexpress.com/item/5-8GHZ-Smart-Sensoring-Switch-Microwave-Radar-Module-6-9M-Home-Control/32645549496.html?spm=a2g0s.8937460.0.0.CvscLJ
https://ru.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html?spm=a2g0s.8937460.0.0.RNYQfo
И там еще есть подобные.
А на открытом пространстве работает? В том смысле, что может определить есть ли моя тушка на разумном расстоянии от него или нет, если установлен на улице?
Класс! когда задавал этот вопрос, думал что мне и так все ответы известны. Но нет. Это Что-то очень новенькое!
А какие он показания дает? А каком объеме? Угол большей? Вообще чуть понятнее описания на сайте можно? Заранее спасибо!
Такие датчики стоят в раздвижных дверях магазинов, в том числе и на улицу смотрят. Работают хорошо, ловят доплеровское смещение отраженного сигнала. За такую цену да, это что-то новое ))
у меня RCWL стоит над дверью на улице при входе в дом - слишком чуствительный :( - листва, животные, ветки деревьев - реагирует на все что шевелиться, когда проект делал - тестировал в офисе/комнате - для этого отличное решение.
благо я его параллельно с PIR датчиком опрашиваю
Что то Я совсем с этими войдами запутался, поправьте
АлексейЭтоЯ
21 строку посмотрите и спросите себя, что там произойдёт, если ф-я starting вернёт истину?
АлексейЭтоЯ
21 строку посмотрите и спросите себя, что там произойдёт, если ф-я starting вернёт истину?
Что то Я совсем с этими войдами запутался, поправьте
А ботинки почистить не надо?
Как возвращает значение эта функция? Может стОит теорию почитать?
bool
starting(
void
) { digitalRead(PIRPIN) == HIGH;}
Для Варота
Если, за поправленные скобки, тебе памятник нужно поставить, или 100$ дать, не много хочешь, работать не пробовал, или тяжелее клавиатуры ничего не держал, так ты любишь общаться, или Я тебе не так понял?? Или это шутишь вы так??
Если, за поправленные скобки, тебе памятник нужно поставить, или 100$ дать, не много хочешь,
Нах мне твои доллары не сдались.
Я понимаю, что сейчас от тебя будут только обиды как от гимназистки, но надеюсь, ты про себя впредь подумаешь, и будешь вести себя как человек, а не как...
К тебе две претензии: по форме, и по сути.
1. по форме: перечитай свой пост. Ты ввалился в тему и заявил: "что-то я запутался, поправьте". Ты, бля, сержант-дембель, а тут духи собрались, деду что-то подправлять? Тебя мама не учила говорить "пожалуйста" и здороваться? Вот я и спросил тебя, начёт «ботинки почистить» - "Вы, барин токма скажите и мы мигом почистим, не извольте сумлеваться". Когда остынешь от обидок, согласишься, что я прав.
2. по сути: опять же перечитай свой пост. Что значит, ты запутался? Ты хоть бы написал, что ты хотел сделать! Хрен же тебя знает, что ты там делал, что такое получилось. Олег вон потёр хрустальный шар, чего-то там догадался, но если выяснится, что неправильно догадался - получит вагон зря потерянного времени. И такое тут каждый день. А всё только потому, что тебе даже хотелку свою лень описать – поправьте и всё тут! Сами разберётесь что там и как!
Вот как-то так. Думай впредь, как задавать вопросы, чтобы получить ответы, а не посылания.
Ребята, давайте жить дружно. http://www.consultant.ru/cons/cgi/online.cgi?req=home#doc/LAW/221804/100...
статья 5.61
Немного доработал алгоритм Евгения, теперь все должно работать нормально и при освещении датчика светодиодом.
Первый вариант (из недостатков - постоянное отключение светодиода при наличии стороннего света, при его резком появлении):
Второй вариант (недостаток - постоянное отключение света при его отсутствии):