womöglich eine simple Frage: Wie kann man möglichst elegant einen Aktor mit dem gleichen Sensor an und ausschalten?
Beispiel: Die Statusleuchte soll durch Tastendruck auf Taste A blau leuchten, bei erneutem Druck auf Taste A wieder erlöschen.
Ich habe das Problem folgendermaßen gelöst, funktioniert, allerdings frage ich mich, ob es noch eine „schönere“ Lösung hierfür gibt.
Verwende jeweils eine boolesche Variable. Z.b. blau. Wenn a gedrückt dann wird blau=nicht blau. Dann Abfrage wenn blau dann Led blau, ansonsten Led aus.
Hallo und vielen Dank für den Tipp. Hab es gerade für die interne LED ausprobiert, gute Lösung. Verwendest Du diese Programmierung auch für externe Aktoren?
Danke für die Antwort, allerdings tue ich mich schwer damit, dann einen Ist-Wert-Abgleich durchzuführen. Bei der eingebauten LED ist das ja recht einfach, aber wie lese ich den Ist-Zustand eines externen Aktors ab? Beispiel: Wenn Motor aus, Schaltet Taste A den Motor an, wenn Motor an, schaltet Taste A den Motor aus. Hast Du einen Tipp oder Umsetzungsbeispiel für mich?
Vielen Dank, Roland
Naja, Du kannst am Motor nicht ablesen ob er läuft. Du schaltest den Motor an und setzt die Variable Motor auf wahr. Wenn Du ihn abschaltest setzt Du die Variable auf Falsch. Dann kannst Du irgendwo im Programm die Variable abfragen und weißt. ob der Motor gerade läuft.
Hallo und danke für die Antwort. Hatte es so bereits probiert, allerdings ohne Erfolg. Aber wenn es so funktionieren soll, dann probiere ich es nochmals aus.
Vielen Dank und viele Grüße,
Roland
Habe heute die Zeit gefunden, nochmals zu experimentieren. Anstelle des externen Motors habe ich eine externe LED angeschlossen.
Das gesamte Programm soll eine Taschenlampe mit Notblinkfunktion darstellen. Wenn Taste A einmal gedrückt, geht die externe LEDwe an, ein erneuter Tastendruck schaltet sie aus. Die Leuchtstärke der LEDwe lässt sich via Poti regeln. Bei Druck auf Taste B schaltet sich die Notblinkfunktion (LEDrt) ein, ein erneuter Druck schaltet sie wieder aus.
Ich habe das Programm auf zwei Arten gebaut.
Beide Male mit dem selben Ergebnis:
A) Ich brauche immer die 250ms-Pausen um klar zwischen on und off-Tastendruck zu unterscheiden.
B) Beide male schalten die Tasten immer mal wieder nur sehr unzuverlässig oder gar nicht. Beim Ausschalten kann ich das nachvollziehen, liegt an den eingebauten Pausen, bei Ein kann ich diesen Effekt jedoch nicht nachvollziehen, er ist auch nicht eindeutig reproduzierbar.
Anbei zwei Scrennshots oben herkömmlich unten mit Variable
Daher meine Fragen: Warum schaltet der Calliope nicht zuverlässig ein? Kann man das ganze auch ohne Pausen programmieren?
Hallo Callirope!
Habe mal ein wenig überlegt obwohl ich kein Openrobertaspezialist bin:
Du frägst zu oft ab, ob Knopf A gedrückt wurde. Die Helligkeitsregelung würde ich in die unendlichschleife machen in eine Abfrage mit einer Variablen Lichtan (oder so ähnliche) Wenn Lichtan=1 dann scheribeanalogen wert von Poti
In Wenn Taste A gedrückt gehört dann Wenn Lichtan=1 dann Lichtan=0 und schreibe analogen Wert auf 0
Oberer Bereich fertig! Und dann halt noch unten umbauen. Du musstest immer warten weil beim Drücken des Knopfes ja immer schon mindestens 2 ABfragen abgearbeitet wurden. So schnell konntest Du ja garnicht den Knopf loslassen.
heute bin ich dazu gekommen, weiter zu experimentieren. Ich habe versucht Deine Anregungen umzusetzen, das Problem bleibt jedoch gleich: Auf Tastendruck erhalte ich kein definiertes Ergebnis, weil der Calliope in meinen Augen zu viele Impulse gleichzeitig bekommt. Mir stellt sich die Frage, mit welcher Frequenz der Calliope die Sensoren abfragt. Ich habe diese Frage auch als neuen Thread eröffnet.
Im Anhang mal die Programmierung, wie sie jetzt aussieht. Habe ich dich bei der Umsetzung irgendwo missverstanden, bzw. hast Du weitere Optimierungsvorschläge?
Hallo Callirope. Du musst die zweite Abfrage entfernen und den Inhalt in einen „Sonst“-zweig von Wenn…mache setzen.
Sonst schaltet er ja beim Tastendruck wenn das Licht aus ist das Licht an und geht dann in die zweite Abfrage und schaltet das Licht wieder aus. Eventuell so schnell dass Du es garnicht mitbekommst.
Habs jetzt doch mal selbst programmiert und das Problem gefunden.
Nach der Tastenabfrage muss man kurz warten, da sonst mehrere Tastendruckereignisse gesendet werden und je nach Länge des Tastendrucks wird eine gerade oder ungerade Anzahl gesendet und es ändert sich eventuell nichts.
okay, danke für Deine Lösung. Wie befürchtet, kommt man um den Warteblock nicht drumherum.
Trotzdem handlicher als die Programmierung mit „Wiederhole bis“.
Allerdings stellt sich mir schon die nächste Frage, meine zweite Funktion, das endlose Blinken einer LED durch Taste B (wie oben unter Beitrag vom 15. März zu sehen) läasst sich so nicht lösen, oder?
Wenn Du noch eine Lösung hast, gerne - ansonsten gebe ich mich auch so damit zufrieden.