Go Down

Topic: Arduino und Nextion als Sensorsteuerung: Keine Werte-Anzeige im Textfeld... (Read 4442 times) previous topic - next topic

Badger1875

Hoi Andreas,

eigentlich wollte ich mir das "neu schreiben" sparen. Ich hab grad mir anderen Sachen den Kopf noch so voll, dass ich gerne was funktionierendes als Grundlage genommen hätte.
Ich hatte eigentlich gedacht, dass die Anzeige eines bestehenden Wertes auf einem anderen Display kein so großes Hexenwerk sein kann.

Schade, dann werd ich wohl doch in den sauren Apfel beissen...


Das wirft mich allerdings wieder um eine lange Zeit zurück :-(

Danke trotzdem!

Grüße

Freddie

Serenifly

Du musst es nur richtig machen

Code: [Select]

char buffer_baer[6];

int z = 12345;

itoa(z, buffer_baer, 10);

Das ist alles. itoa() will den Wert als Integer Variable, einen Puffer der groß genug für den String + 1 ist und das Zahlensystem.

Badger1875

...steht doch schon alles geschrieben… hast Du es nicht beachtet?...
Zumindestens versuche ich es...

...Wenn DU- diesen Sketch "zusammengefrickelt hast, dann weißt auch nur DU- was
er macht. Dem ist aber wohl nicht so.
Eigentlich weiß ich es schon, mit dem Nokia macht das Teil genau das was ich will, ich möcht nur das kleine Nokia gegen ein größeres Display tauschen.

...Also klobbe mal die NextionLib in die Tonne und Deinen Sketch hinterher.
Da Du das ganze am Nextion betreiben willst, brauchst Du auch kein Nokia-
Display- auch in die Tonne.

Du machst doch nichts weiter, als mit dem Arduino einen Schrittmotor zu
steuern.
Besorge Dir also einen Sketch, der GENAU- mit dem Schrittmotor-das macht,
was Du möchtest.

Alle Eingaben/Ausgaben gibst Du über die serielle Schnittstelle aus!

Wenn das fehlerfrei läuft, dann hast Du die beste Grundlage für das Nextion.
Gruß und Spaß
Andreas
P.S.
Ja ich weiß, scheiß Vorschlag, bringt mich nicht weiter- blah, blah, blah.
Manchmal ist es aber besser einfach, einfach- von vorne zu beginnen.

In der Zwischenzeit hab ich angefangen, das Rad neu zu erfinden, mal sehn wie lange es dauert, bis es wieder rund läuft.

Nur um nochmal das eigentliche Problem darzustellen:
mein Script funktioniert in allen Bereichen so wie es soll, die Tastatureingaben werden übernommen und richtig angezeigt,die zwei daraus errechneten Zahlenwerte werden auf dem Nokia genau da wo sie sein sollen angezeigt. Auch der Schrittmotor macht genau das was er soll.
Nun möchte ich die Werte anstatt auf dem Nokia, auf dem Nextion an ähnlicher Stelle anzeigen. Leider habe ich fast keine Ahnung vom Nextion, habe aber meine Seiten so hinbekommen wie ich sie wollte und auch die für die Anzeige notwendigen Textfelder auf der Seite definiert.
Das es aber so schwer ist, sich nur zwei Werte anzeigen zu lassen zeigt mir, dass man sich nicht zu viel erhoffen darf...
Ich werde weiterwerkeln...

Trotzdem vielen Dank für eure Hilfe!

Grüße

Freddie

Tommy56

Die beiden Displays haben ein völlig anderes Konzept. Das Nokia wird vom Arduino direkt angesprochen. Das Nextion hat einen eigenen Prozessor. Dort muss einerseits das Display selbst programmiert werden, anderseits die Datenübertragung zum Display.

Das kann man nicht miteinander vergleichen.

Das Nextion kann viel mehr, als das Nokia. Es erfordert aber auch mehr Einarbeitungsaufwand. Das zu akzeptieren, scheint Dein Problem zu sein.

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

SkobyMobil

Hallo,
na gut. Gehen wir einmal davon aus "auf dem Nokia genau da wo sie sein sollen angezeigt"

Mach von Deinem Sketch mal eine Si-Kopie.
Nun nimmst Du das Original und löscht alles raus, was mit dem Nokia zu tun.
Zeilen und Libs fürs Nokia.
Mit Serial.println(meinWert) bringst Du alles im original Format auf den seriellen Monitor.
Wenn der serielle Monitor alles genau so richtig anzeigt wie das Nokia voher, dann meldest Du Dich noch
einmal.
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

Badger1875

Hi Andreas,

nett dass Du nicht aufgibst und mir weiter helfen willst...

...ein großes DANKE dafür!

Also,

das Script hab ich jetzt von allem befreit, was fürs Nokia gedacht war und im seriellen Monitor zeigt das Teil auch alles so an wie es sein soll.

Zum Verständnis hab ich da noch im Script Marker mit eingefügt, damit ich sehe ob das Ergebnis aus so passt wie es soll.

Code: [Select]
/* Arduino Mega 2560
 * Schrittmotor - Steuerung für Sensorpositionierung
 */


// Laden der Baugruppenbibliotheken
#include <Keypad.h>       // Keypad Library
#include <AccelStepper.h> // AccelStepper Library



// Festlegen der Variablen
// Tastatur
volatile int ersteziffer=99;
volatile int zweiteziffer=99;
volatile int dritteziffer=99;
volatile int vierteziffer=99;


// Berechnung
long eingabe=0; //speichert die berechnete Eingabe
String baer = ""; //Position Baer


// Tastatur
const byte ROWS = 4; //4 Reihen
const byte COLS = 4; // 4 Spalten
char keys[ROWS][COLS] = {
  {'1','2','3','F'},
  {'4','5','6','E'},
  {'7','8','9','D'},
  {'A','0','B','C'}
};
byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {31, 33, 35, 37};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

                                                                   
// AccelStepper Treiber Setup
AccelStepper stepper(1, A0, A1); // 1 = Easy Driver Interface, Arduino A0 verbunden mit STEP Pin von Easy Driver, Arduino A1 verbunden mit DIR Pin von Easy Driver


// Programmvorbereitung
void setup() {

Serial.begin(9600);

  stepper.setMaxSpeed(4800);  // Setzt die Geschwindigkeit des Schrittmotors
  stepper.setAcceleration(2400);  //  Setzt die Beschleunigung des Schrittmotors 
}


// Programmabschnitt
void loop() {
  char keypressed = keypad.getKey();  // Welche Taste wurde gedrückt
  if (keypressed != NO_KEY){  // Übernahme des der gedrückten Taste hinterlegten Wertes
    switch (keypressed) {
     
      case '1':
        checknumber(1);
      break;
       
      case '2':
        checknumber(2);
      break;
 
      case '3':
        checknumber(3);
      break;
 
      case 'F':
        checknumber(780);
      break;
     
      case '4':
        checknumber(4);
      break;
     
      case '5':
        checknumber(5);
      break;
 
      case '6':
        checknumber(6);
      break;
 
      case 'E':
        checknumber(850);
      break;

      case '7':
        checknumber(7);
      break;
       
      case '8':
        checknumber(8);
      break;
 
      case '9':
        checknumber(9);
      break;
 
      case 'D':
        checknumber(1000);
      break;
 
      case 'A':
        deletenumber();
      break;

      case '0':
        checknumber(0);
      break;     

      case 'B':
        calculatedistance();
      break;     
 
      case 'C':
        checknumber(1250);
      break;
    }
  }
}

// Aufbereiten der eingegebenen Ziffern zu einer 1-4 - stelligen Zahl
void checknumber(int x){
  if (ersteziffer == 99) { // Prüfen ob erste Ziffer eingegeben wurde
    ersteziffer=x;
    String displayvalue = String(ersteziffer);  //  Wandelt die Eingabe in einen String um
    drawnextionscreen(displayvalue); // Wiederaufbau Nextion LCD Display
    Serial.println(displayvalue);
   
  } else {
  if (zweiteziffer == 99) { // Prüfen ob zweite Ziffer eingegeben wurde
    zweiteziffer=x;    String displayvalue = String (ersteziffer) + String(zweiteziffer);  //  Wandelt die Eingabe in einen String um
    drawnextionscreen(displayvalue); // Wiederaufbau Nextion LCD Display
    Serial.println(displayvalue);
   
  } else {
  if (dritteziffer == 99) { // Prüfen ob dritte Ziffer eingegeben wurde
    dritteziffer=x;
    String displayvalue = String (ersteziffer) + String(zweiteziffer) + String(dritteziffer);  //  Wandelt die Eingabe in einen String um
    drawnextionscreen(displayvalue); // Wiederaufbau Nextion LCD Display
    Serial.println(displayvalue);
   
   
  } else {  // Prüfen ob vierte Ziffer eingegeben wurde
      vierteziffer=x;
      String displayvalue = (String(ersteziffer) + String(zweiteziffer) + String(dritteziffer) + String(vierteziffer));
      drawnextionscreen(displayvalue);
      Serial.println(displayvalue);
     
      }
    }
  }
}

void deletenumber() {  // löscht die letzte eingegebene Ziffer
  if (vierteziffer !=99) {
      String displayvalue = String(ersteziffer) + String(zweiteziffer) + String(dritteziffer);
      drawnextionscreen(displayvalue); // Wiederaufbau Nextion LCD Display
      Serial.println(displayvalue);
       
      vierteziffer=99;
  }
  else {
    if (dritteziffer !=99) {
      String displayvalue = String(ersteziffer) + String(zweiteziffer);
      drawnextionscreen(displayvalue); // Wiederaufbau Nextion LCD Display
      Serial.println(displayvalue);
       
      dritteziffer=99;
   }
  else {
    if (zweiteziffer !=99) {
      String displayvalue = String(ersteziffer);
      drawnextionscreen(displayvalue); // Wiederaufbau Nextion LCD Display
      Serial.println(displayvalue);
       
      zweiteziffer=99;
   } 
  else {
     if (ersteziffer !=99) {
       String displayvalue = "";
       drawnextionscreen(displayvalue); // Wiederaufbau Nextion LCD Display
       Serial.println(displayvalue);
       
       ersteziffer=99;
        }
      }
    }
  }
}

void calculatedistance() {  // Berechnet aus den eingegebenen Ziffern eine bis zu 4-stellige Zahl
 
    if (vierteziffer == 99 && dritteziffer == 99 && zweiteziffer == 99 && ersteziffer != 99) {
      eingabe=ersteziffer;
      movestepper(eingabe);
    }

     if (zweiteziffer != 99 && dritteziffer == 99) {
      eingabe=(ersteziffer*10)+zweiteziffer;
      movestepper(eingabe);
    }

     if (dritteziffer != 99 && vierteziffer == 99) {
      eingabe=(ersteziffer*100)+(zweiteziffer*10)+dritteziffer;
      movestepper(eingabe);
    }

     if (vierteziffer != 99) {
      eingabe=(ersteziffer*1000)+(zweiteziffer*100)+(dritteziffer*10)+vierteziffer;
      movestepper(eingabe);
    }
   
    resetnumbers(); // Löscht die letzte Eingabe
  }

void movestepper(long z) {  //  Startet Schrittmotor
 
  long calculatedmove=((z*1600)/40);  //  Berechnet die Schrittzahl anhand der neuen Eingabe
  stepper.runToNewPosition(calculatedmove);
  baer = String(z);
  Serial.print("IST - Position ");
  Serial.print(baer);
  Serial.print(" /");
 
}

 
void resetnumbers() {  // Löschen der letzten Zahl
  ersteziffer=99;
  zweiteziffer=99;
  dritteziffer=99;
  vierteziffer=99;
}


// Anzeige der aktuellen Position des Baers
 void drawnextionscreen(String y) {
    Serial.print("Eingabe ");
    Serial.print(y);
    Serial.print(" /");
    Serial.print("SOLL - Position ");
    Serial.print(baer);
    Serial.print(" /");
}



Wenn ich nun mit dem Keypad Werte eingebe, Zeigt mir der Serial Monitor:

Code: [Select]
Eingabe 8 /SOLL - Position  /8
Eingabe 80 /SOLL - Position  /80
IST - Position 80 /Eingabe 4 /SOLL - Position 80 /4
Eingabe 40 /SOLL - Position 80 /40
Eingabe 400 /SOLL - Position 80 /400
IST - Position 400 /Eingabe 0 /SOLL - Position 400 /0
IST - Position 0 /Eingabe 5 /SOLL - Position 0 /5
Eingabe 50 /SOLL - Position 0 /50
IST - Position 50 /Eingabe 4 /SOLL - Position 50 /4
Eingabe 40 /SOLL - Position 50 /40
Eingabe 400 /SOLL - Position 50 /400
Eingabe 40 /SOLL - Position 50 /40
Eingabe 4 /SOLL - Position 50 /4
Eingabe  /SOLL - Position 50 /
Eingabe 8 /SOLL - Position 50 /8
Eingabe 80 /SOLL - Position 50 /80
Eingabe 800 /SOLL - Position 50 /800
IST - Position 800 /Eingabe 6 /SOLL - Position 800 /6
Eingabe 60 /SOLL - Position 800 /60
IST - Position 60 /Eingabe 5 /SOLL - Position 60 /5
IST - Position 5 /Eingabe 6 /SOLL - Position 5 /6
Eingabe 60 /SOLL - Position 5 /60
IST - Position 60 /Eingabe 0 /SOLL - Position 60 /0
IST - Position 0 /


In der ersten Zeile hab ich als 1. Ziffer "8", als 2. Ziffer "0" eingegeben (siehe "Eingabe ", der Wert "80" wird korrekt berechnet und angezeigt, nach der Zeit für das Verfahren des Schrittmotors wird die "80" in der "IST - Position" angezeigt. Alle weiteren Eingaben wurden ebenfalls korrekt berechnet und angezeigt.

Wie schon weiter oben erwähnt, hab ich die Anzeigeseite für das Nextion mit zwei Textfeldern "t0" und "t1" versehen, die lassen sich aber auch schnell in etwas anderes ändern...

Wie krieg ich nun die Werte aufs Nextion?


Schonmal im Voraus ein wiederholtes großes DANKE!


Freddie,

der jetzt nicht mehr ganz hoffnungslos ist...

SkobyMobil

Hallo,
mal sehen, ob wir das hinkriegen…

Ich habe das einmal rausgepickt:

Code: [Select]
// Anzeige der aktuellen Position des Baers
 void drawnextionscreen(String y)
{
    Serial.print("Eingabe ");
    Serial.print(y);
    Serial.print(" /");
    Serial.print("SOLL - Position ");
    Serial.print(baer);
    Serial.print(" /");
}


da würde ich folgendes löschen

Code: [Select]
Serial.print("Eingabe ");
Serial.print(" /");
Serial.print("SOLL - Position ");
Serial.print(" /");


dann bleiben

Code: [Select]
Serial.print(y);
Serial.print(baer);


diese Werte brauchst Du für das Nextion

Im Nextion legst Du jetzt auf "page 0" zwei Textfelder an.
Diese setzt Du unter Attribute auf "global"
(wenn Du später eine Seite hinzufügst, dann bleiben die Werte erhalten)

Textfled 1 bekommt den Name "Eingabe"
Textfled 2 bekommt den Name "SPosition"

NextionIntern ist das dann "Eingabe.txt" und "SPosition.txt"

Nun klickst Du im Editor auf den Menüpunkt "Debug". Es sollte kein Fehler
auftreten und sich im Vordergrund ein Fenster* öffnen.
Das ist die Ansicht, wie sie später auf dem Display erscheint.

Jetzt hast Du im Editor unten links ein Fenster mit dem Titel:
Instruction Input Area:
Dort klickst Du rein und gibst folgendes ein:

Eingabe.txt="4711"

mit Enter bestätigen

dann gibst Du ein

SPosition.txt="0815"

mit Enter bestätigen

Jetzt ist das eine Textfeld mit 4711- und das andere mit 0815 gefüllt.

Jetzt schließt Du das Fenster* wieder.
Das Ganze macht jetzt einen laufenden Eindruck.

Nun verbindest Du das Nextion seriell mit Deinem PC und im Editor
betätigst Du oben im Menü "Upload"
Es geht wieder ein Fenster auf, bestätigen- und das Programm wird auf das
Display übertragen.

Nach der Übertragung beendest Du das ganze Zeugs und verbindest das Nextion
mit EINER seriellen (NICHT TX0/RX0) Schnittstelle des Arduino.

Ich nenne diese Schnittstelle hier einmal "Serial2"

Wenn Du der Meinung bist, das alles richtig angeschlossen, konfiguriert und
verdrahtet ist, dann öffnest Du Deinen Sketch.

Diese Funktion sollte jetzt folgenden Inhalt haben:

Code: [Select]
void drawnextionscreen(String y)
{
Serial.print(y);
Serial.print(baer);
}


DIE- änderst Du jetzt

Code: [Select]
void drawnextionscreen(String y)
{
// Serial.print(y);
// Serial.print(baer);

byte NexT[3] = {255,255,255};

char EGB[15];
dtostrf(y, 0, 1, EGB);

char POS[15];
dtostrf(baer, 0, 1, POS);

Serial2.print("Eingabe.txt=\"");
Serial2.print(EGB);
Serial2.write('"');
Serial2.write(NexT,3);
 
Serial2.print("SPosition.txt=\"");
Serial2.print(POS);
Serial2.write('"');
Serial2.write(NexT,3);
}


Wenn diese Funktion aufgerufen wird, dann werden die Werte übertragen und
auf dem Nextion dargestellt.

Gruß und Spaß
Andreas

die zweite Maus bekommt den Speck...

Badger1875

Servus Andreas,

vielen Dank für die Hilfe!

Die Seite für Nextion hab ich erstellt, die Textfelder nach deinen Angaben definiert und mit 'Debug' getestet: hat funktioniert!
Danach hab ich das Script mit "copy" und "paste"

Code: [Select]
void drawnextionscreen(String y)
{
//    Serial.print("Eingabe ");
//    Serial.print(y);
//    Serial.print(" / ");
//    Serial.print("WAR BEI - Position ");
//    Serial.print(baer);
//    Serial.print(" / SOLL NACH - Position Eingabe ");

byte NexT[3] = {255,255,255};

char EGB[15];
dtostrf(y, 0, 1, EGB);

char POS[15];
dtostrf(baer, 0, 1, POS);

Serial2.print("Eingabe.txt=\"");
Serial2.print(EGB);
Serial2.write('"');
Serial2.write(NexT,3);
 
Serial2.print("SPosition.txt=\"");
Serial2.print(POS);
Serial2.write('"');
Serial2.write(NexT,3);

}


geändert, aber ein Kompilieren danach wird abgebrochen mit

Code: [Select]
E:\Arbeitsordner\Freddie\Arduino\Sensorsteuerung\Sensor_1_serial_v6\Sensor_1_serial_v6.ino: In function 'void drawnextionscreen(String)':

Sensor_1_serial_v6:282: error: cannot convert 'String' to 'double' for argument '1' to 'char* dtostrf(double, signed char, unsigned char, char*)'

 dtostrf(y, 0, 1, EGB);

                     ^

Sensor_1_serial_v6:285: error: cannot convert 'String' to 'double' for argument '1' to 'char* dtostrf(double, signed char, unsigned char, char*)'

 dtostrf(baer, 0, 1, POS);

                        ^

exit status 1
cannot convert 'String' to 'double' for argument '1' to 'char* dtostrf(double, signed char, unsigned char, char*)'

...

Grüße

Freddie

SkobyMobil

Hallo,
y und baer müssen Zahl (int, float) sein. KEIN Text.


 Serial2.print("Eingabe.txt=\"");
    Serial2.print("y");     oder    Serial2.print(y);
    Serial2.write('"');
Serial2.write(NexT,3);

probiere das mal


Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

Serenifly

Die Fehlermeldung ist doch eindeutig:

Quote
cannot convert 'String' to 'double' for argument '1' to 'char* dtostrf(double, signed char, unsigned char, char*)
Sagt genau was falsch ist

Das erste Argument muss double sein. Du übergibst String. Das wird explizit gesagt und du siehst auch an der Funktions-Signatur was erwartet wird

Badger1875

Hallo Serenifly,

gut, nun weiß ich was falsch ist, aber wer sagt mir wie ich das nun richtig mache?

Wenn ich es wissen würde, würde ich hier nicht fragen :smiley-confuse:


Danke für´s Helfen!!!


Freddie

SkobyMobil

die zweite Maus bekommt den Speck...

Badger1875

@ Andreas,

die Fehlermeldung verweist immer noch auf 'dtostrf', wie oben schon gepostet...

Freddie

SkobyMobil

Hallo,
das hast Du probiert?

 Serial2.print("Eingabe.txt=\"");
    Serial2.print("y");     oder    Serial2.print(y);
    Serial2.write('"');
Serial2.write(NexT,3);

Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

Badger1875

Hi Andreas,
das von Dir vorgeschlagene
Code: [Select]
      Serial2.print("Eingabe.txt=\"");
//    Serial2.print("y");
//    Serial2.print(y);
      Serial2.write('"');
      Serial2.write(NexT,3);

hab ich auch anstelle des vorherigen Codes eingetragen, bleibt das
Code: [Select]
byte NexT[3] = {255,255,255};

char EGB[15];
dtostrf(y, 0, 1, EGB);

char POS[15];
dtostrf(baer, 0, 1, POS);

davor stehen? Wenn ja, kommt die gleiche Fehlermeldung...

Freddie



Go Up