Anfänger Frage zu if else bei dmx simple

Ich bin neu in Forum und beschäftige mich seit zwei Wochen mit einem Arduino Uno und mein Hauptaugenmerk liegt bei DMX (DmxSimple). Ich habe eine Frage, die mir fast peinlich zu stellen ist:
ich habe Probleme mit einer if-else-Abfrage. Und zwar sollen durch einen Taster, die DMX-Kanäle (Farben) umgeschaltet werden.
Wenn ich den Sketch hochlade, leuchtet der Spot blau. Alles ok.
Wenn ich den Sketch bei gedrückten Taster hochlade, leuchtet der Spot rot. Alles ok.
Aber wenn ich dann den Taster loslasse oder drücke, leuchtet der Spot violett! Die if-else-Anweisung schaltet nicht, sondern durchläuf das if und das else gleichermaßen! Der Serial Monitor gibt aber den richtigen Tasterstatus zurück.

Wenn ich das ganze mit Variablen regel (statt Taster), die ich über den Serial Monitor eingebe, ist es genau das gleiche. Die Variablen sind bei der Initialisierung auf 1 aber 2 gesetzt: blau oder rot - alles ok! Schalte ich aber über den Serial Monitor um: violett. Es scheint also an der if-else-Abfrage zu liegen.

Der Einfachheit halber, habe ich eine Beispieldatei genommen, und nur zwei Zeilen dazu geschrieben.

Mit googlen und mit alten Forumbeträgen, scheine ich nicht weiterzukommen.
Für Antworten wäre ich dankbar!

`#include <DmxSimple.h>

const int buttonPin = 4;
const int ledPin = 8;
int buttonState = 0;

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop() {
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
DmxSimple.write(1, 50); // von mir dazugeschrieben, ROT, brightness 50

} else {
digitalWrite(ledPin, LOW);
DmxSimple.write(3, 50); // von mir dazugeschrieben, BLAU, brightness 50
}
}
`

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Das ist ein Irrtum!
Wenn du umschalten willst von rot zu blau, solltest du rot auch abschalten. Das sehe ich nirgends bei dir.

Bedenke: Rot + blau = magenta(lila)

@hajo_klar
Annahme, dein Spot hat 3 Addressen
rot
grün
blau.

Du musst also für Rot den Blau Kanal abschalten bzw. für Blau den Rot Kanal. Ansonsten wirds violett.

P.S.: bitte poste deinen Code in Code Tags. Wie das geht - steht im Forum-How to - der sticky post am Beginn / in der Themenübersicht.
Das kannst du auch noch nachträglich tun.
https://forum.arduino.cc/t/wie-man-dieses-forum-benutzt-bitte-lesen/902274/2

Hallo @hajo_klar

es ist immer besser den ganzen Sketch als Code-Section zu posten.
Als Code-Section kann man den Code mit einem Mausklick in die Zwischenablage kopieren
und die Länge wird durch die Fenstertechnik der Code-Section begrenzt.

Du solltest dir angewöhnen für alles und jedes selbsterklärende Namen zu verwenden.
Wenn du in einem halben Jahr wieder in ein Programm reinschaust und da steht

DmxSimple.write(1, 50);

dann grübelst du was ist noch mal die "1" ?? was ist nochmal "50"?

Hier ist eine Programmversion mit debug-macros und selbsterklärenden Namen

// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *

// a detailed explanation how these macros work is given in this tutorial
// https://forum.arduino.cc/t/comfortable-serial-debug-output-short-to-write-fixed-text-name-and-content-of-any-variable-code-example/888298

#define dbg(myFixedText, variableName) \
  Serial.print( F(#myFixedText " "  #variableName"=") ); \
  Serial.println(variableName);
// usage: dbg("1:my fixed text",myVariable);
// myVariable can be any variable or expression that is defined in scope

#define dbgi(myFixedText, variableName,timeInterval) \
  do { \
    static unsigned long intervalStartTime; \
    if ( millis() - intervalStartTime >= timeInterval ){ \
      intervalStartTime = millis(); \
      Serial.print( F(#myFixedText " "  #variableName"=") ); \
      Serial.println(variableName); \
    } \
  } while (false);
// usage: dbgi("2:my fixed text",myVariable,1000);
// myVariable can be any variable or expression that is defined in scope
// third parameter is the time in milliseconds that must pass by until the next time a
// Serial.print is executed
// end of macros dbg and dbgi
// print only once when value has changed
#define dbgc(myFixedText, variableName) \
  do { \
    static long lastState; \
    if ( lastState != variableName ){ \
      Serial.print( F(#myFixedText " "  #variableName" changed from ") ); \
      Serial.print(lastState); \
      Serial.print( F(" to ") ); \
      Serial.println(variableName); \
      lastState = variableName; \
    } \
  } while (false);
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *

#include<DmxSimple.h>

const byte buttonPin = 4;
const byte ledPin = 8;
byte buttonState = 0;

const byte red = 1;
const byte blue = 3;

int brightness = 50;

const byte pressed = HIGH;
const byte unPressed = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  brightness = 50;
}

void loop() {
  buttonState = digitalRead(buttonPin);
  dbgc("1:",buttonState);
  
  if (buttonState == pressed) {
    digitalWrite(ledPin, HIGH);    
    DmxSimple.write(red, brightness);  // von mir dazugeschrieben, ROT, brightness 50
 } 
 else {
    digitalWrite(ledPin, LOW);
    DmxSimple.write(blue, brightness);  // von mir dazugeschrieben, BLAU, brightness 50
  }
}

vgs

Was beklagt ihr Euch?
hajo_klar hat einen Minimalsketch extra für uns geschrieben bei dem das Problem auftritt.
Schon das gehört honoriert!

Ich tendire combie beizupflichten das dieser Logikfehler der Grund der Fehlfunktion ist.
Grüße Uwe

Vielen, vielen Dank!!!! Ich werde heute Nachmittag oder Morgen testen.

Es war der Logikfehler. Ich hatte einfach "vergessen", die Funktion wieder auszuschalten.
Habt nochmals vielen Dank!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.