Многозадачность

Подскажите пожалуйста, сможет ли arduino nano справиться с такой задачкой. Если к адресной светодиодной ленте WS2812b подключены две сенсорные кнопки, от первой кнопки зажигается первый светодиод и плавно затухает, а от второй кнопки второй светодиод и так же плавно затухает. В то время когда первый светик затухает, второй я включить не могу и так же наоборот. Можно ли сделать их независимыми друг от друга? Я как истинный дилетант, справиться с этим вопросом не смог. Получалось только одновременно моргать, включать да выключать. Направьте на путь истинный, а то сил моих больше нет))

int bt2 = 0;
int bt3 = 0;

#include <Adafruit_NeoPixel.h>

#ifdef __AVR__
#include <avr/power.h>
#endif

Adafruit_NeoPixel pixels_13 = Adafruit_NeoPixel(10, 13, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels_13.begin();
  pinMode(2, INPUT);
  pinMode(3, INPUT);
}

void loop() {
  if (digitalRead(2) == 1 && bt2 == 0) {
    bt2 = 1;
    pixels_13.setBrightness(255);
    pixels_13.setPixelColor(0, pixels_13.Color(0, 255, 0));
    pixels_13.show();
  }
  if (digitalRead(2) == 0 && bt2 == 1) {
    bt2 = 0;
    for (int i = 255; i > 0; i--) {
      pixels_13.setPixelColor(0, pixels_13.Color(0, i, 0));
      pixels_13.show();
      unsigned long currentMillis = millis();
      while (millis() - currentMillis < 15) {
      }
    }
    pixels_13.setPixelColor(0, pixels_13.Color(0, 0, 0));
    pixels_13.show();
  }

  if (digitalRead(3) == 1 && bt3 == 0) {
    bt3 = 1;
    pixels_13.setBrightness(255);
    pixels_13.setPixelColor(1, pixels_13.Color(0, 255, 0));
    pixels_13.show();
  }
  if (digitalRead(3) == 0 && bt3 == 1) {
    bt3 = 0;
    for (int i = 255; i > 0; i--) {
      pixels_13.setPixelColor(1, pixels_13.Color(0, i, 0));
      pixels_13.show();
      unsigned long currentMillis = millis();
      while (millis() - currentMillis < 15) {
      }
    }
    pixels_13.setPixelColor(1, pixels_13.Color(0, 0, 0));
    pixels_13.show();
  }
}

Сделать можно, но придется переписать код полностью. Ваши циклы for() блокируют выполнение программы. Нужно на каждое исполнительное устройство написать по функции - конечному автомату. Совсем недавно обсуждение было, там один из участников приводил общий алгоритм работы с “многозадачностью”.

Не обманывайте себя. Это пишется проще - delay(15);

1 лайк

Так раньше и было написано, это я тут незнаючи намудрил)

1 лайк

Но вроде бы delay(), нельзя в многозадачности использовать?

1 лайк

Вы понимаете, что дело не в названии? У вас ровно то же самое. И, кстати, почему нельзя использовать? Вы же использовали, программа скомпилировала, значит - можно!

Пока про КА вдумчиво не ознакомитесь, дальнейшее рассуждение на тему допустимости в коде дилеев считаю бессмысленной тратой времени

Спасибо за ответ, просто хотел узнать можно ли такое сделать на ардуинке

1 лайк

Большое спасибо, буду пробовать

Мог бы и ссылку кинуть, я же не зря старался.
“…один из участников”, my ass!

В конце этой темы я привел пример.

Сводка

Выбегалло обожает вкраплять в свою речь отдельные словосочетания на французском, как он выражается, диалекте (С) АБС

1 лайк