Messfrequenz vom DHT11 über Touchdisplay ändern

Doch das geht. Du musst nur die Zeit mit übergeben.

Beispiel:

void loop() {                                                             
  Dht_auslesen(intervall_Dht);                              
}                                                                         

void Dht_auslesen(unsigned long intervall) { 
  neumillis_Dht = millis();                               
  if ( (neumillis_Dht - altmillis_Dht) >= intervall) {
.....

Und den Wert der Variable "intervall_Dht" holst du aus dem Nextion.

dann kann ich intervall_Dht aus der 3er Kette oben raus nehmen?(wenn ich die Variable vom Nextion hole)

kann das dann nicht auch ein (int intervall) sein?

Ja.

Ich würde es bei long lassen, dann ist es einheitlich.
Es geht auch mit int, bin aber nicht sicher, obs nicht doch irgend wann Probleme gibt.

ok dann lasse ich es bei long.

ich habe mir jetzt mal den sketch + dazugehöriges Youtube Video angesehen und alles wieder nach meinem Verständnis kommentiert.
Das was ich nicht verstehe habe ich versucht in den Kommentaren so gut es geht zu kennzeichnen.
Könnt ihr mich aufklären?

#include <SoftwareSerial.h>                                                         //serielle Schnittstelle kann an fast jedem pin verwendet werden
String endChar = String(char(0xff)) + String(char(0xff)) + String(char(0xff));
String ReceivedData = "";                                                           // string zum empfangen der daten

SoftwareSerial nextion(12, 13);                                                     // legt die seriellen pins am Arduino fest(RX, TX)
int Data0;
int Data1;

union {                                                                             // wird benötigt um die Daten umzuwandeln
  char charByte[8];                                                                 // **er sagt das das charByte 8 Bit groß ist?**
  long valLong;                                                                     // **deklariert valLong als long variable?**
} value;

void setup() {
  Serial.begin(9600);                                                                // öffnet serielle schnittstelle für seriellen Monitor (Bautrate)
  nextion.begin(9600);                                                               // öffnet serielle schnittstelle für Nextion Display (Bautrate)
}

void loop() {                                                                        
  if (nextion.available()) {                                                          // Abfrage ob Display verfügbar ist
    ReceivedData += char(nextion.read());                                             // wenn ja dann lies es und speichere die daten als char in  ReceivedData                                        
    if (ReceivedData.length() > 8) ReceivedData = "";                                 // wenn der inhalt von ReceivedData größer 8 ist dann lösche("") die daten aus ReceivedData
  }

  if (ReceivedData.length() == 8) {                                                   // wenn ide empfangenen daten 8 Stellen lang sind dann *1
    //Serial.println(ReceivedData);                                                   //
    value.charByte[0] = char(ReceivedData[0]);                                        // *1 wandelt die daten um **?? aber von was in was ??**
    value.charByte[1] = char(ReceivedData[1]);                                        // *1                                        
    value.charByte[2] = char(ReceivedData[2]);                                        // *1
    value.charByte[3] = char(ReceivedData[3]);                                        // *1
    Data0 = value.valLong;                                                            // *1 speichre die oberen 4 **??Bit??** der reine nach (0123) in data0
    value.charByte[0] = char(ReceivedData[4]);                                        // *1
    value.charByte[1] = char(ReceivedData[5]);                                        // *1
    value.charByte[2] = char(ReceivedData[6]);                                        // *1
    value.charByte[3] = char(ReceivedData[7]);                                        // *1
    Data1 = value.valLong;                                                            // *1 speichre die oberen 4 **??Bit??** der reine nach (0123) in data1
    Serial.println(Data0);                                                            // schreibe die Daten von data0 in den seriellen Monitor mit Zeilenumbruch
    Serial.println(Data1);                                                            // schreibe die Daten von data1 in den seriellen Monitor mit Zeilenumbruch
    ReceivedData = "";                                                                // lösche("") die empfangenen Daten wieder **?? wenn er hier die Daten löscht) wie kann er sie dann noch übertragen??** 
  nextion.print("n2.val=");                                                           // übertrage die Daten an n2 (n2 ich ein Zahlenfeld auf dem Display)
  nextion.print(Data0);                                                               // **hier weis ich nicht was passiert**
  nextion.print(Data1);                                                               // **hier weis ich nicht was passiert**
  nextion.write(0xFF);                                                                // **hier weis ich nicht genau was passiert er überschreibt Daten? aber welche**
  nextion.write(0xFF);                                                                // **hier weis ich nicht genau was passiert er überschreibt Daten? aber welche**
  nextion.write(0xFF);                                                                // **hier weis ich nicht genau was passiert er überschreibt Daten? aber welche**
  }


  if (ReceivedData.endsWith(endChar)) {                                               // Fehlerbehandlung wenn Daten nicht passen z.B. zu große länge oder ungültges Format
    Serial.println(ReceivedData);
    Serial.println("error");
    ReceivedData = "";
  }
}

Negative Intervalle machen keinen Sinn, also würde ich unsigned für wichtiger halten.
unsigned int reicht gerade so 1 Minute, Diese Grenze ist für einen Dht_auslesen-Parameter etwas knapp.

intervall übernimmt doch den wert von intervall_Dht was ja eine feste Variable sein soll z.b. 2000 für 2ms

und intervall_Dht wird ja im späteren verlauf von der Eingabe des Touchscreen abgelöst.

wie soll das dann nicht reichen?
Oder täusche ich mich da?

und bevor es untergeht würde ich gern noch mal auf Post #25 hinwweisen

Da solltes du dir zwingend die Beschreibung der Nextion Displays durchlesen. Ohne das nötige Wissen wirst du mit dem Display immer Probleme haben.

Die gezeigten Zeilen sind notwendige Daten und Parameter zur Anzeige im Display.

Das stimmt auch. Da es vorher unsigned long war, habe ich mir das unsigned in der Angabe geschenk. Der Rest wurde vom TO geschrieben.

Hallo,
ich kenne mich mit dem Nexton Display nicht aus, insofern sollte ich meine Klappe halten :wink: aber mit diesen Zeilen willst Du die eingegeben Zeichen zurück schreiben um sie irgendwo am Nexton anzeigen zu können. Normal läuft das ja sicher mit tags im Nexton ab. und vermutlich ist n2.val der Tag Name für die Stelle an der der aktuelle Messzyklus angezeigt werden soll. @HotSystems hats schon geschrieben Lese die Doku von dem Nexton. YouToube ist Quatsch.

Frage in die Runde. Bietet die Nexton lib eine Methode um eine gemachte Eingabe in eine numerische Variable zu legen ?
Wenn nicht könnte man die vom Nexton empfangenen Zeichen in einer C Zeichenkette ablegen , das ist ja im Wesentlichen das Array in der Struct. Dann eine 0 mit dran und den mit atoi wandeln und in value.valLong ablegen.

Heinz

Und hier noch die Seite mit einer ausführlichen Doku zum Nextion.

Bisher habe ich noch keinen gesehen, der diese Library nutzt.

Hallo,
vermutlich gibts auch keine, wozu sollte die auch sein. ?
ich habs ja schon gesagt keine Ahnung sollte die Klappe halten. :wink:

Gruß Heinz

 nextion.print(Data0);                                                               // **hier weis ich nicht was passiert**
  nextion.print(Data1); 

ich habe 2 Tastenfelder auf dem Dislpay auf denen ich die Zahlen eingeben kann. Diese eigegeben Zahlen werden dann auch auf den Feldern angezeigt. Das wird das sicher ein.

nextion.print("n2.val=");

n2 Ist ein Zahlenfeld auf dem Nextion dort werden die Zahlen die eingetippt habe auch angezeigt. Das könnte es sein.

nextion.write(0xFF);                                                                // **hier weis ich nicht genau was passiert er überschreibt Daten? aber welche**
 nextion.write(0xFF);                                                                // **hier weis ich nicht genau was passiert er überschreibt Daten? aber welche**
 nextion.write(0xFF); 

Ich bilde mir ein mal was gelesen zu haben das diese Zeiten dafür da sind alles wieder zu bereinigen.

es gibt ja auch eine Nextion libeary aber soll extrem umständlich sein.

Diese Zeilen schließen die Schreibfunktion auf dem Display ab. Lies bitte die verlinkte Doku.

Nö...jeder Tipp kann helfen.

das mach ich. dann versuch ich alles zuusammen zu fügen. und dann melde ich mich sicher wieder :slight_smile:

So da bin ich wieder,

Habe jetzt noch einmal einen anderen Ansatz versucht. Und zwar wollte ich jetzt mit dem DHT_11 einen Balken auf dem Nextion ändern.

laut dem Guide

Das Klapps soweit auch alles gut.

wenn ich den Wert im Code ändere dann Verschiebt sich auch der Balken.
Doch sobald ich bei nextion.print("temp.val=50"); anstatt der 50 das t (für ausgelesene Temperatur) eingebe reagiert der Balken nicht. Hat jemand eine Ahnung warum das so ist?

#include "DHT.h"                                                          // fügt DHT Bibliothek ein
#define DHTPIN 2                                                          // PIN2 am Arduino ist der Datenpin am DHT11
#include <SoftwareSerial.h>                                               // Serielle Schnittstelle (RX/TX) kann selbst gewählt weerden 
#define DHTTYPE DHT11                                                     // legt fest welcher DHT Sensor angeschlossen ist
unsigned long altmillis_Dht, neumillis_Dht, intervall_Dht = 2000;         // sagt das altmillis_Dht, neumillis_Dht, intervall_Dht in einem Bereich zwischen 0 und 4,294,967,295 liegen kann !! intervall_Dht habt aber den festen wert 2000

DHT dht(DHTPIN, DHTTYPE);                                                 // DHT wird in Code jetzt mit dht und weist die vorher definierten Parameter fest
SoftwareSerial nextion(12, 13);                                           // sagt das der Dislpay am Seriellen Port RxPin_12 und TxPin_13 hängt
void setup() {                                                            // alles bis (*1) läuft nur beim ersten Start EINMMALIG durch
  Serial.begin(9600);                                                     // legt die Bautrate fest (muss gleich zum Seriellen Monitor sein)
  nextion.begin(9600);                                                    // Serielle Schnittstelle vom Display
  Serial.println("DHT11 Testprogramm\n");                                 // gibt den Text DHT11 Testprogramm  aus
  dht.begin();                                                            // startet den dht11 Sensor
  altmillis_Dht = 0;                                                      // altmillis_Dht wird auf den Wert 0 gesetzt
}                                                                         //(*1)
void loop() {                                                             // Dieser Loop soll nur in weitere Loops weiterleiten
  Dht_auslesen(intervall_Dht);                                            // springt zum loop Dht_auslesen (ein Wert der der in (*4) geschrieben wird) 
}                                                                         // ende des "weiterleiten" loop




void Dht_auslesen(int intervall) {                                        //loop Dht_auslesen ( (*4))



  neumillis_Dht = millis();                                               // Beispiel loop_1: neumills_Dht = 4000    |    Beispiel loop_2 (es sind 10 Sekunden vergangen):  neumills_Dht = 14000
  if ( (neumillis_Dht - altmillis_Dht) >= intervall) {                    // wenn 4000 - 0 größer oder glech 2000    |    wenn 14000 - 4000(=6000) größer oder glech 2000
    altmillis_Dht = neumillis_Dht;                                        // dann setze 0 auf 4000                   |    dann setze 4000 auf 14000
                                                                          // und führe den den code bis (*2) aus     |    und führe den den code bis (*2) aus


    float h = dht.readHumidity();                                         //Dht11 liest Luftfeuchtigkeitswert(h)
    int t = dht.readTemperature();                                        //Dht11 liest Temperaturwert(t)
     

    if (isnan(h) || isnan(t)) {                                           //(*3)wenn (h) und/oder (t) nicht gelesen werden können (z.b. kaben an PIN2 ab)
      Serial.println("Fehler beim auslesen des Sensors!");                //dann schreibe "Fehler beim auslesen des Sensors!"
      return;                                                             // und springe zm Anfang(*3) ansonsten einfach weiter
    }
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(h);                                                      // Ausgeben der Luftfeuchtigkeit
    Serial.print("%\n");                                                  // Neue Zeile(\n) im Seriellen Monitor
    Serial.print("Temperatur: ");
    Serial.print(t);                                                      // Ausgeben der Temperatur
    Serial.print("°");                                                    // Schreiben das ° Zeichen
    Serial.print("C\n\n");                                                // lässt eine Zeile Platz
    nextion.print("temp.val=50");
    nextion.write(0xff);
    nextion.write(0xff);
    nextion.write(0xff);
 }                                                                       //*2
}

ok hab`s hin bekommen.

und zwar musste ich schreiben

nextion.print(temp.val=);
nextion.print(t);

Machs mal so

nextion.print("temp.val=");
nextion.print(t);

Gruß Tommy

Edit: Hast es ja selbst gefunden.

Trotzdem Danke! :+1: