Помогите потушить адресную ленту

four_ton
Offline
Зарегистрирован: 19.09.2019

Добрый день, уважаемые эксперты и любители ардуино! Прошу вашей помощи в реализации минипроекта.

Имеется адресная лента РГБ, которая должна плавно засвечиваться по нажатию кнопки (с фиксацией). Так же плавно должна и гаснуть, после повторного нажатия кнопки. Но столкнулся с проблемой такого рода, что в выключенном состоянии светодиоды продолжают светиться с минимальной яркостью. Подскажите, пжлст, как это побороть программно. За ранее спасибо!

#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;
           }
       }
 } 
 
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Попробуйте переписать строки №№ 60-62 примерно так

if (cr-coeff_R>0) cr = (cr-coeff_R); else cr = 0;

Должно помочь. Скорее всего они у Вас никогда нулями не становятся. Когда cr станет меньше coeff, но пока ещё положительной, она такой и останется. Потому маленько и светятся.

Хотя я бы гасил не так. В смысле, что нелинейно.

four_ton
Offline
Зарегистрирован: 19.09.2019

Помогло. Спасибо большое! От души)

Очень выручили.