ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino
Zeit vom Nextion Enhanced mit Arduino auslesen - Druckversion

+- ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino (https://www.arduinoforum.de)
+-- Forum: Arduino-Allgemein (/arduino-Forum-Arduino-Allgemein)
+--- Forum: Programmierung (/arduino-Forum-Programmierung)
+--- Thema: Zeit vom Nextion Enhanced mit Arduino auslesen (/arduino-Thread-Zeit-vom-Nextion-Enhanced-mit-Arduino-auslesen)

Seiten: 1 2 3 4 5 6


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 05.03.2019 17:27

Wieso? Du musst natürlich wieder 1970 addieren, wenn Du daraus das Jahr anzeigen willst.

Mit Deinen Fragmenten kann man nichts genaues feststellen.
Baue doch mal nur einen Sketch, in dem die die bekannten Werte in die tm-Struktur rein hängst (also ohne den Nextion-Teil, von dem wissen wir ja, das er geht) und zeige, was der dann ausgibt.

Gruß Tommy

Ich hatte die Zeit nicht gesetzt, sondern nur umgewandelt. Sorry.
Code:
#include <TimeLib.h>

tmElements_t tm;
char puffer[100];
void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  tm.Year = 49;
  tm.Month = 3;
  tm.Day = 5;
  tm.Hour = 17;
  tm.Minute = 41;
  tm.Second = 12;
  setTime(makeTime(tm));  // <------------------ hier -------
  sprintf(puffer,"%02d.%02d.%04d %02d:%02d:%02d",day(),month(),year(),hour(),minute(),second());
  Serial.println(puffer);
}

void loop() {

}

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 05.03.2019 18:29

(05.03.2019 17:27)Tommy56 schrieb:  setTime(makeTime™); // <------------------ hier -------
sprintf(puffer,"%02d.%02d.%04d %02d:%02d:%02d",day(),month(),year(),hour(),minute(),second());
Serial.println(puffer);

den Bereich habe ich einfach mal dazu gepackt. Das setTime hatte ich auch schon herausgefunden.

Code:
tm.Year = (nex_rtc0-1970);
          Serial.print("tm.Year=(nex_rtc0-1970) / tm.Year= ");
          Serial.println(tm.Year);
          tm.Month = nex_rtc1;
          Serial.print("tm.Month=nex_rtc1 / tm.Month= ");
          Serial.println(tm.Month);
          tm.Day = nex_rtc2;
          Serial.print("tm.Day=nex_rtc2 / tm.Day= ");
          Serial.println(tm.Day);
          tm.Hour = nex_rtc3;
          Serial.print("tm.Hour=nex_rtc3 / tm.Hour= ");
          Serial.println(tm.Hour);
          tm.Minute = nex_rtc4;
          Serial.print("tm.Minute=nex_rtc4 / tm.Minute= ");
          Serial.println(tm.Minute);
          tm.Second = nex_rtc5;
          Serial.print("tm.Second=nex_rtc5 / tm.Second= ");
          Serial.println(tm.Second);
          //setTime(nex_rtc3, nex_rtc4, nex_rtc5, nex_rtc2, nex_rtc1, nex_rtc0);
          setTime(makeTime(tm));  // <------------------ hier -------
          sprintf(pufer,"%02d.%02d.%04d %02d:%02d:%02d",day(),month(),year(),hour(),minute(),second());
          Serial.println(pufer);
Die Ausgabe von pufer ist richtig, aber nicht meine Uhrzeitausgabe.
Aber das day() etc. hinter sprintf ruft doch genau so die Uhrzeit aus der Time.lib ab wie ich mit DigitalClockDisplay.
Code:
18:07:36.394 -> ------------------RTC wurde abgefragt------------------
18:07:36.429 -> 5/3/2019   18:7:38
18:07:36.464 -> tm.Year=(nex_rtc0-1970) / tm.Year= 49
18:07:36.498 -> tm.Month=nex_rtc1 / tm.Month= 3
18:07:36.532 -> tm.Day=nex_rtc2 / tm.Day= 5
18:07:36.566 -> tm.Hour=nex_rtc3 / tm.Hour= 18
18:07:36.600 -> tm.Minute=nex_rtc4 / tm.Minute= 7
18:07:36.634 -> tm.Second=nex_rtc5 / tm.Second= 38
18:07:36.669 -> 05.03.2019 18:07:38
18:07:37.044 -> 0:47:06 1/1/1970  Unix Time:  2826

Irgendwie verliert er die Werte nach dem synchronisieren.
Da muss ich wohl mal auf die suche gehen.


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 05.03.2019 18:42

Gib doch mal wieder den gesamten aktuellen Code.

Welche Zeile erzeugt die Ausgabe:
Code:
0:47:06 1/1/1970  Unix Time:  2826

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 06.03.2019 10:41

(05.03.2019 18:42)Tommy56 schrieb:  Gib doch mal wieder den gesamten aktuellen Code.
Hier mal der Code:
Code:
#include <TimeLib.h>

union  puffer
  {
    long l;
    byte arr[5];
  };

char pufer[100];
  
byte NexT[3] = {255,255,255}; // Abschluss fuer Serielle Kommunikation
byte inID[3];
byte b; // seriell empfangene bytes (GetZahl)
int nex_rtc0 = 0 , nex_rtc1 = 0 , nex_rtc2 = 0 , nex_rtc3 = 0 , nex_rtc4 = 0 , nex_rtc5 = 0;// Uhr und Datum vom Nextion geholt 0=JJJJ,1=MM,2=TT 3=HH,4=MIN,5=Sek
int art = 0; // Art der Seriell empfangenen Daten 1=Nummern , 2=ObjektID , 3=Slider , 4=Nextion Sleep , 5=Nextion WakeUp
int datenangefordert = 0;
const long UhrSyncInt = (1 * 30);  //alle x Stunden die Uhrzeit synchronisieren z.B. 6 Stunden (6 * 3600L)
static bool rtc0get = false;
static bool rtc1get = false;
static bool rtc2get = false;
static bool rtc3get = false;
static bool rtc4get = false;
static bool rtc5get = false;
static bool sleepmode = false;
static bool timesync = true;
unsigned long lastuhrMillis;
unsigned long lastuhrInterval = 10000;
tmElements_t tm;

void setup()
{
Serial.begin(9600);
Serial1.begin(115200);
Serial1.print("sleep=0");
Serial1.write(NexT,3);
delay(2000);
setSyncInterval(UhrSyncInt);  // z.B. 6 Stunden (6 * 3600L)
setSyncProvider(syncWithNextion);
}

void loop() {
  // put your main code here, to run repeatedly:
if (millis() - lastuhrMillis > lastuhrInterval)
    {
      digitalClockDisplay();
      lastuhrMillis = millis();
    }

}

void syncWithNextion()
{
     timesync = true;
     while (timesync)
     {
        if (!rtc0get)
          {
          if (datenangefordert == 0)
            {
            Serial1.print("get rtc0");
            Serial1.write(NexT,3);
            datenangefordert = 1;
            }
          nex_rtc0 = getZahl();
          if (nex_rtc0 != -1L)
            {
            Serial.print("nex_rtc0 = ");
            Serial.println(nex_rtc0);
            rtc0get = true;
            datenangefordert = 0;
            }
          }
        if ((!rtc1get) && (rtc0get))
          {
          if (datenangefordert == 0)
            {
            //Serial.println("get nex_rtc1");
            Serial1.print("get rtc1");
            Serial1.write(NexT,3);
            datenangefordert = 1;
            }
          nex_rtc1 = getZahl();
          if (nex_rtc1 != -1L)
            {
            Serial.print("nex_rtc1 = ");
            Serial.println(nex_rtc1);
            rtc1get = true;
            datenangefordert = 0;
            }
          }
        if ((!rtc2get) && (rtc1get))
          {          
          if (datenangefordert == 0)
            {
            //Serial.println("get nex_rtc2");
            Serial1.print("get rtc2");
            Serial1.write(NexT,3);
            datenangefordert = 1;
            }
          nex_rtc2 = getZahl();
          if (nex_rtc2 != -1L)
            {
            Serial.print("nex_rtc2 = ");
            Serial.println(nex_rtc2);
            rtc2get = true;
            datenangefordert = 0;
            }
          }
        if ((!rtc3get) && (rtc2get))
          {
          if (datenangefordert == 0)
            {
            Serial1.print("get rtc3");
            Serial1.write(NexT,3);
            datenangefordert = 1;
            }
          nex_rtc3 = getZahl();
          if (nex_rtc3 != -1L)
            {
            Serial.print("nex_rtc3 = ");
            Serial.println(nex_rtc3);
            rtc3get = true;
            datenangefordert = 0;
            }
          }
        if ((!rtc4get) && (rtc3get))
          {
          if (datenangefordert == 0)
            {
            Serial1.print("get rtc4");
            Serial1.write(NexT,3);
            datenangefordert = 1;
            }
          nex_rtc4 = getZahl();
          if (nex_rtc4 != -1L)
            {
            Serial.print("nex_rtc4 = ");
            Serial.println(nex_rtc4);
            rtc4get = true;
            datenangefordert = 0;
            }
          }
        if ((!rtc5get) && (rtc4get))
          {
          if (datenangefordert == 0)
            {
            Serial1.print("get rtc5");
            Serial1.write(NexT,3);
            datenangefordert = 1;
            }
          nex_rtc5 = getZahl();
          if (nex_rtc5 != -1L)
            {
            Serial.print("nex_rtc5 = ");
            Serial.println(nex_rtc5);
            datenangefordert = 0;
            rtc5get = true;
            Serial.println("------------------RTC wurde abgefragt------------------");
            Serial.print(nex_rtc2);
            Serial.print("/");
            Serial.print(nex_rtc1);
            Serial.print("/");
            Serial.print(nex_rtc0);
            Serial.print("   ");
            Serial.print(nex_rtc3);
            Serial.print(":");
            Serial.print(nex_rtc4);
            Serial.print(":");
            Serial.println(nex_rtc5);
            tm.Year = (nex_rtc0-1970);
            Serial.print("tm.Year=(nex_rtc0-1970) / tm.Year= ");
            Serial.println(tm.Year);
            tm.Month = nex_rtc1;
            Serial.print("tm.Month=nex_rtc1 / tm.Month= ");
            Serial.println(tm.Month);
            tm.Day = nex_rtc2;
            Serial.print("tm.Day=nex_rtc2 / tm.Day= ");
            Serial.println(tm.Day);
            tm.Hour = nex_rtc3;
            Serial.print("tm.Hour=nex_rtc3 / tm.Hour= ");
            Serial.println(tm.Hour);
            tm.Minute = nex_rtc4;
            Serial.print("tm.Minute=nex_rtc4 / tm.Minute= ");
            Serial.println(tm.Minute);
            tm.Second = nex_rtc5;
            Serial.print("tm.Second=nex_rtc5 / tm.Second= ");
            Serial.println(tm.Second);
            //setTime(nex_rtc3, nex_rtc4, nex_rtc5, nex_rtc2, nex_rtc1, nex_rtc0);
            setTime(makeTime(tm));  // <------------------ hier -------
            sprintf(pufer,"%02d.%02d.%04d %02d:%02d:%02d",day(),month(),year(),hour(),minute(),second());
            Serial.println(pufer);
            Serial.print(hour());
            Serial.print(":");
            Serial.print(minute());
            Serial.print(":");
            Serial.print(second());
            Serial.print(" ");
            Serial.print(day());
            Serial.print("/");
            Serial.print(month());
            Serial.print("/");
            Serial.println(year());
            Serial.print("now()= ");
            Serial.println(now());
            if(timeStatus()!= timeSet) Serial.println("Unable to sync with the RTC");
            else Serial.println("------------SyncProvider has set the system time-------------");
            digitalClockDisplay();
            rtc0get = false;
            rtc1get = false;
            rtc2get = false;
            rtc3get = false;
            rtc4get = false;
            rtc5get = false;
            timesync = false;
            }        
          }
     }
    
}   // Ende syncWithNextion()        

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print("/");
  Serial.print(month());
  Serial.print("/");
  Serial.print(year());
  Serial.print("  Unix Time:  ");
  Serial.println(now());
}//Ende digitalClockDisplay()

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
} // Ende printDigits(int digits)

// return -1 wenn nichts da, sonst die Zahl
long getZahl() {
  static puffer p;
  static byte idx;
  static byte id;
  static byte anzFF;
  static bool inLesen = false;
  
if (Serial1.available() > 0 )
    {
    b = Serial1.read();
    //Serial.print("Serielles Byte empfangen : ");
    //Serial.println(b);
          
    if (!inLesen)
      {
      if (b == 0x71) //Beginn Zahlenfolge gefunden
        {
        //Serial.println("Beginn Zahlenfolge gefunden");
        inLesen = true;
        idx = 0;
        anzFF = 0;
        art = 1;
        return -1L;
        }
      }else
        if (b == 0xFF)  // Endeanteil
          {
          anzFF++;
          if (anzFF == 3) // fertig
            {
            //Serial.println("Ende gefunden");
            inLesen = false;
              if (art == 1)
                {
                return p.l;
                art = 0;
                }
             }else return -1L; // in Endebearbeitung
          }
          else
            if (art == 1)
              {
              p.arr[idx++] = b; // Zahlanteil schreiben
              return -1L;
              }
      } else return -1L;  // nichts da              
}// Ende GetZahl()

Die Uhrzeit wird, während syncWithNextion läuft, korrekt wiedergegeben.
Sobald der Arduino im loop läuft ist die Uhrzeit nicht mehr korrekt.

Serielle Ausgabe:
Code:
10:16:54.140 -> nex_rtc0 = 2019
10:16:54.173 -> nex_rtc1 = 3
10:16:54.173 -> nex_rtc2 = 6
10:16:54.173 -> nex_rtc3 = 10
10:16:54.206 -> nex_rtc4 = 16
10:16:54.206 -> nex_rtc5 = 57
10:16:54.241 -> ------------------RTC wurde abgefragt------------------
10:16:54.308 -> 6/3/2019   10:16:57
10:16:54.308 -> tm.Year=(nex_rtc0-1970) / tm.Year= 49
10:16:54.341 -> tm.Month=nex_rtc1 / tm.Month= 3
10:16:54.376 -> tm.Day=nex_rtc2 / tm.Day= 6
10:16:54.409 -> tm.Hour=nex_rtc3 / tm.Hour= 10
10:16:54.443 -> tm.Minute=nex_rtc4 / tm.Minute= 16
10:16:54.477 -> tm.Second=nex_rtc5 / tm.Second= 57
10:16:54.545 -> 06.03.2019 10:16:57
10:16:54.545 -> 10:16:57 6/3/2019
10:16:54.579 -> now()= 1551867417
10:16:54.579 -> ------------SyncProvider has set the system time-------------
10:16:54.647 -> 10:16:57 6/3/2019  Unix Time:  1551867417
-------Ende von syncWithNextion
10:17:02.120 -> 0:08:49 1/1/1970  Unix Time:  529

Muss ich die Zeit trotzdem noch mit return zurück senden?


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 06.03.2019 10:57

Es hat einen Grund, warum ich Dir in meinem Vorschlag
Code:
time_t syncWithNextion()
geschrieben habe.
Warum Du daraus
Code:
void syncWithNextion()
machst, ist mir schleierhaft.
Du musst die Zeit schon zurückgeben, woher soll der Prozessor sie sonst kennen?

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 06.03.2019 11:16

(06.03.2019 10:57)Tommy56 schrieb:  Es hat einen Grund, warum ich Dir in meinem Vorschlag
Code:
time_t syncWithNextion()
geschrieben habe.
Warum Du daraus
Code:
void syncWithNextion()
machst, ist mir schleierhaft.
Du musst die Zeit schon zurückgeben, woher soll der Prozessor sie sonst kennen?

Gruß Tommy

Danke
Habe die letzten Tage so viel rumprobiert das ich wohl vor lauter Bäume den Wald nicht mehr gesehen habe.


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - SkobyMobil - 06.03.2019 17:53

Hallo,
ist der Sketch aus #44 nur zum lesen/schreiben der Uhrzeit?
Gruß und Dank
Andreas


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 06.03.2019 18:08

Er soll die RTC aus dem Nextion auslesen und damit syncen, was er aber nicht macht, da die "syncWithNextion()" die Zeit nicht zurück gibt.

Gruß Tommy