#1 2023-10-06 16:38:10

imden10
Учасник
Зареєстрований: 2022-05-02
Повідомлень: 42

Перемикання режимів лед стрічки

Доброго дня! Маю скетч для управління 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);
  }
}

Неактивний

#2 2023-10-06 20:27:10

г0cть
Гість

Re: Перемикання режимів лед стрічки

Перепишите функцию, избавьтесь от блокирующих циклов for

#3 2023-10-06 20:34:14

imden10
Учасник
Зареєстрований: 2022-05-02
Повідомлень: 42

Re: Перемикання режимів лед стрічки

г0cть пише:

Перепишите функцию, избавьтесь от блокирующих циклов for

ну таке, це я і так розумію, але не розумію як

Неактивний

#4 2023-10-06 20:55:26

akapulko
Гість

Re: Перемикання режимів лед стрічки

"Ну ось код, ось проблема..."
І що?

#5 2023-10-06 21:45:44

Васятко
Гість

Re: Перемикання режимів лед стрічки

Попробуйте в качестве костыля
for (int j = 0; j < 256 * 5; j++) {
if (!digitalRead(BUTTON_SWITCH_PIN)) break;
for ...

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму