Fade эффект при включение RGB ленты

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Доброго времени суток.

Разбираюсь тут значит с RGB лентой, подключил её к ардуино через ULN, нашел программку на процессенги теперь можно выбирать цвет с компа - красота.

Но на месте прогресс мой не стоит. Сделал что бы выбраный цвет сохранялся в памити ардуинки, и когда включаем её в сеть, то она светится последним выбраным цветом - тоже кросата.

Но она включается резко. Хотелось бы сделать плавное включение, но вот не знаю как на сеё языке это сделать. Подскажите, мм?

Вот фрагмент кода:

void startDevice(){
  int r = EEPROM.read(EPROM_ADDR_VALUE_R);
  int g = EEPROM.read(EPROM_ADDR_VALUE_G);
  int b = EEPROM.read(EPROM_ADDR_VALUE_B);
  
  //если в памяти пусто, светим белым
  if(r==255 && g==255 && b==255){
    analogWrite(PIN_RED, 1023);
    analogWrite(PIN_GREEN, 1023);
    analogWrite(PIN_BLUE, 1023);
  }else{
    analogWrite(PIN_RED, r);
    analogWrite(PIN_GREEN, g);
    analogWrite(PIN_BLUE, b);
  }
}

Есть догадка:

Что если цвет хранить в HEX формате? А при включение увеличить значение от черного до нужного цвета, потом парсить в RGB в отправлять на analogWrite?

Но тут тоже вопрс, как HEX от #000000 скажем до #ff0000 увеличить?

 

leshak
Offline
Зарегистрирован: 29.09.2011

 

void startDevice(){
  byte r = EEPROM.read(EPROM_ADDR_VALUE_R);
  byte g = EEPROM.read(EPROM_ADDR_VALUE_G);
  byte  b = EEPROM.read(EPROM_ADDR_VALUE_B);
  

  for(float i=0;i<=1;i+=0.02){
    analogWrite(PIN_RED, i*r);
    analogWrite(PIN_GREEN, i*g);
    analogWrite(PIN_BLUE, i*b);
  }  
  

}

P.S. А Hex - тут нафиг упал. Системы исчисления - это для людей. Для самой программы - это все не нужно. А конвертации в "человекочитаемость" и обратно - только лишний геморой, без которого лучше если он не обязателен.

и да, analogWrite(...,1024) - ошибка. Читайте Функция analogWrite() | Аппаратная платформа Arduino и смотрите какое максимальное значение у второго параметра

 

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Спасибо, заработало!))

leshak пишет:

и да, analogWrite(...,1024) - ошибка. Читайте Функция analogWrite() | Аппаратная платформа Arduino и смотрите какое максимальное значение у второго параметра

А это вы к чему?))

leshak
Offline
Зарегистрирован: 29.09.2011

 

Zhyravlev_AS пишет:

Спасибо, заработало!))

leshak пишет:

и да, analogWrite(...,1024) - ошибка. Читайте Функция analogWrite() | Аппаратная платформа Arduino и смотрите какое максимальное значение у второго параметра

А это вы к чему?))

Это я к тому, что нужно было пройти по ссылке и внимательно еще раз прочитать документацию. В частности строку "value: период рабочего цикла значение между 0 (полностью выключено) and 255 (сигнал подан постоянно). " . И как это соотностися со строками 8,9,10 вашего скетча из стартового поста.

p.s. Кстати обратите внимание, что и r,g,b я из int в byte переделал.

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Про значение analogWrite - учту.

А почему байт?

leshak
Offline
Зарегистрирован: 29.09.2011

 

Zhyravlev_AS пишет:

Про значение analogWrite - учту.

А почему байт?

А какого типа возвращает значение EEPROM.read()? Заодно посмотрите что  EEPROM.write принимает в качестве значения для записи.

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Спасибо за помощь, теперь буду знать)

leshak
Offline
Зарегистрирован: 29.09.2011

Zhyravlev_AS пишет:

Спасибо за помощь, теперь буду знать)

OK. К тому же учтите, что это означает, что перед тем как сохранять в eeProm иди делать analogWrite  с только что прочитанного analogRead - вначале нужно его привести к диапазону байт.

То есть

byte val=analogRead(PIN1);

analogWrite(PIN2,val);
EEPROM.write(val);

это лажа. будет "срезаться" 75% диапазона сверху.

а нужно

byte val=map(analogRead(PIN1),0,1023,0,255);

analogWrite(PIN2,val);
EEPROM.write(val);