Hallo zusammen,
vorneweg: Ich bin eher in der Hardware zu Hause. Ich Sachen Software bin ich Anfänger, von daher bitte ich um Verständnis, wenn euch die Frage dämlich vorkommen sollte.
Es geht um folgendes:
Ich habe einen Sensor, der mir alle 3 Sekunden einen Wert liefert (Variable: scd30.CO2). Dieser Wert wird in einem OLED-Display angezeigt. Je nachdem, in welchem Bereich sich der Wert befindet, soll sich die Hintergrundfarbe im Display ändern.
Gelöst habe ich das bis jetzt so (Auszug aus dem Code):
if(scd30.CO2 < 900)
{
LCD_Clear(GREEN); // lösche Display-Inhalt, Hintergrundfarbe grün
Paint_DrawString_EN(45, 10, "CO2:", &Font24, GREEN, BLACK); // schreibe Messgröße an richtigen Platz
Paint_DrawString_EN(85, 42, "ppm", &Font20, GREEN, BLACK); // schreibe Einheit an richtigen Platz
Paint_DrawNum(25, 40, (scd30.CO2), &Font24, GREEN, BLACK); // schreibe Messwert an richtigen Platz
}
else if (scd30.CO2 >= 900 && scd30.CO2 < 1000)
{
LCD_Clear(YELLOW); // lösche Display-Inhalt, Hintergrundfarbe grün
Paint_DrawString_EN(45, 10, "CO2:", &Font24, YELLOW, BLACK); // schreibe Messgröße an richtigen Platz
Paint_DrawString_EN(90, 42, "ppm", &Font20, YELLOW, BLACK); // schreibe Einheit an richtigen Platz
Paint_DrawNum(20, 40, (scd30.CO2), &Font24, YELLOW, BLACK); // schreibe Messwert an richtigen Platz
}
else if (scd30.CO2 >= 1000 && scd30.CO2 < 1200)
.
.
.
Problem ist, dass immer alle Anweisungen hinter den If's ausgeführt werden, also auch das LCD_Clear. Damit wird permanent das komplette Display aktualisiert, obwohl eigentlich nur der Wert aktualisiert werden müsste. Das führt zu einem nervigen Geblinke.
Also hab ich mich an einer while-Schleife versucht, in der nur der Sensorwert aktualisiert werden soll, nicht das komplette Display. In dieser Schleife möchte ich bleiben, bis der Sensorwert die if-Bedingung nicht mehr erfüllt.
So sah das Ganze aus (wieder ein Auszug):
if(scd30.CO2 < 900)
{
LCD_Clear(GREEN); // lösche Display-Inhalt, Hintergrundfarbe grün
Paint_DrawString_EN(45, 10, "CO2:", &Font24, GREEN, BLACK); // schreibe Messgröße an richtigen Platz
Paint_DrawString_EN(85, 42, "ppm", &Font20, GREEN, BLACK); // schreibe Einheit an richtigen Platz
while (scd30.CO2 < 900)
{
Paint_DrawNum(25, 40, (scd30.CO2), &Font24, GREEN, BLACK); // schreibe Messwert an richtigen Platz
}
}
.
.
.
Ist (natürlich ) falsch. Allerdings verstehe ich nicht ganz, wieso. Auch wenn der Sensorwert den angegebenen Wert von 900 übersteigt, komme ich scheinbar nicht aus der Schleife.
Habt ihr da evtl. einen Tip für mich?
VG