Go Down

Topic: Ausgang mit Serieller Eingabe steuern (Read 1 time) previous topic - next topic

wnilsw

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):

Code: [Select]
// 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.

michael_x

Mehrere Probleme:
1. Nach Serial.read()   liefert das folgende Serial.available() eins weniger.
   Mit umgekehrter Reihenfolge geht es besser:
Code: [Select]
   if ( Serial.available() > 0 )
   {
       char c = Serial.read();
   }

2. 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.
3. Wenn du ( z.B. mit SerialMonitor ) eine '1' sendest, kommt ein Buchstabe '1' an, das ist etwas anderes als die Zahl 1
Code: [Select]
    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 )

wnilsw

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

MaFu

Und mal so als kleine Anregung:

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

Also anstelle von
Code: [Select]
if (BoolRe1 == HIGH)
lieber so schreiben
Code: [Select]
if (HIGH == BoolRel)

Wenn man dann nämlich aus Versehen das zweite Gleichheitszeichen vergisst gibt es einen Compilerfehler.
Code: [Select]
if (HIGH = BoolRe1) // Fehler, da ungültige Anweisung

Das klappt natürlich nicht, wenn man zwei Variablen miteinander vergleicht.  ;)
_______
Manfred

Go Up