Pages: 1 [2]   Go Down
Author Topic: Probleme mit Void und Funktionen.  (Read 1342 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Entschuldige das ich das so sage, aber ich habe ein wenig das Gefühl, das Du eher wild rumprobierst, als die vorgeschlagenen Lösungen umzusetzen. Das ist nicht böse gemeint, ist aber der falsche Weg. Sicherlich wird es auch so, mit einer hinreichend großen Zahl von Versuchen, irgendwann funktionieren, aber das ich kein guter Lösungsweg. Denn spätestens wenn Du noch eine Ergänzung einbauen willst, fängt das Probieren von vorne an.

Lass uns mal analysieren, was Dein aktuelles Programm eigentlich macht:

In jedem loop() Durchlauf wird als erstes die Funktion performCommand() aufgerufen. Diese schaut ob ein Kommando übergeben wurde und schreibt es in die globale Variable "val", aber nur wenn tatsächlich ein Kommando übergeben wurde.
Anschliessend wird performBlinkState() aufgerufen. Das schaut, ob die Variable "blinkState" true ist, wenn ja wird geblinkt. Wenn der Werte "false" ist, wird nicht geblinkt.

Nachdem performBlinkState() abgearbeitet ist, wird die globale Variable "val" auf den Wert "f" (das Kommando für "Blinken") geprüft und wenn "f" in val steht, wird blinkState umgeschaltet (von true zu false, oder von false zu true).
Hier steckt aber genau Dein Problem.

Angenommen irgendwann wird das Kommando "f" gesendet. Und zwar genau einmal. Dann schreibt Deine Funktion "performCommand()" das "f" in die Variable "val". Dort bleibt das "f" dann stehen, bis ein anderes Kommando gesendet wird. Da aber in jedem Durchlauf von loop() wieder der Vergleich durchgeführt wird, ob "f" in val steht, wird auch in jedem Durchlauf von loop() der Wert von blinkState wieder umgeschaltet.
Das ist aber nicht was das Programm machen soll. Der Zustand von blinkState soll ja nur dann EINMAL !! umgeschaltet werden, wenn da Kommando "f" empfangen wird, aber nur dann.

Damit muss das Umschalten dann passieren, wenn das Kommando ausgewertet wird, also in der Funktion "performCommand()":

Code:
void performCommand() {
    if (Serial.available()) {
        val = Serial.read();

        //Kommando auswerten
        if(val == 'f') {
            //wenn 'f' dann Blinker umschalten
            blinkState=!blinkState;
        }
    }
}

In Deiner loop() brauchst Du dann dafür gar nichts weiter machen, außer die Funktion performBlinkState(blinkState) aufrufen. Wenn blinkState "false" ist, wird halt nicht geblinkt, bei "true" wird geblinkt. Blinken bedeutet einfach, das wenn die richtige Zeit gekommen ist, die LED ein, bzw. ausgeschaltet wird.

Zu Deiner Frage was mit "Flag" gemeint ist. Flag (englisch für Flagge / Fahne) bedeutet hier sowas wie eine Signalflagge. Also eine Variable die einen bestimmten Zustand repäsentiert. Z.B. Blinker an oder aus. In Deinem Beispiel ist "blinkState" genau so ein Flag.

Wenn Du die angepasste Funktion performCommand() verwendest, sollte das mit dem Blinken eigentlich schon klappen. Allerdings hat Dein Programm noch ein anderes "kleines" Problem, denn es kann passieren, das die LED gerade an ist, wenn erneut das Kommado "f" gesendet wird, um das Blinken wieder auszuschalten. Versuch mal heraus zu bekommen, warum das so ist und wie man das lösen kann.

Mario.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für die erklärung.

Der von dir beschriebene effekt tritt allerdings nicht ein. Ich kann zu jederzeit den/die blinker ansprechen. Testweise habe ich die zeit auch mal auf 5 sekunden blinkintervall hochgedreht -kann aber immer innerhalb der zeit an oder abschalten.

Vielen dank erstmal. Ich melde mich sicherlich wieder  smiley-mr-green
Logged

Pages: 1 [2]   Go Up
Jump to: