Как заменить delay?

Xhunt8r

✩✩✩✩✩✩✩
8 Окт 2023
14
0
Привет! У меня есть проект в котором надо по нажатию кнопки менять цвет на светодиодном кольце. Сначала идет эффект бегущей строки в функции load(), а в switch идут цвета, по кнопке происходит инкремент в переменную от которой зависит цвет. Проблема в том, что по нажатию на кнопку ничего не происходит, возможно это из за delay. Как можно это исправить, чтобы сохранить эффект бегущей строки(может mills? но не могу в них разобраться). Заранее спасибо!
Код:
#include <FastLED.h>
#include "Ultrasonic.h"
#include "GyverButton.h"

#define NUM_LEDS 12
#define DATA_PIN 10
CRGB leds[NUM_LEDS];


Ultrasonic ultrasonic(6, 7);

int chooseLight;
byte mode;

GButton lightButt(3);


void setup()
{
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(100);
  Serial.begin(9600);
  chooseLight, mode = 0;


}

void loop()
{
  lightButt.tick();
  if (lightButt.isPress())
  {
    Serial.println("pressed!");
    chooseLight++;

  }

  if (chooseLight >= 4) chooseLight = 0;
  if (mode >= 5)  mode = 0;

 
  Light();
 
}

void liner()
{
  float dist_cm = ultrasonic.Ranging(CM);     //Получить дистанцию
  Serial.println("Distance to object: ");
  Serial.println(dist_cm);                     //Вывод дистанции
}
void Light()
{
  switch(chooseLight)
  {
    case 0:
      load();
    break;

    case 1:
     FastLED.setBrightness(150);
     for (byte countLED = 0; countLED < 12; countLED++)
     {

        leds[countLED] = CRGB::White;
        FastLED.show();
      
     }
    break;
    case 2:
     FastLED.setBrightness(25);
     for (byte countLED = 0; countLED < 12; countLED++)
     {

        leds[countLED] = CRGB::Red;
        FastLED.show();
      
     }
    break;
    
    case 3:
     FastLED.setBrightness(100);
     for (byte countLED = 0; countLED < 12; countLED++)
     {

        leds[countLED] = CRGB::Blue;
        FastLED.show();
        
     }
    break;
  }
 
}

//Эффект загрузки

void load() {
  FastLED.setBrightness(50);
  for (byte countLED = 0; countLED < 12; countLED++) {

    leds[countLED] = CRGB::DarkViolet;
    FastLED.show();
    delay(100);
  }

  for (byte countLED = 0; countLED < 12; countLED++) {

    leds[countLED] = CRGB::Black;
    delay(100);
  }

  for (byte countLED = 0; countLED < 12; countLED++) {

    leds[countLED] = CRGB::DarkViolet;
    FastLED.show();
    delay(100);
    leds[countLED] = CRGB::Black;
  }
 
}
 

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
Под avr (он же "нано") моя либа не работае. Придется таки вам разбираться с делей и писать код так что бы его не использовать.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
340
105
что по нажатию на кнопку ничего не происходит,
При долгом нажатии на кнопку (секунда) тоже ничего не происходит?
Serial.println("pressed!"); Не выводится?
Тогда закомментируйте строку 42 Light();
И если Serial.println("pressed!"); все равно не выводится при нажатиях, значит с кнопкой что то не так.
 

Xhunt8r

✩✩✩✩✩✩✩
8 Окт 2023
14
0
@Сотнег, Можете помочь с реализаций данного метода, я пробовал у меня не получилось
 

Xhunt8r

✩✩✩✩✩✩✩
8 Окт 2023
14
0
@bort707, Через yield получилось, но проблема в инкременте, без него все работает, кнопка срабатывает, но нужно изменять режим светодиодного кольца.

C++:
#include <FastLED.h>
#include "GyverButton.h"

#define NUM_LEDS 12
#define DATA_PIN 10
CRGB leds[NUM_LEDS];

int chooseLight;

GButton lightButt(3);
void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(100);
  Serial.begin(9600);
  chooseLight = 0;
}

void loop() {

  if (chooseLight >= 3) chooseLight = 0;
  switch (chooseLight) {
      case 0:
        load();
        break;

      case 1:
        FastLED.setBrightness(150);
        for (byte countLED = 0; countLED < 12; countLED++) {

          leds[countLED] = CRGB::White;
          FastLED.show();
        }
        break;
      case 2:
        FastLED.setBrightness(25);
        for (byte countLED = 0; countLED < 12; countLED++) {

          leds[countLED] = CRGB::Red;
          FastLED.show();
        }
        break;

      case 3:
        FastLED.setBrightness(100);
        for (byte countLED = 0; countLED < 12; countLED++) {

          leds[countLED] = CRGB::Blue;
          FastLED.show();
        }
        break;
    }
    
}

void yield() {
  lightButt.tick();
  if (lightButt.isPress()) {
    Serial.println("pressed!");
    chooseLight++;
    Serial.println(chooseLight);
  }
}

void load() {
  FastLED.setBrightness(50);
  for (byte countLED = 0; countLED < 12; countLED++) {

    leds[countLED] = CRGB::DarkViolet;
    FastLED.show();
    delay(100);
  }

  for (byte countLED = 0; countLED < 12; countLED++) {

    leds[countLED] = CRGB::Black;
    FastLED.show();
    delay(100);
  }

  for (byte countLED = 0; countLED < 12; countLED++) {

    leds[countLED] = CRGB::DarkViolet;
    FastLED.show();
    delay(100);
    leds[countLED] = CRGB::Black;
  }
}