if-Bedingung geht nicht mehr, wenn "else" dabei ist (NeoPixel)

Hallo,

wie im Titel bereits beschrieben habe ich mit einer einfachen if-Bedingung einige Probleme. Ich bin kein Neuling in der Programmierung und kenne mich eigentlich auch mit Arduinos recht gut aus.

Ich bin aktuell dabei ein kleines Programm mit NeoPixel für WS2812 Pixel zu basteln :slight_smile:
Leider habe ich folgendes Problem:

Wenn ich nur die if-Condition habe funktioniert alles super:
Die Prüfung der Bedingungen klappt einwandfrei immer und in jedem loop erneut.

Sobald ich aber ein "else" einfüge ist die Prüfung der if-Condition IMMER false und es wird (daher logisch) nur das else ausgeführt.

Zum allgemeinen Verständnis:
Es handelt sich um ein DMX Signal, was eingelesen wird und je nach Signal ein Programm mit den LEDs ausführen soll. Das DMX Signal wird definiv dauerhauft gesendet und es ändert sich auch nachweislich. Also müsste die Prüfung zwischen true und false wechseln, aber genau das passiert eben nicht.

Anbei der Code in vereinfachter Fassung (Problem besteht bei genau diesem Code weiterhin):

#include <DMXSerial.h>
#include <Adafruit_NeoPixel.h>

#define PIN 6
#define NUM_LEDS 10
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

int p9;
    
void setup() {
  strip.begin();
  strip.show();
    
  DMXSerial.init(DMXReceiver);
  DMXSerial.write(9, 0);
}

void loop() {
  p9 = DMXSerial.read(9);

  if(p9 == 255) {
      green();
      delay(500);
      blue();
      delay(500);
  } else {
      red();
  }
}


//---------- Functions ----------//

void red() {
    for(int i; i < NUM_LEDS; i++) {
       strip.setPixelColor(i, 255,0,0); 
       strip.show();
    }
}

void green() {
    for(int i; i < NUM_LEDS; i++) {
       strip.setPixelColor(i, 0,255,0); 
       strip.show();
    }
}

void blue() {
    for(int i; i < NUM_LEDS; i++) {
       strip.setPixelColor(i, 0,0,255); 
       strip.show();
    }
}

Hat jemand eine Idee was (bei dem eigentlich sehr einfachen Programm) nicht stimmt?

Grüße
FloF

FloF195:
Hallo,

wie im Titel bereits beschrieben habe...

Der Titel ist für die Tonne, denn es gibt gar keine if-Schleifen.
Es gibt if-Bedingungen.

Was macht

DMXSerial.read(9);

Was passiert, wenn du in der Zeile danach  Serial.println(p9); delay(100);  schreibst?

Oh... Sorry. Du hast natürlich recht! War geistig wohl bei einer anderen Schleife oder so beim schreiben...

Habs korrigiert.

println(p9); geht leider nicht, da DMXserial die serielle Schnittstelle nutzt. Somit kann ich leider keine Ausgabe über den seriellen Monitor erzeugen :frowning:

Es scheint an strip.show(); zu liegen. Sobald ich es in der Funktion red() auskommentiere funktioniert die Prüfung im if auch. Klar, dann geht die Funktion dann nicht mehr.

Aber es scheint somit am strip.show(); zu liegen. Aber wieso? Das darf ja mehrfach vorkommen!? Ich habe es auch aus jeder Funktion raus genommen und am Ende vom Loop eingefügt, das verändert nichts.

Dein Programm ohne DMX ergibt folgende Warnungen:

warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized]

Mit for (int i = 0; i < NUM_LEDS; i++) funktioniert das Programm, sieht zumindest so aus :slight_smile:

Es lohnt sich, die Warnungen einzuschalten.

Mein Testsketch:

#include <Adafruit_NeoPixel.h>

#define PIN 6
#define NUM_LEDS 10
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_RGB + NEO_KHZ800);

int p9;

void setup() {
  Serial.begin(9600);
  strip.begin();
  strip.setPixelColor(0, 50, 0, 0);
  strip.setPixelColor(1, 0, 50, 0);
  strip.setPixelColor(2, 0, 0, 50);
  strip.show();
}

void loop() {
  if (Serial.available()) {
    p9 = Serial.parseInt();
    if (p9 == 255) {
      green();
      delay(500);
      blue();
      delay(500);
    } else {
      red();
    }
  }
}

//---------- Functions ----------//

void red() {
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, 255, 0, 0);
    strip.show();
  }
}

void green() {
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, 0, 255, 0);
    strip.show();
  }
}

void blue() {
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, 0, 0, 255);
    strip.show();
  }
}

agmue:
Dein Programm ohne DMX ergibt folgende Warnungen:

warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized]

Mit for (int i = 0; i < NUM_LEDS; i++) funktioniert das Programm, sieht zumindest so aus :slight_smile:

Hat leider keinen Unterschied ergeben ob ich "int i" oder "int i = 0" schreibe.

Und Serial.*() ist nicht einsetzbar, da ich die Library DMXSerial.h nutze und die die serielle Schnittstelle für sich beansprucht. Ich empfange ja über den RX-Pin ein DMX Signal.

FloF195:
Hat leider keinen Unterschied ergeben ob ich "int i" oder "int i = 0" schreibe.

Schade.

FloF195:
Und Serial.*() ist nicht einsetzbar, da ich die Library DMXSerial.h nutze und die die serielle Schnittstelle für sich beansprucht. Ich empfange ja über den RX-Pin ein DMX Signal.

Kleiner Scherzkeks! Ich verwende Serial.*(), weil ich DMX nicht habe :slight_smile:

Da es mit Serial.*() funktioniert, muß es einen Unterschied zu DMXSerial.h geben.

Die Ansteuerung von NeoPixel-LEDs ist leider zeitkritisch und blockierend, weshalb andere zeitkritische Anwendungen wie Kommunikation dadurch behindert werden können oder umgekehrt. Einzige mir bekannte Lösung: verwende APA102 (DotStar).