Помогите потушить адресную ленту
- Войдите на сайт для отправки комментариев
Чт, 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, но пока ещё положительной, она такой и останется. Потому маленько и светятся.
Хотя я бы гасил не так. В смысле, что нелинейно.
Помогло. Спасибо большое! От души)
Очень выручили.