У новичка проблема
- Войдите на сайт для отправки комментариев
Втр, 23/01/2018 - 22:19
Есть RGB светодиод который нужно заставить красиво переливатся. Я написал вот такой скетч, который по идее должен изменять яркость всех трёх цветов от 0 до 255, и если какой-то цвет имеет пороговую яркость, то она начинает менятся в обратную сторану, но когда значение перемненной отвечающей за яркость синего цвета становится 0, то сразу же меняет своё значение на 255, помогите пожалуйста.
int bluePin = 3; //Инициализируем пины RGB светодиода
int greenPin = 5;
int redPin = 6;
int r = 0; //переменная отвечающая за яркость красного цвета
int g = 255; //переменная отвечающая за яркость зелёного цвета
int b = 255; //переменная отвечающая за яркость синего цвета
int x = 2; //переменная отвечающая за шаг изменения яркости красного и синего цветов
int y = 1; //переменная отвечающая за шаг изменения яркости зелёного цвета
void setup(){
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop(){
r = r + x;
g = g - y;
b = b - x;
if(r == 0 || r == 255){ // при достижение крайних значений для яркости меняем знак переменной шага изменения яркости
x = -x;
}
if(g == 0 || g == 255){
y = -y;
}
analogWrite(redPin, r);
analogWrite(greenPin, g);
analogWrite(bluePin, b);
delay(200);
}
Так где у вас условие для "разворота" синего цвета? И ставьте не == , а >= и <= , иначе в пролете будете, если начнете прибавлять более, чем по единице.
ну неужели сами не видите? Или вы на самом деле этого скетча не писали, а сперли его в инете?
P.S когда переменная r=255 то переменная b=0, то есть нет смысла писать
if(b == 0 || b == 255)...У новичка проблема- головы у него нет, а его жопа думать не хочет .Нужен пинок в думающий орган. строка 30 . Вопрос сколько будет если 0.2 сек * на 256=???
Полагаю, что вам нужно завести переменную z для b...
Если вы не заметили, то условие разворота переменной x уже есть, так как она используется для двух цветов
Можно конечно и так, но я хочу минимизировать "вес" скетча.
Если вы не заметили, то условие разворота переменной x уже есть, так как она используется для двух цветов
Не совсем понимаю ход вашей мысли.
условие 21 строки не сработает никогда и r будет расти, пока не превысит максимум для int - 32768, а b, соответсвенно уйдет в минус
Пользуюс, просто убрал для более презентабельного вида и минимизации затрат памяти.
Спасибо, я понял
Да чего там минимизировать... Вообще - если у вас шаг инкремента более единицы, то ровно в заданное число вы можете никогда не попасть.
Спасибо, не подумал
reverseRed = false; r = reverseRed ? (r > x ? r - x : 0) : ((r + x) < 255 ? r + x : 255); if (r == 0 || r == 255) { reverseRed = !reverseRed; }Попробуйте что-то вроде этого. Для остальных цветов сделайте по аналогии. У вас отсутствует контроль крайних значений.
int bluePin = 3; //Инициализируем пины RGB светодиода int greenPin = 5; int redPin = 6; int r = 0; //переменная отвечающая за яркость красного цвета int g = 255; //переменная отвечающая за яркость зелёного цвета int b = 255; //переменная отвечающая за яркость синего цвета int x = 2; //переменная отвечающая за шаг изменения яркости красного и синего цветов int y = 1; //переменная отвечающая за шаг изменения яркости зелёного цвета void setup() { /**/ Serial.begin(9600);// <-- сюда надо написать это /**/ pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { r = r + x; g = g - y; b = b - x; if (r == 0 || r == 255) { // при достижение крайних значений для яркости меняем знак переменной шага изменения яркости x = -x; } if (g == 0 || g == 255) { y = -y; } analogWrite(redPin, r); analogWrite(greenPin, g); analogWrite(bluePin, b); /**/ Serial.println();// <-- сюда надо написать это Serial.print(r); Serial.print(" "); Serial.print(g); Serial.print(" "); Serial.print(b); /**/ delay(200); }Спасибо, но мне уже подсказали более оптимальный вариант:
Да умею я пользоватся монитором порта, хватит про это писать.
Спасибо, но мне уже подсказали более оптимальный вариант:
Использовать int32 только для того чтобы контролировать крайние значения +/- километр - это не комильфо. В будущем вангую у вас нехватку ОЗУ даже в мелочах. Естественно не в этом проекте.
Использовать int32 только для того чтобы контролировать крайние значения +/- километр - это не комильфо. В будущем вангую у вас нехватку ОЗУ даже в мелочах. Естественно не в этом проекте.
Поживём - увидим.
Использовать int32 только для того
Rootware, там нет int32.
Что касается вашего метода контроля границ - в книжках по стилю не советуют создавать слишком навороченные конструкции на основе тернарного оператора. Пишите проще, например передача байт через сериал пишется в 2-3 строчки... тогда и байты не теряются :)
Использовать int32 только для того
Rootware, там нет int32.
Что касается вашего метода контроля границ - в книжках по стилю не советуют создавать слишком навороченные конструкции на основе тернарного оператора. Пишите проще, например передача байт через сериал пишется в 2-3 строчки... тогда и байты не теряются :)
У меня ничего не теряется. Промашечка с вашей стороны. А по теме... Да ошибочка. Исправляюсь - int16.
У меня ничего не теряется. Промашечка с вашей стороны. А по теме... Да ошибочка. Исправляюсь - int16.
Правильно ли я понял, что вы так и остались в убеждении, что ваш код рабочий, а неполные пакеты приходят исключительно по причине "кривости ардуины" ? - плохое качество для разработчика - искать причины своих ошибок на стороне...
У меня ничего не теряется. Промашечка с вашей стороны. А по теме... Да ошибочка. Исправляюсь - int16.
Правильно ли я понял, что вы так и остались в убеждении, что ваш код рабочий, а неполные пакеты приходят исключительно по причине "кривости ардуины" ? - плохое качество для разработчика - искать причины своих ошибок на стороне...
Да. Каждый новый пакет приходит с первыми четырьмя байтами F0, а уж после сам отсылаемый пакет. Что это? Я думаю, что любая "попса" имеет прорехи. Так сказать компромисы.
Да. Каждый новый пакет приходит с первыми четырьмя байтами F0, а уж после сам отсылаемый пакет. Что это? Я думаю, что любая "попса" имеет прорехи. Так сказать компромисы.
почему же у всех, кроме вас - эта "попса" работает, не догадываетесь?
У меня практически во всех проекта используется обмен по сериалу - и нигде ничего не теряется....
Да. Каждый новый пакет приходит с первыми четырьмя байтами F0, а уж после сам отсылаемый пакет. Что это? Я думаю, что любая "попса" имеет прорехи. Так сказать компромисы.
почему же у всех, кроме вас - эта "попса" работает, не догадываетесь?
У меня практически во всех проекта используется обмен по сериалу - и нигде ничего не теряется....
И у меня, уже (!), ничто и нигде не теряется. Не поверите.
У меня практически во всех проекта используется обмен по сериалу - и нигде ничего не теряется....
Честный Си, ничего не ворует?