Проблема с FastLED и простым счетчиком - PullRequest
0 голосов
/ 11 мая 2018

Хорошо, у меня одна проблема с этим кодом. Счетчик pushCounterz (именуемый только z, чтобы исключить конфликтующую переменную) будет начинаться с правильного счетчика (1 или 0 или в зависимости от того), и при нажатии кнопки произойдет одно из следующих событий:

  1. ничего не делает
  2. правильно переключает светодиод, но счетчик работает не по одному из двух способов
    1. переместится на -255, затем при втором нажатии сбрасывается на 1 и переворачивается при каждом нажатии от 1 до -255
    2. Счетчик не будет увеличиваться
    #include <FastLED.h>
    #define AnalogIn A0
    #define SwIn 2
    #define LED_Out 12
    #define NUM_LEDS 100
    int pushCounterz = 0;
    int buttonState;
    int lastButtonState;   // the previous reading from the input pin
    int ledPin = 13;
    int ledState = HIGH; 

    CRGB leds[NUM_LEDS];

    void setup() {
      // put your setup code here, to run once:
      FastLED.addLeds<WS2812, LED_Out, GRB>(leds, NUM_LEDS);
      //pinMode(SwIn, INPUT);
      pinMode(LED_Out, OUTPUT);
      pinMode(ledPin, OUTPUT);
      //Turn Off strip
      for (int i = 0; i <= NUM_LEDS; i++) {
        leds[i] = CRGB ( 255, 0, 0 );
        FastLED.show();
      }
        digitalWrite(ledPin, ledState);
        Serial.begin(115200);
        Serial.println(pushCounterz);
        lastButtonState = digitalRead(SwIn); // Set the button state to the startup state 
    }

    void loop() {

      buttonState = digitalRead(SwIn);

   if (buttonState == LOW && buttonState != lastButtonState) {
    ledState = !ledState;
   }
   if (buttonState == LOW && buttonState != lastButtonState) {
        if (pushCounterz > 3) {
          Serial.println("Reset to 0: ");
          pushCounterz = 0;
        } else {
          pushCounterz = pushCounterz + 1;
          Serial.println("Incerment");
        }
        Serial.println(pushCounterz);
        switch (pushCounterz) {
          case 0:
            for (int i = 0; i <= NUM_LEDS; i++) {
              leds[i] = CRGB (255, 0, 0);
            }
            break;
          case 1:
            for (int i = 0; i <= NUM_LEDS; i++) {
              leds[i] = CRGB ( 0, 255, 0);
             }
             break;
          case 2:
            for (int i = 0; i <= NUM_LEDS; i++) {
               leds[i] = CRGB ( 0, 0, 255);
             }
            break;
          case 3:
           // theaterChaseRainbow(1,50);
            break;
          default:
           for (int i = 0; i <= NUM_LEDS; i++) {
             leds[i] = CRGB ( 0, 0, 0);
           }
           break;
        }
      }
    FastLED.show();
    digitalWrite(ledPin, ledState);
    lastButtonState = buttonState;
    }

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

РЕДАКТИРОВАТЬ: Код выше исправил одну проблему с кнопкой. Я изменил схему на HIGH и отбросил LOW, однако не изменил код. ОДНАКО состояние остается непоследовательным, иногда работает, а иногда переворачивается между 1 и -255 (тем более, последний). Сводка изменений:

void setup() {
...
  lastButtonState = digitalRead(SwIn); // Set the button state to the startup state 
}

  */
  buttonState = digitalRead(SwIn);

  if (buttonState == LOW && buttonState != lastButtonState) {
    ledState = !ledState;
  }
  if (buttonState == LOW && buttonState != lastButtonState) {

РЕДАКТИРОВАТЬ: Последовательный вывод, чтобы показать текущее сумасшествие (с примечаниями) после редактирования выше:

0 <- initial startup correct
Incerment <- button push
1 <- correct increment
Incerment <- 2nd button push
-255 <- 1 + 1 does NOT equal -255
Incerment <- 3rd button push
1 <- ??? Assuming -255 +1 = 1?
Incerment
-255

1 Ответ

0 голосов
/ 12 мая 2018

С

for (int i = 0; i <= NUM_LEDS; i++)

вы используете индекс 100, который является 101-м элементом массива.

Это неопределенное поведение, которое в вашем случае вызывает проблемы с pushCounterz.

Исправьте все свои циклы for, которые повторяются в leds, изменив оператор <= с помощью <.

for (int i = 0; i < NUM_LEDS; i++)
...