Hallo,
gibt es, obwohl das durchaus ein effizienter Code ist eine Möglichkeit
sowas eleganter zu schreiben? Es handelt sich nur um 12 LED, die
Temperaturen darstellen sollen, auch Zwischenwerte sollen dargestellt
werden durch 2 LED. Die Led Setzfunktion lässt derzeit nur einen
Parameter zu + ON, OFF oder BLINK.
Dazu setze ich einfach in einem Array die LED und ein Interrupt wertet
diesen dann aus und betätigt das Schieberegister.
1
/BitmaskenfürdieAussentemperaturLES
2
3
#define HC595_LED_M10 0
4
#define HC595_LED_M5 1
5
#define HC595_LED_0 2
6
#define HC595_LED_5 3
7
#define HC595_LED_10 4
8
#define HC595_LED_15 5
9
#define HC595_LED_17 6
10
#define HC595_LED_20 7
11
#define HC595_LED_22 8
12
#define HC595_LED_25 9
13
#define HC595_LED_30 10
14
#define HC595_LED_35 11
15
16
/* Zustand der Aussen-Temperatur LED am 74HCT595 Nr.2 */
Es genügt doch, die "Sprung"temperaturen zu speichern, die dann in einer
Schleife abgefragt werden.
Wenn die Temperatur z.B: < -5.5 ist, werden 3 LEDs gesetzt: Die 1. im 1.
Schleifendurchlauf, die 2. in 2. Durchlauf und die 3. im 3. Danach wird
die Schleife beendet weil die Temperatur zu klein ist für die 4. LED und
alle folgenden.
Christian J. schrieb:> if (W->Ext_Temperature < -10.5)> HC595_SetATempLed(HC595_LED_M10,BLINK);> else if ((W->Ext_Temperature > -10.5) && (W->Ext_Temperature <> -9.5)) {> HC595_SetATempLed(HC595_LED_M10,ON);> } else if ((W->Ext_Temperature > -9.5) && (W->Ext_Temperature <> -5.5)) {
Willst Du den Fall W->Ext_Temperature == -10.5 explizit nicht behandeln?
Andernfalls wäre der Vergleich nämlich doppelt.
1
if(a<=-10)
2
blubb1;
3
elseif((a>-10)&&(a<-5))
4
blubb2;
Das (a >-10) steckt schon im Wort else mit drin: Wäre a nicht > -10,
wäre die erste Abfrage a<=-10 schon wahr gewesen und die zweite würde
nie ausgeführt.
Ansonsten fände ich eine Lookuptable für die Grenzen der
Temperaturbereiche und eine für die aus den Stufen resultierenden
LED-Zustände etwas kompakter. Eleganz und Effizienz
(Platz/Geschwindigkeit/gute Wartbarkeit?) ist natürlich wie immer
Ansichtssache.
Tom schrieb:> Willst Du den Fall W->Ext_Temperature == -10.5 explizit nicht behandeln?
Float Werte kann man nicht auf Gleichheit prüfen. Trotzdem Danke, dass
Du Dir soviel Mühe gemacht hast! Mein Vorteil war, dass alle Temps 0.5
um ihr Zentrum liegen und alle Zwischenräume eben dazwischen. Dadurch
war das mit der Schleife oben einfach lösbar.
const size_t num_temperature_ranges = sizeof(temperature_range_limits) /
sizeof(temperature_range_limits[0]);
Auch noch nicht gesehen .... ich habe einfach 12 reingeschrieben.
Tom schrieb:> Das heißt aber nicht, dass zwei float-Werte nie gleich sein können.
Habe ich aber so gelernt, dass man die nicht mit == vergleichen kann.
Das KOnstrukt von Tom habe ich grad eingebaut, man lernt nie aus :-)
Christian J. schrieb:>> Willst Du den Fall W->Ext_Temperature == -10.5 explizit nicht behandeln?>> Float Werte kann man nicht auf Gleichheit prüfen. Trotzdem Danke
Ich gehe davon aus das Tom ein ">=" oder "<=" meint. Prinzipiell ist es
natürlich möglich dass zwei float/double-Werte einander gleich sind. In
einem solchen, zugegebenermaßen eher seltenen, Fall würde das Programm
direkt an deinem ganzen Konstrukt vorbeispringen. Deshalb fragt man in
der Regel eine von zwei angrenzenden Bedingung abgeschlossen ab.
Grüße