Залипает delay()

доброго времени суток! такая проблема исполнение программы залипает на delay(), далее нужно ловить момент для переключения по клику кнопки чтобы перейти к след. режиму работы.

#include "Adafruit_NeoPixel.h" // подключаем библиотеку

#define PIN  10              // указываем пин для подключения ленты
#define NUMPIXELS 30  // указываем количество светодиодов в ленте

Adafruit_NeoPixel strip (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

const int buttonPin = 5;  // пин кнопки
int a = 1000;
int b = 150;
int c = 500;
int Program;
int buttonState = 0;

void setup()

{pinMode(buttonPin, INPUT);

if(!digitalRead(5))
{Program+=1;
delay(1000);}

{if(Program>=3);
{Program=0;}
}
strip.begin();
strip.setBrightness(20); // указываем яркость светодиодов (максимум 255)
}





void loop() {

switch (Program) {

case 0:
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, strip.Color(255, 255, 255));
strip.show();}
break;

case 1:   
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 255));
strip.show();
delay(b);}
strip.clear(); 

for (int i = 29; i > -1; --i) {
strip.setPixelColor(i, strip.Color(0, 0, 255));
strip.show();
delay(b);}
strip.clear();

for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, strip.Color(255, 255, 255));
strip.show();
delay(b);}
strip.clear(); 

for (int i = 29; i > -1; --i) {
strip.setPixelColor(i, strip.Color(255, 255, 255));
strip.show();
delay(b);}
strip.clear();

for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, strip.Color(255, 0, 0));
strip.show();
delay(b);}
strip.clear();

for (int i = 29; i > -1; --i) {
strip.setPixelColor(i, strip.Color(255, 0, 0));
strip.show();
delay(b);}
strip.clear();
break;

case 2:

for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 255));
strip.show();}
{delay(c);}
strip.clear();

for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, strip.Color(255, 255, 255));
strip.show();}
{delay(c);}
strip.clear();

for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, strip.Color(255, 0, 0));
strip.show();}
{delay(c);}
strip.clear(); 

}}

Научитесь не использовать delay, если нужна мгновенная реакция на вмешательство пользователя !!!

пробовал через millis(), нет эффекта бегущего светодиода((((

И в чем вопрос?

в том, что через delay() нужно ловить момент для переключения по клику кнопки.
а через millis() не получается сохранить эффект бегущего пикселя.

Так и должно быть. Не используйте delay()

Значит вы используете millis() неправильно

Так и должно быть.

Найдите два исходника: blink и blink without delay и перечитывайте их, пытаясь найти разницу, до тех пор, пока не случится озарение.

Функция yield()

Но это костыль, работает если кроме опроса кнопок больше ничего не нужно делать и “на постоянно” так делать нельзя.

Как вариант

Вас спросили:

Ваш ответ:

Это, по-вашему, вопрос? По-моему - это утверждение. Как на него отвечать? Ну, давайте я попробую адекватно ответить: “Мне жаль, что у Вас не получается”. Вам помог мой ответ?

while(millis()<10000){
if(!digitalRead(5))
{Program+=1;
if(Program>=3)
{Program=0;}
delay(200);
}
}

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

Может быть это натолкнет на мысль?

// В объявлении:
unsigned long time;

// В setup:
time=millis()+5000;

// В loop:
if (millis()>=time)
{
// этот блок будет срабатывать каждые 5 секунд
// здесь что-то свое
	time=millis()+5000;
}

Как-то так.

похоже вы сами не знаете “как”

2 лайка

А потом это понесется в массы с пометкой “так на arduino.ru научили”

2 лайка

Так нельзя, это гарантированные проблемы при переполнении millis(). Делать нужно по феншую

void loop()
{
  static unsigned long time  = millis();

  if (millis() - time >= 5000)
  {
    // этот блок будет срабатывать каждые 5 секунд
    time = millis();
    // здесь что-то свое
  }
}

Здесь перемена мест слагаемых очень даже имеет значение :wink:

3 лайка

На мысль о переполнении millis()? Меня сразу натолкнуло :frowning:

этот блок будет срабатывать постоянно. Условие надо перевернуть

1 лайк

Точно, млин, не проснулся еще. Поправил ))

У знака “=” рога не с того места выросли? Давала направо, а рога слева почему-то. :slight_smile:

Как-то странно.