If mit drawBox Funktion u8g2 Display

Hallo!

Wie man unschwer gleich merken wird, bin ich neu hier und generell beim Arduino programmieren.

Ich benötige das für ein Ausbildungsprojekt und befasse mich erst seit sehr kurzer Zeit damit und beziehe fast alles aus Videos und Programmen und kopiere mir das so raus und in meines hinein, dass es irgendwie läuft (auch wenn das dem einen oder anderen jetzt sicher die letzten Haare rauben wird) ^^

Kurz und knapp:
Ich möchte mir auf einem u8g2 Display Werte anzeigen lassen mit Grafik, während nur die Werte gelöscht werden sollen SOFERN sich diese ändern...

Meine Wunschfunktion sieht wie folgt aus (sofern das überhaupt richtig ist):
if ("Temperatur_Innen" ODER "Temperatur_Aussen" ODER "Sollwert" ungleich "letztem Zyklus") {
u8g2.drawBox(box_area_x_pos, box_area_y_pos, box_area_width, box_area_height);
}

die box_area Koordinaten habe ich bereits natürlich oben hinterlegt bei den Definitionen, die hab ich also bereits getroffen...

Ich poste euch hier mal meinen Code den ich bis jetzt zusammengebracht habe (steinigt mich nicht ^^)

#include <U8g2lib.h>  //Datenbank für Grafikdisplay KS0108 128x64 Pixel
#include <DS18B20.h>  //DS18B20 Temperatursensor Bibliothek laden
#include <OneWire.h>  //Bibliothek für 1-Kabel Sensoren
#include <DallasTemperature.h>

void isrUpbutton();
void isrDownbutton();

DS18B20 tempSensorin(16);   //4,7k Ohm Pullup Widerstand zwischen Plusleitung (Rot) + Datenleitung (Gelb)
DS18B20 tempSensorout(17);  //4,7k Ohm Pullup Widerstand zwischen Plusleitung (Rot) + Datenleitung (Gelb)

char temperature_inside[5];                   //Benennung der String-Variable für Innentemperatur
char temperature_outside[5];                  //Benennung der String-Variable für Außentemperatur
char Setvariable_str[5];                      //Benennung der String-Variable für Setvariable
const char DEGREE_SYMBOL[] = { 0xB0, '\0' };  //Grad Symbol "°" (in Kombination mit unten angeführtem Schriftstil)

int Setvariable = 20;
#define Upbutton 2    //Upbutton angeschlossen Pin 2
#define Downbutton 3  //Downbutton angeschlossen Pin 3
#define relayPin 12   //Relais angeschlossen Pin 12
double counter1 = 0;

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, 13, 11, 10);  //Displayinterface, angeschlossen an Pin 13, 11, 10; Pinaufgaben: clock=13, data=11, CS=10

static const unsigned char image_paint_0_bits[] U8X8_PROGMEM = { 0x49, 0x2a, 0x1c, 0x7f, 0x1c, 0x2a, 0x49 };  //Sternsymbole Kopfzeile
//+ und - Symbole neben Sollwert Fußzeile
static const unsigned char image_paint_1_bits[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
//Schneeflockensymbol Groß
static const unsigned char image_paint_2_bits[] U8X8_PROGMEM = { 0x00, 0xaa, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x48, 0x10, 0x24, 0x00, 0x50, 0x10, 0x14, 0x00, 0x20, 0x11, 0x09, 0x00, 0x58, 0x11, 0x35, 0x00, 0x80, 0x28, 0x02, 0x00, 0x60, 0x45, 0x0d, 0x00, 0x01, 0x82, 0x00, 0x01, 0x02, 0x01, 0x81, 0x00, 0x85, 0x00, 0x42, 0x01, 0x7a, 0x00, 0xbc, 0x00, 0x85, 0x00, 0x42, 0x01, 0x02, 0x01, 0x81, 0x00, 0x01, 0x82, 0x00, 0x01, 0x60, 0x45, 0x0d, 0x00, 0x80, 0x28, 0x02, 0x00, 0x58, 0x11, 0x35, 0x00, 0x20, 0x11, 0x09, 0x00, 0x50, 0x10, 0x14, 0x00, 0x48, 0x10, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00 };

void setup() {
  Serial.begin(9600);         //Beginn Serielle Verbindung 9600 Baud
  u8g2.begin();               //Display Start
  pinMode(relayPin, OUTPUT);  //Relaispin als Ausgang gesetzt
  digitalWrite(relayPin, HIGH);
  pinMode(Upbutton, INPUT_PULLUP);                                             //Upbutton als Eingang definiert und mit einem Software Pullup-Widerstand gesetzt
  attachInterrupt(digitalPinToInterrupt(Upbutton), isrUpbutton, FALLING);      //Buttoninterrupt eingefügt damit der Button zu jeder Zeit
                                                                               //im Loop gedrückt werden kann
  pinMode(Downbutton, INPUT_PULLUP);                                           //Downbutton als Eingang definiert und mit einem Software Pullup-Widerstand gesetzt
  attachInterrupt(digitalPinToInterrupt(Downbutton), isrDownbutton, FALLING);  //Buttoninterrupt eingefügt damit der Button zu jeder Zeit
                                                                               //im Loop gedrückt werden kann

  //Einmaliges Schreiben des Grafikhintergrundes beim Start des Arduino
  u8g2.clearBuffer();  //Interner Displayspeicher löschen
  u8g2.setFontMode(1);
  u8g2.setBitmapMode(1);
  u8g2.setFont(u8g2_font_profont11_tr);               //Schriftart einstellen für Display
  u8g2.drawStr(22, 8, "Cooling Box 42");              //Überschrift
  u8g2.drawLine(0, 11, 127, 11);                      //Unterstrich unter "Cooling Box 42"
  u8g2.drawXBMP(118, 1, 7, 7, image_paint_0_bits);    //Sternsymbol links
  u8g2.drawXBMP(3, 1, 7, 7, image_paint_0_bits);      //Sternsymbol rechts
  u8g2.drawStr(44, 23, "Inside");                     //Geschriebenes Wort in Zeile
  u8g2.drawStr(44, 34, "Outside");                    //Geschriebenes Wort in Zeile
  u8g2.drawStr(44, 45, "Soll");                       //Geschriebenes Wort in Zeile
  u8g2.drawStr(41, 60, "Sollwert");                   //Geschriebenes Wort in Zeile
  u8g2.drawEllipse(19, 56, 6, 6);                     //Kreisumrandung für - Symbol
  u8g2.drawEllipse(108, 56, 6, 6);                    //Kreisumrandung für + Symbol
  u8g2.drawXBMP(17, 54, 94, 5, image_paint_1_bits);   //+ und - Symbol
  u8g2.drawXBMP(95, 18, 25, 25, image_paint_2_bits);  //Schneeflockensymbol
  u8g2.drawStr(32, 23, "C");                          //"C" Symbol in Zeile 1
  u8g2.drawStr(32, 34, "C");                          //"C" Symbol in Zeile 2
  u8g2.drawStr(32, 45, "C");                          //"C" Symbol in Zeile 3

  u8g2.setFont(u8g2_font_helvR12_tf);   //Schriftart ändern für "°" Symbol
  u8g2.drawStr(25, 25, DEGREE_SYMBOL);  //"°" Symbol in Zeile 1
  u8g2.drawStr(25, 36, DEGREE_SYMBOL);  //"°" Symbol in Zeile 2
  u8g2.drawStr(25, 47, DEGREE_SYMBOL);  //"°" Symbol in Zeile 3

  u8g2.sendBuffer();  //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
}

void loop() {
  Serial.print("Temperatur innen: ");     //Im seriellen Monitor den Text und
  Serial.print(tempSensorin.getTempC());  //die Dazugehörigen Werte anzeigen
  Serial.println(" °C");                  //}

  //Serial.print("Temperatur außen: ");             //Im seriellen Monitor den Text und
  //Serial.print(tempSensorout.getTempC());         //die Dazugehörigen Werte anzeigen
  //Serial.println(" °C");//}

  Serial.print("Sollwert: ");  //Im seriellen Monitor den Text und
  Serial.print(Setvariable);   //die Dazugehörigen Werte anzeigen
  Serial.println();

  if (counter1 >= 2) {  //Wenn Zähler eingestellten Wert erreicht oder überschreitet wird darunter stehende Aktion ausgeführt
    float ti = tempSensorin.getTempC();
    dtostrf(ti, 2, 1, temperature_inside);  //Umwandlung Innentemperatur in String

    if (ti < Setvariable) {         //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
      digitalWrite(relayPin, LOW);  //wird Relaispin ausgeschalten
    }
    if (ti > Setvariable) {          //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
      digitalWrite(relayPin, HIGH);  //wird Relaispin eingeschalten
    }

    float to = tempSensorout.getTempC();
    dtostrf(to, 2, 1, temperature_outside);  //Umwandlung Außentemperatur in String

    float st = Setvariable;
    dtostrf(st, 2, 1, Setvariable_str);  //Umwandlung Sollwert in String


    u8g2.setFont(u8g2_font_profont11_tr);
    u8g2.drawStr(0, 23, temperature_inside);   //Temperaturwert in Zeile 1
    u8g2.drawStr(0, 34, temperature_outside);  //Temperaturwert in Zeile 2
    u8g2.drawStr(0, 45, Setvariable_str);      //Sollwert in Zeile 3
    u8g2.sendBuffer();                         //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
    counter1 = 0;
  }

  counter1++;
}

void isrUpbutton() {  //Buttoninterrupt Upbutton

  if (digitalRead(Upbutton) == 0) Setvariable = Setvariable + 1;  //Wenn gedrückt, wird der Sollwert +1 angehoben
                                                                  //for(int i=0; i<40; i++) { // delay 40x500uSek=20mSek          //Taster entprellung (so kurz wie möglich das keine doppel Werte übernommen werden)
  //delayMicroseconds(500);
}

void isrDownbutton() {  //Buttoninterrupt Upbutton

  if (digitalRead(Downbutton) == 0) Setvariable = Setvariable - 1;  //Wenn gedrückt, wird der Sollwert -1 angehoben
  //for(int i=0; i<40; i++) { // delay 40x500uSek=20mSek           //Taster entprellung (so kurz wie möglich das keine doppel Werte übernommen werden)
  //delayMicroseconds(500);
}

Ich nehme auch gerne Verbesserungsvorschläge an :slight_smile:

Hoffe mir kann hier einer weiterhelfen, da mir eigentl. nur mehr dieser Teil fehlt, der Rest läuft bereits :smiley:

Danke im Voraus!

Willkommen im Forum :wink:
Du machts bitte Folgendes
In der IDE drücken STRG +T.
Dan unter Bearbeiten ist Für Forum kopieren,
und hier einfügen.
So wie das jetzt ist ist das fast nicht lesbar. geschweige das kopieren und bearbeiten

Wie gesagt, ich bin totaler noob ^^

Danke für die Ausbesserung, ja jetzt sieht das so schön aus wie man das oft sieht :smiley:

So erster Fehler

sketch_jul11b:87:13: error: 'tempC' was not declared in this scope
   87 |     dtostrf(tempC, 2, 1, temperature_inside);   //Umwandlung Innentemperatur in String

Hast das alles mal Kompiliert?

Ich mach jetzt Feierabend :sleeping:

jepp, nur habe ich seitdem die "tempC" wieder wegen der Übersichtlichkeit zurück auf "ti" für Temperature_Inside geändert, den einen hab ich wohl vergessen, tut leid :confused:

Ist nochmals bearbeitet und jetz auch richtig und Compiled.

Gute Nacht!

Sagt doch alles aus, Du musst dir zwei variable anlegen zB. "tialt", "toalt" anlegen und die mit aktueller Temp verglichen.

Mein Problem ist, ich schaff es nicht mir das zu schreiben, ich hab bereits Stunden auf Google und YouTube verbracht und einige Foren durchgelesen, so wie ich es brauch hat das keiner und ich weis nicht genau wie ich das mach :confused:

es scheitert bei mir leider an den banalsten Dingen, somit weis ich nicht wie ich die z.b. "tialt" abspeichere, damit die bis zum nächsten Zyklus im Speicher bleibt damit ich sie überhaupt mal abgleichen kann ...

Ich wäre hier für eine kleine Hilfestellung sehr dankbar!

Mach mall Foto vom Display wie es aussieht jetzt mit angezeigten Werten, habe dein Display nicht, nutze nur Farbdisplays.
Man lernt am besten mit Beispielen und nicht mit Abkupfern, Funktionen was man nicht versteht sind ziemlich gut beschrieben in Arduino Referenz, sogar auf Deutsch + gutes C++ Buch.

Ich würde jetzt ned behaupten abzukupfern, aber wenn du das so siehst kann ich das wohl nicht ändern ...

Im Anhang ein Bild meines Display's worauf zu erkennen ist, dass er immer die Zahlen überschreibt da ich ja keinen clearBuffer machen kann, weil ja der Grafikhintergrund nur im Setup gezeichnet wird und sonst alles weg ist ausser der Zahlen, und ich hätte ja gerne, das alles bleibt und nur die Zahlen neu geschrieben werden.

Teste das mall

#include <U8g2lib.h> //Datenbank für Grafikdisplay KS0108 128x64 Pixel
#include <DS18B20.h> //DS18B20 Temperatursensor Bibliothek laden
#include <OneWire.h> //Bibliothek für 1-Kabel Sensoren
#include <DallasTemperature.h>

void isrUpbutton();
void isrDownbutton();

DS18B20 tempSensorin(16); //4,7k Ohm Pullup Widerstand zwischen Plusleitung (Rot) + Datenleitung (Gelb)
DS18B20 tempSensorout(17); //4,7k Ohm Pullup Widerstand zwischen Plusleitung (Rot) + Datenleitung (Gelb)

char temperature_inside [5]; //Benennung der String-Variable für Innentemperatur
char temperature_outside [5]; //Benennung der String-Variable für Außentemperatur
char Setvariable_str [5]; //Benennung der String-Variable für Setvariable
const char DEGREE_SYMBOL[] = { 0xB0, '\0' }; //Grad Symbol "°" (in Kombination mit unten angeführtem Schriftstil)

int Setvariable = 20;
#define Upbutton 2 //Upbutton angeschlossen Pin 2
#define Downbutton 3 //Downbutton angeschlossen Pin 3
#define relayPin 12 //Relais angeschlossen Pin 12
byte counter1 = 0;


U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, 13, 11, 10); //Displayinterface, angeschlossen an Pin 13, 11, 10; Pinaufgaben: clock=13, data=11, CS=10

static const unsigned char image_paint_0_bits[] U8X8_PROGMEM = {0x49, 0x2a, 0x1c, 0x7f, 0x1c, 0x2a, 0x49}; //Sternsymbole Kopfzeile
//+ und - Symbole neben Sollwert Fußzeile
static const unsigned char image_paint_1_bits[] U8X8_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08};
//Schneeflockensymbol Groß
static const unsigned char image_paint_2_bits[] U8X8_PROGMEM = {0x00, 0xaa, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x48, 0x10, 0x24, 0x00, 0x50, 0x10, 0x14, 0x00, 0x20, 0x11, 0x09, 0x00, 0x58, 0x11, 0x35, 0x00, 0x80, 0x28, 0x02, 0x00, 0x60, 0x45, 0x0d, 0x00, 0x01, 0x82, 0x00, 0x01, 0x02, 0x01, 0x81, 0x00, 0x85, 0x00, 0x42, 0x01, 0x7a, 0x00, 0xbc, 0x00, 0x85, 0x00, 0x42, 0x01, 0x02, 0x01, 0x81, 0x00, 0x01, 0x82, 0x00, 0x01, 0x60, 0x45, 0x0d, 0x00, 0x80, 0x28, 0x02, 0x00, 0x58, 0x11, 0x35, 0x00, 0x20, 0x11, 0x09, 0x00, 0x50, 0x10, 0x14, 0x00, 0x48, 0x10, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00};
//bool schreiben = false;
float ti = 0, to = 0, st = 0;
float tialt = 0, toalt = 0, stalt = 0;

void setup() {
  Serial.begin(9600); //Beginn Serielle Verbindung 9600 Baud
  u8g2.begin(); //Display Start
  pinMode(relayPin, OUTPUT); //Relaispin als Ausgang gesetzt
  digitalWrite(relayPin, HIGH);
  pinMode(Upbutton, INPUT_PULLUP); //Upbutton als Eingang definiert und mit einem Software Pullup-Widerstand gesetzt
  attachInterrupt(digitalPinToInterrupt(Upbutton), isrUpbutton, FALLING); //Buttoninterrupt eingefügt damit der Button zu jeder Zeit
  //im Loop gedrückt werden kann
  pinMode(Downbutton, INPUT_PULLUP); //Downbutton als Eingang definiert und mit einem Software Pullup-Widerstand gesetzt
  attachInterrupt(digitalPinToInterrupt(Downbutton), isrDownbutton, FALLING); //Buttoninterrupt eingefügt damit der Button zu jeder Zeit
  //im Loop gedrückt werden kann

  //Einmaliges Schreiben des Grafikhintergrundes beim Start des Arduino
  u8g2.clearBuffer(); //Interner Displayspeicher löschen
  u8g2.setFontMode(1);
  u8g2.setBitmapMode(1);
  u8g2.setFont(u8g2_font_profont11_tr); //Schriftart einstellen für Display
  u8g2.drawStr(22, 8, "Cooling Box 42"); //Überschrift
  u8g2.drawLine(0, 11, 127, 11); //Unterstrich unter "Cooling Box 42"
  u8g2.drawXBMP(118, 1, 7, 7, image_paint_0_bits); //Sternsymbol links
  u8g2.drawXBMP(3, 1, 7, 7, image_paint_0_bits); //Sternsymbol rechts
  u8g2.drawStr(44, 23, "Inside"); //Geschriebenes Wort in Zeile
  u8g2.drawStr(44, 34, "Outside"); //Geschriebenes Wort in Zeile
  u8g2.drawStr(44, 45, "Soll"); //Geschriebenes Wort in Zeile
  u8g2.drawStr(41, 60, "Sollwert"); //Geschriebenes Wort in Zeile
  u8g2.drawEllipse(19, 56, 6, 6); //Kreisumrandung für - Symbol
  u8g2.drawEllipse(108, 56, 6, 6); //Kreisumrandung für + Symbol
  u8g2.drawXBMP(17, 54, 94, 5, image_paint_1_bits); //+ und - Symbol
  u8g2.drawXBMP(95, 18, 25, 25, image_paint_2_bits); //Schneeflockensymbol
  u8g2.drawStr(32, 23, "C"); //"C" Symbol in Zeile 1
  u8g2.drawStr(32, 34, "C"); //"C" Symbol in Zeile 2
  u8g2.drawStr(32, 45, "C"); //"C" Symbol in Zeile 3

  u8g2.setFont(u8g2_font_helvR12_tf); //Schriftart ändern für "°" Symbol
  u8g2.drawStr(25, 25, DEGREE_SYMBOL); //"°" Symbol in Zeile 1
  u8g2.drawStr(25, 36, DEGREE_SYMBOL); //"°" Symbol in Zeile 2
  u8g2.drawStr(25, 47, DEGREE_SYMBOL); //"°" Symbol in Zeile 3

  u8g2.sendBuffer(); //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
}

void loop() {
  Serial.print("Temperatur innen: "); //Im seriellen Monitor den Text und
  Serial.print(tempSensorin.getTempC()); //die Dazugehörigen Werte anzeigen
  Serial.println(" °C");//}

  //Serial.print("Temperatur außen: ");             //Im seriellen Monitor den Text und
  //Serial.print(tempSensorout.getTempC());         //die Dazugehörigen Werte anzeigen
  //Serial.println(" °C");//}

  Serial.print("Sollwert: ");                     //Im seriellen Monitor den Text und
  Serial.print(Setvariable);                      //die Dazugehörigen Werte anzeigen
  Serial.println();
  u8g2.setFont(u8g2_font_profont11_tr);
  if (counter1 >= 2) {                        //Wenn Zähler eingestellten Wert erreicht oder überschreitet wird darunter stehende Aktion ausgeführt
    ti = tempSensorin.getTempC();
    dtostrf(ti, 2, 1, temperature_inside);   //Umwandlung Innentemperatur in String

    if (ti < Setvariable) {                  //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
      digitalWrite(relayPin, LOW);                //wird Relaispin ausgeschalten
    }
    if (ti > Setvariable) {                  //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
      digitalWrite(relayPin, HIGH);               //wird Relaispin eingeschalten
    }

    to = tempSensorout.getTempC();
    dtostrf(to, 2, 1, temperature_outside);     //Umwandlung Außentemperatur in String

    st = Setvariable;
    dtostrf(st, 2, 1, Setvariable_str);         //Umwandlung Sollwert in String



    u8g2.drawStr(0, 23, temperature_inside);   //Temperaturwert in Zeile 1
    u8g2.drawStr(0, 34, temperature_outside);  //Temperaturwert in Zeile 2
    u8g2.drawStr(0, 45, Setvariable_str);      //Sollwert in Zeile 3
    u8g2.sendBuffer();                         //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
    counter1 = 0;
  }
  tialt = ti;
  toalt = to;
  stalt = st;
  counter1++;

  if ((tialt != ti) || (toalt != to) || ( stalt != st)) {
    u8g2.setCursor(0, 23); //Setze Cursor auf gewünschte Stelle
    u8g2.print("    ");  // 4 X Space wird gedruckt
    u8g2.setCursor(0, 34);
    u8g2.print("    ");
    u8g2.setCursor(0, 45);
    u8g2.print("    ");
  }
}

void isrUpbutton() { //Buttoninterrupt Upbutton

  if (digitalRead(Upbutton) == 0) Setvariable = Setvariable + 1; //Wenn gedrückt, wird der Sollwert +1 angehoben
  //for(int i=0; i<40; i++) { // delay 40x500uSek=20mSek //Taster entprellung (so kurz wie möglich das keine doppel Werte übernommen werden)
  //delayMicroseconds(500);
}

void isrDownbutton() { //Buttoninterrupt Upbutton

  if (digitalRead(Downbutton) == 0) Setvariable = Setvariable - 1; //Wenn gedrückt, wird der Sollwert -1 angehoben
  //for(int i=0; i<40; i++) { // delay 40x500uSek=20mSek //Taster entprellung (so kurz wie möglich das keine doppel Werte übernommen werden)
  //delayMicroseconds(500);
}

Das ganze geht auch schöner nur bin fauler Sack.

 if ((tialt != ti) || (toalt != to) || ( stalt != st)) {
    u8g2.setCursor(0, 23); //Setze Cursor auf gewünschte Stelle
    u8g2.print("    ");  // 4 X Space wird gedruckt
    u8g2.setCursor(0, 34);
    u8g2.print("    ");
    u8g2.setCursor(0, 45);
    u8g2.print("    ");
  }

in dem Block werden die alte werte gelöscht = mit Space überschrieben und neu geschrieben, so wenigstens die Idee, ob funktioniert musst selber testen.
was du nicht berücksichtigst hast wen die Temp kommt in zweistelligen minus Bereich ist das ganze kaputt, wird das Degree Zeichen gelöscht.
Ok im dem Fall mit der Box ist das unkritisch, nur wenn du mal ein in, out Thermometer baust ist das Relevant

Danke für den Hinweis! Werd ich aber nie erreichen, da das ding mit Peltierelementen betrieben wird und nie an die 0° Grenze kommen wird da die Isolierung garnicht ausgelegt ist dafür wirklich zu frieren, aber das ist nebensächlich. :slight_smile:

Dein Programm geht leider nicht. Aufgrund mangelnder Erfahrung könnte ich nur mutmaßen, dass die if-Abfrage ausserhalb des Loops ist aber genau kann ich das nicht sagen. Es funktioniert auf jeden Fall genau so wie vorher, die Zeichen werden überzeichnet und nicht neu geschrieben.

Ich habe es aber inzwischen hingebracht, hier mein Loop:


void loop() {
  Serial.print("Temperatur innen: ");     //Im seriellen Monitor den Text und
  Serial.print(tempSensorin.getTempC());  //die Dazugehörigen Werte anzeigen
  Serial.println(" °C");                  //}

  //Serial.print("Temperatur außen: ");             //Im seriellen Monitor den Text und
  //Serial.print(tempSensorout.getTempC());         //die Dazugehörigen Werte anzeigen
  //Serial.println(" °C");//}

  Serial.print("Sollwert: ");  //Im seriellen Monitor den Text und
  Serial.print(Setvariable);   //die Dazugehörigen Werte anzeigen
  Serial.println();

  if (counter1 >= 2) {  //Wenn Zähler eingestellten Wert erreicht oder überschreitet wird darunter stehende Aktion ausgeführt
    float ti = tempSensorin.getTempC();
    dtostrf(ti, 2, 1, temperature_inside);  //Umwandlung Innentemperatur in String

    if (ti < Setvariable) {         //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
      digitalWrite(relayPin, LOW);  //wird Relaispin ausgeschalten
    }
    if (ti > Setvariable) {          //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
      digitalWrite(relayPin, HIGH);  //wird Relaispin eingeschalten
    }

    float to = tempSensorout.getTempC();
    dtostrf(to, 2, 1, temperature_outside);  //Umwandlung Außentemperatur in String

    float st = Setvariable;
    dtostrf(st, 2, 1, Setvariable_str);  //Umwandlung Sollwert in String

    tialt = digitalRead(ti);
    toalt = digitalRead(to);
    salt = digitalRead(st);

    u8g2.setDrawColor(0);
    if (ti || to || st != tialt || toalt || salt) {
      u8g2.drawBox(box_area_x_pos, box_area_y_pos, box_area_width, box_area_height);
    }
    u8g2.setDrawColor(1);
    u8g2.setFont(u8g2_font_profont11_tr);
    u8g2.drawStr(0, 23, temperature_inside);   //Temperaturwert in Zeile 1
    u8g2.drawStr(0, 34, temperature_outside);  //Temperaturwert in Zeile 2
    u8g2.drawStr(0, 45, Setvariable_str);      //Sollwert in Zeile 3



    u8g2.sendBuffer();  //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
    counter1 = 0;
  }


Ist wahrscheinlich nicht schön, funktioniert aber :smiley:
Somit hab ich die Funktion mal erreicht. Vielleicht krieg ich das noch hin, das ich die beiden Funktionen setDrawColor in die if-Funktion mit einbaue dann führt er die nicht in jedem Loop aus, spart vielleicht bisschen was. :smiley:

Aber danke dir für deine mithilfe! :smiley:

Ich halte das Verfahren für zu Rechen- und Zeitintensiv.
Wenn sich ein Wert ändert, löscht Du das halbe display und beschreibst es komplett neu.
Und irgendwie sehe ich nicht, dass Du den alt-Wert nach dem schreiben aus dem neuwert übernimmst, was zur Folge hätte, dass der Display mit jedem Umlauf neu beschrieben wird.

Ich beschreibe ja lediglich das Areal neu in dem die Werte stehen, alles andere bleibt bestehen.

Wir reden hier VIELLEICHT von 1/10 der Displayfläche :man_shrugging:
Was noch möglich wäre, ist das man 3 if-Befehle ausführt und nur das Areal des jeweiligen wertes ändert, was aber die Ausführzeit nicht verkürzen wird da ich in 0,X Werten angebe und sich somit ständig der Wert irgendwie ändert.

Hast du einen Verbesserungsvorschlag?

Ich überlege gearde das schreiben in eine Funktion zu werfen und nur den Bereich und die alt- und neuwerte zu übergeben.

Kannst Du mir mal den ganzen Code geben?
Ich lad dann zwischendurch mein lappi mal nach.

Hier der aktuelle Code :slight_smile: :

#include <U8g2lib.h>  //Datenbank für Grafikdisplay KS0108 128x64 Pixel
#include <DS18B20.h>  //DS18B20 Temperatursensor Bibliothek laden
#include <OneWire.h>  //Bibliothek für 1-Kabel Sensoren
#include <DallasTemperature.h>

void isrUpbutton();
void isrDownbutton();

DS18B20 tempSensorin(16);   //4,7k Ohm Pullup Widerstand zwischen Plusleitung (Rot) + Datenleitung (Gelb)
DS18B20 tempSensorout(17);  //4,7k Ohm Pullup Widerstand zwischen Plusleitung (Rot) + Datenleitung (Gelb)

char temperature_inside[5];                   //Benennung der String-Variable für Innentemperatur
char temperature_outside[5];                  //Benennung der String-Variable für Außentemperatur
char Setvariable_str[5];                      //Benennung der String-Variable für Setvariable
const char DEGREE_SYMBOL[] = { 0xB0, '\0' };  //Grad Symbol "°" (in Kombination mit unten angeführtem Schriftstil)

const uint8_t box_area_x_pos = 0;    //Koordinate für drawBox Funktion um Zahlenbereich zu Reinigen
const uint8_t box_area_y_pos = 16;   //Koordinate für drawBox Funktion um Zahlenbereich zu Reinigen
const uint8_t box_area_width = 24;   //Koordinate für drawBox Funktion um Zahlenbereich zu Reinigen
const uint8_t box_area_height = 33;  //Koordinate für drawBox Funktion um Zahlenbereich zu Reinigen

int Setvariable = 30;
#define Upbutton 2    //Upbutton angeschlossen Pin 2
#define Downbutton 3  //Downbutton angeschlossen Pin 3
#define relayPin 12   //2x Relais angeschlossen Pin 12

float tialt = 0;
float toalt = 0;
float salt = 0;

double counter1 = 0;

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, 13, 11, 10);  //Displayinterface, angeschlossen an Pin 13, 11, 10; Pinaufgaben: clock=13, data=11, CS=10

static const unsigned char image_paint_0_bits[] U8X8_PROGMEM = { 0x49, 0x2a, 0x1c, 0x7f, 0x1c, 0x2a, 0x49 };  //Sternsymbole Kopfzeile
//+ und - Symbole neben Sollwert Fußzeile
static const unsigned char image_paint_1_bits[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
//Schneeflockensymbol Groß
static const unsigned char image_paint_2_bits[] U8X8_PROGMEM = { 0x00, 0xaa, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x48, 0x10, 0x24, 0x00, 0x50, 0x10, 0x14, 0x00, 0x20, 0x11, 0x09, 0x00, 0x58, 0x11, 0x35, 0x00, 0x80, 0x28, 0x02, 0x00, 0x60, 0x45, 0x0d, 0x00, 0x01, 0x82, 0x00, 0x01, 0x02, 0x01, 0x81, 0x00, 0x85, 0x00, 0x42, 0x01, 0x7a, 0x00, 0xbc, 0x00, 0x85, 0x00, 0x42, 0x01, 0x02, 0x01, 0x81, 0x00, 0x01, 0x82, 0x00, 0x01, 0x60, 0x45, 0x0d, 0x00, 0x80, 0x28, 0x02, 0x00, 0x58, 0x11, 0x35, 0x00, 0x20, 0x11, 0x09, 0x00, 0x50, 0x10, 0x14, 0x00, 0x48, 0x10, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00 };

void setup() {
  Serial.begin(9600);                                                          //Beginn Serielle Verbindung 9600 Baud
  u8g2.begin();                                                                //Display Start
  pinMode(relayPin, OUTPUT);                                                   //Relaispin als Ausgang gesetzt
  pinMode(Upbutton, INPUT_PULLUP);                                             //Upbutton als Eingang definiert und mit einem Software Pullup-Widerstand gesetzt
  attachInterrupt(digitalPinToInterrupt(Upbutton), isrUpbutton, FALLING);      //Buttoninterrupt eingefügt damit der Button zu jeder Zeit
                                                                               //im Loop gedrückt werden kann
  pinMode(Downbutton, INPUT_PULLUP);                                           //Downbutton als Eingang definiert und mit einem Software Pullup-Widerstand gesetzt
  attachInterrupt(digitalPinToInterrupt(Downbutton), isrDownbutton, FALLING);  //Buttoninterrupt eingefügt damit der Button zu jeder Zeit
                                                                               //im Loop gedrückt werden kann

  //Einmaliges Schreiben des Grafikhintergrundes beim Start des Arduino
  u8g2.clearBuffer();  //Interner Displayspeicher löschen
  u8g2.setFontMode(1);
  u8g2.setBitmapMode(1);
  u8g2.setFont(u8g2_font_profont11_tr);               //Schriftart einstellen für Display
  u8g2.drawStr(22, 8, "Cooling Box 42");              //Überschrift
  u8g2.drawLine(0, 11, 127, 11);                      //Unterstrich unter "Cooling Box 42"
  u8g2.drawXBMP(118, 1, 7, 7, image_paint_0_bits);    //Sternsymbol links
  u8g2.drawXBMP(3, 1, 7, 7, image_paint_0_bits);      //Sternsymbol rechts
  u8g2.drawStr(44, 23, "Inside");                     //Geschriebenes Wort in Zeile
  u8g2.drawStr(44, 34, "Outside");                    //Geschriebenes Wort in Zeile
  u8g2.drawStr(44, 45, "Soll");                       //Geschriebenes Wort in Zeile
  u8g2.drawStr(41, 60, "Sollwert");                   //Geschriebenes Wort in Zeile
  u8g2.drawEllipse(19, 56, 6, 6);                     //Kreisumrandung für - Symbol
  u8g2.drawEllipse(108, 56, 6, 6);                    //Kreisumrandung für + Symbol
  u8g2.drawXBMP(17, 54, 94, 5, image_paint_1_bits);   //+ und - Symbol
  u8g2.drawXBMP(95, 18, 25, 25, image_paint_2_bits);  //Schneeflockensymbol
  u8g2.drawStr(32, 23, "C");                          //"C" Symbol in Zeile 1
  u8g2.drawStr(32, 34, "C");                          //"C" Symbol in Zeile 2
  u8g2.drawStr(32, 45, "C");                          //"C" Symbol in Zeile 3

  u8g2.setFont(u8g2_font_helvR12_tf);   //Schriftart ändern für "°" Symbol
  u8g2.drawStr(25, 25, DEGREE_SYMBOL);  //"°" Symbol in Zeile 1
  u8g2.drawStr(25, 36, DEGREE_SYMBOL);  //"°" Symbol in Zeile 2
  u8g2.drawStr(25, 47, DEGREE_SYMBOL);  //"°" Symbol in Zeile 3

  u8g2.sendBuffer();  //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
}

void loop() {
  //Serial.print("Temperatur innen: ");     //Im seriellen Monitor den Text und
  //Serial.print(tempSensorin.getTempC());  //die Dazugehörigen Werte anzeigen
  //Serial.println(" °C");                  //}

  //Serial.print("Temperatur außen: ");             //Im seriellen Monitor den Text und
  //Serial.print(tempSensorout.getTempC());         //die Dazugehörigen Werte anzeigen
  //Serial.println(" °C");//}

  //Serial.print("Sollwert: ");  //Im seriellen Monitor den Text und
  //Serial.print(Setvariable);   //die Dazugehörigen Werte anzeigen
  //Serial.println();

  if (counter1 >= 2) {  //Wenn Zähler eingestellten Wert erreicht oder überschreitet wird darunter stehende Aktion ausgeführt
    float ti = tempSensorin.getTempC();
    dtostrf(ti, 2, 1, temperature_inside);  //Umwandlung Innentemperatur in String

    if (ti < Setvariable - 1) {     //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
      digitalWrite(relayPin, LOW);  //wird Relaispin ausgeschalten
    }
    if (ti > Setvariable + 1) {      //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
      digitalWrite(relayPin, HIGH);  //wird Relaispin eingeschalten
    }

    float to = tempSensorout.getTempC();
    dtostrf(to, 2, 1, temperature_outside);  //Umwandlung Außentemperatur in String

    float st = Setvariable;
    dtostrf(st, 2, 1, Setvariable_str);  //Umwandlung Sollwert in String

    tialt = digitalRead(ti);
    toalt = digitalRead(to);
    salt = digitalRead(st);

    u8g2.setDrawColor(0);
    if (ti || to || st != tialt || toalt || salt) {
      u8g2.drawBox(box_area_x_pos, box_area_y_pos, box_area_width, box_area_height);
    }
    u8g2.setDrawColor(1);
    u8g2.setFont(u8g2_font_profont11_tr);
    u8g2.drawStr(0, 23, temperature_inside);   //Temperaturwert in Zeile 1
    u8g2.drawStr(0, 34, temperature_outside);  //Temperaturwert in Zeile 2
    u8g2.drawStr(0, 45, Setvariable_str);      //Sollwert in Zeile 3

    u8g2.sendBuffer();  //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
    counter1 = 0;
  }

  counter1++;
}

void isrUpbutton() {  //Buttoninterrupt Upbutton

  if (digitalRead(Upbutton) == 0) Setvariable = Setvariable + 1;  //Wenn gedrückt, wird der Sollwert +1 angehoben
                                                                  //for(int i=0; i<40; i++) { // delay 40x500uSek=20mSek          //Taster entprellung (so kurz wie möglich das keine doppel Werte übernommen werden)
  //delayMicroseconds(500);
}

void isrDownbutton() {  //Buttoninterrupt Upbutton

  if (digitalRead(Downbutton) == 0) Setvariable = Setvariable - 1;  //Wenn gedrückt, wird der Sollwert -1 angehoben
  //for(int i=0; i<40; i++) { // delay 40x500uSek=20mSek           //Taster entprellung (so kurz wie möglich das keine doppel Werte übernommen werden)
  //delayMicroseconds(500);
}

Ich hab das versucht mit print machen. wen du aber das auf "drawStr" machst brauchst keine Box zeichnen.
Und wie geschrieben testen kann ich nicht, bei tft funktioniert sowas, wo bei wurde das ganz anders machen und als Formatierten Text ausgeben und schreiben von Rechts nach Links das kann aber die u8g2 nicht.
Bei schreiben von Rechts nach Links tanzen die werte nicht wen die unter 10 fallen

Weis ich hab ich gelesen und auch ausprobiert aber es hatte keine Änderung vorgerufen, die Werte waren dann noch immer in besagten Arealen und wurden von neuen Werten direkt überdruckt wodurch es wieder unleserlich wurde :man_shrugging:

Kk, ich hab bis dato nur dieses u8g2 Display und das mit einem Starterkit mitgelieferten 16x2 Display ausprobiert. Aber ich habs reingeladen und probiert gehabt :slight_smile:

Hihihi...
In welcher Auflösung werden denn die Temperatursensoren betrieben?
Warum hast Du da einen counter drin, der nur 1 oder 2 zählt und bei 2 das schreiben auslöst?

Was für Kontroller hat dein Display ist doch ein Pixel Display?
Hat sich erledigt es ist der SBN6400G