Определить нажатие кнопки внутри цикла 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);
}
@Lorenzo Alinari, 👍0
1 ответ
▲ 0
Я наконец-то решил!
Я попробовал библиотеку Bounce2, но она ведёт себя очень странно (эффекты передаются с первого, затем с третьего, затем снова с первого на долю секунды и автоматически ко второму, плюс кое-что ещё :/ )
Похоже, мне просто нужно было добавить обычный digitalRead внутрь for() и return. Обычно я не допускаю таких ошибок xD
,
@Lorenzo Alinari
Смотрите также:
- Как переключить светодиод при нажатии кнопки?
- Определение того, была ли нажата и отпущена кнопка
- Нажать клавишу Windows, используя «keyboard.press();»
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Напряжение меняется, но цифровой поток всегда HIGH
- Остановить мигание светодиодов
- Вопрос новичка с 4-контактной кнопкой