"Sonderzeichen" los werden

Ich hatte mir eine NTP Clock mit einen LCD gebaut - meine alte Uhr
in der Werkstatt wollte nicht mehr.
Alles läuft wie es soll, ich habe nur links in den Display diese "Sonderzeichen".
Kommen diese von den Display oder vom Code und es gibt es eine Möglichkeit
diese "auszublenden" ?

#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <time.h>

#include <LiquidCrystal_PCF8574.h>       // Include LiquidCrystal_I2C library
LiquidCrystal_PCF8574 lcd(0x27); // Configure LiquidCrystal_I2C library with 0x27 address

// Wi-Fi Settings
const char *wifi_ssid = "SSID";                   // ergänzen
const char *wifi_password = "PW";           // ergänzen
const char* NTP_SERVER = "fritz.box";
const char* TZ_INFO    = "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00";

char wochentage[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
String monat[12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};

char buf[64];
int  tm_hour, tm_min, tm_sec;
char buf1[64];
int tm_mday, tm_mon, tm_year;

time_t now;
tm tm;

void setup () {
  Serial.begin(115200);
  lcd.begin(16 , 2); 
  lcd.setBacklight(255);
  setup_wifi();
  configTime(0, 0, NTP_SERVER);
  setenv("TZ", TZ_INFO, 1);
}

void loop () {
  time(&now);                       // Liest die aktuelle Zeit
  localtime_r(&now, &tm);           // Beschreibt tm mit der aktuelle Zeit

  lcd.clear();             

  lcd.setCursor(0, 0);
  lcd.println(buf);

  lcd.setCursor(0, 1);
  lcd.println(buf1);

  sprintf(buf1,"Date:%02d.%02d.%04d ", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
  Serial.printf("%02d-%02d-%04d \t", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
  //Serial.printf("%02d %s %04d \t", tm.tm_mday, monat[tm.tm_mon], tm.tm_year + 1900);  // Monat ausgeschrieben

  Serial.print(wochentage[tm.tm_wday]);
  //Serial.print(tm.tm_wday);         // Wochentag als Zahl, 0 = Sonntag
  Serial.print("\tder ");
  Serial.print(tm.tm_mday);
  Serial.print(" " + monat[tm.tm_mon] + " ");
  Serial.print(tm.tm_year + 1900);
  sprintf(buf,"Time:%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec);
  Serial.println(buf);
  delay(1000);
}

void setup_wifi() {
  delay(10);
  WiFi.begin(wifi_ssid, wifi_password);
  int counter = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    if (++counter > 100) ESP.restart();
    Serial.print(".");
  }
  Serial.println("WiFi connected");
}

Die Uhr stellt bzw. soll sich automatisch auf Winter - / Sommerzeit
umstellen.
Der ursprüngliche Code ist nicht von mir, sondern von hier:
NTP Uhr
Ich habe keine Idee mehr, mit Leerzeichen versucht usw.
Anscheinend liegt es an den LCD - aber dass wollte ich gern genauer
wissen.
Schönen Sonntag noch !

Nimm mal statt lcd.println nur lcd.print.

Und ich sehe da evtl. ein anderes Problem. Mit welcher Spannung betreibst du dein LCD ?
Bei 5Volt ist es kritisch, da ein ESP nur 3,3Volt an den Datenpins verträgt.
Es kann funktionieren, nur keiner weiß wie lange.

Mit lcd.print - keine Änderung.
Die ESP32 gibt direkt 5V aus, diese versorgt dann den I2C
Adappter und damit auch das LCD.
Mit einen Testsketch "Hallo World" hatte ich diese "Sonderzeichen"
nicht, daher vermute ich dass es an der Formatierung mir sprintf liegen
könnte.
Wenn es an die 5V liegen würde, hätte ich bei "Hello World" dieses
Problem auch ....
Aber wie soll ich dass überprüfen können ?
Eine andere Formatierung der Anzeige ohne sprintf ?
Ich weiß auf die Schnelle nicht wie ich dass machen soll.

Da waren dann auch sicher keine Tabs drin!
Das ist ein Tab -->> '\t'

1 Like

Zuerst den Zeilenvorschub '\n' raus und dann evtl. die '\t' durch Leerzeichen ersetzen.
Außerdem wäre es sinnvoller, erst die buf zu beschreiben und dann diese auszugeben.

Gruß Tommy

Das hat auch nichts mit deiner Textanzeige zu tun. Damit machst du über längere Zeit deinen ESP32 kaputt. Die GPIOs sind nicht 5Volt tolerant.
Ich habe ja geschrieben, es kann funktionieren, nur keiner weiß wie lange.
Oder hast du ein Datenblatt, was dir sagt, die GPIOs können 5 Volt vertragen.
Es liegt bei dir, dies zu ändern oder den ESP32 zu zerstören.

1 Like
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <time.h>

#include <LiquidCrystal_PCF8574.h>       // Include LiquidCrystal_I2C library
LiquidCrystal_PCF8574 lcd(0x27); // Configure LiquidCrystal_I2C library with 0x27 address

// Wi-Fi Settings
const char *wifi_ssid = "SSID";                   // ergänzen
const char *wifi_password = "PW";           // ergänzen
const char* NTP_SERVER = "fritz.box";
const char* TZ_INFO    = "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00";

char wochentage[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
String monat[12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};

char buf[64];
int  tm_hour, tm_min, tm_sec;
char buf1[64];
int tm_mday, tm_mon, tm_year;

time_t now;
tm tm;

void setup () {
  Serial.begin(115200);
  lcd.begin(16 , 2); 
  lcd.setBacklight(255);
  setup_wifi();
  configTime(0, 0, NTP_SERVER);
  setenv("TZ", TZ_INFO, 1);
}

void loop () {
  time(&now);                       // Liest die aktuelle Zeit
  localtime_r(&now, &tm);           // Beschreibt tm mit der aktuelle Zeit

  lcd.clear();             

  lcd.setCursor(0, 0);
  lcd.println(buf);

  lcd.setCursor(0, 1);
  lcd.println(buf1);

  sprintf(buf1,"Date:%02d.%02d.%04d", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
  Serial.println(buf1);
  //Serial.printf("%02d %s %04d \t", tm.tm_mday, monat[tm.tm_mon], tm.tm_year + 1900);  // Monat ausgeschrieben

  Serial.print(wochentage[tm.tm_wday]);
  //Serial.print(tm.tm_wday);         // Wochentag als Zahl, 0 = Sonntag
  Serial.print("\tder ");
  Serial.print(tm.tm_mday);
  Serial.print(" " + monat[tm.tm_mon] + " ");
  Serial.print(tm.tm_year + 1900);
  sprintf(buf,"Time:%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec);
  Serial.println(buf);
  delay(1000);
}

void setup_wifi() {
  delay(10);
  WiFi.begin(wifi_ssid, wifi_password);
  int counter = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    if (++counter > 100) ESP.restart();
    Serial.print(".");
  }
  Serial.println("WiFi connected");
}

Danke noch einmal - es lag an den Tabs.
Wieder etwas dazu gelernt.
Betreffs den 3,3V - verstehe ich (noch) nicht - ich gebe keine Spannung
auf die Ports, es wird ja nur zum I2C Adapter "gesendet".
Die ESP32 schickt ja nur Pegel zum PCF8574 und von dort zum LCD
und bekommt von dort nichts zurück was die Ports beschädigen könnte ?
Ich habe den Quellcode geändert / die Tabs rausgenommen.

Dann solltest du dir zwingend mal Datenblätter und Informationen zum I2C-Bus ansehen und lesen. Die einzelnen Bus Teilnehmer arbeiten mit Open Kollektor oder OpenDrain und brauchen dazu Pullup-Widerstände. Und diese sind bei dir auf dem I2C-Treiberboard auf dem Display und geben somit 5 Volt auf den Bus, die dann zum ESP32 gelangen.
Und noch ein Irrtum, die Daten gehen bei I2C in beide Richtungen und das immer wenn der Bus arbeitet und funktioniert.

Hier etwas zum Nachlesen. Oder Dies hier

1 Like

Wieso opfert eigentlich keiner ein paar Cent und ist auf der Sicheren Seite.

Gruß

Pucki

Weil er sich des Problems nicht bewußt ist.
Die Beschreibung 5V Versorgungsspannung für das ESP32 Board heißt eben nicht, daß die Eingänge auch 5V vertragen. Das wird aber nicht gesagt.
Auch die Problematik der Pullupwiderstände am I2C Bus ist nicht so offensichtlich.

Grüße Uwe

Eigentlich liegt die 5V am ESP immer an den Pins an, wegen den PullUp wen der Bus wartet auf Arbeit und das ist das schlimmste.
Wen der Bus arbeitet werden die Pins "ein wenig" entlastet mit dem Low Pegel.

Aber zu wem ich das schreibe :wink:
Das und oben sollte der TO lesen.

Ok, an den PullUp R,s habe ich nicht gedacht - diese sind natürlich auf den
Board vorhanden und von daher liegen auch die 5V an den Pins der ESP32 an.
Ich werde dann den Aufbau mit Pegelwandlern ergänzen.
Zu meiner Verteidigung - mit der ESP32 habe ich noch nicht gearbeitet, nur
mit den Standard Nano und der ist ja 5V tolerant und da denkt man nicht sofort
an diesen feinen Unterschied.

Alles Gut :wink:
Wenigstens Einer was das versteht wie und Warum.

Wobei die immer vorhanden sein müssen, ohne die funktioniert I2C nicht.

Wen der TO den LS nimmt hat sich mit den PullUp erledigt, das machen die Widerstände an dem MOSFET.
Levelkonverter

Dazu müsste er die Pullups aber auf der Adapterplatine rausnehmen, oder messen, dass die Parallelschaltung der Widerstände nicht zu klein wird. Bei 5Volt sehe ich mal bei 2k2, kleiner möglichst nicht.

Das würde ich nicht so nennen.

Ein IC, das mit 5V betrieben wird, ist nicht 5V tolerant.

Wenn Du den ATMega328, der auf dem NANO drauf ist mit 3,3V betreibst (wie zB ein Arduino MINI 3,3V) verträgt er nur mehr 3,3V an den Eingängen.
Genaugesagt Versorgungsspannung +0,5V).

Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.