Определить нажатие кнопки внутри цикла for()

Я работал над проектом со светодиодной лентой, где мне нужно было переключать различные эффекты одним нажатием кнопки. Проблема в том, что я не знаю, как распознать нажатие кнопки для переключения эффекта, пока в цикле for() происходит переключение цветов для создания эффекта радуги (так что, думаю, это проблема многозадачности). Не могли бы вы мне помочь? :)

#include <Adafruit_NeoPixel.h>

#define pin 5
#define led 15
#define button 7
Adafruit_NeoPixel strip = Adafruit_NeoPixel (led,pin,NEO_RGB+NEO_KHZ800);

int doggo=0;

void setup(){
 strip.begin();
 pinMode(button,INPUT);
}
void loop(){


 int buttonVal=digitalRead(button);

 if(buttonVal==HIGH){
  doggo++;
  delay(300);
 }
 if (doggo>2){
  doggo=0;
 }
 while (doggo==0){
  //вся полоска красная
  for (int i=0;i<led;i++){
   strip.setPixelColor(i,255,0,0);
   strip.show();
  }
 }
 while (doggo==1){
  //эффект радуги
  uint16_t i, j;
  int rainbowSpeed=10;
  for(j=0; j<256*5; j++) { 

   for(i=0; i< strip.numPixels(); i++) {

    strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    strip.show();

   }

  }

 delay(rainbowSpeed);


 }


 while (doggo==2){
  //целая полоска синяя
  for (int i=0;i<led;i++){
   strip.setPixelColor(i,0,0,255);
   strip.show();
  }
 }

}


uint32_t Wheel(byte WheelPos) {
 WheelPos = 255 - WheelPos;

 if(WheelPos < 85) {
  return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
 }
 if(WheelPos < 170) {
  WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
 }
 WheelPos -= 170;
 return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

, 👍0


1 ответ


0

Я наконец-то решил!

Я попробовал библиотеку Bounce2, но она ведёт себя очень странно (эффекты передаются с первого, затем с третьего, затем снова с первого на долю секунды и автоматически ко второму, плюс кое-что ещё :/ )

Похоже, мне просто нужно было добавить обычный digitalRead внутрь for() и return. Обычно я не допускаю таких ошибок xD

,