Плавный розжиг/затухание RGB светодиода
- Войдите на сайт для отправки комментариев
Чт, 21/12/2017 - 14:05
Доброго времени суток, уважаемые форумчане.
Требуется посильная помощь...За основу взят скетч от vosara из поста " Независимый 3х-канальный плавный розжиг/затухание светодиодов..."
Привязал туда одну кнопку и RGB светодиод...В основных цветах и белом все работает замечательно.
Вопрос к гуру программирования...Как выставив определенный цвет на RGB светодиоде, (255,155,55) например, плавно зажигать и гасить его именно в этом цвете...без остаточного затухания красного для данного случая...
Прошу...подскажите нужное направление...
Заранее благодарен всем откликнувшимся...
Исходник:
01 #define led1 9 02 #define button1 2 03 #define led2 10 04 #define button2 3 05 #define led3 11 06 #define button3 4 07 uint8_t light1; 08 uint8_t light2; 09 uint8_t light3; 10 uint32_t time; 11 12 void setup() 13 { 14 pinMode(button1, INPUT_PULLUP); //настариваем пин кнопки на вход 15 pinMode(led1, OUTPUT); //настариваем пин светодиода на выход 16 pinMode(button2, INPUT_PULLUP); //настариваем пин кнопки на вход 17 pinMode(led2, OUTPUT); 18 pinMode(button3, INPUT_PULLUP); //настариваем пин кнопки на вход 19 pinMode(led3, OUTPUT); 20 } 21 22 void loop(){ 23 if(millis() - time >= 10){ 24 time = millis(); 25 if(!digitalRead(button1) && light1 < 255) light1++; //кнопка нажата 26 else if(digitalRead(button1) && light1 > 0) light1--; 27 if(!digitalRead(button2) && light2 < 255) light2++; //кнопка нажата 28 else if(digitalRead(button2) && light2 > 0) light2--; 29 if(!digitalRead(button3) && light3 < 255) light3++; //кнопка нажата 30 else if(digitalRead(button3) && light3 > 0) light3--; 31 } 32 analogWrite(led1, light1); 33 analogWrite(led2, light2); 34 analogWrite(led3, light3); 35 }
плавно зажигать и гасить его именно в этом цвете...без остаточного затухания красного для данного случая...
Не знаю, как оно в реальности получится с "именно в этом цвете", но логично было бы каждый канал уменьшать/увеличивать пропорционально. Например, для понимания сути, если задан цвет 10, 20, 30 - то за один проход первый канал уменьшаем на 1, второй на 2, третий на 3. В результате все три канала одновременно дойдут до ноля. Для увеличения - аналогично, только коэффициент приращения будет другим.
А как???
Перепробывал практически все из известного мне...прошу снисхождения...но я из начинающих...
Интуитивно я и сам это понимаю...что пропорционально надобно...но как впихнуть и куда энту пропорциональность...вот загадка...
В смысле "куда впихнуть"? Есть же у вас в коде light1++, light1-- и т.д. Что они значат, ведь понимаете?
ННу да...light1++ то же самое что и light1=light1+1, т.е. увеличивает значение на единичку...
Ну вот, а надо увеличивать/уменьшать не на единичку, а на коэффициент, который надо рассчитать перед этим исходя из значений в каналах.
Опаньки...взрыв мозга...очередной...может просто не тем взрывал?
Буду напрягать мозговые мышцы...
Спасибо за указанный путь...
Эх елькана палька...формулку бы...
А моск наморщить?
"Ищите на третьей планете " (ЦЫ)
Смотрите функцию map(). http://arduino.ua/ru/prog/Map
Сами разберетесь как применить ?
ЗЫ Только смотрите шепотом, а то припрется безкостыльный старикан и начнет трещать о том, что ардуино IDE с ее функциями, придумана для домохозяек и прочий дименционный бред.
brokly...спасибо за ссылку...как применить постараюсь разобраться...но...меня терзают смутные сомнения...без помощи в разжевывании не обойдусь...
Попробуйте так. Работает следующим образом: Добавляем еще одну кнопку чтобы можно было увеличивать/уменьшать. Кликнули ее 1 раз и своими кнопками увеличуете нужный цвет, кликнули ее еще раз - и можно уменьшать нужный цвет. Так по кругу.
Огромное спасибо за скетч...
Я обязательно попробую его и разберу потом...потереблю короче...подстрою под себя...
Но в моем случае нужна именно первоначальная установка цвета...(100, 255,50) или(100,10,155), сами знаете, вариантов много...и лишь потом плавное увеличение яркости до максимума ( когда кнопка нажата) и плавное уменьшение яркости когда отжата...но именно в нужном цвете...
Ну хорошо, нажмете и установите нужный цвет - а когда отпустите цвет уйдет в 0.
На мой взгляд здесь еще без одной кнопки не обойтись чтобы фиксировать установку
Шаришься по просторам сети и такая тоска берет...
Можно подумать, что все только и занимаются тем, что заставляют RGB светодиоды переливаться всеми цветами радуги и ( или) хаотично менять цвет...
Обидно господа...
А если еще и учесть, что большинство кода написано по-ходу просто от балды...и их предлагают в качестве примеров для начинающих...вообще мрак...
К сожалению не могу сейчас попробовать...не у компа...
Развлекуха начнется ближе к ночи...
Попробую...поломаю под сеюя че-нить...и отпишусь...
КАжется я понял что надо. А первоначальная будет залита в плату и не менятся?
Вот-вот-вот!!!
Т.е. в скетче первоначально устанавливются параметры RGB...а потом кнопочкой управляем...яркостью.
Нажали-удержали...разжигае до максимальной для этого цвета яркости...отпустили...тухнет...медленно...
ПОнял!! Тогда мой код не пойдет. Ваш ближе к поставленой задаче
Моего кода тут нет...
Все это Ваше, vosara...
Так, что там с map(), изучили? В вашем случае - это самое оно.
Нужна, как было сказано выше, пропорциональность в управлении ШИМ...
Вот с этой пырпыр...циональностью и буду иметь секас...но только позже...
До map не добрался...пока...мелочь моя ненаглядная не дает заняться творчеством...
Ладно. Поскольку значения двух каналов будут всегда зависимыми от третьего, то определимся, что, например, канал R будет "ведущим", а G и B - "ведомыми".
Например, для случая (100, 255, 50) R = 100 - принимаем за заданное значение (оно же максимальное), а G и B - вычисляем.
считаем: G = map(R, 0, 100, 0, 255)
здесь R - это значение красного канала (как входящий параметр)
0 и 100 - мин и мах значения для красного канала
0 и 255 - мин и макс значения для зеленого канала
для синего аналогично: B = map(R, 0, 100, 0, 50)
0 и 50 - мин и макс значения для синего канала
т.е. канал R будет приращаться/уменьшаться на 1, а G и B будем считать через map.
В общем, как-то так, вроде бы не ошибся, если ошибся - поправят.
Спасибо за участие...
Буду постепенно разгребат...
Огромная благодарность всем, кто откликнулся!!!
Но, к моему большому сожалению не имею возможности сейчас проверить все, что вы выкладываете...доберусь до пепелаца...сразу будет ответ!!!
Еще раз всем огромная благодарность!!!
Еще раз огромное спасибо всем, а в особенности qwone !!!
Добрался наконец до компа...залил скетч в дуню...
Все работает!!! Все отлично!!!
Теперь можно морщить мозги...затачивать под себя и смотреть откуда ножки растут...
Ну в общем разбираться с map...
Попытался доработать код под себя...
Пишет "Ошибка компиляции для платы Arduino Pro, Arduino Pro Mini"
В чем беда?
Посмотрите...пожалуйста...
И не судите строго может быть за кривизну кода...ведь начинающий...
Пишет "Ошибка компиляции для платы Arduino Pro, Arduino Pro Mini"
В чем беда?
А какая ошибка-то? Всегда в таких вопросах приводите полный текст сообщения об ошибке! Там же всё написано - что не так и в какой строке.
Переменную B1 назовите по другому как-нибудь.
Exit status1... и далее...
Больше ничего...
Спасибо за совет...
Прикольно...получилось...В1 на W...
Теперь с кнопками разьираться буду...а то работают как 2И...
Опять спешите. Переписал свой скетч с разделом на модули
А потом это удвоить
ПС: И что бы этим идиотизмом не заниматься придумали Си с классами =С++
Уважаемый qwone ...
Я не спешу...просто методом проб и ошибок стремлюсь к истине...
А до Вашего конечного кода мне не хватило шагов пять...
И еще раз большое спасибо за помощь...
А
byte
bright и
byte
bright2 лучше наверное пусть будут равны 0...
чтобы не зажигались после загрузки кода...но это мое мнение делитанта...
ННуууу...Вы забросали меня исходниками...а сколько мне в энтом разбираться....чтобы тупо не копировать...как делают 90% начинающих ардуняшек...
Благодарю...и пошел взрывать мозги...есть над чем подумать...
Разберетесь в этом.Апнете навык программирования. http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
И еще раз спасибо...
А последний код не работает... как-то так...но пока не разбирал...и так инфы по самые-самые...ну в смысле бубенцы...