2017-02-19 4 views
1

Ich habe ein Arduino mit FastLED mit einem Streifen von 600 Ws2812b Lichter. Ich bin mit dem folgenden Code:unerwartetes Verhalten arduino fastLED ws2812b

#include "FastLED.h" 
#define DATA_PIN 5  // change to your data pin 
#define COLOR_ORDER GRB  // if colors are mismatched; change this 
#define NUM_LEDS 600  // change to the number of LEDs in your strip 
#define BRIGHTNESS 32 
#define WRAP_NUM 55 
#define LED_TYPE WS2812B 

CRGB leds[NUM_LEDS]; 
int startIndex=0; 
int bottom=1; 

void setup() 
{ 
    delay(3000); 

    FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); 
    FastLED.setBrightness(BRIGHTNESS); 
} 

void loop() 
{ 
    shapeTwirl(); 
} 

void shapeTwirl() 
{ 
    FastLED.clear(); 

    static int heart[]={bottom*WRAP_NUM}; 
    for(int i=0;i<sizeof(heart);i++) 
    { 
     leds[(heart[i]+startIndex)]=CRGB::Red; 
    } 
    FastLED.show(); 
    delay(70); 

    startIndex=(startIndex+1)%WRAP_NUM; 
} 

ich meine Lichter in einem Kreis habe und das macht einen roten Punkt Wrap um den Kreis. Ein blauer Punkt, der ungefähr 100 Lichter entfernt ist, dreht sich jedoch auch herum. Es gibt nichts in meinem Code, um blaues Licht zu machen. Ich habe dies aufgespürt

int bottom=1; 

zu verwenden, wenn ich unten im Code mit einer Reihe ersetzen, ich werde der blauen Punkt los und es funktioniert einwandfrei. Das Problem ist auch gelöst, wenn ich unten # 1 definiere. Es spielt keine Rolle, ob ich den Boden jetzt oder innerhalb von shapeTwirl definiere. Das führt mich zu der Annahme, dass etwas falsch mit der Verwendung einer Variable für die Unterseite ist, aber ich habe versucht, ein int, static int, unsigned int ohne Erfolg zu verwenden.

Warum leuchtet das falsche Licht?

Ich benutze ein Arduino Uno, um die Lichter und externe Stromversorgung zu steuern, um sie zu betreiben.

Antwort

1

Hinweis: Sie sollten prüfen, ob die Arduino IDE konfiguriert ist, alle Warnungen drucken.


Ihr Code ruft undefiniertes Verhalten.

diese Zeile:

static int heart[]={bottom*WRAP_NUM}; 

Ergebnisse in einem Array von ein Elemente mit dem Wert von bottom * WRAP_NUM initialisiert, unabhängig von dem Wert der bottom. Ich bemerke das, weil dies möglicherweise nicht das ist, was Sie beabsichtigt haben.

Hier ist Ihr Problem:

for(int i=0; i < sizeof(heart); i++) 

sizeof(heart) gibt die Anzahl der Bytes Ihres Arrays, die 2 liegt daran, dass die Größe eines int auf Arduino ist. Als Folge Körper in der Anweisung der Schleife

leds[(heart[i]+startIndex)]=CRGB::Red; 

heart[i] greift auf eine ungültige Speicherstelle in der zweiten Schleife Iteration (i == 1), was bedeutet, dass einige andere zufälligen Ort könnte mit Ihrer Farbe überschrieben.

Wenn Sie wissen wollen, wie viele int in Ihrem Array gespeichert sind dann müssen Sie es mit sizeof(heart)/sizeof(int) ersetzen:

for(int i=0; i < (sizeof(heart)/sizeof(int)); i++) 

Als Grund, warum Sie ein blaues Licht sehen , Würde ich die folgenden Dinge überprüfen:

  • Überprüfen Sie, dass #define COLOR_ORDER GRB ist wirklich was Sie wollen: ich vermute, dass CRGB::RedRGB als COLOR_ORDER erfordern würde.
  • Sicherstellen, dass die Verdrahtung korrekt ist