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