seriell einen Pin auf 1 / 0 schalten - mit einen Befehl

Hallo,

ich habe folgendes Problem (bin Anfänger!) :

Über die Schnittstelle lese ich ein Zeichen :

char ch = Serial.read();

und schalte zur Kontrolle eine LED (z.B. LED1):

if (ch == '1')

{
Serial.println("LED1 ist on");
digitalWrite(outLed,HIGH);
}

Das geht soweit - LED1 wird eingeschalten wenn die "1" kommt.
Aber wie schalte ich diese "LED1" mit "1" wieder aus und erhalte dabei die Ausgabe "LED1 ist Off".
Ich wollte nicht noch einen Taster für das Ausschalten nehmen.
Die meisten Geräte haben ja auch nur eine Taste für Ein / Aus.
Also muss dass auch über serielle Schnittstelle "irgendwie" gehen.
Ich stehe irgendwie auf dem Schlauch - einen direkten toggle Befehl o.ä.
kenne ich auch nicht.
Danke für die Hilfe - schöne Feiertage !

Du merkst Dir in einer Variable, ob die LED an oder aus ist. Je nach deren Inhalt schaltest Du aus oder an.

Gruß Tommy

einen direkten toggle Befehl o.ä.
kenne ich auch nicht.

Aber ich!

if (ch == '1') 
{ 
  digitalWrite(outLed,!digitalRead(outLed));
  Serial.print("LED1 ist ");Serial.println(digitalRead(outLed));
}

Ansonsten:
Mein Favorit, in solchen Fällen, ist der CmdMessenger

Hallo,

Ich habe schon viele Lösungen im Web gefunden (viele Zeilen Code)- mit Polling/ Timer /
Interupt usw.
Aber ich dachte es muss auch einfacher gehen.
Auf das Prüfen der Zustandsveränderung mit Nicht muss man erst einmal kommen.
Gibt es bei Deiner Methode auch Nachteile - oder warum wird sehr viel mit diesen anderen
Methoden gearbeitet ?
Nochmals vielen Dank !

1000 Wege führen nach Rom!

Wenn es das tut, was du willst, dann ist das Wichtigste ja geschafft.

Und ja, es verplempert weit über 100 Takte Rechenzeit für ein einfaches Pin toggeln.
Wenn das aber nicht stört… dann stört es nicht.

So würde es bei mir in etwa aussehen:

#include <CombiePin.h>

Combie::Pin::OutputPin<13>    led;

void serialEvent() 
{
  if(Serial.read()=='c') 
  { 
    led.toggle();
    Serial.print("LED ist ");Serial.println(led);
  }
}

void setup() 
{
  Serial.begin(9600);
  Serial.println("Start");
  led.init();
}

void loop(){}

CombieLib.zip (50.6 KB)

... oder warum wird sehr viel mit diesen anderen Methoden gearbeitet ?

Kann ich dir nicht sagen.
Stecke nicht in den Anderen drin.

Auf jeden Fall schaue ich mir gerne Code von Anderen an!
Manchmal lerne ich dabei, wie es besser geht, das wird dann in mein Vorgehen integriert.
Manchmal sehe ich aber auch, wie man es NICHT tun sollte.

Oft sind es aber einfach nur alternative Wege.
Dann muss man im Einzelfall prüfen, was besser geeignet ist.