У новичка проблема

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Есть 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);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Так где у вас условие для "разворота" синего цвета? И ставьте не == , а >= и <= , иначе в пролете будете, если начнете прибавлять более, чем по единице.

b707
Онлайн
Зарегистрирован: 26.05.2017

ну неужели сами не видите? Или вы на самом деле этого скетча не писали, а сперли его в инете?

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

P.S когда переменная r=255 то переменная b=0, то есть нет смысла писать if(b == 0 || b == 255)...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

У новичка проблема- головы у него нет, а его жопа думать не хочет .Нужен пинок в думающий орган. строка 30 . Вопрос сколько будет если 0.2 сек * на 256=???

sadman41
Offline
Зарегистрирован: 19.10.2016

Полагаю, что вам нужно завести переменную z для b...

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Если вы не заметили, то условие разворота переменной x уже есть, так как она используется для двух цветов

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Можно конечно и так, но я хочу минимизировать "вес" скетча.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Room Astronaut пишет:

Если вы не заметили, то условие разворота переменной x уже есть, так как она используется для двух цветов

Зато многие заметили, что новичек не пользуется Serial для отладки скетча

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Не совсем понимаю ход вашей мысли.

b707
Онлайн
Зарегистрирован: 26.05.2017

условие 21 строки не сработает никогда и r будет расти, пока не превысит максимум для int - 32768, а b, соответсвенно уйдет в минус

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Пользуюс, просто убрал для более презентабельного вида и минимизации затрат памяти.

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Спасибо, я понял

sadman41
Offline
Зарегистрирован: 19.10.2016

Да чего там минимизировать...  Вообще - если у вас шаг инкремента более единицы, то ровно в заданное число вы можете никогда не попасть. 

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Спасибо, не подумал

Rootware
Offline
Зарегистрирован: 11.01.2018
reverseRed = false;

r = reverseRed ? (r > x ? r - x : 0) : ((r + x) < 255 ? r + x : 255);

if (r == 0 || r == 255)
{
reverseRed = !reverseRed;
}

Попробуйте что-то вроде этого. Для остальных цветов сделайте по аналогии. У вас отсутствует контроль крайних значений.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
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);
}

 

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Спасибо, но мне уже подсказали более оптимальный вариант: 

if(r <= 0 || r >= 255)

 

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Да умею я пользоватся монитором порта, хватит про это писать.

Rootware
Offline
Зарегистрирован: 11.01.2018

Room Astronaut пишет:

Спасибо, но мне уже подсказали более оптимальный вариант: 

if(r <= 0 || r >= 255)

 

Использовать int32 только для того чтобы контролировать крайние значения +/- километр - это не комильфо. В будущем вангую у вас нехватку ОЗУ даже в мелочах. Естественно не в этом проекте.

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Rootware пишет:

 

Использовать int32 только для того чтобы контролировать крайние значения +/- километр - это не комильфо. В будущем вангую у вас нехватку ОЗУ даже в мелочах. Естественно не в этом проекте.

Поживём - увидим.

b707
Онлайн
Зарегистрирован: 26.05.2017

Rootware пишет:

Использовать int32 только для того

Rootware, там нет int32.

Что касается вашего метода контроля границ - в книжках по стилю не советуют создавать слишком навороченные конструкции на основе тернарного оператора. Пишите проще, например передача байт через сериал пишется в 2-3 строчки... тогда и байты не теряются :)

Rootware
Offline
Зарегистрирован: 11.01.2018

b707 пишет:

Rootware пишет:

Использовать int32 только для того

Rootware, там нет int32.

Что касается вашего метода контроля границ - в книжках по стилю не советуют создавать слишком навороченные конструкции на основе тернарного оператора. Пишите проще, например передача байт через сериал пишется в 2-3 строчки... тогда и байты не теряются :)

У меня ничего не теряется. Промашечка с вашей стороны. А по теме... Да ошибочка. Исправляюсь - int16.

b707
Онлайн
Зарегистрирован: 26.05.2017

Rootware пишет:

У меня ничего не теряется. Промашечка с вашей стороны. А по теме... Да ошибочка. Исправляюсь - int16.

Правильно ли я понял, что вы так и остались в убеждении, что ваш код рабочий, а неполные пакеты приходят исключительно по причине "кривости ардуины" ? - плохое качество для разработчика - искать причины своих ошибок на стороне...

Rootware
Offline
Зарегистрирован: 11.01.2018

b707 пишет:

Rootware пишет:

У меня ничего не теряется. Промашечка с вашей стороны. А по теме... Да ошибочка. Исправляюсь - int16.

Правильно ли я понял, что вы так и остались в убеждении, что ваш код рабочий, а неполные пакеты приходят исключительно по причине "кривости ардуины" ? - плохое качество для разработчика - искать причины своих ошибок на стороне...

Да. Каждый новый пакет приходит с первыми четырьмя байтами F0, а уж после сам отсылаемый пакет. Что это? Я думаю, что любая "попса" имеет прорехи. Так сказать компромисы.

b707
Онлайн
Зарегистрирован: 26.05.2017

Rootware пишет:

Да. Каждый новый пакет приходит с первыми четырьмя байтами F0, а уж после сам отсылаемый пакет. Что это? Я думаю, что любая "попса" имеет прорехи. Так сказать компромисы.

почему же у всех, кроме вас -  эта "попса" работает, не догадываетесь?

У меня практически во всех проекта используется обмен по сериалу - и нигде ничего не теряется....

Rootware
Offline
Зарегистрирован: 11.01.2018

b707 пишет:

Rootware пишет:

Да. Каждый новый пакет приходит с первыми четырьмя байтами F0, а уж после сам отсылаемый пакет. Что это? Я думаю, что любая "попса" имеет прорехи. Так сказать компромисы.

почему же у всех, кроме вас -  эта "попса" работает, не догадываетесь?

У меня практически во всех проекта используется обмен по сериалу - и нигде ничего не теряется....

И у меня, уже (!), ничто и нигде не теряется. Не поверите.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

У меня практически во всех проекта используется обмен по сериалу - и нигде ничего не теряется....

Честный Си, ничего не ворует?