Hallo zusammen,
ich habe an meinen Arduino Uno ein OLED Display angeschlossen. Zusätzlich möchte in über den Seriellen-Monitor mit dem Ardunio kommunizieren. Mein Problem ist, dass die Strings manchmal nicht korrekt verarbeitet werden.
Wenn ich das Programm starte und im Seriellen-Monitor "Zeit" eingebe sollte die Ausgabe:
Es wurde 'zeit' eingegeben. Laenge 4
sHilfe: 20:36:11 Länge: 8
Aktuelle Zeit: 20:36:11 Uhr, 1549053371
Es wird aber nur :
Es wurde 'zeit' eingegeben. Laenge 4
sHilfe: 20:35:56 Länge: 8
Aktuelle Zeit:
Das heißt das zusammensetzen des Strings sAusgabe funktioniert nicht.
Die Fehlerhafte Ausgabe kann ich korrigieren, wenn ich andere Teile des Programms auskommentiere, z.B. wenn ich in setup() den Teil für das OLED display (Zeile 20-22). Es funktioniert ebefalls wenn ich den Inhalt der if-Abfrage in der Funktion SerialPortLesen() Zeile (80-83) auskommentieren.
Ich habe schon viel rumprobiert. Ein umstellen von Strings auf C-String hat das Problem auch nicht gelöst. Wenn ich irgendwo etwas ändere geht an einer anderen Stelle eine String-Operation oder Ausgabe nicht.
Es ist auch schon passiert. Das Ausgaben in setup () nicht mehr funktioniert hat, wenn ich etwas in der Funktion SerialPortLesen() etwas geändert habe. Obwohl die Funktion noch gar nicht aufgerufen wurde.
#include <Time.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Deklaration des SSD1306 Display angeschlossen an I2C (SDA, SCL pins)
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Anzeige für OLED-Display intialisieruen
time_t iZeitEingabe; // Lezter Zeitstempel, der Eingeben wurde
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println("SSD1306 allocation failed");
}
//Serial.println(UhrZeit(10, 5, 1) + " Uhr");
setTime(1549053354);
}
void loop() {
SerialPortLesen();
}
String UhrZeit (int Stunde, int Minute, int Sekunde) {
//Gibt einen String in der Form: hh:mm:ss zurück.
String sZeit;
if (Stunde < 10) {
sZeit = '0';
sZeit.concat(Stunde);
sZeit.concat(':');
} else {
sZeit = Stunde;
sZeit.concat(':');
}
if (Minute < 10) {
sZeit.concat('0');
sZeit.concat(Minute);
sZeit.concat(':');
} else {
sZeit.concat(Minute);
sZeit.concat(':');
}
if (Sekunde < 10) {
sZeit.concat('0');
sZeit.concat(Sekunde);
} else {
sZeit.concat(Sekunde);
}
return sZeit;
}
void SerialPortLesen() {
// Ließt Eingaben vom Serielen Port aus
String sEingabe;
String sAusgabe;
String sHilfe;
if (Serial.available() == 0) return; // Wenn keine Zeichen vorhanden sind, Funktion verlassen
sEingabe = Serial.readString();
sEingabe.trim(); //Entfernt den Zeilenumbruch und eventuelle Leerzeichen
Serial.println ("Es wurde '" + sEingabe + "' eingegeben. Laenge " + sEingabe.length());
sEingabe.toLowerCase();
if (sEingabe.startsWith("t") && sEingabe.length() == 11) {
// Eine neuer Zeitstempel wird eingegeben, wenn erste Buchstabe 't' und 11 Zeichen enhalten sind
sEingabe.remove(0,1); // Entfernt das nullte Zeichen also das 't'
iZeitEingabe = sEingabe.toInt();
Serial.print("Zeit wird gesetzt "+ sEingabe+" umgewandelt ist das: ");Serial.println(iZeitEingabe);
setTime(iZeitEingabe); //Neue Ardunio-Zeit zuordenen
} else if (sEingabe == "zeit") {
// Aktuelle Zeit wird über den Seriellen Port ausgegeben
sAusgabe = "Aktuelle Zeit: ";
sHilfe = UhrZeit(hour(),minute(),second());
Serial.print("sHilfe: ");Serial.print (sHilfe);Serial.print (" Länge: "),Serial.println(sHilfe.length());
sAusgabe += sHilfe + " Uhr, ";
sAusgabe.concat(String(now()));
Serial.println (sAusgabe);
}
}
Hat jemand eine Idee wo mein Fehler liegt?
Vielen Dank für eurer Hilfe.
