PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Perfekte" Funktion für 7-Segment-Display schreiben?



RoboTrader
21.11.2017, 08:10
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

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!

HaWe
21.11.2017, 10:37
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

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-anzeige-direkt-vom-arduino-ansteuern/
https://www.hacktronics.com/Tutorials/arduino-and-7-segment-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.

RoboTrader
21.11.2017, 15:17
[...] 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.


[...] 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-Display-Arduino-Raspberry-gratis/dp/B01L9GC470/? :D

HaWe
21.11.2017, 16:15
... hm, wäre das was? https://www.amazon.de/gp/product/B071CWKKM5/? Oder eben https://www.amazon.de/AZDelivery-Display-Arduino-Raspberry-gratis/dp/B01L9GC470/? :D


ja, und ja.

Rabenauge
21.11.2017, 16:24
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.

HaWe
21.11.2017, 17:06
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.


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

Rabenauge
21.11.2017, 17:47
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.

HaWe
21.11.2017, 19:07
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:


// 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);
}

Rabenauge
21.11.2017, 19:34
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.

HaWe
21.11.2017, 19:41
ja, gerne, allerdings ist das Thema 7-segment ja durch, hier gings um Vorschläge zu universellen Alternativen, wo sich der Lib-Aufwand lohnt.

RoboTrader
23.11.2017, 10:36
Vielen Dank!
Mich haben aber auch eure Ausführungen zu den unterschiedlichen Displays interessiert. Denn früher oder später werde ich zugreifen. Ich habe mich doch entschieden, erstmal mit dem zu arbeiten, was hier in meinem Starter-Kit enthalten ist und da alles herauszuholen. Auch, wenn ich mit meinem LCD1602 wohl bald verzweifeln werde.

Ausser ... auch das frage ich gleich in einem neuen Thread.

Wo seid ihr nun mit der Diskussion hingewandert?

Rabenauge
23.11.2017, 11:35
Auch, wenn ich mit meinem LCD1602 wohl bald verzweifeln werde.



Warum das denn? Ich benutz die Dinger ganz gerne, weil sie recht stabil sind (draussen von Vorteil) und-zumindest mit dem I2C-Backpack, sehr einfach zu handeln.
Oder hast du die Version ohne I2C? Dann empfehle ich, nachrüsten, die Platine gibts bei den einschlägigen Elektronik-Verramschern für wenig Geld.

RoboTrader
23.11.2017, 17:11
Könnte man die "normale" HDMI-Bildschirm-Ausgabe auch auf einem ILI9341-TFT oder einem 128x64-OLED anzeigen lassen?
Also die Shell darauf "sehen"?

HaWe
23.11.2017, 17:24
Könnte man die "normale" HDMI-Bildschirm-Ausgabe auch auf einem ILI9341-TFT oder einem 128x64-OLED anzeigen lassen?
Also die Shell darauf "sehen"?

kurze Antwort: nein.

lange Antwort:
HDMI kann man einfach zu DVI wandeln, ILI9341 hat aber SPI, das ist ein völlig anderes Protokoll.
Kleinere Displays verwenden auch I2C, wieder was anderes,
auch gibt es aber welche, die sowohl i2c als auch SPI- u/o UART-tauglich sind.

(Auch der Raspi hat für Displays mehrere Ports: SPI, I2C, HDMI, composite und DSI, aber alle verlangen entsprechende spezielle Displays mit diesen Standards; ein HDMI Display lässt sich nicht an SPI anschließen)

RoboTrader
23.11.2017, 17:27
Danke dir. Das sind super Infos. Nach SPI und I2C werde ich mal genauer googeln.
Es macht richtig Spaß! Bin so froh, hier zu euch gestossen zu sein!

HaWe
23.11.2017, 17:30
i2c ist extrem langsam, macht nur Sinn mit OLED für langsame, seltene Anzeigen. i2c hat nur 1 Kabel für Signale bei normalerweise 100-400kHz, SPI hat 2 Signalleitungen und läuft meist bei 1 MHz bis 16 MHz oder sogar noch schneller (max. Prozessortakt).
Nimm also SPI.