- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 9 von 9

Thema: Nicht nur für Arduino: Preiswerte Displays mit "Intelligenz"-> Nextion!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.213
    @cdk Danke. Hab das korrigiert.

    Zur Performance Erkenntnisse: ich hab gestern noch ein bisschen herumprobiert und, wenn man screenfüllende Bitmaps lädt, dann dauert das geschätzt eine halbe Sekunde. In meinem Fall sind das schon recht grosse: 480x320. Man sieht dann deutlich, wie sich der Bildschirm von links nach rechts aufbaut, aber nur als "flackern".
    Kann man aber mit leben (es ist nur optisch unschön), eine flüssige Bedienung ist damit allemal möglich-man muss ja die betreffende Seite auch erst "wahrnehmen".
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  2. #2
    HaWe
    Gast
    Zitat Zitat von Rabenauge Beitrag anzeigen
    @cdk Danke. Hab das korrigiert.

    Zur Performance Erkenntnisse: ich hab gestern noch ein bisschen herumprobiert und, wenn man screenfüllende Bitmaps lädt, dann dauert das geschätzt eine halbe Sekunde. In meinem Fall sind das schon recht grosse: 480x320. Man sieht dann deutlich, wie sich der Bildschirm von links nach rechts aufbaut, aber nur als "flackern".
    Kann man aber mit leben (es ist nur optisch unschön), eine flüssige Bedienung ist damit allemal möglich-man muss ja die betreffende Seite auch erst "wahrnehmen".
    Die "Schnelliggkeit" eines Displays und seiner Treiber bemisst sich ja gerade in der Geschwindigkeit, in der es in der Lage ist, Texte und Grafiken in schneller Folge anzuzeigen, und zwar direkt, ungepuffert.
    En solcher Test ist ja in einem bereits verlinkten Video (von Marek Buriak) sehr gut zu erkennen, und man sieht, welche Performancesteigerung erreichbar ist, wenn man nur andere Treiberprogramme verwendet:

    https://www.youtube.com/watch?v=vnEwzN14BsU

    Ähnliche Benchmarktests gibt es auch von allen möglichen anderen Grafiktreiber-Libs, nur alle sind sie immer ein wenig anders, also nicht direkt vergleichbar.

    Auch in "meinem" benchmark passiert nichts anderes, auch ich mache nur direkt aufeinanderfolgede Display-Ausgaben (verschiedene ungepufferte Textzeilen und verschiedene ungepufferte Grafiken, wie Linien, Kreise, Dreiecke, Rechtecke, Ellipsen, nur umrandet oder auch gefüllt), so wie man sie auch im täglichen Leben auf Grafikdisplays braucht. A-Bär: Mein test ist vereinfacht und standardisiert für etliche verschiedene Plattformen, jetzt kann man die Leistung direkt miteinander vergleichen.

    Hier kann man extrem gut die Performance auf verschiedenen Pattformen (MCUs, SoCs, TFTs) beurteilen, und da die sehr simplen Display-Befehle in allen gängigen Grafik-Libs (H.Karlsen UTFT, Adafruit GFX, Marek.Buriak) vorhanden sind und auch sehr ähnlich aussehen, müsste es sehr einfach sein, diesen auch aufs Nextion anzuwenden, denn genau das ist es doch, was man auch für seine eigenen Grafik-Programme benötigt, und auch dann will man ja nichts anderes als mal eben ein paar Kreise (Tachometer), Rechtecke (Rahmen), Zeiger (Linien, Dreiecke) und Zahlen und Beschriftungen (Text) auf verschiedenen Farb-Hintergründen (gefüllte Flächen) anzuzeigen.

    Daher nochmal der Testcode für Adafruit (identischer Code auf ILI9341 und auf OLED SSD1306), zum Vergleich auch für Marek Buriaks ILI9341 - man sieht, wie ähnlich die Codes einander sind:

    Code:
    // hw brickbench
    // Adafruit ILI9340 / ILI9341
    
    #include "SPI.h"
    #include "Adafruit_GFX.h"
    #include "Adafruit_ILI9340.h"
    
    
    // for Due/Mega/Leonardo use the hardware SPI pins (which are different)
    
    #define _cs 10
    #define _dc 9
    #define _rst 8
    
    
    // Using software SPI is really not suggested, its incredibly slow
    // Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _mosi, _sclk, _rst, _miso);
    // Use hardware SPI
    
    Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);
    
    
    
    #define  WHITE     ILI9340_WHITE
    #define  TimerMS() millis()
    
    unsigned long runtime[8];
    
    
    void TFTprint(char sbuf[], int16_t x, int16_t y) {
      tft.setCursor(x, y);
      tft.print(sbuf);
    }
       
    
    inline void displayValues() {
    
      char buf[120];
      tft.fillScreen(ILI9340_BLACK); // clrscr()
    
        sprintf (buf, "%3d %9ld  int_Add",    0, runtime[0]); TFTprint(buf, 0,10);
        sprintf (buf, "%3d %9ld  int_Mult",   1, runtime[1]); TFTprint(buf, 0,20);
        sprintf (buf, "%3d %9ld  float_op",   2, runtime[2]); TFTprint(buf, 0,30);
        sprintf (buf, "%3d %9ld  randomize",  3, runtime[3]); TFTprint(buf, 0,40);
        sprintf (buf, "%3d %9ld  matrx_algb", 4, runtime[4]); TFTprint(buf, 0,50);
        sprintf (buf, "%3d %9ld  arr_sort",   5, runtime[5]); TFTprint(buf, 0,60);
        sprintf (buf, "%3d %9ld  TextOut",    6, runtime[6]); TFTprint(buf, 0,70);
        sprintf (buf, "%3d %9ld  Graphics",   7, runtime[7]); TFTprint(buf, 0,80);
       
       
    }
    
    
    int32_t test_TextOut(){
      int  y;
      char buf[120];
     
      for(y=0;y<20;++y) {   
        tft.fillScreen(ILI9340_BLACK); // clrscr()
        sprintf (buf, "%3d %9d  int_Add",    y, 1000);  TFTprint(buf, 0,10);
        sprintf (buf, "%3d %9d  int_Mult",   0, 1010);  TFTprint(buf, 0,20);
        sprintf (buf, "%3d %9d  float_op",   0, 1020);  TFTprint(buf, 0,30);
        sprintf (buf, "%3d %9d  randomize",  0, 1030);  TFTprint(buf, 0,40);
        sprintf (buf, "%3d %9d  matrx_algb", 0, 1040);  TFTprint(buf, 0,50);
        sprintf (buf, "%3d %9d  arr_sort",   0, 1050);  TFTprint(buf, 0,60);
        sprintf (buf, "%3d %9d  displ_txt",  0, 1060);  TFTprint(buf, 0,70);
        sprintf (buf, "%3d %9d  testing...", 0, 1070);  TFTprint(buf, 0,80);
    
      }
      return y;
    }
    
    
    int32_t test_graphics(){
      int y;
      char buf[120];
     
     
      for(y=0;y<100;++y) {
        tft.fillScreen(ILI9340_BLACK);
        sprintf (buf, "%3d", y);  TFTprint(buf, 0,80); // outcomment for downwards compatibility
    
        tft.drawCircle(50, 40, 10, WHITE);
        tft.fillCircle(30, 24, 10, WHITE);
        tft.drawLine(10, 10, 60, 60, WHITE);
        tft.drawLine(50, 20, 90, 70, WHITE);
        tft.drawRect(20, 20, 40, 40, WHITE);
        tft.fillRect(65, 25, 20, 30, WHITE);
        tft.drawEclipse(70, 30, 15, 20); //  original test
        // tft.drawCircle(70, 30, 20, WHITE); // alternatively, just if no drawEclipse is avaiable in the Arduino graph libs!
    
      }
      return y;
    }
    
    
    
    int test(){
    
      unsigned long time0, x, y;
      double s;
      char  buf[120];
      int   i;
      float f;
    
     
     
      // lcd display text / graphs
     
      time0=TimerMS();
      s=test_TextOut();
      runtime[6]=TimerMS()-time0;
      sprintf (buf, "%3d %9ld  TextOut", 6, runtime[6]); Serial.println( buf);
      TFTprint(buf, 0,70);
     
      time0=TimerMS();
      s=test_graphics();
      runtime[7]=TimerMS()-time0;
      sprintf (buf, "%3d %9ld  Graphics", 7, runtime[7]); Serial.println( buf);
      TFTprint(buf, 0,80);
     
    
      Serial.println();
     
      y = 0;
      for (x = 0; x < 8; ++x) {
          y += runtime[x];
      }
     
      displayValues();
     
      sprintf (buf, "gesamt ms: %9ld ", y);
      Serial.println( buf);
      TFTprint(buf, 0,110);
     
      x=50000000.0/y;
      sprintf (buf, "benchmark: %9ld ", x);
      Serial.println( buf);
      TFTprint(buf, 0,120);
    
      return 1;
    
    }
    
    
    
    void setup() {
     
      Serial.begin(9600);
     
      // Setup the LCD
      tft.begin();
      tft.setTextColor(ILI9340_WHITE); tft.setTextSize(1);
     
    }
    
    void loop() {
      char  buf[120];
      test();
     
      sprintf (buf, "Ende HaWe brickbench");   
      Serial.println( buf);
      TFTprint(buf, 0, 140);
     
      while(1);
    }
    Code:
    // hw brickbench
    // ILI9341_due NEW lib by Marek Buriak http://marekburiak.github.io/ILI9341_due/
    
    
    #include <SPI.h>
    
    #include "ILI9341_due_config.h"
    #include "ILI9341_due.h"
    #include "SystemFont5x7.h"
    //#include "Streaming.h"
    
    // For the Adafruit shield, these are the default.
    /*
    #define TFT_RST 8
    #define TFT_DC 9
    #define TFT_CS 10
    // Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
    */
    
    #define    tft_cs     49
    #define    tft_dc     48
    #define    tft_rst     0
    
    
    ILI9341_due tft = ILI9341_due(tft_cs, tft_dc); // <<<<<<<<<<<<<<<<<<<< drop RESET pin !
    
    char textBuff[20];
    
    // Color set
    #define   BLACK           0x0000
    #define   RED             0xF800
    #define   GREEN           0x07E0
    //#define   BLUE            0x001F
    #define   BLUE            0x102E
    #define CYAN            0x07FF
    #define MAGENTA         0xF81F
    #define YELLOW          0xFFE0
    #define ORANGE          0xFD20
    #define GREENYELLOW     0xAFE5
    #define DARKGREEN       0x03E0
    #define WHITE           0xFFFF
    
    uint16_t  color;
    uint16_t  colorFONDO = BLACK;
    
    
    #define  TimerMS() millis()
    
    unsigned long runtime[8];
    
    
    void TFTprint(char sbuf[], int16_t x, int16_t y) {
      tft.cursorToXY(x, y);
      tft.printAt(sbuf,x,y);
    }
       
    
    inline void displayValues() {
    
      char buf[120];
      tft.fillScreen(BLACK); // clrscr()
    
        sprintf (buf, "%3d %9ld  int_Add",    0, runtime[0]); TFTprint(buf, 0,10);
        sprintf (buf, "%3d %9ld  int_Mult",   1, runtime[1]); TFTprint(buf, 0,20);
        sprintf (buf, "%3d %9ld  float_op",   2, runtime[2]); TFTprint(buf, 0,30);
        sprintf (buf, "%3d %9ld  randomize",  3, runtime[3]); TFTprint(buf, 0,40);
        sprintf (buf, "%3d %9ld  matrx_algb", 4, runtime[4]); TFTprint(buf, 0,50);
        sprintf (buf, "%3d %9ld  arr_sort",   5, runtime[5]); TFTprint(buf, 0,60);
        sprintf (buf, "%3d %9ld  TextOut",    6, runtime[6]); TFTprint(buf, 0,70);
        sprintf (buf, "%3d %9ld  Graphics",   7, runtime[7]); TFTprint(buf, 0,80);
       
       
    }
    
    
    int32_t test_TextOut(){
      int  y;
      char buf[120];
     
      for(y=0;y<20;++y) {   
        tft.fillScreen(BLACK); // clrscr()
        sprintf (buf, "%3d %9d  int_Add",    y, 1000);  TFTprint(buf, 0,10);
        sprintf (buf, "%3d %9d  int_Mult",   0, 1010);  TFTprint(buf, 0,20);
        sprintf (buf, "%3d %9d  float_op",   0, 1020);  TFTprint(buf, 0,30);
        sprintf (buf, "%3d %9d  randomize",  0, 1030);  TFTprint(buf, 0,40);
        sprintf (buf, "%3d %9d  matrx_algb", 0, 1040);  TFTprint(buf, 0,50);
        sprintf (buf, "%3d %9d  arr_sort",   0, 1050);  TFTprint(buf, 0,60);
        sprintf (buf, "%3d %9d  displ_txt",  0, 1060);  TFTprint(buf, 0,70);
        sprintf (buf, "%3d %9d  testing...", 0, 1070);  TFTprint(buf, 0,80);
    
      }
      return y;
    }
    
    
    int32_t test_graphics(){
      int y;
      char buf[120];
     
     
      for(y=0;y<100;++y) {
        tft.fillScreen(BLACK);
        sprintf (buf, "%3d", y);  TFTprint(buf, 0,80); // outcomment for downwards compatibility
    
        tft.drawCircle(50, 40, 10, WHITE);
        tft.fillCircle(30, 24, 10, WHITE);
        tft.drawLine(10, 10, 60, 60, WHITE);
        tft.drawLine(50, 20, 90, 70, WHITE);
        tft.drawRect(20, 20, 40, 40, WHITE);
        tft.fillRect(65, 25, 20, 30, WHITE);
        //tft.drawEllipse(70, 30, 15, 20, WHITE); //  original test
        tft.drawCircle(70, 30, 20, WHITE); // alternatively, just if no drawEclipse is avaiable in the Arduino graph libs!
    
      }
      return y;
    }
    
    
    
    int test(){
    
      unsigned long time0, x, y;
      double s;
      char  buf[120];
      int   i;
      float f;
    
     
     
      // lcd display text / graphs
     
      time0=TimerMS();
      s=test_TextOut();
      runtime[6]=TimerMS()-time0;
      sprintf (buf, "%3d %9ld  TextOut", 6, runtime[6]); Serial.println( buf);
      TFTprint(buf, 0,70);
     
      time0=TimerMS();
      s=test_graphics();
      runtime[7]=TimerMS()-time0;
      sprintf (buf, "%3d %9ld  Graphics", 7, runtime[7]); Serial.println( buf);
      TFTprint(buf, 0,80);
     
    
      Serial.println();
     
      y = 0;
      for (x = 0; x < 8; ++x) {
          y += runtime[x];
      }
     
      displayValues();
     
      sprintf (buf, "gesamt ms: %9ld ", y);
      Serial.println( buf);
      TFTprint(buf, 0,110);
     
      x=50000000.0/y;
      sprintf (buf, "benchmark: %9ld ", x);
      Serial.println( buf);
      TFTprint(buf, 0,120);
    
      return 1;
    
    }
    
    
    
    void setup() {
     
      Serial.begin(115200);
     
      // Setup the LCD
    
      tft.begin();
      tft.setRotation(iliRotation270);
      tft.fillScreen(colorFONDO);
      tft.setFont(SystemFont5x7);
    
      tft.setTextColor(WHITE);
    
      Serial.println("tft started");
     
    }
    
    void loop() {
      char  buf[120];
      test();
     
      sprintf (buf, "Ende HaWe brickbench");   
      Serial.println( buf);
      TFTprint(buf, 0, 140);
     
      while(1);
    }

    weitere flink portierte Testcodes ab hier (runterblättern): http://www.mindstormsforum.de/viewto...&t=8491#p68170,
    komplette Benchmark-Tests (außer Grafik auch Rechenperformance) finden sich ab hier: http://www.mindstormsforum.de/viewto...&t=8095#p63773

    Dieser Brickbench Test läuft sogar ohne nennenswerte Änderungen auf einem Raspi mit 1080p HDMI screen und openVG Grafik, oder alternativ auf einem Raspi mit SSD1306 oder SH1106 OLED per I2C
    http://www.mindstormsforum.de/viewto...p=67838#p67839
    http://www.mindstormsforum.de/viewto...p=69371#p69370
    und sogar auf Lego NXTs und EV3s mit NXC, nxtOSEK C, RobotC, GCC C++, Java, C# und ev3Basic!

    Und Code-Änderungen (z.B. andere Grafiken als Zusatz oder Ersatz, an anderer Stelle) müsste man in der Praxis für eigene Programme/Projekte ebenso schnell und simpel umschreiben können.

    Daher würde ich auch fürs Nextion erwarten, dass man in ähnlicher Weise ruck-zuck diesen einfachen Testcode portieren können müsste.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.213
    Hm- dann mach das doch einfach mal.
    Sicher geht das, dass man dem Teil sagt: zeichne dies, zeichne jenes, und lass dabei mal die Stoppuhr mitlaufen.
    Mir aber ist es zu mühselig denn, egal, welchen tollen Benchmark man laufen lässt, schneller wirds davon dann auch nicht.
    Also rein akademische Forschung.
    Sicherlich, nicht uninteressant-aber meine Wetterstation fasziniert mich da entschieden mehr.
    Aber wenn du willst, dann schreib mal was fürs Nextion- der Editor ist frei und kostenlos verfügbar, kannst du also machen. Das kann ich dann gerne mal einspielen, und dir die Resultate geben.
    Ich brauch dann lediglich die, für _mein_ Display compilierte Datei, die ist schnell mal eingespielt.
    Es ist das NX4832T035.
    Falls du den Arduino einbeziehen willst: es hängt ein MEGA 2560 dran, Schnittstelle ist Serial1.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  4. #4
    HaWe
    Gast
    neinnein, das muss schon jemand machen, der da eingearbeitet ist und die API Funktionen kennt, aber schließlich sind es doch nur solche wie
    tft.setCursor(x, y);
    tft.print(strbuf);
    oder
    tft.fillCircle(x, y, radius, color);

    alle wie in meinem Code eben auch
    - oder?

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.213
    Lies die verdammte Anleitung.
    "Im Prinzip, ja".
    Ganz ehrlich: den Test würd ich machen, wenn ich ein *.hmi-File hätte, aber das selber umsetzen-nee, wozu denn.
    Wie oben schon geschrieben: mir bringt so ein Benchmark nix, weil das Display davon auch nich schneller wird, warum also Zeit darauf verschwenden?
    Soviel davon hab ich auch wieder nicht....
    Ganz einfach eigentlich: du willst den Test-dann schreib ihn.
    Oder wer anderer-ich hab zu tun.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  6. #6
    HaWe
    Gast
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Lies die verdammte Anleitung.
    "Im Prinzip, ja".
    Ganz ehrlich: den Test würd ich machen, wenn ich ein *.hmi-File hätte, aber das selber umsetzen-nee, wozu denn.
    Wie oben schon geschrieben: mir bringt so ein Benchmark nix, weil das Display davon auch nich schneller wird, warum also Zeit darauf verschwenden?
    Soviel davon hab ich auch wieder nicht....
    Ganz einfach eigentlich: du willst den Test-dann schreib ihn.
    Oder wer anderer-ich hab zu tun.
    also, ich habe doch das Display gar nicht, wie soll ich da den Test laufen lassen?
    Auch später, für eigene Projekte, wo Turtlegrafiken (Roboter-Weg über die Zeit plus entdeckte Hindernisse aufzeichnen) bewegte Figuren bei Spielen (Pong, Moonlander, Conway's Game of Life), Oszillografen (graph. Monitoring von Analog-Werten) oder einfach auch mal abwechselnd nur ein paar tabellarische Zahlenwerte und Textstrings (z.B. fürs Debuggen) gebraucht werden, muss ich doch schnell mal ein paar Dinge auf dem Display ausgeben können, und das flexibel, für mehrere verschiedene aktuelle Projekt-Programme willkürlich, bedarfsmäßig, abwechselnd nacheinander.
    Aber wenn das so kompliziert ist, eben mal ein paar Textzeilen, Kreise und Rechtecke nacheinander in for() Schleifen durchlaufen zu lassen, dann weiß ich ehrlich gesagt nicht, ob das Teil wirklich empfehlenswert und nicht tatsächlich viel zu kompliziert ist.

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 01.11.2017, 12:53
  2. Künstliche Intelligenz: "Alpha Go spielt wie eine Göttin"
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 09.03.2016, 11:21
  3. Arduino kann einen "acos" nicht berechnen. [gelöst
    Von Zimt Creme im Forum Software, Algorithmen und KI
    Antworten: 10
    Letzter Beitrag: 09.02.2011, 07:47
  4. Idee für Ansteuerung "mehrerer" 7-Seg.-Displays?
    Von Jaecko im Forum Elektronik
    Antworten: 14
    Letzter Beitrag: 29.01.2008, 11:49
  5. IO-Pins lassen sich nicht richtig mit "bsf"/"
    Von keiang im Forum PIC Controller
    Antworten: 3
    Letzter Beitrag: 21.07.2005, 19:12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress