Помогите потушить адресную ленту
- Войдите на сайт для отправки комментариев
Чт, 19/09/2019 - 17:58
Добрый день, уважаемые эксперты и любители ардуино! Прошу вашей помощи в реализации минипроекта.
Имеется адресная лента РГБ, которая должна плавно засвечиваться по нажатию кнопки (с фиксацией). Так же плавно должна и гаснуть, после повторного нажатия кнопки. Но столкнулся с проблемой такого рода, что в выключенном состоянии светодиоды продолжают светиться с минимальной яркостью. Подскажите, пжлст, как это побороть программно. За ранее спасибо!
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 13
#define PixNum1 6 //количество пикселей в ленте
int switchPin = 7;
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(6, PIN, NEO_GRB + NEO_KHZ800);
//***********************************************************************
//***********************************************************************
void setup()
{
pinMode(switchPin, INPUT);
digitalWrite(switchPin, LOW);
Serial.begin(9600);
strip1.setBrightness(255);
strip1.begin();
strip1.show(); // Initialize all pixels to 'off'
randomSeed(analogRead(0));
}
//***********************************************************************
//***********************************************************************
void loop()
{
//RevRiseAllPixel(0,0,0,0,0);//Плавное включение всех пикселей (задержка, шаг включения, отдельные цвета R,G,B каждого из 3 пикселей )
RevRiseAllPixel(10,1,0,255,0);
}
void RevRiseAllPixel(uint8_t pause, uint8_t StepOn, uint8_t r, uint8_t g, uint8_t b)
{
float coeff_R, coeff_G, coeff_B, m; // Значения шагов увеличения каждого цвета в пикселе
uint16_t j, k; // счетчики
float cr, cg, cb; // устанавливаемые цвета на ленте в цикле
m = max(r, g); // Самый яркий цвет (бОльшее значение из r, g, b)
m = max(m, b);
coeff_R = StepOn/m*r;
coeff_G = StepOn/m*g;
coeff_B = StepOn/m*b;
if (digitalRead(switchPin) == HIGH)
{
for(j=PixNum1; j>0; j--)//Цикл для пикселей в ленте
{//Замена каждого цвета на округленную сумму текущего цвета и числа прибавления
if(r!=0 and ceil(coeff_R+cr)<r)cr=ceil(cr+coeff_R);
if(g!=0 and ceil(coeff_G+cg)<g)cg=ceil(cg+coeff_G);
if(b!=0 and ceil(coeff_B+cb)<b)cb=ceil(cb+coeff_B);
strip1.setPixelColor(j-1, cr, cg, cb);
strip1.show();
}
delay(pause);//Плавность
if(k==2)
{
cr=0; cg=0; cb=0;
}
}
else
{
for(j=PixNum1; j>0; j--)//Цикл для пикселей в ленте
{//Замена каждого цвета на округленную сумму текущего цвета и числа прибавления
if(cr-coeff_R>0)cr=(cr-coeff_R);
if(cg-coeff_G>0)cg=(cg-coeff_G);
if(cb-coeff_B>0)cb=(cb-coeff_B);
strip1.setPixelColor(j-1, cr, cg, cb);
strip1.show();
}
delay(pause);//Плавность
if(k==2)
{
cr=0; cg=0; cb=0;
}
}
}
Попробуйте переписать строки №№ 60-62 примерно так
if(cr-coeff_R>0) cr = (cr-coeff_R); else cr = 0;Должно помочь. Скорее всего они у Вас никогда нулями не становятся. Когда cr станет меньше coeff, но пока ещё положительной, она такой и останется. Потому маленько и светятся.
Хотя я бы гасил не так. В смысле, что нелинейно.
Помогло. Спасибо большое! От души)
Очень выручили.