Цикл for(), похоже, не прерывается?

esp8266 rgb-led loop led-strip

Итак, я совершенно новичок в кодировании Arduino, но создал скетч, который работает, но я думаю, что он работает неправильно. Поэтому мне бы хотелось получить совет, как его улучшить.

Этот скрипт в настоящее время работает на чипе Wemos ESP8266, прикрепленном к светодиодной ленте WS2812 144 длиной 1 метр.

Мои вопросы:

  1. Цикл прерывается, когда значение постепенного исчезновения превышает 254. Когда я пытаюсь прервать его на fadein == 255, цикл больше не работает, так как значение постепенного изменения сразу переходит к 255. Почему?

  2. Когда я установил задержку на ноль, светодиод мерцал из-за слишком быстрого обновления. однако это мерцание продолжается даже после прерывания цикла for, что заставляет меня заключить, что цикл for все еще работает, даже когда применяется разрыв.

    Конечно, это больше не проблема, когда задержка установлена выше (как и должно быть), но все равно кажется пустой тратой вычислительной мощности поддерживать активный цикл for, пока он больше не делает ничего нового. как я могу полностью остановить выполнение цикла?

  3. Как это можно сделать по-другому/более эффективно?

Код

#define FASTLED_ALLOW_INTERRUPTS 0                                    //исправляем дрожание светодиодной ленты
#include <FastLED.h>                                                  //добавляем быстродействующую библиотеку
#define NUM_LEDS 144                                                  //установить количество светодиодов
#define DATA_PIN D4                                                   //установить светодиоды выводов данных

CRGB ledStrip[NUM_LEDS];                                              //инициализация светодиодной ленты
int fadeIn = 8;                                                       //инициализация счетчика исчезновения
int led = 0;                                                          //инициализация светодиодного счетчика

void setup() { 
  Serial.begin(115200);                                               //настраиваем канал связи
  FastLED.addLeds<WS2811,DATA_PIN, RGB>(ledStrip, NUM_LEDS);          //настраиваем конфигурацию светодиодной ленты
}
      
void loop()                    
{
for (int led = 0; led < NUM_LEDS; led++) {                            //перемещаем светодиод вверх по полосе, пока не будет достигнуто максимальное количество
    ledStrip[led] = CHSV( 0+led*1.77, 255, 225);                      //устанавливаем значение оттенка анимированного светодиода, чтобы получилась радуга
    FastLED.show();                                                   //показать цвет светодиода
    ledStrip[led] = CHSV( 0+led*1.77, 255, fadeIn);                   //устанавливаем оттенок неанимированного светодиода на то же значение оттенка, увеличивая значение затухания
    delay(3);
    if (fadeIn > 254) {                                               //если значение FadeIn превышает 254
      break;                                                          //остановим светодиодную анимацию
    }
}

    if (led = 144 && fadeIn < 254) {                                   //когда достигается 144-й светодиод и значение постепенного исчезновения меньше 255
      fadeIn+=16;                                                      //увеличиваем значение FadeIn на 16
    }
    if (led = 144 && fadeIn < 255) {                                   //когда достигается 144-й светодиод и FadeIn меньше 255, отображаются сообщения отладки
      Serial.println(led);                                             //печатаем значение светодиодного счетчика
      Serial.println(fadeIn);                                          //печатаем значение постепенного исчезновения
    }
    if (fadeIn > 255) {                                                 //если значение FadeIn превышает 255
      fadeIn = 255;                                                     //зажимаем значение FadeIn до 255

    }
    
  
} 

, 👍1

Обсуждение

+1 за правильно отформатированный код... если бы я мог, я бы дал вам еще +1 за комментарии, которые не мешают коду, @jsotola


4 ответа


3
  1. Рассмотрим последовательность значений «fadeIn». Он начинается с 8 и увеличивается на 16. Итак: 8, 24,... 248, 264,... . Оно никогда не бывает ровно 255. Таким образом, вы никогда не выйдете из цикла for.

  2. В вашем примере кода имеется только одна задержка. Трудно связать описанное в вашем вопросе поведение с местом задержки.

  3. Программирование на Arduino — это на самом деле программирование на C и C++. Этот язык, разработанный в Bell Labs, существует уже несколько десятилетий, и на эту тему написано бесчисленное множество книг. Вместо того, чтобы переписывать вашу программу (кто-то еще может это сделать), я бы рекомендовал заняться программированием на C, а если вы хотите написать программное обеспечение для библиотеки Arduino, то также программировать на C++.

,

правильно, я хотел проявить гибкость в отношении значения приращения. поэтому это if было добавлено в конце: if (fadeIn > 255) { //если значение fadeIn превышает 255 fadeIn = 255; // фиксировать значение fadeIn до 255 }, @nixx

Поскольку вы новичок в Stack Exchange, я бы порекомендовал следующее: задавайте по одному вопросу за раз. И не стесняйтесь редактировать свой вопрос, чтобы сделать его лучше. Это не форум. Вопросы должны быть самостоятельными и не зависеть от обсуждения. Будьте осторожны, не задавайте открытых вопросов или мнений. Такие вопросы обычно помечаются, и люди не будут на них отвечать. Когда вы пишете свои вопросы, помните, что другие будут искать ваш вопрос и опубликованные ответы. Поэтому сделайте вопрос кратким и понятным., @st2000

спасибо за предложения. Я учту их при будущих публикациях Я знаю, что есть книги, и я читаю столько, сколько могу, в Интернете, но пройти полный курс по программированию, чтобы запустить одну функцию светодиода, было бы для меня немного несбалансированно (плюс я график, а не программист). поэтому я надеялся получить совет по этой «простой» функции, которая, судя по всем найденным мной ссылкам, выглядит правильно сконструированной, но почему-то работает не так, как должна., @nixx


0

Вы закрываете цикл for() сразу после оператора if, содержащего разрыв. Нигде в этом цикле for() вы не меняете fadeIn, поэтому не из чего выходить.

Если вы переместите , закрывающий цикл for, ниже кода, изменяющего fadeIn, то break может быть выполнено:

void loop() {
  for (int led = 0; led < NUM_LEDS; led++) {                            //перемещаем светодиод вверх по полосе, пока не будет достигнуто максимальное количество
    ledStrip[led] = CHSV( 0+led*1.77, 255, 225);                      //устанавливаем значение оттенка анимированного светодиода, чтобы получилась радуга
    FastLED.show();                                                   //показать цвет светодиода
    ledStrip[led] = CHSV( 0+led*1.77, 255, fadeIn);                   //устанавливаем оттенок неанимированного светодиода на то же значение оттенка, увеличивая значение затухания
    delay(3);
    if (fadeIn > 254) {                                               //если значение FadeIn превышает 254
      break;                                                          //остановим светодиодную анимацию
    }

    if (led = 144 && fadeIn < 254) {                                   //когда достигается 144-й светодиод и значение постепенного исчезновения меньше 255
      fadeIn+=16;                                                      //увеличиваем значение FadeIn на 16
    }
    if (led = 144 && fadeIn < 255) {                                   //когда достигается 144-й светодиод и FadeIn меньше 255, отображаются сообщения отладки
      Serial.println(led);                                             //печатаем значение светодиодного счетчика
      Serial.println(fadeIn);                                          //печатаем значение постепенного исчезновения
    }
    if (fadeIn > 255) {                                                 //если значение FadeIn превышает 255
      fadeIn = 255;                                                     //зажимаем значение FadeIn до 255
    }
  }
}
,

ну, это самое забавное... когда я пробовал это раньше (или использовал ваш код), цикл каким-то образом вообще не выполнялся. Я думал, что мне нужно оставить эти последние три «если» в стороне., @nixx

Есть и другие ошибки, указанные в других ответах, например, оператор присваивания, используемый вместо оператора сравнения. Я только отметил ошибку условия прерывания цикла, которое не может быть выполнено, если условие не изменяется внутри цикла., @jose can u c


2

Это выполнение задания, а не ожидаемого сравнения

if (led = 144

Для сравнения нужен ==

,

Я тоже так думал изначально, но когда я пробую это, функция прерывается, и fadeIn никогда не увеличивается... поэтому я оставил в ней led = 0, так как led == 0 не работает., @nixx

ладно... разобрался с этим... он никогда не бывает 144, так как у меня 144 светодиода, но он начинает отсчет с 0, поэтому никогда не достигал 144, а только 143 как максимум, @nixx


0

Хорошо, спасибо за вашу помощь, мы нашли решение, которое сделает его стабильным. Думаю, меня сбил с толку тот факт, что светодиод = 144 (волшебным образом) работал вне цикла, но светодиод == 144 не работал вообще.

Оказывается, я неправильно считал светодиоды (от 0 до 143 вместо 1-144), и из-за этого все остальные части встали на свои места.

Передача

#define FASTLED_ALLOW_INTERRUPTS 0                                    //исправляем дрожание светодиодной ленты
#include <FastLED.h>                                                  //добавляем быстродействующую библиотеку
#define NUM_LEDS 144                                                  //установить количество светодиодов
#define DATA_PIN D4                                                   //установить светодиоды выводов данных

CRGB ledStrip[NUM_LEDS];                                              //инициализация светодиодной ленты
int fadeIn = 8;                                                       //инициализировать значение постепенного исчезновения
int fadeIncr = 16;                                                    //инициализируем приращение постепенного исчезновения

void setup() { 
  Serial.begin(115200);                                               //настраиваем канал связи
  FastLED.addLeds<WS2811,DATA_PIN, RGB>(ledStrip, NUM_LEDS);          //настраиваем конфигурацию светодиодной ленты
}

void loop()                    
{
for (int led = 0; led < NUM_LEDS; led++) {                            //перемещаем светодиод вверх по полосе, пока не будет достигнуто максимальное количество
    ledStrip[led] = CHSV( 0+led*1.77, 255, 225);                      //устанавливаем значение оттенка анимированного светодиода, чтобы получилась радуга
    FastLED.show();                                                   //показать цвет светодиода
    ledStrip[led] = CHSV( 0+led*1.77, 255, fadeIn);                   //устанавливаем оттенок неанимированного светодиода на то же значение оттенка, увеличивая значение затухания
    delay(1);
    if (led == 143) {                                                  //когда достигается 144-й светодиод и значение постепенного исчезновения меньше 255
      fadeIn+=(fadeIncr);                                              //увеличиваем значение FadeIn на 16
      fadeIn=constrain(fadeIn, 0, 255);                                // диапазон значений клипа
        Serial.println(led);                                           //печатаем значение светодиодного счетчика
        Serial.println(fadeIn);                                        //печать постепенного исчезновения
    } 
    if (fadeIn == 255) {                                               //если значение FadeIn превышает 255
      break;                                                           //остановим светодиодную анимацию
    } 
  }
} 
,