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 - 05.01.2019 20:03

Im Code steht nicht viel mehr. Außer der Ausgabe von Jahr zum seriellen Monitor und einem 1000er Delay.
Im Monitor erscheint meist 255.
Bin gerade nicht mehr am PC.
Das Nextion zeigt die aktuelle Uhrzeit und Datum mit Wochentag an. Ist auch alles über das Display einstellbar.


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 05.01.2019 20:14

Ohne weitere Information (besonders zur Hex-Folge beim Empfang) ist es unmöglich zu helfen.

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 06.01.2019 08:59

Hier mal mein Code:
Code:
int val=0;
int lichtan=0;
int jahr=0;

boolean newData = false;

void endeKennung() //wird zum abschließen eines Sendebefehls ans Nextion benötigt
{
  Serial1.write(0xff);
  Serial1.write(0xff);
  Serial1.write(0xff);
}

void setup() {
  Serial1.begin(9600);
  Serial.begin(9600);
}

void loop() {

  if (lichtan==0)
      {
      lichtan=1;
      }
      else lichtan=0;
  
  
  Serial1.print("get rtc0"); // Jahr anfordern
   endeKennung();
    
    if (Serial1.available() &&  newData == false)
      {
         jahr = Serial1.read();
         newData = true;
      }

  if (newData == true)
      {
      Serial.print(" I received:");
      Serial.print(jahr,HEX);
      Serial.println();
      newData = false;
      }
    
  val=(millis() / 1000);
  Serial.print("Licht an: ");
  Serial.print(lichtan);
  Serial.println();
  
  Serial1.print("temp.val="); //Legt fest wo hin geschrieben werden soll. In dem Fall an Nummernfeld temp.val am Nextion
  Serial1.print(val); // Wert aus val wird übertragen an temp.val
  endeKennung();
  Serial1.print("lichtaktiv.val="); //Legt fest wo hin geschrieben werden soll. In dem Fall an Checkbox lichtaktiv.val am Nextion
  Serial1.print(lichtan); // Wert aus val wird übertragen an lichtaktiv.val
  endeKennung();

  delay(1000);

Als Ausgabe am SeriellenMonitor kommt:
Code:
Licht an: 1
I received:71
Licht an: 0
I received:E3
Licht an: 1
I received:7
Licht an: 0
I received:0
Licht an: 1
I received:0
Licht an: 0
I received:FF
Licht an: 1
I received:FF
Licht an: 0
I received:FF
Licht an: 1
I received:71
Licht an: 0
I received:E3
Licht an: 1
I received:7

Das senden zum Display funktioniert.


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 06.01.2019 11:48

Also kommt (hex): 71 E3 07 00 00 FF FF FF. Das sieht doch gut aus.

0x71 = Kennung für numerische Daten
0xFF 0xFF 0xFF = Endekennung
E3 = 227 Dez
227+7*256 = 2019 <== Stimmt doch
Oder wenn Du die Zahl von hinten in 4 Byte einliest und diese als unsigned long ausliest:
0x000007E3 = 2019 Dez.

Die Rechenvorschrift hatte ich Dir bereits in #6 gepostet. Es ist sinnvoll, sich die Antworten, die Du bekommst, auch anzuschauen. Wenn Du konkrete Einzelheiten nicht verstehst, kannst Du konkret fragen.

Auf diesem Weg kannst Du alle Zahlen der rtc im Nextion auslesen.

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 06.01.2019 12:37

OK, jetzt weiß ich wie sich das zusammen setzt.
Wie schaffe ich es nur die 4 Blöcke zwischen 71 und FF FF FF auszulesen und dann daraus die Zahl zu ermitteln. OK irgendwie mit unsigned long aber wie?
Ich habe mir wohl wirklich zu viel zugetraut.

Für mich ist das totales Neuland. Sorry


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 06.01.2019 13:52

Ungetestet (ich habe gerade kein Nextion verfügbar):
Code:
union  puffer{
    long l;
    byte arr[4];
};

void endeKennung() //wird zum abschließen eines Sendebefehls ans Nextion benötigt
{
  Serial1.write(0xff);
  Serial1.write(0xff);
  Serial1.write(0xff);
}

// return -1 wenn nichts da, sonst die Zahl
long getZahl() {
  static puffer p;
  static byte idx;
  static byte anzFF;
  static bool inLesen = false;
  byte b;
  if (Serial1.available()) {
    b = Serial1.read();
    if (!inLesen) {
        if (b == 0x71) { // Anfang gefunden
        inLesen = true;
        idx = 3;
        anzFF = 0;
        return -1L;
      }
    }  
    else {
      if (b == 0xFF) { // Endeanteil
        anzFF++;
        if (anzFF == 3) { // fertig
          inLesen = false;
          return p.l;
        }  
        else return -1L; // in Endebearbeitung
      }
      else {
        p.arr[idx--] = b; // Zahlanteil schreiben
        return -1L;
      }
    }  
  }
  else return -1L;  // nichts da
}

void setup() {
  // ...
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial1.print("get rtc0"); // Jahr anfordern
  endeKennung();
}

void loop() {
long zahl;
  
  zahl = getZahl();
  if (zahl != -1L) Serial.println(zahl);
}

So ungefähr sollte es funktionieren. Die 0x71 erkennen, dort geht es los. Die Zahl ist immer 4 Byte lang, danach kommt 3 mal 0xFF.

Gruß Tommy


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - MarkoM - 06.01.2019 14:16

Danke Tommy für Deine Bemühungen.
Da kommt jetzt leider -486080512 bei raus.

wenn ich Serial1.print("get rtc0") mit in loop packe kommen sogar unterschiedliche Werte dabei raus.


RE: Zeit vom Nextion Enhanced mit Arduino auslesen - Tommy56 - 06.01.2019 15:03

Ok, denkfehler von mir. Wenn man nicht testen kann, macht man halt schnell Fehler.
Code:
// return -1 wenn nichts da, sonst die Zahl
long getZahl() {
  static puffer p;
  static byte idx;
  static byte anzFF;
  static bool inLesen = false;
  byte b;
  if (Serial1.available()) {
    b = Serial1.read();
    if (!inLesen) {
        if (b == 0x71) { // Anfang gefunden
        inLesen = true;
        idx = 0;
        anzFF = 0;
        return -1L;
      }
    }  
    else {
      if (b == 0xFF) { // Endeanteil
        anzFF++;
        if (anzFF == 3) { // fertig
          inLesen = false;
          return p.l;
        }  
        else return -1L; // in Endebearbeitung
      }
      else {
        p.arr[idx++] = b; // Zahlanteil schreiben
        return -1L;
      }
    }  
  }
  else return -1L;  // nichts da
}
Die Bytes müssen in der anderen Reihenfolge rein.

Gruß Tommy