Ви не увійшли.
Попробуйте в качестве костыля
for (int j = 0; j < 256 * 5; j++) {
if (!digitalRead(BUTTON_SWITCH_PIN)) break;
for ...
"Ну ось код, ось проблема..."
І що?
Перепишите функцию, избавьтесь от блокирующих циклов for
ну таке, це я і так розумію, але не розумію як
Перепишите функцию, избавьтесь от блокирующих циклов for
Доброго дня! Маю скетч для управління WS2812.
Потрібно зробити 4 режими і кнопку яка буде переключати між режимами. 1 режим - вся стрічка червоного кольору. 2 режим - вся стрічка зеленого кольору. 3 режим - вся стрічка синього кольору. 4 режим - стрічка плавно переливається з червоного в зелений потім в синій і по кругу.
Проблема в тому, що 4-й режим блокую кнопку, тобто кнопка попросту не реагує, пробував різні бібліотеки для кнопки і без бібліотеки, але нічого не допомага.
Ось скетч:
#include <Adafruit_NeoPixel.h>
#define PIN 5 // Визначте пін, до якого підключена лента WS2812
#define NUM_LEDS 16 // Кількість світлодіодів у вашій стрічці
#define BUTTON_SWITCH_PIN 23 // Пін, до якого підключена кнопка
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
int mode = 1; // Початковий режим - червоний колір
int num_mode = 4; // Кількість режимів
unsigned long lastButtonPress = 0; // Зберігаємо час останнього натискання кнопки
const unsigned long debounceDelay = 200; // Затримка антидребізга (200 мілісекунд)
void setup() {
strip.begin();
strip.show(); // Ініціалізація всіх світлодіодів у виключеному стані
strip.setBrightness(150); // указываем яркость (максимум 255)
Serial.begin(115200);
pinMode(BUTTON_SWITCH_PIN, INPUT_PULLUP);
}
void loop() {
// Оновлення стану кнопки і перевірка на натискання
unsigned long currentMillis = millis();
int buttonState = digitalRead(BUTTON_SWITCH_PIN);
if (buttonState == LOW && currentMillis - lastButtonPress >= debounceDelay) {
mode++;
if (mode > num_mode) {
mode = 1;
}
resetStrip();
lastButtonPress = currentMillis;
}
// Виклик різних режимів відображення
switch (mode) {
case 1:
solidColor(strip.Color(255, 0, 0));
break;
case 2:
solidColor(strip.Color(0, 255, 0));
break;
case 3:
solidColor(strip.Color(0, 0, 255));
break;
case 4:
rainbowCycle();
break;
}
Serial.println(mode);
}
// Функція для відображення одного кольору на всій стрічці
void solidColor(uint32_t color) {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, color);
}
strip.show();
}
// Функція для скидання кольорів до початкового стану
void resetStrip() {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
}
void rainbowCycle() {
for (int j = 0; j < 256 * 5; j++) {
for (int i = 0; i < strip.numPixels(); i++) {
int wheelPos = (i * 256 / strip.numPixels() + j) % 256;
strip.setPixelColor(i, Wheel(wheelPos));
}
strip.show();
delay(10);
}
}
uint32_t Wheel(byte WheelPos) {
if (WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}