Ausgang mit Serieller Eingabe steuern

Guten Tag,

ich versuche gerade mit eine Relaissteuerung zu erstellen. Das Relais schaltet LOW. Mein Code sieht bisher so aus (Bin absoluter Arduino Anfänger):

// Variablen festlegen
int Re1 = 21;
int Re2 = 20;
int incoming = 0;
boolean BoolRe1 = LOW;
boolean BoolRe2 = LOW;
//Setup
void setup() {
  //Pinmodes
  pinMode(Re1, OUTPUT);
  pinMode(Re2, OUTPUT);
  
 
  //Serielle Schnittstelle starten
  Serial.begin(9600);
  
  //Relais-Pins auf "AUS" schalten
  digitalWrite(Re1, HIGH);
  digitalWrite(Re2, HIGH);
}

//Loop
void loop() {
//Einkommende Serielle Befehle in Variable "incoming" schreiben
incoming = Serial.read();

//Eins Ein
 if (Serial.available() > 0){
if(incoming = 1){
   if (BoolRe1 = HIGH) {
   digitalWrite(Re1, LOW);
    BoolRe1 = LOW;
    }//if3
   }//if2
 } //if1
 
  //Eins Aus
  if (Serial.available() > 0){
if(incoming = 1){
   if (BoolRe1 = LOW) {
   digitalWrite(Re1, HIGH);
    BoolRe1 = HIGH;
    }//if3
   }//if2
 } //if1
} //loop

Mein Problem ist jetzt folgendes: Ich sende über den Seriellen Port eine "1" und der Pin schaltet LOW. Jetzt sende ich erneut eine 1, allerdings schaltet jetzt der Pin nicht mehr HIGH. Wo liegt mein Problem? Wie gesagt, bin absoluter Anfänger. Vielen Dank.

Mehrere Probleme:

  1. Nach Serial.read() liefert das folgende Serial.available() eins weniger.
    Mit umgekehrter Reihenfolge geht es besser:
   if ( Serial.available() > 0 )
   {
       char c = Serial.read();
   }
  1. Vergleiche im if gehen mit == oder !=
    Ein einfaches = ist eine Zuweisung. Das ist syntaktisch (leider) auch richtig, das if ist true wenn etwas != 0 zugewiesen wurde.
  2. Wenn du ( z.B. mit SerialMonitor ) eine '1' sendest, kommt ein Buchstabe '1' an, das ist etwas anderes als die Zahl 1
    if (incoming == '1')

( 4. Du erleichterst dir (vermutlich) das Leben wenn z.B. '1' einschaltet und '0' ausschaltet. Dann musst du dir nicht merken, was vorher war )

Vielen, vielen dank michael_x! Ich habe meinen Quellcode noch etwas entschlackt, und jetzt funktioniert alles perfekt!

Und mal so als kleine Anregung:

Es empfiehlt sich, dass man sich angewöhnt die Abfrage umzudrehen.

Also anstelle von

if (BoolRe1 == HIGH)

lieber so schreiben

if (HIGH == BoolRel)

Wenn man dann nämlich aus Versehen das zweite Gleichheitszeichen vergisst gibt es einen Compilerfehler.

if (HIGH = BoolRe1) // Fehler, da ungültige Anweisung

Das klappt natürlich nicht, wenn man zwei Variablen miteinander vergleicht. :wink: