Hallo Community,
mit dem Risiko an die Wand genagelt zu werden, eine banale Frage zur Mehrfach-Nutzung einer vorhanden Taste in meinem Projekt mit "button2" .
Ich benutze die Taste derzeit "getoggelt" zum Steuern der Lüftung über eine Infrarot-Diode.
Erster Tastendruck ist Code "Lüftung ein" 2. Tastendruck ist "Lüftung aus".Funktioniert
Meine Hoffnung war in der Recherche nun, mit einem Klick die Funktion1 ("Ein") mit Doppelklick (Funktion 2 z.B "Lüfter erhöhen" und mit dem langen Tastendruck (Funktion 3 "Lüftung aus") zu konfigurieren.
Das funktioniert aber bei dem Beispiel nicht, da bei einem Doppelklick bzw. langem Druck ja immer die Funktion 1 (Einzelklick) ausgelöst wird (serieller Monitor).
Ohne bei dem ein oder Anderen Adrenalin zu erzeugen, ist das so gewollt ?
#include "Button2.h"
#define BUTTON_PIN 27 // GPIO Pin
Button2 button;
void setup() {
Serial.begin(115200);
button.begin(BUTTON_PIN);
// Zuweisung der Funktionen für verschiedene Klick-Arten
button.setTapHandler(tap); // 1x Klick
button.setDoubleClickHandler(doubleClick); // 2x Klick
button.setLongClickHandler(longClick); // Langer Druck
}
void loop() {
button.loop(); // WICHTIG: Muss in jedem Loop aufgerufen werden
}
// Funktionen
void tap(Button2& btn) {
Serial.println("Einfachklick: Funktion 1 (z.B. LED an)");
}
void doubleClick(Button2& btn) {
Serial.println("Doppelklick: Funktion 2 (z.B. LED aus)");
}
void longClick(Button2& btn) {
Serial.println("Langer Druck: Funktion 3 (z.B. System Reset)");
}
Serieller. Monitor:
Einfachklick: Funktion 1 (z.B. LED an)
Langer Druck: Funktion 3 (z.B. System Reset)
Einfachklick: Funktion 1 (z.B. LED an)
Einfachklick: Funktion 1 (z.B. LED an)
Doppelklick: Funktion 2 (z.B. LED aus)
Einfachklick: Funktion 1 (z.B. LED an)
Einfachklick: Funktion 1 (z.B. LED an)
Doppelklick: Funktion 2 (z.B. LED aus)
Einfachklick: Funktion 1 (z.B. LED an)
Langer Druck: Funktion 3 (z.B. System Reset)
Du hast den Doppelklick mit button.setDoubleClickHandler(doubleClick); definiert, was ja gut ist. Wie kommst du auf den Gedanken, dass für einen Einfachklick button.setTapHandler(tap); das richtige wäre???
Hast du es mal mit der logischen Variante button.setClickhandler(click); für einen Einfachklick probiert? Musst dann nur die Callbackfunktion tap auch entsprechend umbenennen.
Wem man gerade antwortet, ist Glückssache, das passiert mir auch öfters. Du ( @mahowe ) als Starter dieses Topics hast die Möglichkeit, einen Beitrag (meiner Ansicht nach #3 von @Kai-R) als Lösung zu markieren. Dann sieht jeder sofort, dass und wie deine Frage beantwortet wurde.
Was der Name der callback-Funktion ist, (tap oder click oder einzelclick oder was auch immer ein gültiger Funktionsname in c++ ist, bleibt natürlich dir überlassen.
Das ist natürlich richtig. Weil ich in meiner Antwort halt „click“ als Namen verwendet habe, hielt ich es sicherheitshalber für notwendig darauf hinzuweisen, dass die Funktion tap umbenannt werden muss, damit es funktioniert.
Danke für den Hinweis.
Da ich hier im ersten Schritt tatsächlich etwas verwirrt war (was bei meinen Fähigkeiten nichts besonderes ist), habe ich Mut gefasst und etwas recherchiert (Mühe gegeben) und mir mal den Code im button2.h angesehen(Fast schon ein glücklicher Zufall bei mir!)
Aber ich habe dadurch schon wieder einiges gelernt und werde jetzt in meinem Projekt mit 1-,2-,3- oder langem Tastenklick die Lüftung über die 2 IR-Sendedioden steuern.
Dazu plane ich noch 3 LEDs, die dann je nach Stärke leuchten. Am Ende gehe ich mit dem langen Klick einfach wieder ganz runter und fange dann wieder mit Klick, Double bzw. Triple-Klick an die Lüftung zu erhöhen..
Die komfortablere Steuerung mit z.B. 4 Einzel-Klicks nach oben und den z.B. 5. Klick der Taste wieder nach unten habe ich nicht geschafft (hatte ich bei der Suche mit KI gefunden und irgendwie mit Counter, etc.).
Macht aber nichts.
Schon wieder ich Community,
ich habe meine 3Click-und langen Click zum Laufen gebracht und auch die Bedienungszeiten angepasst. Alles in mein Projekt vorgestern eingebaut.
Mit dem 1-click auf die Taste wird bei der Lüftung "auto" gestartet. Den Code zum Raufschalten der Lüftung (ist ja nur ein Code) habe ich banal mit 3 unterschiedlichen repeats-Wiederholungen realisiert. mit langen Tastendruck komme ich dann wieder auf "auto" und kann von vorne beginnen zu erhöhen. Nicht nur kinde- sondern greisenleicht.
Problem nur, zwischen "auto" und Raufschalten muss eine Pause von x - Sekunden sein. Sonst verschluck sich die Lüftung irgendwie. Mit "Delay" würde ich vermutlich den "loop zum stehen" bringen. Gibt es eine andere (für mich leicht nachvollziehbare Lösung). Also eine die ich als Programmier-Legasteniker verstehe.
Ich habe nur diesen Teil als funktionierenden Sketch beigefügt. Anders hättet ihr mich wahrscheinlich "gefedert und geteert". Wenn einer eine Idee (für meine Weiterentwicklung) dazu hat, würde ich mich freuen.
// Bei 1 x Click Tastendruck wird der IR-Befehl "AUTO" mit repeats mit 0 Wiederholungen ausgegeben
// Bei 2 x Click Tastendruck wird IR-Befehl "Pfeil nach oben" über repeats1 3 fach ausgegeben
// Bei 3 x Click Tastendruck wird IR-Befehl "Pfeil nach oben" über repeats2 6 fach ausgegeben
// Bei langen Tastendruck wird IR-Befehl "Auto" über repeats mit o Wiederholungen ausgegeben
// Die LEDs habe ich zum Testen angeschlossen. Die Funktion ist komplett
//
#include "Button2.h"
#include <IRremote.hpp>
#define BUTTON_PIN 15 // GPIO Pin
Button2 button;
constexpr uint8_t LED_1 = 16; // Ausgang LED WS
constexpr uint8_t LED_2 = 17; // Ausgang LED bl
constexpr uint8_t LED_3 = 18; // Ausgang LED gn
const int SenderPin_1 = 04; // GPIO4 Pin für IR LED
constexpr uint16_t address = 0x10; // Euromate Fernbedienung
constexpr uint8_t onCommand {0x5}; // Taste AUTO / 0x8 = Auto
constexpr uint8_t offCommand {0x10}; // Taste OFF
constexpr uint8_t repeats = 0;
constexpr uint8_t repeats1 = 3;
constexpr uint8_t repeats2 = 6;
constexpr uint8_t lowCommand {0x5}; // Taste Pfeil nach oben / 0x6 = Pfeil nach unten
constexpr uint8_t highCommand {0x8}; // Taste Pfeil nach oben
void setup() {
Serial.begin(115200);
button.begin(BUTTON_PIN);
pinMode(LED_1, OUTPUT); // GPIO 16
pinMode(LED_2, OUTPUT); // GPIO 17
pinMode(LED_3, OUTPUT); // GPIO 18
pinMode(SenderPin_1, OUTPUT); // PIN 04 ist Ausgangs-PIN für IR Lüftung
//Zeiten ändern
button.setDebounceTime(50); // 50ms entprellen
button.setLongClickTime(2000); // 1.5 Sekunden für langes Drücken
button.setDoubleClickTime(800); // 400ms für Doppelklicks
// Zuweisung der Funktionen für verschiedene Klick-Arten
button.setClickHandler(click); // 1x Klick
button.setDoubleClickHandler(doubleClick); // 2x Klick
button.setTripleClickHandler(tripleClick); // 3x Klick
button.setLongClickHandler(longClick); // Langer Druck
}
//Lüftung
// pinMode(LueftungEA, INPUT_PULLUP); //Pin 26 wird in Ruhe auf High gesetzt
// pinMode(LueftungLH, INPUT_PULLUP); //Pin 27 wird in Ruhe auf High gesetzt
// Funktionen
void click(Button2& btn) {
Serial.println("Sende IR Lueftung auto");
//Sender 1 ansprechen
IrSender.setSendPin(SenderPin_1);
IrSender.sendNEC(address, lowCommand, repeats);
digitalWrite(LED_1, HIGH); //Stufe auto
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
}
void doubleClick(Button2& btn) {
Serial.println("Sende IR Lueftung stärker");
//Sender 1 ansprechen
IrSender.setSendPin(SenderPin_1);
IrSender.sendNEC(address, highCommand, repeats1);
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, HIGH); //Lüftung stärker
digitalWrite(LED_3, LOW);
}
void tripleClick(Button2& btn) {
Serial.println("Sende IR Lueftung ganz stark");
//Sender 1 ansprechen
IrSender.setSendPin(SenderPin_1);
IrSender.sendNEC(address, highCommand, repeats2);
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, HIGH); //Lüftung ganz stark
}
void longClick(Button2& btn) {
Serial.println("Sende IR Lueftung wieder auf auto");
//Sender 1 ansprechen
IrSender.setSendPin(SenderPin_1);
IrSender.sendNEC(address, lowCommand, repeats);
digitalWrite(LED_1, HIGH); //Lüftung wieder auto
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
}
void loop() {
button.loop(); // WICHTIG: Muss in jedem Loop aufgerufen werden
}
Schaut man in deinen Sketch, fällt gleich auf:
"Wie Sie sehen, sehen Sie nichts"
Was eine lange und was eine mehrfache Betätigung ist, und wann danach etwas wieder eie einzelne Betätigung ist, kann die button2 lib ja erst hinterher erkennen ...
Wenn du da etwas intelligenter machen willst, muss das in einer Verbesserung der button2 geschehen. Das ist vermutlich eher nichts für Programmier-Legasteniker
Hat er ja sowas von Recht!
Zumal Kai-R wirklich eine massive Unterstützung war .Was sicher nicht einfach ist ...
Werde mich jetzt erst mal mit Stärken die ich in anderen Bereichen besitze wieder etwas aufbauen und den nächtlichen Schnee erwarten. Die Lüftung wird deswegen nicht kaputt gehen.
Vergellsgott
Ich hatte mir das Anlegen von Kommentaren so als Hilfsmittel gedacht. Leider kann so etwas dann bei unstrukturiertem Arbeiten und vor allem mit dem vielen Probieren sogar hinderlich sein.
Fällt mir hier gerade der philosophische Satz ein "Nur was man kennt, kann man erkennen"! Wüsste nicht mal wo der bei mir und meiner Arbeit passt. Trotzdem Danke für den Hinweis, mir fällt so etwas schon gar nicht mehr auf, vor lauter "Wald".
nachdem ich keine Änderung im Funktionsaublauf bemerkt habe (liegt an mir!), die Frage:
Was bewirkt `void shortKlickSender() genau?
Wo finde ich das von dir empfohlene das Multihandler-Beispiel?
Da ich mich undeutlich zu meinem "tun/machen" ausgedrückt habe (liegt an mir) ein weiterer Versuch mich anders zu artikulieren:
Über die Fernbedienung schalte ich in der Praxis mit dem "Pfeil nach oben" auch die Lüftung ein, da sie zu Beginn meines Kurses noch ausgeschaltet ist.
Da es immer recht hektisch zu Beginn ist und ich ja zwei baugleiche Lüftungen an der Decke steuern muss, drücke ich dann unter der jeweiligen Lüftung(en) stehend, mehrmals die "Pfeil nach oben" Taste um die Ventilatoren zu erhöhen (Das geht i.d.R. bis Stufe 6 und dann schaltet das Ding wieder in den Standby-Betrieb). Die Anzeige der Ventilator-Höhe ist an der Decke und ohne Brille für mich nicht mehr lesbar, da winzig in der Anzeige.
Ich muss also irgendwie versuchen, dass ich das Einschalten und die Erhöhung der Lüftung über meinen beiden IR-Sendern mit der einen mechanischen Taste steuere. So meine Idee..
(Ich lege vorsichtshalber mal die Fernbedienung und kurze Funktionsbeschreibung bei.)
Wenns nicht geht, gehts halt nicht und ich versuche mit Probieren irgendwie einen befriedigenden Lüftungszustand hin zu bringen.
Für eure Kraft meinen "diffusen Ausführungen zuzuhören" trotzdem herzlichen Dank
Da sich die Anlage ihre letzte Einstellung merkt, wie synchronisierst du denn dann die verschiedenen Stufen, wenn dein Microcontroller mit immer mit den gleichen Grundeinstellungen startet?
Da ist doch die Wahrscheinlichkeit groß, dass die nicht übereinstimmen (z.B. die Stufeneinstellung der Lüfter). Oder wenn zwischendurch doch mal die Fernbedienung verwendet wird.
Was genau sollen die Repeats erreichen? Willst Du damit drei bzw. sechs Stufen auf einmal schalten?
Danke für die schnelle Rückmeldung. Die Änderung habe ich vorgenommen, verstanden und funktioniert.
Unter Beispielen habe ich button2 und MultiHandler.ino gefunden. Die Funktion scheint aber zu meiner Lösung mit deinem Vorschlag ähnlich zu sein. Nur übersichtlicher
Führt aber nicht zum gewünschten Ergebnis. Denn das Einschalten funktioniert ja ohne grundsätzlich ohne Probleme, egal wie oft ich drücke.
Eigentlich müsste die Pause bei Doppel- oder Tripleclick zwischen den 1 "Pfeil nach oben" und repeats der folgenden "Pfeil nach oben " sein. Der erste schaltet "Pfeil nach oben " schaltet die Lüftung ein, dann kommt das warten, der 2te bis xten "Pfeil nach oben" - Code startet dann den Ventilatorenstärke.
Vielleicht sollte ich mich noch mal unter die Lüftung stellen und Schritt für Schritt die einzelnen Tastenfolgen und deren Ergebnis aufnehmen?
?? Bisher wird mit einem Schalter an der Wand die Lüftung eingeschaltet und dann mit der FB durch den Raum gegangen und jede Lüftung mit ein paar "Pfeil nach oben" auf mittel oder hoch geschaltet.
Da ist doch die Wahrscheinlichkeit groß, dass die nicht übereinstimmen (z.B. die Stufeneinstellung der Lüfter). Oder wenn zwischendurch doch mal die Fernbedienung verwendet wird.
??
Die repaets eigentlich nur den Lüfter auf halb hoch(3-4), wenn es moderat ist oder auf voll (6-8) wenns schweißtreibend ist.
Ich habe extra eine Taste spendiert um die Lüftung wieder auszuschalten. Die funktioniert ja wenigstens für den Cooldown, die Leute verschwitzt sind und keiner krank werden soll.
Ich hab jetzt die Bedienung intensiver gelesen und gesehen, dass dies nicht nur ein "dummer" Ventilator ist. Na ja, die werden ja auch in medizinischen Einrichtungen verwendet.
Ich muss gestehen ihr denkt selbst hier mit und weiter als ich.
Meine Trainerkollegen/innen waren bei der Vorstellung halt so begeistert, nicht mehr diese "blöde" Fernbedienung über Kopf bedienen zu müssen. Dann komme ich eben nicht in die Ruhmeshalle.