Uhrzeit und Datum mit ESP8266 auf Display

Hallo und allen hier im Forum ein gesundes Neues!!!
Da ich noch Urlaub habe, verbringe ich etwas Zeit mit meinen ESP Modul. Ich habe vor, die Uhrzeit auf ein Display auszugeben. Jetzt habe ich einen Sketch gefunden der zumindest alles schön auf dem Seriellen Monitor ausgibt (man muß ja das Rad nicht immer selbst erfinden)

void printTime(time_t t)
{
	sPrintI00(hour(t));
	sPrintDigits(minute(t));
	sPrintDigits(second(t));
	DBG_OUTPUT_PORT.print(' ');
	DBG_OUTPUT_PORT.print(dayShortStr(weekday(t)));
	DBG_OUTPUT_PORT.print(' ');
	sPrintI00(day(t));
	DBG_OUTPUT_PORT.print(' ');
	DBG_OUTPUT_PORT.print(monthShortStr(month(t)));
	DBG_OUTPUT_PORT.print(' ');
	DBG_OUTPUT_PORT.print(year(t));
	DBG_OUTPUT_PORT.println(' ');
}

//Print an integer in "00" format (with leading zero).
//Input value assumed to be between 0 and 99.
void sPrintI00(int val)
{
	if (val < 10) DBG_OUTPUT_PORT.print('0');
	DBG_OUTPUT_PORT.print(val, DEC);
	return;
}

//Print an integer in ":00" format (with leading zero).
//Input value assumed to be between 0 and 99.
void sPrintDigits(int val)
{
	DBG_OUTPUT_PORT.print(':');
	if (val < 10) DBG_OUTPUT_PORT.print('0');
	DBG_OUTPUT_PORT.print(val, DEC);
}

....das funktioniert sehr schön. Jetzt kommt meine Frage an euch Profis. Wie packt man das auf ein Display. Meine Versuche waren, die DBG_OUTPUT_PORT.print auf das Display zu schreiben:

(Beispiel vom Versuch)

void sPrintDigits(int val)
{
        tft.setTextSize(2);
        tft.setCursor( 4,214);
	tft.print(':');
	if (val < 10) tft.print('0');
	tft.print(val, DEC);
}

Das funktioniert für die Sekundenangabe, bei Minuten wird es dann alles Mist! Ich denke, ich habe einen totalen Denkfehler......Was bedeutet eigentlich DBG_OUTPUT_PORT.print(' ');?? (ja, einen Platzhalter für die Ausgabe auf dem Seriellen Monitor.....)....wie könnte ich meine Idee umsetzen??

Gruß Shunth

Es fehlt der komplette Code und welche LCD Library du benutzt..

Vielleicht eher so:

void sPrintDigits(int hour ,int minute,int seconds)
{

char test[10];
sprintf(test, "%02d:02%d:%02d",hour,minute,seconds);
        tft.setTextSize(2);
        tft.setCursor( 4,214);
	tft.print(test);
}

.....bekomme leider eine Fehlermeldung.....der Code ist wohl zu groß?????

//### NTP, TIME & TIMEZONE ###################################################################


//UDP
WiFiUDP Udp;
unsigned int localPort = 123;

//NTP Server
char ntpServerName1[] = "ntp1.t-online.de";
char ntpServerName2[] = "time.nist.gov";

//Timezone
//Central European Time (Frankfurt, Paris)
TimeChangeRule CEST = { "CEST", Last, Sun, Mar, 2, 120 };     //Central European Summer Time
TimeChangeRule CET = { "CET ", Last, Sun, Oct, 3, 60 };       //Central European Standard Time
Timezone CE(CEST, CET);
TimeChangeRule *tcr;        //pointer to the time change rule, use to get the TZ abbrev
time_t utc, local;


const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

bool getNtpTime(char* ntpServerName)
{
  DBG_OUTPUT_PORT.print(F("NTP request..."));
  if (timeStatus() == timeSet) {
    DBG_OUTPUT_PORT.println(F("not necessary"));
    return true;
  }

  IPAddress ntpServerIP; // NTP server's ip address

  while (Udp.parsePacket() > 0); // discard any previously received packets
  DBG_OUTPUT_PORT.println(F("Transmit NTP Request"));
  // get a random server from the pool
  WiFi.hostByName(ntpServerName, ntpServerIP);
  DBG_OUTPUT_PORT.print(ntpServerName);
  DBG_OUTPUT_PORT.print(": ");
  DBG_OUTPUT_PORT.println(ntpServerIP);
  sendNTPpacket(ntpServerIP);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      DBG_OUTPUT_PORT.println(F("Receive NTP Response"));
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 = (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      setTime(secsSince1900 - 2208988800UL);
      //setTime(23, 55, 0, 30, 3, 2016); //simulate time for test
      return true;
    }
  }
  DBG_OUTPUT_PORT.println(F("FATAL ERROR : No NTP Response."));
  return false; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
               // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

//Function to return the compile date and time as a time_t value
time_t compileTime(void)
{
#define FUDGE 25        //fudge factor to allow for compile time (seconds, YMMV)
  char *compDate = __DATE__, *compTime = __TIME__, *months = "JanFebMarAprMayJunJulAugSepOctNovDec";
  char chMon[3], *m;
  int d, y;
  tmElements_t tm;
  time_t t;
  strncpy(chMon, compDate, 3);
  chMon[3] = '\0';
  m = strstr(months, chMon);
  tm.Month = ((m - months) / 3 + 1);
  tm.Day = atoi(compDate + 4);
  tm.Year = atoi(compDate + 7) - 1970;
  tm.Hour = atoi(compTime);
  tm.Minute = atoi(compTime + 3);
  tm.Second = atoi(compTime + 6);
  t = makeTime(tm);
  return t + FUDGE;        //add fudge factor to allow for compile time
}

void printTime(time_t t)
{
  sPrintI00(hour(t));
  sPrintDigits(minute(t));
  sPrintDigits(second(t));
  DBG_OUTPUT_PORT.print(' ');
  DBG_OUTPUT_PORT.print(dayShortStr(weekday(t)));
  DBG_OUTPUT_PORT.print(' ');
  sPrintI00(day(t));
  DBG_OUTPUT_PORT.print(' ');
  DBG_OUTPUT_PORT.print(monthShortStr(month(t)));
  DBG_OUTPUT_PORT.print(' ');
  DBG_OUTPUT_PORT.print(year(t));
  DBG_OUTPUT_PORT.println(' ');
}

//Print an integer in "00" format (with leading zero).
//Input value assumed to be between 0 and 99.
void sPrintI00(int val)
{
  if (val < 10) DBG_OUTPUT_PORT.print('0');
  DBG_OUTPUT_PORT.print(val, DEC);
  return;
}

//Print an integer in ":00" format (with leading zero).
//Input value assumed to be between 0 and 99.
void sPrintDigits(int val)
{
  tft.setTextSize(2);
  tft.setCursor(75,214);
  tft.print(':');
  if (val < 10) tft.print('0');
  tft.print(val, DEC);
}
void sPrintDigits(int hour ,int minute,int seconds)
{

char test[10];
sprintf(test, "%02d:02%d:%02d",hour,minute,seconds);
        tft.setTextSize(2);
        tft.setCursor( 4,214);
  tft.print(test);
}
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      //client.publish("debug", "ESP8266 Subscriber connected");
      // ... and resubscribe
      client.subscribe("/Erdfeuchte/humidity/1");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void callback(char* topic, byte* payload, unsigned int length) {
    payload[length] = '\0';
    String s = String((char*)payload);
    freq = s.toFloat();
    prozent = 100-((freq - 35) / 2.58);   
}
/*
void setup_wifi() {
  delay(10);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}
*/
void tft_zeichneBeschriftung(void)
{
 tft.setTextColor(ILI9340_WHITE);
 tft.setCursor( 30,60);
 tft.setTextSize(2);
 tft.print("Erdfeuchte in Prozent");
 tft.setTextSize(2);
 tft.setCursor( 54,12);
 tft.print("Erdfeuchtemessung");
}
void tft_zeichneRahmen( )
{
 tft.fillScreen(ILI9340_BLACK);
 tft.drawRoundRect(1, 0, tft.width()-1,40, 10, ILI9340_BLUE);
 tft.drawRoundRect(1, 50, tft.width()-1,135, 10, ILI9340_GREEN);
 tft.drawRoundRect(0, 200, tft.width()-1, 40, 10, ILI9340_RED);
 }
 void zeigeTemperatur(float prozent)
{
 dtostrf(prozent, 2, 1, prozentStr);
 Serial.print("Erdfeuchte ist: ");
 Serial.println(prozent);
 tft.setTextSize(10);
 tft.setTextColor(ILI9340_YELLOW, ILI9340_BLACK );
 tft.setCursor(55,94);
 tft.print(prozentStr);
}            
//############################################################################################

void setup()
{
  DBG_OUTPUT_PORT.begin(76400);
  DBG_OUTPUT_PORT.setDebugOutput(true);
  DBG_OUTPUT_PORT.println(F("ArduinoClub-NTP-Timezone"));
  WiFi.mode(WIFI_STA);
  WiFi.begin(WiFiSSID, WiFiPSK);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);
  
}

  tft.begin();
  
  if (isConnected(30)) {
    wasConnected = true;
    DBG_OUTPUT_PORT.println(F("Starting UDP"));
    Udp.begin(localPort);
    DBG_OUTPUT_PORT.print(F("Local port: "));
    DBG_OUTPUT_PORT.println(Udp.localPort());
    DBG_OUTPUT_PORT.println(F("waiting for sync"));    
}
  tft.setRotation( ROTATION_270);
  tft_zeichneRahmen();
  tft_zeichneBeschriftung();
}

void loop()
{
  if (!client.connected()) {
     reconnect();
}
  client.loop();
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (!isConnected(10) && wasConnected) { delay(200); ESP.restart(); }
    if (!getNtpTime(ntpServerName1)) { getNtpTime(ntpServerName2); }
    local = CE.toLocal(now(), &tcr);
    printTime(local);
}
  if (merkeprozent != prozent) {
  zeigeTemperatur(prozent);
  merkeprozent = prozent;
 }  
}

......habe es mit deinen Versuch hochgeladen......nichts in der Anzeige....

Shunth:
......habe es mit deinen Versuch hochgeladen......nichts in der Anzeige....

Welche Arduino core for ESP8266 Version nutzt du?

Gruß Fips

Version 2.2.0 glaube ich.....Ich denke ich muss char test in der Loop aufrufen......oder??

Shunth:
glaube ich....

Wenn du es weißt, sag Bescheid!
Ab 2.4.0 ist die "time.h" intergriert.
Damit ist es einfacher die Zeit auf den Esp zu holen.

Gruß Fips

....mit Version 2.4.0 habe ich Probleme im Bezug auf AP Funktionen.....(Webbasierende Funktionen Json, HTML) deshalb habe ich auf 2.2.0 ge-upt)

Verfluchte Axt, wie sage ich dem ESP in der Loop, dass er auf die Funktion vom Kollegen zugreifen soll.....

void sPrintDigits(int hour ,int minute,int seconds)
{

char test[10];
sprintf(test, "%02d:02%d:%02d",hour,minute,seconds);
        tft.setTextSize(2);
        tft.setCursor( 4,214);
        tft.print(test);
}

....es ist zum Haare raufen!!! >:( >:(

Stabile Versionen nach 2.2.0 sind "2.3.0" und "2.4.2" alle anderen solltest du meiden.

Ich verwende nur noch die 2.4.2.

Vorteile gegenüber 2.3.0 sind integrierte time.h und printf kann mit float umgehen.

Gruß Fips

.....macht die Arduino IDE nicht sowieso ein Update......finde gerade die (unter ESP8266) installierte Version nicht.....

Shunth:
.....macht die Arduino IDE nicht sowieso ein Update......finde gerade die (unter ESP8266) installierte Version nicht.....

Update? Definitiv Nein!

Werkzeuge -> Board -> Boardverwalter

Gruß Fips

Hallo,

Derfips:
Update? Definitiv Nein!

Werkzeuge -> Board -> Boardverwalter

Gruß Fips

da es (nur bei mir?) immer mal Probleme gab: bei den ESp-paketen beser das installierte mit dem Boardmanager deinstallieren und dann das gewünschte installieren.

Die Posix time.h war prinzipiell schon bei der 2.0.0 drin, irgendwie aber nicht wirklich erwähnt.
Bei der 2.4.0 wurde wohl wegen LWIP 2.0 überarbeitet, es kam die Sommerzeitverwaltung mit rein über die Posix-Eviromentvariable.

// Start Time service.
  configTime(0, 0, "pool.ntp.org", "time.nist.gov");
  setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 0);

setzt die Zeitzone auf MEZ.
Beim ESP32 gibt es noch etwas Durcheinander: in der Boardmanager-Version 1.0.0 wird aus irgendwelchen Gründen eine uralte Notation benutzt, da muß es

  setenv("TZ", "CET-1CEST,M3.5.0/02:00:00,M10.5.0/03:00:00", 1);

heißen. Ist im aktuellen github-IDF behoben, dafür gibt es dann neue/andere Querelen, bei mir bleibt da beim ESP32 vorest die 1.0.0.

Wenn die Jungs von Espressif sich mal einig sind, wird es auch eine Funktion/CallBack geben, mit dem man den Zeitpunkt der letzten erfolgreichen Aktualisierung abfragen kann, fehlt im Moment völlig.

Gruß aus Berlin
Michael

amithlon:
Beim ESP32 gibt es noch etwas Durcheinander: in der Boardmanager-Version 1.0.0 wird aus irgendwelchen Gründen eine uralte Notation benutzt, da muß es

  setenv("TZ", "CET-1CEST,M3.5.0/02:00:00,M10.5.0/03:00:00", 1);
setenv("TZ", "CET-1CEST,M3.5.0/02,M10.5.0/03", 1);

Funktioniert bei mir mit 1.0.0

</Off Topic>

Gruß Fips

Shunth:
....mit Version 2.4.0 habe ich Probleme im Bezug auf AP Funktionen.....(Webbasierende Funktionen Json, HTML) deshalb habe ich auf 2.2.0 ge-upt)

Verfluchte Axt, wie sage ich dem ESP in der Loop, dass er auf die Funktion vom Kollegen zugreifen soll.....
....es ist zum Haare raufen!!! >:( >:(

Einfach so, ohne Funktion (achtung ungetestet aus dem Kopf):

void loop() {
  char test[10];
    sprintf(test, "%02d:02%d:%02d",hour(),minute(),seconds());
        tft.setTextSize(2);
        tft.setCursor( 4,214);
        tft.print(test);
        delay(1000);
}

Shunth:
....es ist zum Haare raufen!!! >:( >:(

tft.printf("%.2d:%.2d:%.2d",hour(t),minute(t),seconds(t));

Vielleicht noch zu Printf

http://www.cplusplus.com/reference/cstdio/printf/

ersetzt die Platzhalter wie "%02d" durch den hinten angehängten wert..

"%02d" bedeutet Dezimal mit führende Nullen und 2 Stellen.

Schuppeste:
Vielleicht noch zu Printf

http://www.cplusplus.com/reference/cstdio/printf/

ersetzt die Platzhalter wie "%d02" durch den hinten angehängten wert..

"%d02" bedeutet Deszimal mit führende Nullen und 2 Stellen.

"%d02" ??

"%02d" oder "%.2d"

Gruß Fips

Derfips:
"%d02" ??

"%02d" oder "%.2d"

Gruß Fips

Achja war halt aus dem Kopf..

.....ich sortiere einmal.......(vielen Dank für die Antworten)
Das Projekt ist eigendlich ein "alter" Hut. Ich messe die Erdfeuchte mit den Giesomat (Ramser Elektronik??) von verschiedenen Pflanzen - heißt, ich "studiere" gerade das Verhalten. Die Messung erfolgt mit einem gesonderten ESP8266. Alles bestens....Ich übergebe die Daten an einen Raspberry mittels MQTT. Da sich die Pflanzen "irgendwo im Keller" befinden, habe ich mir gedacht, das auf ein TFT Display auszugeben damit auch meine Mutter sehen kann was los ist. (ältere Dame ohne PC Kenntniss) Auch das funktioniert mit einem zweiten ESP gut......ich Depp habe mir nun eingebildet, die Uhrzeit/Datum mit auszugeben. Da hängt es nun....

Das mit dem Update meine ich so.....wenn ich unter Boardverwalter gehe, kommt da ja häufig "Bibiolotheken werden aktualisiert" und ich dachte hier folgt ein Update. Ich bin eigentlich mehr mit PlatfiormIO unterwegs. Gefällt mir irgendwie besser aber trotzdem ein großes Lob an die "Macher" von Arduino IDE.

Bevor ich eine Frage stelle, habe ich schon einiges probiert. Ich beschäftige mich seit ungefähr einen Jahr mit C (vorab nur C und nicht C++) aber es will manchmal nicht wirklich in meinen Schädel......(beruflich Elektroniker der mit Assembler gewachsen ist...)

Ich probiere mal das in der Loop aus.....