Плавный розжиг/затухание 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 раз и своими кнопками увеличуете нужный цвет, кликнули ее еще раз - и можно уменьшать нужный цвет. Так по кругу.
#define led1 9 #define led2 10 #define led3 11 #define button1 2 #define button2 3 #define button3 4 //добавляем переменную regim bool regim; bool f_regim; //Добавляем кнопку с антидребезгом - переключает regim #define select 5 bool kn_regim = 0; bool fl_regim = 1; uint32_t time; uint8_t light1; uint8_t light2; uint8_t light3; uint32_t pausa; void setup() { pinMode(button1, INPUT_PULLUP); //настариваем пин кнопки на вход pinMode(button2, INPUT_PULLUP); //настариваем пин кнопки на вход pinMode(button3, INPUT_PULLUP); //настариваем пин кнопки на вход pinMode(select, INPUT_PULLUP); pinMode(led1, OUTPUT); //настариваем пин светодиода на выход pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); } // void loop() { //Проверяем кнопку - с Антидребезгом if (digitalRead(select) != fl_regim) { //Если сигнал изменился fl_regim = !fl_regim; time = millis(); } if (kn_regim == digitalRead(select) && millis() - time > 20) { kn_regim = !digitalRead(select); } if (kn_regim && !f_regim) { f_regim = 1; regim = !regim; } else if(!kn_regim) f_regim = 0; if ( millis() - pausa >= 10) { pausa = millis(); if (!digitalRead(button1)) { //кнопка нажата if (regim && light1 < 255) light1++; else if (!regim && light1 > 0) light1--; } if (!digitalRead(button2)) { //кнопка нажата if (regim && light2 < 255) light2++; else if (!regim && light2 > 0) light2--; } if (!digitalRead(button3)) { //кнопка нажата if (regim && light3 < 255) light3++; else if (!regim && light3 > 0) light3--; } } analogWrite(led1, light1); analogWrite(led2, light2); analogWrite(led3, light3); }Огромное спасибо за скетч...
Я обязательно попробую его и разберу потом...потереблю короче...подстрою под себя...
Но в моем случае нужна именно первоначальная установка цвета...(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.
В общем, как-то так, вроде бы не ошибся, если ошибся - поправят.
Спасибо за участие...
Буду постепенно разгребат...
/**/ const byte Rpin =/*пин красный*/ 9; const byte Gpin =/*пин зеленый*/ 10; const byte Bpin =/*пин синий*/ 11; const byte btnPin =/*пин кнопки*/ 2; const byte RGB[] = {/*цвет */255, 155, 55}; byte bright = 255;/*исходная яркость*/ /*вывод цвета на светодиод*/ void viev(byte BR) { byte R = map(BR, 0, 255, 0, RGB[0]); byte G = map(BR, 0, 255, 0, RGB[1]); byte B = map(BR, 0, 255, 0, RGB[2]); analogWrite(Rpin, R); analogWrite(Gpin, G); analogWrite(Bpin, B); } //----main()----------------------- void setup() { pinMode(btnPin, INPUT_PULLUP); //настариваем пин кнопки на вход pinMode(Rpin, OUTPUT); //настариваем пин светодиода на выход pinMode(Gpin, OUTPUT); pinMode(Bpin, OUTPUT); viev(bright); } void loop() { static unsigned long past = 0; unsigned long mill = millis(); if ( mill - past >= 10) { past = mill; if (!digitalRead(btnPin) && bright < 255) ++bright; if (digitalRead(btnPin) && bright > 0) --bright; viev(bright); } } /*Скетч использует 1564 байт (5%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 15 байт (0%) динамической памяти, оставляя 2033 байт для локальных переменных. Максимум: 2048 байт. */Огромная благодарность всем, кто откликнулся!!!
Но, к моему большому сожалению не имею возможности сейчас проверить все, что вы выкладываете...доберусь до пепелаца...сразу будет ответ!!!
Еще раз всем огромная благодарность!!!
Еще раз огромное спасибо всем, а в особенности qwone !!!
Добрался наконец до компа...залил скетч в дуню...
Все работает!!! Все отлично!!!
Теперь можно морщить мозги...затачивать под себя и смотреть откуда ножки растут...
Ну в общем разбираться с map...
Попытался доработать код под себя...
Пишет "Ошибка компиляции для платы Arduino Pro, Arduino Pro Mini"
В чем беда?
Посмотрите...пожалуйста...
const byte Rpin =/*пин красный*/ 3; const byte Gpin =/*пин зеленый*/ 5; const byte Bpin =/*пин синий*/ 6; const byte Rpin1 =/*пин красный*/ 9; const byte Gpin1 =/*пин зеленый*/ 10; const byte Bpin1 =/*пин синий*/ 11; const byte btnPin =/*пин кнопки*/ 2; const byte btnPin1 =/*пин кнопки*/ 4; const byte RGB[] = {/*цвет */205, 16, 118}; byte bright = 255;/*исходная яркость*/ /*вывод цвета на светодиод*/ void viev(byte BR){ byte R = map(BR, 0, 255, 0, RGB[0]); byte G = map(BR, 0, 255, 0, RGB[1]); byte B = map(BR, 0, 255, 0, RGB[2]); byte R1 = map(BR, 0, 255, 0, RGB[0]); byte G1 = map(BR, 0, 255, 0, RGB[1]); byte B1 = map(BR, 0, 255, 0, RGB[2]); analogWrite(Rpin, R); analogWrite(Gpin, G); analogWrite(Bpin, B); analogWrite(Rpin1, R1); analogWrite(Gpin1, G1); analogWrite(Bpin1, B1); } void setup() { pinMode(btnPin, INPUT_PULLUP); //настариваем пин кнопки на вход pinMode(btnPin1, INPUT_PULLUP); //настариваем пин кнопки на вход pinMode(Rpin, OUTPUT); //настариваем пин светодиода на выход pinMode(Gpin, OUTPUT); pinMode(Bpin, OUTPUT); pinMode(Rpin1, OUTPUT); pinMode(Gpin1, OUTPUT); pinMode(Bpin1, OUTPUT); viev(bright); } void loop() { static unsigned long past = 0; unsigned long mill = millis(); if ( mill - past >= 20) { past = mill; if (!digitalRead(btnPin) && bright < 255) ++bright; if (digitalRead(btnPin) && bright > 0) --bright; if (!digitalRead(btnPin1) && bright < 255) ++bright; if (digitalRead(btnPin1) && bright > 0) --bright; viev(bright); } }И не судите строго может быть за кривизну кода...ведь начинающий...
Пишет "Ошибка компиляции для платы Arduino Pro, Arduino Pro Mini"
В чем беда?
А какая ошибка-то? Всегда в таких вопросах приводите полный текст сообщения об ошибке! Там же всё написано - что не так и в какой строке.
Переменную B1 назовите по другому как-нибудь.
Exit status1... и далее...
Больше ничего...
Спасибо за совет...
Прикольно...получилось...В1 на W...
Теперь с кнопками разьираться буду...а то работают как 2И...
Опять спешите. Переписал свой скетч с разделом на модули
/**/ //--------Светодиод 1------------------ const byte Rpin =/*пин красный*/ 9; const byte Gpin =/*пин зеленый*/ 10; const byte Bpin =/*пин синий*/ 11; const byte RGB[] = {/*цвет */255, 155, 55}; byte bright = 255;/*исходная яркость*/ /*вывод цвета на светодиод*/ void viev(byte BR) { byte R = map(BR, 0, 255, 0, RGB[0]); byte G = map(BR, 0, 255, 0, RGB[1]); byte B = map(BR, 0, 255, 0, RGB[2]); analogWrite(Rpin, R); analogWrite(Gpin, G); analogWrite(Bpin, B); } //--------Кнопка 1------------------ const byte btnPin =/*пин кнопки*/ 2; //----main()----------------------- void setup() { //--------Светодиод 1------------------ pinMode(Rpin, OUTPUT); //настариваем пин светодиода на выход pinMode(Gpin, OUTPUT); pinMode(Bpin, OUTPUT); viev(bright); //--------Кнопка 1------------------ pinMode(btnPin, INPUT_PULLUP); //настариваем пин кнопки на вход } void loop() { //--------Кнопка 1 и светодиод------------------ static unsigned long past = 0; unsigned long mill = millis(); if ( mill - past >= 10) { past = mill; if (!digitalRead(btnPin) && bright < 255) ++bright; if (digitalRead(btnPin) && bright > 0) --bright; viev(bright); } } /*Скетч использует 1564 байт (5%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 15 байт (0%) динамической памяти, оставляя 2033 байт для локальных переменных. Максимум: 2048 байт. */А потом это удвоить
/**/ //--------Светодиод 1------------------ const byte Rpin =/*пин красный*/ 9; const byte Gpin =/*пин зеленый*/ 10; const byte Bpin =/*пин синий*/ 11; const byte RGB[] = {/*цвет */255, 155, 55}; byte bright = 255;/*исходная яркость*/ /*вывод цвета на светодиод*/ void viev(byte BR) { byte R = map(BR, 0, 255, 0, RGB[0]); byte G = map(BR, 0, 255, 0, RGB[1]); byte B = map(BR, 0, 255, 0, RGB[2]); analogWrite(Rpin, R); analogWrite(Gpin, G); analogWrite(Bpin, B); } //--------Светодиод 2------------------ const byte R2pin =/*пин красный*/ 3; const byte G2pin =/*пин зеленый*/ 5; const byte B2pin =/*пин синий*/ 6; const byte RGB2[] = {/*цвет */255, 155, 55}; byte bright2 = 255;/*исходная яркость*/ /*вывод цвета на светодиод*/ void viev2(byte BR) { byte R = map(BR, 0, 255, 0, RGB[0]); byte G = map(BR, 0, 255, 0, RGB[1]); byte B = map(BR, 0, 255, 0, RGB[2]); analogWrite(R2pin, R); analogWrite(G2pin, G); analogWrite(B2pin, B); } //--------Кнопка 1------------------ const byte btnPin =/*пин кнопки*/ 2; //--------Кнопка 2------------------ const byte btn2Pin =/*пин кнопки*/ 4; //----main()----------------------- void setup() { //--------Светодиод 1------------------ pinMode(Rpin, OUTPUT); //настариваем пин светодиода на выход pinMode(Gpin, OUTPUT); pinMode(Bpin, OUTPUT); viev(bright); //--------Светодиод 2------------------ pinMode(R2pin, OUTPUT); //настариваем пин светодиода на выход pinMode(G2pin, OUTPUT); pinMode(B2pin, OUTPUT); viev2(bright2); //--------Кнопка 1------------------ pinMode(btnPin, INPUT_PULLUP); //настариваем пин кнопки на вход //--------Кнопка 2------------------ pinMode(btn2Pin, INPUT_PULLUP); //настариваем пин кнопки на вход } void loop() { unsigned long mill = millis(); //--------Кнопка 1 и светодиод 1------------------ static unsigned long past = 0; if ( mill - past >= 10) { past = mill; if (!digitalRead(btnPin) && bright < 255) ++bright; if (digitalRead(btnPin) && bright > 0) --bright; viev(bright); } //--------Кнопка 2 и светодиод 2------------------ static unsigned long past2 = 0; if ( mill - past2 >= 10) { past2 = mill; if (!digitalRead(btn2Pin) && bright2 < 255) ++bright2; if (digitalRead(btn2Pin) && bright2 > 0) --bright2; viev2(bright2); } } /*Скетч использует 1814 байт (5%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 19 байт (0%) динамической памяти, оставляя 2029 байт для локальных переменных. Максимум: 2048 байт. */ПС: И что бы этим идиотизмом не заниматься придумали Си с классами =С++
Уважаемый qwone ...
Я не спешу...просто методом проб и ошибок стремлюсь к истине...
А до Вашего конечного кода мне не хватило шагов пять...
И еще раз большое спасибо за помощь...
А
bytebright иbytebright2 лучше наверное пусть будут равны 0...чтобы не зажигались после загрузки кода...но это мое мнение делитанта.../**/ //-------------------------- // класс светодиод class Cl_Led { protected: byte Rpin;/*пин красный*/ byte Gpin;/*пин зеленый*/ byte Bpin;/*пин синий*/ byte R, G, B; /*цвет*/ byte bright = 0; public: /*конструктор*/ Cl_Led(byte pin1, byte pin2, byte pin3, byte R_, byte G_, byte B_) : Rpin(pin1), Gpin(pin2), Bpin(pin3), R(R_), G(G_), B(B_) {} /*инициализация*/ void init() { pinMode(Rpin, OUTPUT); //настариваем пин светодиода на выход pinMode(Gpin, OUTPUT); pinMode(Bpin, OUTPUT); viev(); } /*показать*/ void viev() { byte R = map(bright, 0, 255, 0, R); byte G = map(bright, 0, 255, 0, G); byte B = map(bright, 0, 255, 0, B); analogWrite(Rpin, R); analogWrite(Gpin, G); analogWrite(Bpin, B); } /*поярче*/ void up() { if ( bright < 255) ++bright; viev(); } /*потусклее*/ void down() { if (bright > 0) --bright; viev(); } }; //-----Компоновка-------------------------- Cl_Led Led1(/*пин красный*/9,/*пин зеленый*/9,/*пин синий*/9,/*RGB*/255, 155, 55); Cl_Led Led2(/*пин красный*/3,/*пин зеленый*/5,/*пин синий*/6,/*RGB*/255, 155, 55); const byte btn1Pin =/*пин кнопки1*/ 2; const byte btn2Pin =/*пин кнопки2*/ 4; //----main()----------------------- void setup() { Led1.init(); Led2.init(); pinMode(btn1Pin, INPUT_PULLUP); //настраиваем пин кнопки на вход pinMode(btn2Pin, INPUT_PULLUP); //настраиваем пин кнопки на вход } void loop() { //--------Кнопка 1 и светодиод------------------ static unsigned long past = 0; unsigned long mill = millis(); if ( mill - past >= 10) { past = mill; if (!digitalRead(btn1Pin)) Led1.up(); else Led1.down(); if (!digitalRead(btn2Pin)) Led2.up(); else Led2.down(); } } /* Скетч использует 1488 байт (4%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 27 байт (1%) динамической памяти, оставляя 2021 байт для локальных переменных. Максимум: 2048 байт. */ННуууу...Вы забросали меня исходниками...а сколько мне в энтом разбираться....чтобы тупо не копировать...как делают 90% начинающих ардуняшек...
Благодарю...и пошел взрывать мозги...есть над чем подумать...
Разберетесь в этом.Апнете навык программирования. http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
И еще раз спасибо...
А последний код не работает... как-то так...но пока не разбирал...и так инфы по самые-самые...ну в смысле бубенцы...