как остановить цикл analogWrite
- Войдите на сайт для отправки комментариев
Сб, 09/09/2017 - 14:45
Всем добрый день!
Задача - при нажатии кнопки плавно зажечь ленту и остановить её в максимальной яркости, при выкл соотв. наоборот.
void loop() { if (digitalRead(BUTPV)== HIGH) { for (brightness = 0; brightness <= Maxbright; brightness++) { analogWrite(pinOUT, brightness); delay(smoothSwitchDelayStep - pause); } //break; //goto m; if (brightness == Maxbright){digitalWrite(pinOUT, HIGH);} } else { digitalWrite(pinOUT, LOW);} }
Антидребезг реализую аппаратно, проверял работает.
Проблема в том, что цикл повторяется. Пробывал Break и метку с переходом на digitalWrite - безуспешно.
Однократно программу реализовывать не вариант, так как нужно постоянное слежение за кнопкой.
Заранее спасибо !
Прошу прощения..
Всем добрый день!
Задача - при нажатии кнопки плавно зажечь ленту и остановить её в максимальной яркости, при выкл соотв. наоборот.
Антидребезг реализую аппаратно, проверял работает.
Проблема в том, что цикл повторяется. Пробывал Break и метку с переходом на digitalWrite - безуспешно.
Однократно программу реализовывать не вариант, так как нужно постоянное слежение за кнопкой.
А как кнопка `понимает`, что выкл соотв?
Всем добрый день!
Задача - при нажатии кнопки плавно зажечь ленту и остановить её в максимальной яркости, при выкл соотв. наоборот.
Антидребезг реализую аппаратно, проверял работает.
Проблема в том, что цикл повторяется. Пробывал Break и метку с переходом на digitalWrite - безуспешно.
Однократно программу реализовывать не вариант, так как нужно постоянное слежение за кнопкой.
А как кнопка `понимает`, что выкл соотв?
Имел в виду при выкл кнопки процесс в обратную сторону - тушение ШИМом до 0 и удержание 0 до тех пор, пока кнопку не вкл
Дело даже не в delay, а в том как в цикле, срабатывающем по событию что-то сделать циклом, а потом удержать это что-то пока не произойдет другое событие.....delay временен)
Имел в виду при выкл кнопки процесс в обратную сторону - тушение ШИМом до 0 и удержание 0 до тех пор, пока кнопку не вкл
ведите счетчик нажатий кнопки. При первом нажатии плавно зажечь ленту, при втором плавно потушить
у вас уже есть цикл - loop() и millis() . Учитесь проектировать программы, перед тем как писать код.
у вас уже есть цикл - loop() и millis() . Учитесь проектировать программы, перед тем как писать код.
ну так millis() предполагает, что по его истечению программа будет возвращаться в LOOP, где сидит ШИМ, что не нужно.
Счётчик нажатий тут не нужен, 2 состояния кнопки, контролирую digitalRead
#6 переделайте программу и будет вам решение.
Счётчик нажатий тут не нужен, 2 состояния кнопки, контролирую digitalRead
А в чем интерес нажата кнопка - плавно зажечь, отпущена - плавно потушить? в таком случае лента включена пока нажата кнопка
http://cppstudio.com/post/348/
Пробуйте!!
Пробуйте!!
Так же - зажигается - тухнет - зажигается и т д.... Видимо потому что в цикле Loop .... А надо зажигается - горит - горит и т д (и наоборот соответственно.) Т.е. запись digitalWrite(pinOUT, HIGH) актуальная в один такт дуины.
Конечно можно дать задежку Millis(), но при выкл кнопки лента будет гореть в течении Millsа
программа работает так (при включении кнопки)
А надо чтобы работала так
За что я "люблю" ТС - за внятное "условие" задания. А есть 100% - "говно" в ТЗ => "говну" в коде => "говно" в работе программы. И от опытного программиста нужно уметь отсечь это "говно" на начальной стадии.
За что я "люблю" ТС - за внятное "условие" задания. А есть 100% - "говно" в ТЗ => "говну" в коде => "говно" в работе программы. И от опытного программиста нужно уметь отсечь это "говно" на начальной стадии.
Видимо я изначально некорректно сформулировал задачку
Скорее у вас светильник с кнопкой. Вы хотите регулировать освещение ей. первый раз нажали освещение растет. Понятно до максимума, но можно остановиться и посередине. Второй раз нажали . Освещение падает до выкл. Но можно выбрать тускло . Следущее идет в рост. Почему я строник ООП-(объектно ориентированого проектирования). Потому что реальные проекты похожи на блин морской бой. Мимо, мимо, попал , мимо. А там где попал надо еще и так, потому что так круще. Еще вишенка в торте про светильник. Яркость должна идти не линейно, а логарифмически 0-1-3-7-15-31-63-127-255. Тогда глазу кажется что яркость линейно возрастает.
Скорее у вас светильник с кнопкой. Вы хотите регулировать освещение ей. первый раз нажали освещение растет. Понятно до максимума, но можно остановиться и посередине. Второй раз нажали . Освещение падает до выкл. Но можно выбрать тускло . Следущее идет в рост. Почему я строник ООП-(объектно ориентированого проектирования). Потому что реальные проекты похожи на блин морской бой. Мимо, мимо, попал , мимо. А там где попал надо еще и так, потому что так круще. Еще вишенка в торте про светильник. Яркость должна идти не линейно, а логарифмически 0-1-3-7-15-31-63-127-255. Тогда глазу кажется что яркость линейно возрастает.
Подсветка рабочей зоны. 2 кнопки - 1 принудительно включает ленту сначало шимом потом держит максимум до её выключения - процесс обратный - с максимальной яркости убывает до 0 и держит 0.... Вторая кнопка - работа от датчика освещенности и (если он сработал) датчика движения.... Если бы задача сводилась при принудительном включении просто разом зажечь ленту и при выкл разом потушить - проблем нет...но так как всё это дело происходит в рамках loop, максимальная яркость держиться только единицу времени контроллера, как Вы понимаете далее процесс повторяется... Если применять программные задержки, то, в случае выкл сразу же лента не потушиться ШИМом как планируется, а будет отрабатывать задержку....
Иными словами есть процесс опроса нажатия / отжатия кнопки и два последовательных процесс внутри этого опроса - плавное зажигание и удержание максимума
Может надо сделать так?
Поправил- алгоритм следующий - Нажажали кнопку и држите (вк. выключатель) Лента плавно зажглась и горит до отпускания кнопки (вык. выключателя) - плавно потухла и не горит до следующего вк.
Поправил- алгоритм следующий - Нажажали кнопку и држите (вк. выключатель) Лента плавно зажглась и горит до отпускания кнопки (вык. выключателя) - плавно потухла и не горит до следующего вк.
Простите, может мой вопрос будет неуместным, возможно даже дезким - на хрена в рабочей зоне выключатель который надо держать пальцем, что бы был свет?
Тож элементарно. Кнопка с пальцем - средство отладки. В рабочем варианте - обічный выключатель, с фиксацией и без пальца.
Вот что пишет ТС
Всем добрый день!
Задача - при нажатии КНОПКИ плавно зажечь ленту и остановить её в максимальной яркости, при выкл соотв. наоборот.
Где тут выключатель?
CARLOS Счётчик нажатий тут не нужен, 2 состояния кнопки, контролирую digitalRead
А надо чтобы работала так
Ну и к чему это?
CARLOS Счётчик нажатий тут не нужен, 2 состояния кнопки, контролирую digitalRead
Вы хотите сказать что потребитель будет держать кнопку чтобы любоваться светом?
В конце концов решать CARLOS - если надо (нажал вк., отпустил - нажал вык.) пусть говорит. Добавим переменную и все дела.
Банальный конечный автомат на 4 состояния:
0 - яркость минимальна,
1 - яркость увеличивается,
2 - яркость максимальна,
3 - яркость уменьшается.
Переходы между состояниями строго последовательно: 0-1-2-3-0-1-2-3-0-...
Сигналом к переходу служит:
0-1 - нажатие (отпускание) кнопки,
1-2 - достижение максиимальной яркости,
2-3 - нажатие (отпускание) кнопки,
3-0 - достижение миниимальной яркости.
Если требуется останавливать яркость в промежуточных состояниях - нужно решить вопрос с управлением: после остановки при нажатии яркость должна продолжать увеличиваться, либо, наоборот, - уменьшется, не достигнув максимального значения.
Клиенту не нужно 4 ему нужно 2, на 2 автомат я в #20 посте уже скетч накропал, его легко переделать в 4. Но ни кто в свернутые коды не смотрит, а ТС картошку копает.
Это ВЫ думаете, что ему нужно только на 2. А как только ему предложет на 2, вдруг выяснится, что ему нужны все 4, а то и больше. (да здравствуют хрустальные шары!)
Народ, приношу извинение за "кнопки" - в реалии двойной выключатель
Алгоритм на рисунке....с правым алгоритмом пока всё ясно (есть готовые решения / скетчи),
а вот с левым никто не заморачивется (все включают сразу, без ШИМА)
Поправил- алгоритм следующий - Нажажали кнопку и држите (вк. выключатель) Лента плавно зажглась и горит до отпускания кнопки (вык. выключателя) - плавно потухла и не горит до следующего вк.
Этот код привод к "неверному" графику работы, в силу повторения цикла LOOP...
Вернее в силу того, что команда digitalWrite работает один такт процессорного времени контроллера, потом всё повторяется
Вот проверил, все как Вы нарисовали
Поправил- алгоритм следующий - Нажажали кнопку и држите (вк. выключатель) Лента плавно зажглась и горит до отпускания кнопки (вык. выключателя) - плавно потухла и не горит до следующего вк.
скетч работает!
При модернизации программы (условия опроса второй кнопки и, если она нажата, опрос входа от датчика) столкунся с проблемой неверной работы. А именно - (case 2, case 3) при включении второй кнопки BUTDD и появления сигнала от датчика pinDD программа постоянно проводит цикл ШИМа, при отсутствии сигнала от датчика ШИМ в максимуме, хотя должен плавно тухнуть.
Подскажите, почему не выполняется проверка условия (52 строка)...при нажатии на кнопку BUTDD лента включается на максимуме и тушится до 0 и так останавливается...на пояление 1 на pindd в этом режиме реакции нет
При включении кнопки BUTPV лента зажигается, доходит до максимума и разом тухнет.....при выкл этой кнопки лента разом включается и плавно тухнет до 0 и держит 0....если при наличии 1 на pinDD выкл кнопку ButDD лента разом погаснет, что правильно, но если вкл эту кнопку снова лента не загорится (при наличии 1 на pinDD), а вкл ленты принудительно с BUTPV зажжёт ленту разом, плавно потушит, еще раз проведется цикл плавно зажечь, потушить....и 0......
Видимо для решения данной задачи нужно как-то запоминать предшествующую ситуацию с кнопками и с яркостью ленты.....
Пробуйте - проверил вроде нормально
А может так даже правельней - Если кнопка #define BUTDD 7 Вык то работает только ручное Вк/Вык И НЕ РЕАГИРУЕТ НА ДАТЧИК - а если ВКЛЮЧЕНА то работает только датчик движения!!! и не реагирует на ручное включение. Выбирать Вам. Может надо чтобы в приоритете было ручное Вк/Вык.
отписался...
А может так даже правельней - Если кнопка #define BUTDD 7 Вык то работает только ручное Вк/Вык И НЕ РЕАГИРУЕТ НА ДАТЧИК - а если ВКЛЮЧЕНА то работает только датчик движения!!! и не реагирует на ручное включение. Выбирать Вам. Может надо чтобы в приоритете было ручное Вк/Вык.
Благодарю за Вашу помощь.
Программа работает и всё ок, но нет учёта нажатий (по случайности) двух кнопок сразу, (т е принцип приоритета принудительного включения)....при это происходит цикл тушения, загорания, горения... ввел goto, но без результата...
Так же в планах установить экранчик с возможностью выбирать параметров максимальной яркости и скорости наращения... или же просто двух энкодеров и т п