Go Down

Topic: Array Abfrage und Senden per Serial wie umsetzten / Bräuchte Hilfe (Read 151 times) previous topic - next topic

Da_Real_Snake

Hey Leute,

es geht um folgendes, da beim Nextion Display die Waveform Komponente jedes mal wieder zurück gesetzt wird und da man dies wohl nicht umgehen kann laut Recherche, bin ich auf eine Idee gekommen wie man das eventuell umgehen könnte.

Folgendes im Bild seht Ihr die Waveform Komponente, diese soll die Feuchtigkeit im Verlauf von 1 Woche darstellen. Sie ist 240px lang und zeigt 7 Tage an wobei für 1 Tag 40px stehen also 40 Messpunkte ( alle 36min), so kommt man auf insg. 240 Messpunkte. ( ist von der Größe der Waveform her so)

]

Ich hatte es erst zum laufen bis ich merkte das nach dem Seitenwechsel er von vorne Anfängt, nach wie gesagt stundenlanger Suche dann ohh kann man so nicht ändern, na toll, damit wolle ich mich aber nicht Zufrieden geben.


Nun kommt meine Idee ins spiel die bisher aber nur so Semi Gut klappt:

Angedacht war es die Daten vom Sensor in ein Array zu schreiben, das wenn man die Seite mit der Waveform aufruft, er diese wieder herstellt. Was auch klappt. aber er überträgt die nicht Belegten Plätze im Array auch mit also die Nullen welche dann natürlich in der Waveform auch geschrieben werden.

Gibt es eine Möglichkeit es so zu machen das man das Array überpüft, die Werte bis zur 1. Null dann verschickt bis wieder ein neuer Wert hinzu gekommen ist ?


Ich häng mal meinen Test Code an bisher, hab jetzt natürlich die Zeit auf 100ms zum testen in diesem Skript also nicht wundern:

Code: [Select]

int Messwerte[240];
byte Zeiger = 0;

unsigned long startZeit;     // Startzeit des Millis Timers

const int CP1 = A0; // Capacitiver Sensor 1

int CP1SW = 0;  // Reiner Sensor Wert (0-1023)
int CP1AW;      // Sensor Wert der Benutzt oder Ignoriert werden kann
int CP1PW;      // Prozent Wert basieren auf dem Sensor Wert (0-1023 / 0-100%)

int DiagrammVoll = 0;
int Messung = 100;




void setup() {

  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(CP1, INPUT);
 

}

void loop() {

// Sensor 1--------------------------------------------------------------------------------------------------------------
 
CP1AW = analogRead(CP1);
if (abs(CP1SW - CP1AW) > 10) {   // Dies ist damit der Wert nicht ständig herum springt
  CP1SW = CP1AW;
}

CP1PW = map(CP1SW, 1023, 0, 100, 0);
Serial1.print("n2.val=");
Serial1.print(CP1PW);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);


// Daten ins Array Speichern-----------------------------------------------------------------------------------------------


if (millis() - startZeit >= Messung) {
startZeit = millis();

 Messwerte[Zeiger] = CP1PW;
 Zeiger++;
 if (Zeiger >= 240) Zeiger = 0;

}

// Array Daten nacheinander Übertragen------------------------------------------------------------------------------------

for (int i = 0; i<240;) {

Serial.println(Messwerte[i]);
String Tosend = "add ";
Tosend += 4;
Tosend += ",";
Tosend += 0;
Tosend += ",";
Tosend += Messwerte[i];
Serial1.print(Tosend);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);
i++;


}




}



EDIT: Falls es wichtig ist oder interessiert, das war der Code mit dem es Top lief aber halt nach Seitenwechsel fängt er immer von vorne an:

Code: [Select]

unsigned long startZeit;     // Startzeit des Millis Timers


const int CP1 = A0; // Capacitiver Sensor 1

int CP1SW = 0;  // Reiner Sensor Wert (0-1023)
int CP1AW;      // Sensor Wert der Benutzt oder Ignoriert werden kann
int CP1PW;      // Prozent Wert basieren auf dem Sensor Wert (0-1023 / 0-100%)

int DiagrammVoll = 0;
int Messung = 100;

void setup() {
 
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(CP1, INPUT);

}

void loop() {
 
// Sensor 1--------------------------------------------------------------------------------------------------------------
 
CP1AW = analogRead(CP1);
if (abs(CP1SW - CP1AW) > 10) {   // Dies ist damit der Wert nicht ständig herum springt
  CP1SW = CP1AW;
}

CP1PW = map(CP1SW, 1023, 0, 100, 0);
Serial1.print("n2.val=");
Serial1.print(CP1PW);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

// Daten an Diagramm Senden-----------------------------------------------------------------------------------------------


if (millis() - startZeit >= Messung) {
startZeit = millis();

String Tosend = "add ";
Tosend += 4;
Tosend += ",";
Tosend += 0;
Tosend += ",";
Tosend += CP1PW;
Serial1.print(Tosend);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

DiagrammVoll++;
Serial.print(DiagrammVoll);

}

if (DiagrammVoll == 240) {

String Toclear = "cle ";
Toclear += 4;
Toclear += ",";
Toclear += 255;
Toclear += "";
Serial1.print(Toclear);
Serial.print(Toclear);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

DiagrammVoll = 0;

}

}



MFG Stefan


uwefed

Je mehr Du  Streß machst, desto langsamer kommen die Antworten.

beeblebrox


Da_Real_Snake

Je mehr Du  Streß machst, desto langsamer kommen die Antworten.
Ja ich hatte letztes mal 1 Woche gewartet und keine Antwort auf nen anderes Thema erhalten, dachte weil der Beitrag soweit nach hinten gerutscht war schreib ich nochmal was das er wieder vorne ist und gesehen wird. Falls das nicht in Ordnung war Sry.


Ich hab das gar nicht verstanden !
Ulli
Hey Ulli, ich versuch das nochmal anders zu erklären:

Ich hab 240 Messpunkte die in ein Array geschrieben werden, 1 Messpunkt alle 36min, in meinem Testcode waren es 100ms.

Nun möchte ich wenn ich z.b einen Button drücke oder halt eine bestimmte Funktion "true oder false" ist, diese Daten im Array über die Serielle Schnittsttelle senden, aber das ganze nur 1 mal.


EDIT: Hab das Problem gelöst der Thread kann geschlossen werden.

Tommy56

Dann solltest Du die Lösung auch hier veröffentlichen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

ElEspanol

Ich sehe hier mal wieder wie eine „schlechte/unzureichende" Problembeschreibung zu fehlender Resonanz führt.

Schön, dass du es selbst lösen kannst. Weil oftmals ist es so, dass die Verfassung eines Posts dich der Lösung schon ein gutes Stück näher bringt.
Google mal nach Rubberduck Test, oder versuche, deiner Großmutter genau zu erklären, wie dein Sketch funktioniert und warum du das so programmiert hast.
Dann findest du garantiert noch einige Fehler.

Serenifly

Nun möchte ich wenn ich z.b einen Button drücke oder halt eine bestimmte Funktion "true oder false" ist, diese Daten im Array über die Serielle Schnittsttelle senden, aber das ganze nur 1 mal.
Das hat also gar nichts wirklich mit Arrays zu tun. Sondern es geht darum einen Taster nur einmal auszulösen

SkobyMobil

Hallo,
Du hast ja eine bestimmte Anzahl an Werten.
Dafür legst Du Dir im Nextion globale Variablen an.

vaWert1, vaWert2, u.s.w.
In der Waveform sorgst Du dafür, das der letzte (aktuelle) Wert an linker Stelle dargestellt
wird.

Im Sketch kannst Du Dir ein Arrayanlegen, das alle Werte aufnimmt und den aktuellen immer an
erster Stelle hat. Hier macht es der Sketch im Arduino.

Code: [Select]
void INcTMessungA()
{
  int zlINcTM; // zähler
  for (zlINcTM = 47; zlINcTM >= 0 ; zlINcTM--) // hier wird runtergezählt

  {
    INcTMessung[zlINcTM] = INcTMessung[zlINcTM-1]; // index wird verschoben, Platz 3 wird zu Platz 2, Platz 2 wird zu Platz 1, u.s.w.

    if (zlINcTM == 0)
    {
      INcTMessung[0] = INcT; // der aktuelle Wert steht immer an =
    }
  }
}


Du kannst die Variablen auch direkt im Nextion füllen.

Code: [Select]
void TabellePM25()
{
zlWPM25++;
    char WPM25TC[15];
          dtostrf(MitPM25, 0, 1, WPM25TC);
Serial3.print("WertPM25.PM25M");// Stundenlauf
Serial3.print(zlWPM25);// Stundenlauf
Serial3.print(".");// Stundenlauf
Serial3.print("txt=\"");// Stundenlauf
Serial3.print(MitPM25);
          Serial3.write('"');
          Serial3.write(NexT, 3);

          Serial3.print("WertPM25.PM25Z");// Stundenlauf
Serial3.print(zlWPM25);// Stundenlauf
Serial3.print(".");// Stundenlauf
Serial3.print("txt=\"");// Stundenlauf
Serial3.print(Zeit);
          Serial3.write('"');
          Serial3.write(NexT, 3);

          if(zlWPM25 >= 24)
          {
            zlWPM25 = 0;
          }         
}


Das ist nicht ganz ohne... weil der Name der variable zerlegt wird.

Die Variable hat den Bezeichner PM25M0, PM25M1, PM25M2, u.s.w.

Der Zähler (zlWPM25) hängt an den Bezeichner (PM25M) einfach seinen Wert an.
Aus PM25M wird PM25M0, oder aus PM25M wird PM25M22.
So wird einfach in die betreffene Variable geschrieben.

So ein "RingBuffer" kannst Du Dir mit Variablen auch im Nextion aufbauen.
Dann mußt Du nur den aktuellen Wert übertragen, und im Nextion wird der Wert von einer
Variable zu nächsten verschonen. Ausgelöst wird das durch "cklick".
Gruß und Spaß
Andreas
P.S.
"Thread kann geschlossen werden"
lesen hilft...
die zweite Maus bekommt den Speck...

Da_Real_Snake

Hey,

nein das Problem war nicht das es nur 1 mal ausgelöst werden sollte. Beim Nextion ist es so das die Waveform nur "local" gesetzt werden kann und nicht "global" , das heißt jedes mal wenn man auf eine andere Seite geht wird die Waveform geleert.

Da ich für meinen Zweck aber die Werte da permanent haben will, war das nen Problem. Ich hab vill. auch erst einfach zu kompliziert gedacht und deswegen keine Lösung gefunden, ich hab dann ne Nacht drüber geschlafen und bin dann auf ne einfache Lösung gekommen.

Ich hab mir einfach einen Zusätzlich Button angelegt, quasi "Aktualisieren" :




Jedes mal wenn ich nun diesen Button drücke, Löscht er einmal das Diagram, teilt dann der Waveform mit das es nun mehrere Messwerte empfangen wird, mit dem "addt" Befehl, der durch eine Variable Messanzahl festgelegt wird und danach übertägt er die Daten aus dem Array.


Code: [Select]
   Serial.println("ButtonB14 gedrückt");
    String Toclear = "cle ";
    Toclear += 4;
    Toclear += ",";
    Toclear += 255;
    Serial1.print(Toclear);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);

    Serial.println("Werte werden übertragen!");

    String sendpoints = "addt ";
    sendpoints += 4;
    sendpoints += ",";
    sendpoints += 0;
    sendpoints += ",";
    sendpoints += MessAnzahl;
    Serial1.print(sendpoints);

    for (int i = 0; i < MessAnzahl; i = i + 1) {
 
    Serial.println(Messwerte[i]);
    String Tosend = "add ";
    Tosend += 4;
    Tosend += ",";
    Tosend += 0;
    Tosend += ",";
    Tosend += Messwerte[i];
    Serial1.print(Tosend);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);



Ich weiß nicht ob dies die Eleganteste Lösung ist aber sie funktioniert sehr einfach ^^
Ich bin noch Relativ neu was das alles angeht.

Danke Skoby für deinen Code und deine Hilfe mal wieder. Aber ich glaub das ist für mich schon wieder etwas kompliziert.

MFG Stefan

Go Up