-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: "Perfekte" Funktion für 7-Segment-Display schreiben?

  1. #1

    Idee "Perfekte" Funktion für 7-Segment-Display schreiben?

    Anzeige

    Guten Morgen an alle Arduino-Freunde,

    ich bin neu am Werkeln mit dem Arduino, arbeite die Tutorials durch, aber da ich einige Programmiererfahrung habe, erstelle ich immer auch eigene Erweiterungen und Versionen der Tutorial-Codes.
    So auch zum 7-Segment-Display.

    Ich würde gerne statt einzeln Funktionen für neue Zeichen zu schreiben, eine Basis-Funktion kreieren, bei der man die Pins a-g, sowie den dp direkt oder auch als Array übergeben kann. Also etwa
    Code:
    void showSign([a,b,c,d,e,f,g],dp)
    oder eine einzige Variable, die sozusagen binär die Pins belegt (also 3 für a und b auf HIGH und den Rest auf LOW).
    Dann könnte ich weiter simple Funktionen für Zahlen (showNumber()) und Buchstaben (showChar()) einfügen und ganz einfach darauf zugreifen.

    Bei mir hängt es nur am Handling mit einem Array als Funktionsvariable. Wie sieht die Grundstruktur für so eine Funktion in Arduino-C aus?

    Vielen Dank für eure Impulse und einen tollen Dienstag!
    Start: vor 30 Jahren Basic am CPC Schneider + Kosmos-Baukästen • Später: Mindstorms RCX 1.0, Visual Basic, Pascal & php • Jetzt: Python, Arduino-Starter-Kit & Raspberry Pi

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452
    Zitat Zitat von RoboTrader Beitrag anzeigen
    Guten Morgen an alle Arduino-Freunde,

    ich bin neu am Werkeln mit dem Arduino, arbeite die Tutorials durch, aber da ich einige Programmiererfahrung habe, erstelle ich immer auch eigene Erweiterungen und Versionen der Tutorial-Codes.
    So auch zum 7-Segment-Display.

    Ich würde gerne statt einzeln Funktionen für neue Zeichen zu schreiben, eine Basis-Funktion kreieren, bei der man die Pins a-g, sowie den dp direkt oder auch als Array übergeben kann. Also etwa
    Code:
    void showSign([a,b,c,d,e,f,g],dp)
    oder eine einzige Variable, die sozusagen binär die Pins belegt (also 3 für a und b auf HIGH und den Rest auf LOW).
    Dann könnte ich weiter simple Funktionen für Zahlen (showNumber()) und Buchstaben (showChar()) einfügen und ganz einfach darauf zugreifen.

    Bei mir hängt es nur am Handling mit einem Array als Funktionsvariable. Wie sieht die Grundstruktur für so eine Funktion in Arduino-C aus?

    Vielen Dank für eure Impulse und einen tollen Dienstag!
    hallo,
    die Google Suche per
    Arduino 7 segment
    liefert z.B.
    http://shelvin.de/eine-7-segment-anz...ino-ansteuern/
    https://www.hacktronics.com/Tutorial...gment-led.html

    das scheint schon ziemlich nahe dran zu sein an dem was du suchst.

    - - - Aktualisiert - - -

    ps,
    ich halte solche 7-Segment-Displays höchstens für sinnvoll, um das Prinzip zu verstehen, weder die noch die LCD1602 oder LCD2004 sind für Arduino besonders geeignet, weil sie einfach viel zu viele Pins fressen und sie außerdem nicht Grafik-fähig sind. Es lohnt sich IMO nicht, dafür großartige Zeichensatz-Treiber zu implementieren oder sie gar selber zu schreiben.
    Wie gesagt, zum Lernen der Programmier-Prinzipien aber durchaus ok.
    Wenn du aber eine vernünftige Display-Ausgabe willst, besorg dir am besten 2,2" - 2,4" ILI9225 oder, besser noch, ILI9341 TFTs.
    Oder kleine 128x64 OLEDs.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  3. #3
    Zitat Zitat von HaWe Beitrag anzeigen
    [...] das scheint schon ziemlich nahe dran zu sein an dem was du suchst.
    Danke. Gut gegoogelt. Und ich habe wirklich gesucht!
    Mir ging es auch nicht um die sinnvollste Anwendung, sondern, um meine "Gedanken" auch in Arduino-C umsetzen zu können. So verinnerliche ich die einzelnen Lessons auch besser.

    Zitat Zitat von HaWe Beitrag anzeigen
    [...] Wenn du aber eine vernünftige Display-Ausgabe willst, besorg dir am besten 2,2" - 2,4" ILI9225 oder, besser noch, ILI9341 TFTs.
    Oder kleine 128x64 OLEDs.
    Jedesmal, wenn du sowas erwähnst, will ich das sofort bestellen ... grrrr ... nein, ich gehe jetzt erstmal die Lessons mit dem Arduino durch und dann sehe ich weiter!

    ...

    ...

    ...

    ... hm, wäre das was? https://www.amazon.de/gp/product/B071CWKKM5/? Oder eben https://www.amazon.de/AZDelivery-Dis...dp/B01L9GC470/?
    Start: vor 30 Jahren Basic am CPC Schneider + Kosmos-Baukästen • Später: Mindstorms RCX 1.0, Visual Basic, Pascal & php • Jetzt: Python, Arduino-Starter-Kit & Raspberry Pi

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452

    ja, und ja.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    Machs nicht.
    Mit den lahmarschigen Dingern haben wir uns lange genug rumgeärgert- irgendwas is immer: mal sind sie zu lahm, mal gibts keine richtige Bibliothek für (meist sucht man nur ne Weile) und fast immer belegen die nen Haufen Pins.

    Heutzutage nimmt man "intelligente" Displays: https://www.youtube.com/watch?v=wIWxSLVAAQE
    Ist nur ein Beispiel.
    Die Dinger sind so preiwert, dass man sie als vollwertigen Ersatz für die einfacheren nehmen kann, haben aber nen eigenen Controller (und je nach Ausführung noch weitere Nettigkeiten) im Rucksack.
    Dazu brauchen sie lediglich _zwei_ Leitungen, und da ist die Touchfunktion auch schon mit bei.
    Und es geht völlig ohne Bibliothek!
    Bin da grad am spielen mit nem 3.5er, das hat 480x320 Auflösung und die kann man auch ganz problemlos ausschöpfen, auch wenn da "nur" ein Arduino dahinter klemmt.
    Und das allerbeste: die funktionieren an nahezu jedem Controller, da es ne ganz einfache serielle Schnittstelle ist.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452
    Wenn es dir um Schnelligkeit geht, dann hast du u.U. die falschen Libs. Du solltest dann ILI9341 nehmen und nicht mit den soft-SPI Libs von Henning Karlsen arbeiten, sondern mit welchen, die Hardware SPI mit DMA verwenden, so kommt man auf SPI clock von 16 MHz (AVR) oder sogar 84MHz (Due, plus DMA).
    Für Anwendungen, die normalerweise mit LCDs arbeiten und nur ab und zu mal pro Sekunde ein paar Werte wie Temperatur oder Helligkeit aufs Display bringen sollen, ist H.K. aber durchaus eine Alternative, also auch die ILI9225 und sogar die OLEDs (für Schnelligkeit dann ntl. auch SPI, nicht i2c).
    Natürlich sind deutlich teurere mit Controller leistungsfähiger, keine Frage.

    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    Na sicher geht da so einiges- hab auch ein Midi-Keyboard, wo ein 1.8er TFT drauf hockt, und in Echtzeit alle möglichen Werte ausgibt.
    Und ne "Bastel-Tischuhr" mit noch so einem, die Uhrzeit (gross, grafisch), Datum, Temperatur, Luftfeuchte und Luftdruck anzeigt.
    Bei beiden erinnere ich mich lebhaft, wie ich jede Engstelle einzeln aufgespürt und eliminiert habe, damit da nix ruckelt.
    Was ein Stress-obwohl mir sowas auch Spass macht (ich programmier gerne grafische Geschichten), Aber _irgendwo_ ist halt Ende der Fahnenstange.

    Du hast offenbar nie von den Nextions gehört oder?
    Teurer-nun ja.
    Bissel evtl. schon. Mein 3.5er kam 35€- aber seit ich das Ding hab, käm ich im Leben nicht mehr drauf, was anderes zu nehmen.
    Der Vorteil ist hier, dass du den Rechner teilweise gar nicht belastest.
    Und: nen "normales" 3.5er hätt ich in Deutschland grad auch nicht billiger bekommen...

    Hab meines gerade am Arduino hängen, momentan zeigt es nen LCARS-Startscreen.
    Wenn man den antippt, kann man die Helligkeit des Displays einstellen (so in 80 Stufen, mehr machen grad keinen Sinn) mit nem kleinen Slider.
    Tippt man wieder, kommt man auf die nächste Seite: das wird eine Art Hauptmenü.
    Da gibts bisher aber nur nen Zurück-Button.
    Bis an diesen Punkt funktioniert das schon- _ohne_ dass der Arduino überhaupt _irgendwas_ macht!
    Der versorgt das Ding bis jetzt lediglich mit Strom....und trotzdem hab ich eine einwandfreie, grafische Ausgabe, die ich auch noch nach Belieben dimmen kann, und noch Platz für viele, viele weitere Seiten.
    Das Ganze reagiert übrigens völlig ohne Ruckler, selbst die Hintergrundbilder (screenfüllende Bitmaps) sind, beim Seitenwechsel, _sofort_ da.

    Kurz gesagt: ich bin begeistert. Auch wenn die Qualität des Displays selber nich besser ist als die der "alten" TFT's , allemal ein grosser Schritt nach vorne.

    Und, da das Ganze echt simpel zu handhaben ist, würd ich auch nem Anfänger nix anderes mehr empfehlen. Es ist _nicht_ schwieriger, als die normalen TFT anzusteuern, eher im Gegenteil.

    Aber klar auch: wenn ich mir nur mal eben die Uhrzeit irgendwo ausgeben will, und kann oder wills nicht über den Rechner machen, dann nehm ich auch eher ein kleines I2C-OLED- sowas hat man immer griffbereit.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Na sicher geht da so einiges- hab auch ein Midi-Keyboard, wo ein 1.8er TFT drauf hockt, und in Echtzeit alle möglichen Werte ausgibt.
    Und ne "Bastel-Tischuhr" mit noch so einem, die Uhrzeit (gross, grafisch), Datum, Temperatur, Luftfeuchte und Luftdruck anzeigt.
    Bei beiden erinnere ich mich lebhaft, wie ich jede Engstelle einzeln aufgespürt und eliminiert habe, damit da nix ruckelt.
    Was ein Stress-obwohl mir sowas auch Spass macht (ich programmier gerne grafische Geschichten), Aber _irgendwo_ ist halt Ende der Fahnenstange.

    Du hast offenbar nie von den Nextions gehört oder?
    Teurer-nun ja.
    Bissel evtl. schon. Mein 3.5er kam 35€- aber seit ich das Ding hab, käm ich im Leben nicht mehr drauf, was anderes zu nehmen.
    Der Vorteil ist hier, dass du den Rechner teilweise gar nicht belastest.
    Und: nen "normales" 3.5er hätt ich in Deutschland grad auch nicht billiger bekommen...

    Hab meines gerade am Arduino hängen, momentan zeigt es nen LCARS-Startscreen.
    Wenn man den antippt, kann man die Helligkeit des Displays einstellen (so in 80 Stufen, mehr machen grad keinen Sinn) mit nem kleinen Slider.
    Tippt man wieder, kommt man auf die nächste Seite: das wird eine Art Hauptmenü.
    Da gibts bisher aber nur nen Zurück-Button.
    Bis an diesen Punkt funktioniert das schon- _ohne_ dass der Arduino überhaupt _irgendwas_ macht!
    Der versorgt das Ding bis jetzt lediglich mit Strom....und trotzdem hab ich eine einwandfreie, grafische Ausgabe, die ich auch noch nach Belieben dimmen kann, und noch Platz für viele, viele weitere Seiten.
    Das Ganze reagiert übrigens völlig ohne Ruckler, selbst die Hintergrundbilder (screenfüllende Bitmaps) sind, beim Seitenwechsel, _sofort_ da.

    Kurz gesagt: ich bin begeistert. Auch wenn die Qualität des Displays selber nich besser ist als die der "alten" TFT's , allemal ein grosser Schritt nach vorne.

    Und, da das Ganze echt simpel zu handhaben ist, würd ich auch nem Anfänger nix anderes mehr empfehlen. Es ist _nicht_ schwieriger, als die normalen TFT anzusteuern, eher im Gegenteil.

    Aber klar auch: wenn ich mir nur mal eben die Uhrzeit irgendwo ausgeben will, und kann oder wills nicht über den Rechner machen, dann nehm ich auch eher ein kleines I2C-OLED- sowas hat man immer griffbereit.
    naja, ca. 3x so teuer, aber auch größer, ist sicher ok, aber die kleineren müssen auch nicht unbedingt schlecht sein.
    Aber selber darauf gestoßen bin ich tatsächlich bisher nicht auf die Nexions.

    Hast du Lust, mal meinen Benchmark drauf laufen zu lassen, mit deinem Mega?

    Bei dir ntl mit anderen TFT-Libs und Pins:

    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, 15, 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);
    }
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    Hm- das wird so nix.
    Ich mache dazu mal ein neues Thema auf- hier ging es um was _völlig_ anderes. Bin mir ziemlich sicher, dass die Nextion-Geschichte auch andere interessiert.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.452
    ja, gerne, allerdings ist das Thema 7-segment ja durch, hier gings um Vorschläge zu universellen Alternativen, wo sich der Lib-Aufwand lohnt.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. "HALLO" auf 7-Segment-Anzeige über JK-Flip-Flops
    Von bigboss im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 10.12.2012, 11:39
  2. Fehler beim Schreiben "Device signature = 0x000102" USBasp
    Von spelli2001 im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 27.08.2012, 13:16
  3. Der "perfekte" Elektromagnet
    Von jojo.glaser im Forum Elektronik
    Antworten: 15
    Letzter Beitrag: 02.12.2007, 19:08
  4. Pinbelegung für LED-Segment Display "+1.8."
    Von Jaecko im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 15.02.2007, 14:24
  5. Alternativen zur Funktion "Wait" bzw. "Waitms
    Von pinoccio im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 30.04.2006, 15:51

Berechtigungen

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