ESP32-Variable in ihrem Wertebereich beschränken

OP #7343894
Lesenswert?
• ▲
▼

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!

Gast #7343897
Lesenswert?
• ▲
▼

Alex schrieb:

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

Gast #7343925
Lesenswert?
• ▲
▼
1
counter = 2;
2
counter_min = 0;
3
counter_max = 5;
4

5
hochzaehlen(){
6
  counter++;
7
  if (counter > counter_max)
8
    counter = counter_max;
9
}
10

11
runterzaehlen(){
12
  counter--;
13
  if (counter < counter_min)
14
    counter = counter_min;
15
}
16

17
...
18

19
if (btn_pressed){
20
  hochzaehlen()
21
}
#7343933
Lesenswert?
• ▲
▼

Helmut -. schrieb:

Dazu gibt es die Modulo-Funktion. Google weiß da mehr darüber!

Das wird hier nicht funktionieren.

Dieter schrieb:

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:

1
runterzaehlen()
2
{
3
    if (counter > counter_min)
4
        counter--;
5
    else
6
        counter = counter_max;
7
}
#7343938
Lesenswert?
• ▲
▼

Dieter schrieb:

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.

Edit: Ich sehe gerade, Rolf war schneller :)

(Firma: @home) #7344086
Lesenswert?
• ▲
▼

... so z.B.

1
#define mMax(a, b) ({typeof(a) _a= (a); typeof(_b)= (b); (_a > _b)? _a : _b;}) 
2
#define mMin(a, b) ({typeof(a) _a= (a); typeof(_b)= (b); (_a > _b)? _b : _a;})
3
#define mClamp(x, hi, lo) mMin(hi, mMax(lo, x))
4
#define mConstrain mClamp

ODER simple vom Arduino Framework https://www.arduino.cc/reference/en/language/functions/math/constrain/

Alex schrieb:

ich weiß, dass es verschiedene Datentypen gibt

Lern mal lesen, selbständig arbeiten und nicht nur immer doof rumfragen! Und das reflexartig Ahnungslose hier dann rumsülzen ist fast noch schlimmer!

#7344090
Lesenswert?
• ▲
▼

Wenn's wg. Arduino eh schon C++ ist:

1
template <typename T, T Tmin, T Tmax> class LimitierterWert {
2
  public:
3
    typedef T value_type;
4
    operator T const& () const { return myValue; }
5
    LimitierterWert& operator= (T const& val) {
6
         if (val<Tmin) myValue=Tmin;
7
         else if (val>Tmax) myValue=Tmax;
8
         else myValue=val;
9
         return *this;
10
    }
11
    ... operator++, operator--, Konstruktor usw.
12
  private:
13
    value_type myValue;
14
};
15

16
LimitierterWert<int8_t, -5, 5> counter;
17

18
...

usw. Schaut erstmal schlimm aus, der Compiler optimiert das aber alles gut zusammen.

#7344297
Lesenswert?
• ▲
▼

Da Baby [reformed] schrieb:

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.

(Firma: Q3) #7344558
Lesenswert?
• ▲
▼

Du machst eine eigene Funktion, z.B. mit den Namen "limit". Dieser übergibst du den Eingangswert und den oberen und unteren Grenzwert.

integer limit(integer inp, integer upper, integer under) { integer intern = inp; if intern > upper then intern = upper; if intern < under then intern = under; return intern; }

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.