Strings werden nicht korrekt ausgegeben

Hallo an alle!

Ich baue gerade eine Akkuanzeige mit einem Nano und einem 1602 Display für Tragbare Lautsprecher. Es funktioniert dank euch auch alles so weit, allerdings ist es noch ziemlich unübersichtlich, da die ausgegebenen Nachrichten auf dem Display momentan alle mitten im Code stehen. Ich habe eine Funktion geschrieben, mit der ich am Display zwei beliebige Zeilen ausgeben kann (den unwichtigen Teil habe ich rausgekürzt):

void FunkDisZweiZeilenChar (char Zeile1[], char Zeile2[]){
        lcd.setCursor (0,0);
        lcd.print (Zeile1);
        lcd.setCursor (0,1);
        lcd.print (Zeile2); 
       }   
}

Die Funktion wird z.B. so aufgerufen:

FunkDisZweiZeilenChar("Bleiakku1","12V 7200mAh");

Das funktioniert.

Wie sich aber vielleicht schon erahnen lässt, gibt es mehrere Akkus (Bleiakku2, Lipo1, etc.), deren Beschreibungen/Namen ich gerne an einer einzelnen Stelle editieren möchte.
Deshalb war meine Idee diese Zeichenkette in eine Variable zu packen. Das ist aber überraschend schwierig.

Das das Projekt (für meinen Horizont) ziemlich groß ist, habe ich alles natürlich an kleineren Sketchen geübt. Dieser Sketch geht auch und er zeigt "Bleiakku1" korrekt an.

String AkkuName1 ="Bleiakku1";

void setup(){
Serial.begin(9600);
Serial.println (AkkuName1);
}

void loop(){
  
  delay(1000);
}

Wenn ich jetzt in meinem Sketch die paar Zeilen korrekt einsortiere (String Definition vor dem Setup, Ausgabe im Setup) wird nichts ausgegeben. Statt "Bleiakku1" wird einfach nur eine Zeile weiter unten mit den nächsten Nachrichten weiter gemacht. So als wäre der String leer. Der restilche Code wird ganz normal weiter ausgeführt. Um die Anzeige am LCD mache ich mir erstmal keine Gedanken.
Also bin ich momentan auf der Suche nach dem Teil von meinem Code, der die Serial.print Funktion mit Strings "zerstört". Google habe ich natürlich schon probiert, es ist aber auch eine komplizierte Frage zu googlen.
Der Name des Strings wird im Code an keiner anderen Stelle verwendet. Mein Code (der nicht geht) ist in gekürzter Form hier (weggelassen sind nur Variablendefinitionen)

#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Wire.h>
#include <Adafruit_INA219.h>
Adafruit_INA219 ina219;
#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif

String AkkuName1 ="Bleiakku1";

[...] // Hier fehlt ganz viel Variablen Definition

void setup(){  //Das Setup ist vollständig
  //INA219 Setup
  #ifndef ESP8266
    while (!Serial);     // will pause Zero, Leonardo, etc until serial console opens
  #endif
  uint32_t currentFrequency; 


 
  Serial.begin (9600); 
  Serial.print ("Akkuname1: ");
  Serial.println (AkkuName1); 
  


  ina219.begin();
  analogReference (DEFAULT) ; 
  pinMode (PinRelaisLast, OUTPUT);
  pinMode (PinRelaisArdu, OUTPUT);
  pinMode (PinTiefentladungsLED, OUTPUT);
  digitalWrite (PinRelaisArdu, HIGH);
  digitalWrite (PinRelaisLast, HIGH);
  digitalWrite (PinTiefentladungsLED, LOW);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.noBlink();
  Akku = EEPROM.read (0);
  if (Akku==0 || Akku>8){
    Akku = 1;
    EEPROM.write (0,1);
  }
  Akkuauswahl ();
  FunkSmoothingSetup ();
  FunkEncoderRotSetup ();
  FunkArrayUistSetup();
  Prozent=EEPROM.read(1)/200.0;
  Euebrig=Evoll*Prozent;
  Eentnommen=Evoll-Euebrig;
  Serial.println ("Setup Done");
 }


void loop(){
 FunkAuslesen ();
 FunkArrayEentnommen();  
 FunkArrayUmaxfuellen ();
 FunkDisAuswahl();
}

Angezeigt wird im Seriellen Monitor:
"
Akkuname:
Setup Done
"

Sind in dem Code irgendwelche Bausteine, die dieses Fehlverhalten verursachen könnten? Evtl. der Code vom INA219? Bin ich überhaupt mit dem String als Typ auf dem richtigen Weg?

Falls ihr die Antwort nicht kennt, ist sowas ein typisches Problem?

Viele Grüße und vielen Dank,
Leo

Es gibt einen großen Unterschied zwischen C Strings und der Arduino String Klasse. Du vermischt beides und das schlägt natürlich fehl.

Eine Funktion die einen C String als Parameter hat wird am besten so geschrieben:

void func(const char* str)
{
}

Das funktioniert dann sowohl mit Zeigern, mit char Arrays und mit Literalen.

Und C Strings deklariert man so:

const char* str = "Akku";

Oder so:

const char str[] = "Akku";

Die kann man dann auch problemlos an Funktionen übergeben

Das war ja überraschend einfach :slight_smile:
Es ist unglaublich wie schnell man hier Antworten bekommt, einmal schlafen und das Problem ist gelöst :grinning:
Vielen Dank!

LeoLautsprecher:
Das war ja überraschend einfach :slight_smile:
Es ist unglaublich wie schnell man hier Antworten bekommt, einmal schlafen und das Problem ist gelöst :grinning:
Vielen Dank!

Du darfst es gern weitergeben:

Hier werden die Probleme im Schlaf gelöst. :wink: :wink: