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 - MarkoM - 31.01.2019 18:24

(31.01.2019 18:04)Tommy56 schrieb:  Ich vermute, dass bei einem Reset des Arduino nicht automatisch auch ein Reset des Nextion erfolgt.
Du liest dann irgendwas. Es kommt ja auch nicht die Meldung "Beginn Zahlenfolge gefunden" (0x71). Nach einem Reset solltest Du im Setup erst mal alles lesen, was noch in der Queue steht.
Code:
char c;
while (Serial1.available()) c = Serial1.read();

Gruß Tommy

Leider kein Erfolg.
Habe es mal so eingegeben:
Code:
void setup()
{
    Serial.begin(9600);
    Serial1.begin(9600);
    while (Serial1.available())
    {
      c = Serial1.read();
      Serial1.print(c);
    }
}


Ausgabe:

Code:
18:20:24.728 -> get rtc0
18:20:24.762 -> 26
18:20:24.762 -> RTC0 = 1546
18:20:24.762 -> get rtc1
18:20:24.762 -> 255
18:20:24.762 -> RTC1 = 1546
18:20:24.796 -> get rtc2
18:20:24.796 -> 255
18:20:24.796 -> RTC2 = 1546
18:20:24.830 -> get rtc3
18:20:24.830 -> 255
18:20:24.830 -> RTC3 = 1546
18:20:24.864 -> get rtc4
18:20:24.864 -> 113
18:20:24.864 -> Beginn Zahlenfolge gefunden
18:20:24.898 -> 1
18:20:24.898 -> 0
18:20:24.898 -> 0
18:20:24.898 -> 0
18:20:24.898 -> 255
18:20:24.898 -> 255
18:20:24.932 -> 255
18:20:24.932 -> RTC4 = 1

Also keine Änderung. Scheinbar kommen ja auch keine Daten vom Nextion.


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 31.01.2019 18:40

Da musst Du jetzt diesen Fall mit seriellen Ausgaben durchleuchten. Das kann man nicht mehr aus der Ferne machen.
Eigentlich sollte er ja überhaupt keinen RTC0-Wert liefern, wenn er den Start (0x71) nicht gefunden hat.
Das musst Du jetzt direkt am System herausfinden.

Wie / Wo ist inLesen deklariert? Das muss bei einem Neustart false sein.

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 02.02.2019 17:25

So, jetzt habe ich das Abfragen der aktuellen Zeit und der Schaltzeiten gelöst. Es wurden wohl über die Serielle Schnittstelle zu viele Daten gesendet.
Jetzt möchte ich die Time.lib mit den ausgelesenen Daten füttern.
Einfach mit get RTC funktioniert das mit dem Nextion ja leider nicht.

Wie bekomme ich die aktuelle Stunde, Minute, Sekunde in die Time.lib.

So könnte ich die aktuelle Uhrzeit nur z.B. alle 12h vom Nextion abrufen und dann die Zeitenschaltung mit der Lib versuchen.


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 02.02.2019 17:28

Welche Time-Lib verwendest Du? Es gibt mehrere. Link bitte.

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 02.02.2019 17:37

(02.02.2019 17:28)Tommy56 schrieb:  Welche Time-Lib verwendest Du? Es gibt mehrere. Link bitte.

Gruß Tommy
Wollte es mal mit der, von Dir vorgeschlagenen, versuchen.
https://github.com/PaulStoffregen/Time


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 02.02.2019 18:03

Mit der Lib geht es gut.
Du brauchst eine Funktion, die die Zeit vom Nextion holt und diese in einen time_t (Sekunden seit 1.1.1970 = UNIX-Time) umrechnet und zurück gibt.
Also so was:
Code:
/****************************
Das ist in der TimeLib.h definiert
typedef struct  {
  uint8_t Second;
  uint8_t Minute;
  uint8_t Hour;
  uint8_t Wday;   // day of week, sunday is day 1
  uint8_t Day;
  uint8_t Month;
  uint8_t Year;   // offset from 1970;
} tmElements_t, TimeElements, *tmElementsPtr_t;
**********************************/
// Holt die Zeit vom Nextion und gibt sie als time_t (UNIXZeit) zurück
// im Fehlerfall sollte 0 zurück gegeben werden.
time_t syncWithNextion() {
tmElements_t tm;
// Hole Jahr
tm.Year = Jahr;
// Weiter für die anderen Zeitbestandteile Wday brauchst Du nicht zu setzen

return makeTime(tm); // convert time elements into time_t
}

Dann kannst Du im Setup schreiben (und brauchst Dich nicht weiter darum zu kümmern):
Code:
setSyncProvider(syncWithNextion);
setSyncInterval(6 * 3600L);  // z.B. 6 Stunden

Der Code ist ungetestet und nur als Anregung gedacht. Schaue Dir auch die Beispiele der Lib an.

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 06.02.2019 11:07

Hallo Tommy,
ich bin schon wieder am verzweifeln.
Kann es sein, das setSyncProvider im Setup keinen längeren Code akzeptiert?
Wenn ich es so mache,
Code:
static bool uhrempf = false;
void setup()
{
    Serial.begin(9600);
    Serial1.begin(115200);
    Serial1.print("page home");
    Serial1.write(NexT,3);
    while (!Serial);
    setSyncProvider(syncWithNextion);
}    
void loop()
{
if (uhrempf)
  {
    Serial.print("Uhrzeit wurde empfangen");
    //setSyncProvider(syncWithNextion);
  }
.......
Ausgabe im Monitor nur: 10:32:29.405 -> get nex_rtc0
Danach passiert nichts mehr.

Änder ich den Code in:
Code:
void setup()
{
    Serial.begin(9600);
    Serial1.begin(115200);
    Serial1.print("page home");
    Serial1.write(NexT,3);
    while (!Serial);
    //setSyncProvider(syncWithNextion);
    
}    

void loop()
{
if (!uhrempf)
  {
    if (!rtc0get) Serial.println("Uhrzeit wird empfangen");
    setSyncProvider(syncWithNextion);
  }
.........
bekomme ich folgendes:
Code:
10:49:38.226 -> Uhrzeit wird empfangen
10:49:38.259 -> get nex_rtc0
10:49:38.495 -> Beginn Zahlenfolge gefunden
10:49:38.702 -> Ende gefunden
10:49:38.702 -> RTC0 = 2019
10:49:38.736 -> get nex_rtc1
10:49:38.736 -> Beginn Zahlenfolge gefunden
10:49:38.770 -> Ende gefunden
10:49:38.770 -> RTC1 = 2
10:49:38.804 -> get nex_rtc2
10:49:38.804 -> Beginn Zahlenfolge gefunden
10:49:38.838 -> Ende gefunden
10:49:38.838 -> RTC2 = 6
10:49:38.872 -> get nex_rtc3
10:49:38.872 -> Beginn Zahlenfolge gefunden
10:49:38.906 -> Ende gefunden
10:49:38.940 -> RTC3 = 10
10:49:38.940 -> get nex_rtc4
10:49:38.940 -> Beginn Zahlenfolge gefunden
10:49:38.974 -> Ende gefunden
10:49:39.008 -> RTC4 = 49
10:49:39.008 -> get nex_rtc5
10:49:39.008 -> Beginn Zahlenfolge gefunden
10:49:39.041 -> Ende gefunden
10:49:39.076 -> RTC5 = 41
10:49:39.076 -> ------------------Datum Uhrzeit empfangen------------------
Also genau das, was passieren sollte.
Wenn ich dann den setSyncInterval mit 10 Sekunden im Setup hinzfüge wird die Uhrzeit auch nicht alle 10 Sekunden aktualisiert. Im Seriellen Monitor wird zumindest nichts angezeigt.
Hier noch mein Code zum synchronisieren. Musste es leider mit vielen if´s machen. anders kam die serielle Kommunikation durcheinander.
Code:
time_t syncWithNextion()
{
  if (!rtc0get)
     {
     if (!getrtc)
        {
        getrtc = true;
        Serial.println("get nex_rtc0");
        Serial1.print("get rtc0");
        Serial1.write(NexT,3);
        }
     datenangefordert = 1;
     nex_rtc0 = getZahl();
     if (nex_rtc0 != -1L)
        {
        Serial.print("RTC0 = ");
        Serial.println(nex_rtc0);
        datenangefordert = 0;
        rtc0get = true;
        getrtc = false;
        }
     }
  if ((!rtc1get) && (rtc0get))
     {
     if (!getrtc)
        {
        getrtc = true;
        Serial.println("get nex_rtc1");
        Serial1.print("get rtc1");
        Serial1.write(NexT,3);
        }
     datenangefordert = 1;
     nex_rtc1 = getZahl();
     if (nex_rtc1 != -1L)
        {
        Serial.print("RTC1 = ");
        Serial.println(nex_rtc1);
        datenangefordert = 0;
        rtc1get = true;
        getrtc = false;
        }
     }
  if ((!rtc2get) && (rtc1get))
     {          
     if (!getrtc)
        {
        getrtc = true;
        Serial.println("get nex_rtc2");
        Serial1.print("get rtc2");
        Serial1.write(NexT,3);
        }
     datenangefordert = 1;
     nex_rtc2 = getZahl();
     if (nex_rtc2 != -1L)
        {
        Serial.print("RTC2 = ");
        Serial.println(nex_rtc2);
        datenangefordert = 0;
        rtc2get = true;
        getrtc = false;
        }
     }

  if ((!rtc3get) && (rtc2get))
     {
     if (!getrtc)
        {
        getrtc = true;
        Serial.println("get nex_rtc3");
        Serial1.print("get rtc3");
        Serial1.write(NexT,3);
        }
     datenangefordert = 1;
     nex_rtc3 = getZahl();
     if (nex_rtc3 != -1L)
        {
        Serial.print("RTC3 = ");
        Serial.println(nex_rtc3);
        datenangefordert = 0;
        rtc3get = true;
        getrtc = false;
        }
     }
  if ((!rtc4get) && (rtc3get))
     {
     if (!getrtc)
        {
        getrtc = true;
        Serial.println("get nex_rtc4");
        Serial1.print("get rtc4");
        Serial1.write(NexT,3);
        }
     datenangefordert = 1;
     nex_rtc4 = getZahl();
     if (nex_rtc4 != -1L)
        {
        Serial.print("RTC4 = ");
        Serial.println(nex_rtc4);
        datenangefordert = 0;
        rtc4get = true;
        getrtc = false;
        }
     }
  if ((!rtc5get) && (rtc4get))
     {
     if (!getrtc)
        {
        getrtc = true;
        Serial.println("get nex_rtc5");
        Serial1.print("get rtc5");
        Serial1.write(NexT,3);
        }
     datenangefordert = 1;
     nex_rtc5 = getZahl();
     if (nex_rtc5 != -1L)
        {
        Serial.print("RTC5 = ");
        Serial.println(nex_rtc5);
        datenangefordert = 0;
        rtc5get = true;
        getrtc = false;
        }
     }
if (rtc5get && !getrtc)
   {
   tmElements_t tm;    
   tm.Year = (nex_rtc0-1970);
   tm.Month = nex_rtc1;
   tm.Day = nex_rtc2;
   tm.Hour = nex_rtc3;
   tm.Minute = nex_rtc4;
   tm.Second = nex_rtc5;
   rtc0get = false;
   rtc1get = false;
   rtc2get = false;
   rtc3get = false;
   rtc4get = false;
   rtc5get = false;
   uhrempf = true;
   Serial.println("------------------Datum Uhrzeit empfangen------------------");
   return makeTime(tm); // convert time elements into time_t
   }
}
Hast Du zufällig noch einen Lösungsvorschlag?


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 06.02.2019 11:17

Einfach machen, was ich Dir geschrieben habe und alles lesen.
SetSyncProvider gehört ins setup.

Gruß Tommy