Moin,
ich weiß, dass es verschiedene Datentypen gibt. Ich möchte auf meinem i2c-Display eine Variable ausgeben und diese mit zwei Buttons hoch und runter einstellen. Buttoon-Programmierung alles kein Problem.
Ich möchte das meine Variable x nur von 0 bis z.B. 5 geht und wenn ich +1 oder -1 gehe, diese nur von o bis 5 geht.
Wie kann ich in Arduino diese Variable durchgängig überprüfen lassen, sodass bspw. bei "unsigned char x" (Wertebereich bekannt von 0 bis 255) und x=0 ist, die Anzeige auf dem Display beim Schritt von x=0 nach x=5 (also -1 gehe) nicht auf dem Display dann 255 kurz anzeigt.
Danke!
Moin,
ich weiß, dass es verschiedene Datentypen gibt. Ich möchte auf meinem
i2c-Display eine Variable ausgeben und diese mit zwei Buttons hoch und
runter einstellen. Buttoon-Programmierung alles kein Problem.
Ich möchte das meine Variable x nur von 0 bis z.B. 5 geht und wenn ich
+1 oder -1 gehe, diese nur von o bis 5 geht.
Wie kann ich in Arduino diese Variable durchgängig überprüfen lassen,
sodass bspw. bei "unsigned char x" (Wertebereich bekannt von 0 bis 255)
und x=0 ist, die Anzeige auf dem Display beim Schritt von x=0 nach x=5
(also -1 gehe) nicht auf dem Display dann 255 kurz anzeigt.
Danke!
du machst eine funktion für rauf() und eine für runter() in der du das prüft und die Variable sonst nicht direkt angreifst - das ist der korrekte Weg
runterzaehlen(){
counter--;
if (counter < counter_min)
counter = counter_min;
}
Dazu muss für ein Minimum von 0 die Variable allerdings vorzeichenbehaftet sein. Außerdem fehlt der wrap-around. Wenn man es so schreibt, geht's auch vorzeichenlos und mit wrap-around:
runterzaehlen(){
counter--;
if (counter < counter_min)
counter = counter_min;
}
Würde das nicht einen Überlauf verursachen?
Wenn die Funktion aufgerufen wird und Counter bereits 0 ist, wird trotzdem weiter munter dekrementiert. Das heißt aus 0 wird 255.
Ich würde es so lösen:
Erst prüfen, welche Taste gedrückt wurde. Wenn die Taste für 'runter' gedrückt wurde, prüfen, ob counter > 0 ist. Wenn ja, counter dekrementieren. Wenn nicht, dann counter auf 5 setzen.
Beim hochzählen genau umgekehrt: Ist counter < 5? Wenn ja, dann inkrementiere counter ansonsten setze Counter auf 0.
Mit Modulo gehts immer, bis auf den Sonderfall, wenn die Variable 0 ist und "runter" gedrückt wird. Dann müsste auf den Modulowert-1 gesetzt werden. Die Variable muss dann aber auch unsigned sein.
Bei signed geht's immer, denn -1 mod 6 ist 5. Und 6 mod 6 ist 0.
Warum muss man jeden scheiss in eine klasse döddeln?
Es ist nicht nur eine Klasse, es sind fast beliebig viele, für jeden Basis-Datentyp und jede mögliche Limit-Konfiguration ist's eine.
Warum? Weil's schön wiederverwendbar ist. Die Template-Definition wandert in ein Header-File und muss dich später nicht mehr stören.
Es braucht auch nicht mehr RAM als die nackte Variable die dahinter steckt, und die Range-Checks übersetzt der Compiler auch nicht anders als in der Makro-Variante.
Du machst eine eigene Funktion, z.B. mit den Namen "limit". Dieser
übergibst du den Eingangswert und den oberen und unteren Grenzwert.
Die musst du dann aber nach jeder Operation, die den Wert ändert, explizit aufrufen. Die Klasse kannst du einfach wie einen normalen Integer verwenden, und sie kümmert sich automatisch darum.