Помогите с millis

Имеется код: `#include <EncButton.h>
#include “FastLED.h”

#define LED_COUNT 36
#define LED_PIN 8

unsigned long last_time;

CRGB strip[LED_COUNT];

EncButton<EB_TICK, 13> btn(INPUT_PULLUP);

void setup() {
FastLED.addLeds<WS2812B, LED_PIN, RGB>(strip, LED_COUNT);
Serial.begin(9600);
}

void loop() {
if (millis() - last_time > 1) {
last_time = millis();
static byte mode = 0;
btn.tick();
if (btn.isClick()) {
if (++mode >= 5) mode = 0;
}
switch (mode) {
case 0: task1(); break;
case 1: task2(); break;
case 2: task3(); break;
case 3: task4(); break;
case 4: task5(); break;
}
}
}

void task1() {

}
void task2() {
// Включаем все светодиоды
for (int i = 0; i < 18; i++)
{
strip[i] = CRGB::Green; // Красный цвет.
}
// Передаем цвета ленте.
FastLED.show();
// Ждем 500 мс.
delay(50);
// Выключаем все светодиоды.
for (int i = 0; i < 18; i++)
{
strip[i] = CRGB::Black; // Черный цвет, т.е. выключено.
}
// Передаем цвета ленте.
FastLED.show();
// Ждем 500 мс.
delay(50);

// Включаем все светодиоды
for (int i = 18; i < 36; i++)
{
strip[i] = CRGB::Blue; // Синий цвет.
}
// Передаем цвета ленте.
FastLED.show();
// Ждем 500 мс.
delay(50);
// Выключаем все светодиоды.
for (int i = 18; i < 36; i++)
{
strip[i] = CRGB::Black; // Черный цвет, т.е. выключено.
}
// Передаем цвета ленте.
FastLED.show();
// Ждем 500 мс.
delay(500);
}

void task3() {
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 9, CRGB(225,225,225));
fill_gradient_RGB(strip, 27, CRGB(225,225,255), 36, CRGB(225,225,255));
FastLED.show();
delay(150);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
fill_gradient_RGB(strip, 9, CRGB(225,225,255), 18, CRGB(225,225,255));
fill_gradient_RGB(strip, 18, CRGB(225,225,255), 27, CRGB(225,225,255));
FastLED.show();
delay(150);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(150);

fill_gradient_RGB(strip, 0, CRGB(225,225,225), 9, CRGB(225,225,225));
fill_gradient_RGB(strip, 27, CRGB(225,225,255), 36, CRGB(225,225,255));
FastLED.show();
delay(150);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
fill_gradient_RGB(strip, 9, CRGB(225,225,255), 18, CRGB(225,225,255));
fill_gradient_RGB(strip, 18, CRGB(225,225,255), 27, CRGB(225,225,255));
FastLED.show();
delay(150);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(150);

fill_gradient_RGB(strip, 0, CRGB(225,225,225), 9, CRGB(225,225,225));
fill_gradient_RGB(strip, 27, CRGB(225,225,255), 36, CRGB(225,225,255));
FastLED.show();
delay(150);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
fill_gradient_RGB(strip, 9, CRGB(225,225,255), 18, CRGB(225,225,255));
fill_gradient_RGB(strip, 18, CRGB(225,225,255), 27, CRGB(225,225,255));
FastLED.show();
delay(150);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(150);

fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
delay(500);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,225), 36, CRGB(225,225,225));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);

fill_gradient_RGB(strip, 0, CRGB(225,225,255), 18, CRGB(225,225,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 18, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,255), 18, CRGB(225,225,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 18, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,255), 18, CRGB(225,225,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 18, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(225,225,255), 18, CRGB(225,225,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 18, CRGB(0,0,0));
FastLED.show();
delay(50);

fill_gradient_RGB(strip, 18, CRGB(225,225,255), 36, CRGB(225,225,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 18, CRGB(225,225,255), 36, CRGB(225,225,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 18, CRGB(225,225,255), 36, CRGB(225,225,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 18, CRGB(225,225,255), 36, CRGB(225,225,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
}

void task4() {
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(700);

fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,225,0), 18, CRGB(0,225,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 18, CRGB(0,0,255), 36, CRGB(0,0,255));
FastLED.show();
delay(50);
fill_gradient_RGB(strip, 0, CRGB(0,0,0), 36, CRGB(0,0,0));
delay(50);
FastLED.show();
delay(500);
}

void task5() {
task2();
delay(900);
task3();
delay(1000);
task4();
delay(1000);
}`

Это Стробоскопы(ФСО) для автомобиля, но из-за постоянно работы ws2812b кнопка срабатывает через раз, помогите пожалуйста реализовать постоянное орашивание кнопки :pray: :pray:

“Миша, всё переписываем, у тебя скучное лицо, тебе никто денег не даст” (с)

2 лайка

Для начала

Снимок экрана в 2023-03-05 17-05-33

А ФСО знает что вы под них косите ???

Это не код, а помойка.

2 лайка

:slight_smile:
ФСО надо помогать.
Вместо функции delay(); надо написать свою, типа delay_(); и в скетче все их подправить. Кнопку опрашивать внутри этой функции.

// функция временной задержки с проверкой поступающих данных
void delay_(int T1)
{
long Y1=millis();  
while(millis()-Y1<T1){
 //опрос кнопки и прочей хрени не могущей ждать
}
}

Ну тогда уж

void delay_(unsigned long  T1)

чтобы сравнивать подобное ))

Или посмотреть как устроена ардуино-функция delay(); … и не изобретать велосипед:smiley:

Да, Гайвер это объясняет:

Но могут потребоваться разные велосипеды :slight_smile:
delay_1(); delay_2();…

Если ТС не справился с вставкой кода - Вы думаете он сможет переписать delay или накрыть yield ???

И ещё момент. Очень часто внутри delay_(); нужен delay();…мне.

Не факт конечно.

Это костыль, не надо такое советовать

Не знаю, у меня часто и millis(), delay_(), delay() … всё есть. Почему костыль вразумительно не ясно, все пишут - костыль, а объяснений нет. Если розу белую с чёрной жабой … то я только за :slight_smile:

я понимаю что помойка, я лишь учусь что либо делать, поэтому и опросил помощи, потому что не знаю как решить свою проблему.

Потому что гладиолус. Допустим, тебе нужно опрашивать кнопку. У тебя в лупе несколько delay_(), и в каждом ты кнопку опрашиваешь. Но при каждом опросе состояние кнопки может быть разным, потому как нежелательно опрашивать ее более одного раза за проход цикла. И ты рискуешь получить серию непонятных глюков - типа, то кнопка таки не срабатывает, то наоборот, срабатывает там, где не надо, и ты сломаешь голову, пока разберешься, где же ты так накосячил :wink:

потому что так можно запустить только две независимые задачи - одну в основном цикле, и одну делее.
А подход с миллис позволяет получить неограниченное количество замещаемых задач

вы не сможете мне помочь? как вижу по вашим комментариям, шарите в этой теме)

могу подсказать что почитать - пример Blink Without Delay в стандартном ИДЕ

Или многочисленные описания в сети

еще один костыль?