LCDMenuLib2 Screensaver in Digitaluhr umbauen +1

Hallo...

Ich würde gern den LCDML Screensaver in ne Digitaluhr umbauen...
Ich verwende einen 128x64 OLED I2C Display mit dem "LCDML: graphic display with u8g" Beispiel..
zunächst soll das erstmal ohne eine RTC laufen... Die RTC wird dann später nachgerüstet..

Ich seh da den Wald vor lauter Bäumen nicht...

des Weiteren würde ich gern auf der (Standard) Information -Karte Messwerte von 2 Analogen Pins einfügen...
Hier steht bereits das "Grundgerüst" aber die werte bekomm ich nicht an die Passende stelle.. Die werden gar nicht erst angezeigt...
Ein Test mit dem Seriellen Monitor verrät mir allerdings, das tatsächlich werte gemessen werden...
Eine Ausgabe im Seriellen Monitor ist also vorhanden...

void mFunc_information(uint8_t param)
// *********************************************************************
{
  if(LCDML.FUNC_setup())          // ****** SETUP *********
  {
    // remmove compiler warnings when the param variable is not used:
    LCDML_UNUSED(param);

    // setup function
    u8g.setFont(_LCDML_DISP_font);
    u8g.firstPage();
    do {
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 1), F("Blu Control v1.0"));
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 4), F("Power Rails Voltage:"));
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 5), F("12V Rail:"));
      //u8g.drawStr( 80, (_LCDML_DISP_font_h * 5), F("12.45")); //replace with analog Value
      u8g.drawStr( 120, (_LCDML_DISP_font_h * 5), F("V"));
      u8g.drawStr( 6, (_LCDML_DISP_font_h * 6), F("5V Rail:"));
      //u8g.drawStr( 86, (_LCDML_DISP_font_h * 6), F("5.12")); //replace with analog Value
      u8g.drawStr( 120, (_LCDML_DISP_font_h * 6), F("V"));
    } while( u8g.nextPage() );
  }

  if(LCDML.FUNC_loop())           // ****** LOOP *********
  {
      
      
    // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
    // the quit button works in every DISP function without any checks; it starts the loop_end function
    if(LCDML.BT_checkAny()) // check if any button is pressed (enter, up, down, left, right)
    {
      // LCDML_goToMenu stops a running menu function and goes to the menu
      LCDML.FUNC_goBackToMenu();
    }
    int Value12V = analogRead(A6);
    int Value5V  = analogRead(A7);
    Serial.println(Value12V); //noch nicht auf den tatsächlichen wert berechnet
    Serial.println(Value5V); //noch nicht auf den tatsächlichen wert berechnet
    
    char buf[20];
    sprintf (buf, " %d", Value12V);
    
    u8g.drawStr( 80, (_LCDML_DISP_font_h * 5), buf); 
    u8g.drawStr( 86, (_LCDML_DISP_font_h * 6), F("5.12"));
  }

  if(LCDML.FUNC_close())      // ****** STABLE END *********
  {
    // you can here reset some global vars or do nothing
  }
}
1 Like

Funktioniert das Display ? Bin nicht schlau aus der Beschreibung

Der Display funktioniert Einwandfrei...
Der ganze "Rest" läuft so wie er laufen soll...

Wo fehlt es an Infos?

Wen ich das so vergleiche mit dem was in der Lib ist dan fehlt mier

u8g2.setFontMode(1);

Vor
u8g.setFont(_LCDML_DISP_font);
kann mich irren, hab nur ein mall u8g2 benutzt

So sieht die Anzeige im Display aus…
Vielleicht hilft euch das weiter…

Wie gesagt ich hab da "Löcher" in der anzeige, da wo eigentlich die Werte der Analog Pins hin sollten...

Die Ausgabe möchte in eine while-Schleife eingebunden sein, ungetestet:

    u8g.firstPage();
    do {
      u8g.drawStr( 80, (_LCDML_DISP_font_h * 5), buf); 
      u8g.drawStr( 86, (_LCDML_DISP_font_h * 6), F("5.12"));
    } while( u8g.nextPage() );

Vermutlich werden sich aber so die Werte überschreiben und zu einem weißen Block werden, wäre dennoch ein erster Schritt.

OK...

Weiter oben ist aber schon eine " u8g.firstPage()"

Kann die, die du jetzt vorgeschlagen hast genau so heißen?

Ja, das ist eine Methode.

OK... Ich probiere aus...

Ich gebe Rückmeldung...

Danke schonmal...

Für weitere Antworten wäre der genutzte µC von Interesse und welche Fonts verwendet werden.

Viel Erfolg!

Habs ausprobiert...

Bekomme jetzt zwar werte angezeigt, aber die schießen durch die Skala...
Zum Testen die "Raw Daten" & die Berechneten Werte mal in den Seriellen Monitor geschossen, da passt alles...

Ausserdem musste ich den ganzen DisplayCode vom Setup in den loop verschieben, da die einzelnen Werte den Rest der Anzeige überschrieben & bis auf die Werte keine anzeige mehr im Display war...

Verwende einen 328P (Arduino Nano)
Fonts: u8g_font_6x10 (ich glaub das ist das was Du meinst..)

void mFunc_information(uint8_t param)
// *********************************************************************
{
  if(LCDML.FUNC_setup())          // ****** SETUP *********
  {
    // remmove compiler warnings when the param variable is not used:
    LCDML_UNUSED(param);

    // setup function
    u8g.setFont(_LCDML_DISP_font);
    /*u8g.firstPage();
    do {
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 1), F("Blu Control v1.0"));
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 4), F("Power Rails Voltage:"));
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 5), F("12V Rail:"));
      //u8g.drawStr( 80, (_LCDML_DISP_font_h * 5), F("12.45")); //replace with analog Value
      u8g.drawStr( 120, (_LCDML_DISP_font_h * 5), F("V"));
      u8g.drawStr( 6, (_LCDML_DISP_font_h * 6), F("5V Rail:"));
      //u8g.drawStr( 86, (_LCDML_DISP_font_h * 6), F("5.12")); //replace with analog Value
      u8g.drawStr( 120, (_LCDML_DISP_font_h * 6), F("V"));
    } while( u8g.nextPage() );
    */
  }

  if(LCDML.FUNC_loop())           // ****** LOOP *********
  {
      
      
    // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
    // the quit button works in every DISP function without any checks; it starts the loop_end function
    if(LCDML.BT_checkAny()) // check if any button is pressed (enter, up, down, left, right)
    {
      // LCDML_goToMenu stops a running menu function and goes to the menu
      LCDML.FUNC_goBackToMenu();
    }
    float sensor12Value = analogRead(A6);
    float sensor5Value  = analogRead(A7);

    float voltage12 = sensor12Value * (15.0 / 1023.0);  // Wert über Spannungsteiler mit 1k 2K Verhältnis (Liegt aktuell am 3.3V Pin des Nano an
    float voltage5 = sensor5Value * (5.0 / 1023.0); // liegt aktuell am 3.3V Pin des Nano an..

    Serial.println(sensor12Value);
    Serial.println(voltage12);
    Serial.println(sensor5Value);
    Serial.println(voltage5);

    
    char buf1[10];
    sprintf (buf1, " %d", voltage12);
    char buf2[10];
    sprintf (buf2, "%d", voltage5);

    u8g.firstPage();
    do {
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 1), F("Blu Control v1.0"));
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 4), F("Power Rails Voltage:"));
      u8g.drawStr( 0, (_LCDML_DISP_font_h * 5), F("12V Rail:"));
      u8g.drawStr( 80, (_LCDML_DISP_font_h * 5), buf1);
      u8g.drawStr( 120, (_LCDML_DISP_font_h * 5), F("V"));
      u8g.drawStr( 6, (_LCDML_DISP_font_h * 6), F("5V Rail:"));
      u8g.drawStr( 86, (_LCDML_DISP_font_h * 6), buf2);
      u8g.drawStr( 120, (_LCDML_DISP_font_h * 6), F("V"));
    } while( u8g.nextPage() );
  }

  if(LCDML.FUNC_close())      // ****** STABLE END *********
  {
    // you can here reset some global vars or do nothing
  }
}

Kannst du bitte auch mal einen Link deines Displays posten ?

Wenns Hilft...

128x64 2,42" OLED SPI & I2C Display mit SSD1309 Controller

!!!
DATEI - VOREINSTELLUNGEN - Ausführliche Ausgaben während [x] Compilierung. - Darunter: Compiler-Warnungen: ALLE

    dtostrf(voltage12, 4, 2, buf1);

:slight_smile:

Jawohl!!!

Funktioniert...
Kannst Du mir das bitte erläutern?

Compiler Warnungen hab ich übrigens keine...

Ok, danke.

Nur mal am Rande, mit welcher Spannung betreibst du das Display und hast du Levelshifter in der I2C-Leitung ?
Das Display ist nur bis 3,6V angegeben.

Mit den 5V vom Nano...

Nein, keine Levelshifter...

Die Beschreibung auf der Seite ist auch nur Halbherzig zusammenkopiert...
Hab noch n Dokument bekommen, da stehen dann auch noch teils widersprüchliche aussagen drin...
Da ich das Display aber im Auto einsetze, wird es max ein paar Stunden am Stück aktiv sein... Von daher mach ich mir da keine Sorgen...
Das Ding ist schon den ganzen gestrigen Tag & die Letzte Nacht Problemlos durchgelaufen...

Warum sollte ich das tun ?
Es ist dein Display und das Datenblatt sagt etwas anderes.
Ich lese daraus, max. 3,3Volt für dein Display, auch für die Datenleitungen.

Ok, auch ich kann mich da verlesen. Solltest du besser nochmal nachschauen.

Hab gerade noch ein Merkwürdiges verhalten beobachtet:

Ich hab in der "InfoBox" lediglich den Aussenrahmen um die Displayanzeige hinzugefügt:

    char buf1[5];
    dtostrf(voltage12, 4, 2, buf1);
    char buf2[5];
    dtostrf(voltage5, 4, 2, buf2);

   u8g.firstPage();
    do {
      u8g.drawStr( 3,   (_LCDML_DISP_font_h * 1), F("Blu Control v1.0"));
      u8g.drawStr( 3,   (_LCDML_DISP_font_h * 4), F("Power Rails Voltage:"));
      u8g.drawStr( 3,   (_LCDML_DISP_font_h * 5), F("12V Rail:"));
      u8g.drawStr( 60,  (_LCDML_DISP_font_h * 5), buf1);
      u8g.drawStr( 116, (_LCDML_DISP_font_h * 5), F("V"));
      u8g.drawStr( 9,   (_LCDML_DISP_font_h * 6), F("5V Rail:"));
      u8g.drawStr( 66,  (_LCDML_DISP_font_h * 6), buf2);
      u8g.drawStr( 116, (_LCDML_DISP_font_h * 6), F("V"));
 // Rahmen um das Display
      u8g.drawFrame(_LCDML_DISP_box_x0, _LCDML_DISP_box_y0, (_LCDML_DISP_box_x1-_LCDML_DISP_box_x0), (_LCDML_DISP_box_y1-_LCDML_DISP_box_y0));
    } while( u8g.nextPage() );

Und bekomme dann dieses Bild:

Deutlich zu sehen ist, das die 5V Rail Spannung direkt hinter der 12V Rail Spannung und zusätzlich nochmal an korrekter Position angezeigt wird... (habs für die bessere Sichtbarkeit etwas nach links gerückt...)

Kommentiere ich die Zeile mit dem Rahmen aus, ergibt das dieses Bild:

Kann sich das jemand erklären?

Zu kurz, hast '\n' vergessen.