Batterie Anzeige für Solar

Kann mir keiner helfen ?

Servus
mit den Informationsfragmenten die du heir postest nicht.

In jedem Fall wirst du in der Api Dokumentation deiner Display Libraray nachsehen müssen wie man mehrere Display Instanzen deklariert.

und dann noch irgendwas in der Art in die callback():

void callback(char *topic, byte *payload, unsigned int length)
String sTopic = topic;
if (sTopic == „ipshostname“ + „/“ + „einspeisung“)
{

}

oh gott…

geht das nicht irgend wie einfacher?

Wie meinst du das? Irgendwie mußt du dem Teil ja sagen was es tun soll. Bist eh schon recht weit gekommen. Deine ersten postings haben sich so angehört als ob du keine Ahnung vom programmieren hättest

Greez
Bb

naja ich kann bissle php und das wars.
Aber Display Ansteuerung und esp32 ist für mich komplett Neuland.

wie ist das den im jetzigen code gelöst?
Ist da keine variable wo der mqtt inhalt abgelegt wird?

Sag mal willst mich veräppeln ?
Du wirst doch wohl wissen was du programmiert hast. Oder hast die Fotos nur gefaked ?

ich hatte vorlagen die ich mir angepasst habe.
Ich hab das nicht selbst von 0 erstellt

https://osoyoo.com/2017/05/21/nodemcu-lesson-15-i2c-1602-lcd-mqtt/

@bbernard: deine Geduld möchte ich haben … Hut ab :slight_smile:

1 „Gefällt mir“

Mann, warum sagst das nicht gleich <-an-die -stirn-klatsch->
Dachte du hast das selbst runtergeschrieben oder aus meinem Beispiel abgeleitet.

Ehrlich gesagt um das zu laufen zu bringen wäre es besser wenn du für jedes Display einen eigen ESP nimmst. Komplett ohne Grundwissen wirst du das sonst nicht schaffen fürchte ich. Weil nur mit Copy/Paste wirds nicht gehen.
Kosten ja eh nix die Teile.

Wie auch immer, die über MQTT empfangenen Daten sind in der Callback() function in der Variable „payload“ zu finden.

bb

ich habe das hier noch gefunden und eventuell ist es auch die Lösung.

In diesem Beispiel kann man mehrere Topics auf die Zeilen verteilen

scheint nicht zu klappen :-/
Der Code vom arduinoforum ist fehlerhaft

läuft :slight_smile:

gibt es die Möglichkeit im Display einzelne Zeilen zu löschen?
meine Lösung klappt nicht wirklich

if ( !strncmp (topic, „verbrauch“, sizeof(topic)) )
{
oled_verbrauch.clear(0, 0);
oled_verbrauch.setCursor(0, 0);
for (byte i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
oled_verbrauch.print((char)payload[i]);
}
}

if ( !strncmp (topic, „ogverbrauch“, sizeof(topic)) )
{
oled_verbrauch.clear(0, 1);
oled_verbrauch.setCursor(0, 1);
for (byte i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
oled_verbrauch.print((char)payload[i]);
}
}

if ( !strncmp (topic, „egverbrauch“, sizeof(topic)) )
{
oled_verbrauch.clear(0, 2);
oled_verbrauch.setCursor(0, 2);
for (byte i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
oled_verbrauch.print((char)payload[i]);
}
}

if ( !strncmp (topic, „ugverbrauch“, sizeof(topic)) )
{
oled_verbrauch.clear(0, 3);
oled_verbrauch.setCursor(0, 3);
for (byte i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
oled_verbrauch.print((char)payload[i]);
}
}

Auch wenn mein LCD-(Halb)Wisssen ein paar Jahr(zehnt)e her ist,
so meine ich mich zu erinnern, dass du die komplette Zeile(n) (plus das, was du rechts nicht sehen kannst !) überschreibst mit irgend etwas.
Die Displays gibt es ja nicht nur mit 16 Zeichen pro Zeile … daher kommt’s :wink:

Ist aber eh nur eine Remanenzinformation aus meinem alten Frontallappen - von daher → probiere einfach mal :wink:

Ich hätte es eh anders gemacht - aber egal :chart_with_downwards_trend:

LG Tom

Soweit ich weiß geht das nicht unmittelbar. Du kannst aber die ganze Zeile mit Blanks überschreiben.
Am einfachsten ist wenn du immer das ganze Display löscht und dann komplett neu schreibst.-

gruß
bb

kannst du mir da mit dem Code etwas helfen?
Ich habe nun soweit alles fertig bis auf das vierzeilige Display für den Verbrauch.
Das ist nämlich das einzige Display wo ich Werte aus 4 Quellen darstellen muss.
Hier mal ein Foto. Plexiglas wo die Displays reinkommen ist erst morgen da. Ist also ein Provisorium.
Und man kann sehen das an dem vierzeiligen Display an 2 Reihen ein W zuviel ist weil eben nicht gelöscht wird.

Hier mal der Code falls jemand was zum verbessern findet

void callback(char* topic, byte* payload, unsigned int length)
{
  Serial.print("Command from MQTT broker is : ");
  Serial.print(topic);
  Serial.println();
  Serial.print(" publish data is:");

//##########################

if ( !strncmp (topic, "pverzeugung", sizeof(topic)) )  // http://www.cplusplus.com/reference/cstring/strncmp/
  {
    bool isChar = false;
    oled_pverzeugung.clear();
    oled_pverzeugung.setCursor(0, 1);
    for (byte i = 0; i < length; i++)
    {
      if (isPrintable((char)payload[i]))
        isChar = true;
      Serial.print((char)payload[i]);
      oled_pverzeugung.print((char)payload[i]);
          }
    if (isChar)
    {
      oled_pverzeugung.setCursor(0, 0);
      oled_pverzeugung.print("PV Erzeugung");
    }
    
    }

 //######################
  
  if ( !strncmp (topic, "verbrauch", sizeof(topic)) )
  {
    oled_verbrauch.setCursor(0, 0);
    for (byte i = 0; i < length; i++)
    {
      Serial.print((char)payload[i]);
      oled_verbrauch.print((char)payload[i]);
    }
  }


   if ( !strncmp (topic, "ogverbrauch", sizeof(topic)) )
  {
    
    oled_verbrauch.setCursor(0, 1);
    for (byte i = 0; i < length; i++)
    {
      Serial.print((char)payload[i]);
      oled_verbrauch.print((char)payload[i]);
    }
  }


   if ( !strncmp (topic, "egverbrauch", sizeof(topic)) )
  {
    ;
    oled_verbrauch.setCursor(0, 2);
    for (byte i = 0; i < length; i++)
    {
      Serial.print((char)payload[i]);
      oled_verbrauch.print((char)payload[i]);
    }
  }

  
   if ( !strncmp (topic, "ugverbrauch", sizeof(topic)) )
  {
    
    oled_verbrauch.setCursor(0, 3);
    for (byte i = 0; i < length; i++)
    {
      Serial.print((char)payload[i]);
      oled_verbrauch.print((char)payload[i]);
    }
  }
  

//##########################

if ( !strncmp (topic, "einspeisung", sizeof(topic)) )  // http://www.cplusplus.com/reference/cstring/strncmp/
  {
    bool isChar = false;
    oled_einspeisung.clear();
    oled_einspeisung.setCursor(0, 1);
    for (byte i = 0; i < length; i++)
    {
      if (isPrintable((char)payload[i]))
        isChar = true;
      Serial.print((char)payload[i]);
      oled_einspeisung.print((char)payload[i]);
          }
    if (isChar)
    {
      oled_einspeisung.setCursor(0, 0);
      oled_einspeisung.print("Einspeisung");
    }
    
    }

//##########################

if ( !strncmp (topic, "bezug", sizeof(topic)) )  // http://www.cplusplus.com/reference/cstring/strncmp/
  {
    bool isChar = false;
    oled_bezug.clear();
    oled_bezug.setCursor(0, 1);
    for (byte i = 0; i < length; i++)
    {
      if (isPrintable((char)payload[i]))
        isChar = true;
      Serial.print((char)payload[i]);
      oled_bezug.print((char)payload[i]);
          }
    if (isChar)
    {
      oled_bezug.setCursor(0, 0);
      oled_bezug.print("Bezug");
    }
    }

    
 //#########################


if ( !strncmp (topic, "akkuzustand", sizeof(topic)) )  // http://www.cplusplus.com/reference/cstring/strncmp/
  {
    bool isChar = false;
    oled_akkuzustand.clear();
    oled_akkuzustand.setCursor(0, 1);
    for (byte i = 0; i < length; i++)
    {
      if (isPrintable((char)payload[i]))
        isChar = true;
      Serial.print((char)payload[i]);
      oled_akkuzustand.print((char)payload[i]);
          }
    if (isChar)
    {
      oled_akkuzustand.setCursor(0, 0);
      oled_akkuzustand.print("Akkuzustand");
    }
    }

    
 //#########################


if ( !strncmp (topic, "ladungakku", sizeof(topic)) )  // http://www.cplusplus.com/reference/cstring/strncmp/
  {
    bool isChar = false;
    oled_akkuladung.clear();
    oled_akkuladung.setCursor(0, 1);
    for (byte i = 0; i < length; i++)
    {
      if (isPrintable((char)payload[i]))
        isChar = true;
      Serial.print((char)payload[i]);
      oled_akkuladung.print((char)payload[i]);
          }
    if (isChar)
    {
      oled_akkuladung.setCursor(0, 0);
      oled_akkuladung.print("Akkuladung");
    }
    }

 
//##############

if ( !strncmp (topic, "entladungakku", sizeof(topic)) )  // http://www.cplusplus.com/reference/cstring/strncmp/
  {
    bool isChar = false;
    oled_akkuentladung.clear();
    oled_akkuentladung.setCursor(0, 1);
    for (byte i = 0; i < length; i++)
    {
      if (isPrintable((char)payload[i]))
        isChar = true;
      Serial.print((char)payload[i]);
      oled_akkuentladung.print((char)payload[i]);
          }
    if (isChar)
    {
      oled_akkuentladung.setCursor(0, 0);
      oled_akkuentladung.print("Akkuentladung");
    }
    }


//#####################

  } 

Naja, etwa so wie unten.
Wobei ich jetzt nur raten kann, weil ich deinen restlichen Code nicht kenne.
Anzahl der Leerzeichen zwischen " " muß die Anzahl der möglichen Zeichen in einer Zeile sein.

if ( !strncmp (topic, "verbrauch", sizeof(topic)) )
  {
    oled_verbrauch.setCursor(0, 0);
    oled_verbrauch.print("                         ");     
    oled_verbrauch.setCursor(0, 0);
    
     for (byte i = 0; i < length; i++)
    {
      Serial.print((char)payload[i]);
      oled_verbrauch.print((char)payload[i]);
    }
  }

LiquidCrystal_I2C oled_verbrauch(0x21, 20, 4);

denke du meinst das. werde also 20 Leerzeichen einfügen

scheint zu funktionieren. danke :slight_smile:
Kann ich noch etwas gegen das flackern an den Displays machen. Das sich nur die Werte aktualisieren und nicht die Schrift?

Ja, aber das müßtest dann ganz anders coden.
Normalerweise beschriebt man eine komplette Page (Speicherabbild der kompletten Anzeige) und schaltet dann auf den neuen Inhalt um.
Dann flackert nix.