5x 7 Segment-Anzeigen ansteuern (Wörter schreiben)

Guten Tag zusammen,

ich programmiere gerade zum ersten Mal 7-Segment-Anzeigen, es sind insgesamt 5 Stück welche über einen Arduino DUE angesteuert werden, soweit funktionert auch alles. Nun möchte ich aber via Serieller Monitor, Wörter schreiben, welche dann angezeigt werden. Ist dies möglich und wenn ja wie?
Falls es nicht möglich ist, gibt es andere Möglichkeiten dies via 7-Segment-Anzeige zu machen?

Verwendet werden LTS547AP 7 Segment-Anzeigen mit gemeinsamer Kathode.

Vielen Dank für die Hilfe

Lucas

schau einfach bei bestehenden libs ab, z.B. die LCD macht es so

    while (Serial.available() > 0) {
      // display each character to the LCD
      lcd.write(Serial.read());
    }

oder mach es wie in den Serial Input Basics beschrieben: Serial Input Basics - updated

Mit einer 7Segment Anzeige hast du zwar die Möglichkeit, 128 verschiedene Zustände darzustellen, aber die meisten kann man nicht als Zeichen wiedererkennen. Wenn dir die verbleibenden sinnvollen Kombinationen reichen ( z.B. c n o b d u| _ - A C E F L S U kann man mit wenig Phantasie auch auf einer 7Segment-Anzeige erkennen und von den Ziffern 0 .. 9 unterscheiden: du AFFE, SIE ESEL ) kannst du diese Zeichen z.B. mit Serial.read() lesen, erkennen, und die entsprechenden Segmente ansteuern.
Wenn mehrere Segmente gemeinsam einen einzelnen Buchstaben darstellen sollen, darfst du gerne noch kreativer werden, aber die meisten Leute, die kein dafür vorgesehenes LCD oder gar einen Bildschirm verwenden wollen, nutzen eher Punktmatrix - Anzeigen ( 8x8 )

Funktioniert Serial.read() mit jeglicher Art 7 Segment-Anzeige oder müssen dies spezielle sein?

Serial.read() funktioniert sogar ganz ohne Display.
Das ist nur eine von vielen Möglichkeiten, Daten in den Arduino zu bekommen.

Aber wie kann ich jetzt via Serieller Monitor, Wörter auf den 7 Segment anzeigen darstellen lassen?

Na ja, wie immer schrittweise:

  1. Bastel Dir eine Funktion, die einen der mit Siebensegmentanzeige möglichen Buchstaben darstellt - auf einer der fünf Anzeigen.
  2. Bau die Funktion so um, dass sie auf jeder der Anzeigen funktioniert (neben dem Buchstaben wohl ein zweiter Parameter nötig)
  3. Text buchstabenweise ausgeben, erst feste Texte
  4. Buchstaben/Text von Serial einlesen und ausgeben.

Fertig!

1 Like

wie stellst du den heute die Wörter darf? Da wir deinen Code und deinen Schaltplan nicht kennen, ist es schwierig dir weiter zu helfen da wir nicht wissen wo du stehst.

Du könntest daher deinen Code in Codetags posten und deinen Schaltplan posten.

Schau nach, wie deine Bibliothek eine Ziffer darstellt. Dann änderst du es so ab, dass z.B. statt 0 ein o rauskommt, oder statt o ein c.
Oder statt der 1 mit zwei Segmenten rechts oben und unten, zwei Segmente links oben und unten. Das nimmst du dann als l. Oder du schaltest das Segment unten mit dazu und freust dich über ein L.
Kannst auch zum Verständnis deiner 5 7Segment-Module und zum Spaß

       _  _  _  
|  | ||  |_||_
|_ |_||_ | | _|

ohne Arduino erstmal fest verdrahten.

Ich denke wir haben hier mehere Herausforderungen:

  1. den Hardwareaufbau
  • Statisch oder als Multiplex
  • Direkt vom Adruino oder mit Controller IC
  1. die Hardwareansteuerung vom Arduino aus

  2. das mappen der ASCII-tabelle auf 7seg

  3. das Lesen der Seriellen Schnittstelle und Ausgabe auf 7seg

Da du aber nicht der 1. bist, der 7 Segment Anzeigen ansteuern will, dürfte jeder Punkt schon in verschiedenen Varianten gelöst worden sein.

@l_u_c_a_s hast du dir schon Gedanken zum Hardwareaufbau gemacht?

Aufgebaut ist es und es zeigt auch schon etwas an, nämlich meinen Namen.
Ich werde mich jetzt mal dransetzten und das ganze weiterversuchen und euch auf dem laufenden halten.

  int analogPin = 0;
  int pinMode[5]
  void setup() {
  {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(22, OUTPUT);
  pinMode(23, OUTPUT);
  pinMode(24, OUTPUT);
  pinMode(25, OUTPUT);
  pinMode(26, OUTPUT);
  pinMode(27, OUTPUT);
  pinMode(28, OUTPUT);
  pinMode(29, OUTPUT);
  pinMode(30, OUTPUT);
  pinMode(31, OUTPUT);
  pinMode(32, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(34, OUTPUT);
  pinMode(35, OUTPUT);
  pinMode(36, OUTPUT);
  pinMode(37, OUTPUT);
  pinMode(38, OUTPUT);
  pinMode(39, OUTPUT);
  pinMode(40, OUTPUT);
  pinMode(41, OUTPUT);
  pinMode(42, OUTPUT);
  pinMode(43, OUTPUT);
  pinMode(44, OUTPUT);
  pinMode(45, OUTPUT);
  pinMode(46, OUTPUT);
  pinMode(47, OUTPUT);
  pinMode(48, OUTPUT);
  pinMode(49, OUTPUT);

 }}

  void loop() {
  int period = (2000 -
  analogRead(analogPin)) / 2 + 25;
  digitalWrite(12, HIGH);
  digitalWrite(48, HIGH);
  digitalWrite(22, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(28, HIGH);
  digitalWrite(30, HIGH);
  digitalWrite(32, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(36, HIGH);
  digitalWrite(38, HIGH);
  digitalWrite(33, HIGH);
  digitalWrite(31, HIGH);
  digitalWrite(44, HIGH);
  digitalWrite(29, HIGH);
  digitalWrite(35, HIGH);
  digitalWrite(45, HIGH);
  digitalWrite(41, HIGH);
  digitalWrite(39, HIGH);
  digitalWrite(37, HIGH);
  digitalWrite(25, HIGH);
  digitalWrite(23, HIGH);
  delay(period);
  digitalWrite(12, LOW);
  digitalWrite(48, LOW);
  digitalWrite(22, LOW);
  digitalWrite(8, LOW);
  digitalWrite(28, LOW);
  digitalWrite(30, LOW);
  digitalWrite(32, LOW);
  digitalWrite(6, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(36, LOW);
  digitalWrite(38, LOW);
  digitalWrite(33, LOW);
  digitalWrite(31, LOW);
  digitalWrite(44, LOW);
  digitalWrite(29, LOW);
  digitalWrite(35, LOW);
  digitalWrite(45, LOW);
  digitalWrite(41, LOW);
  digitalWrite(39, LOW);
  digitalWrite(37, LOW);
  digitalWrite(25, LOW);
  digitalWrite(23, LOW);
  delay(period);
}

irgendwas stimmt mit deinen Code tags noch nicht - Stell das mal richtig.

Sehe ich das richtig, du steuerst jede einzelne LED mit einem extra Ausgang an? du verwendest KEIN Multiplexing?

Weitere Fragen zur Vorgangsweise:
Was willst du eigentlich wirklich erreichen? Ist das nur zum testen oder für die Schule/Hausübung? Normalerweise nimmt man einfach entsprechende Treiber ICs (MAX7219, HT16K33) und eine funktionierende Bibliothek macht den Rest. So wie du das verkabelt hast - ja kann man machen - ist aber imho die Zeit nicht Wert ...

Ich würde den Code etwas umstrukturieren. Die Pins in en 2 dimensionales Array mit Hilfsfunktion zum setzen eines Digits.

ungefähr so:

int pinDigits[5][8] = {
//  a, b, c, d, e, f, g, dp
  { 2, 3, 4, 5, 6, 7, 8, 9},

...

  {42,43,44,45,46,47,48,49}
};

void setDigit(uint8_t digit, uint8_t value) {
  if(digit >= 5)
    return;

  for(int segment=0; segment<8; segment++){
    digitalWrite(pinDigits[digit][segment], bitRead(value, segment));
  }
}

Setzen von Buchstaben könnte dann in einem nächsten Schritt so aussehen:

setDigit(0, lookup['l']);
setDigit(1, lookup['u']);
setDigit(2, lookup['c']);
setDigit(3, lookup['a']);
setDigit(4, lookup['s']);

Für lookup google mal nach "7 segment lookup table", da gibts bestimmt schon was fertiges.

Ja, werde einen weiteren Code mit Multiplexing erstellen, dies kann aber etwas dauern da ich gerade nicht zum Programmieren komme, ich werde den Code dann hierrein senden.
Das ganze ist hauptsächlich zum Testen, ich hatte die Idee dazu und wollte nicht direkt aufgeben, nur weil es nicht direkt so funktioniert, wie ich es wollte und da ich im Bereich Arduino ein absoluter Anfänger bin, dachte ich mir, frag ich mal hier.

Ich werde mir das ganze anschauen, da ich das gerade zum ersten Mal höre.

arrays wirst du brauchen.

Du hast eh schon reichlich Tipps bekommen wie man das angeht:

Es gibt ein Array mit dem "Zeichensatz", meist als Bitmuster (1 byte --> 8 bit) wo jedes Bit einer LED zugeordnet ist.
eine "write" Funktion die dann aus dem Zeichen das jeweilige Bitmuster ausgibt. Wenn man den Zeichensatz geschickt beginnen lässt dann findet man auch leicht vom Zeichen auf das Bitmuster. Z.B. wenn man mit der Ziffer 0 --> 0x30 beginnt, dann braucht man nur vom auszugebenen ASCII Zeichen 0x30 abziehen und kommt genau auf die Indexposition im Array.

In deinem Fall müsstest du vermutlich mitschreiben an welcher Position du aktuell bist.
Und am Schluss lässt man dann seine Klasse dann von der print.h klasse erben. Dann braucht man nur mehr eine write Funktion (für ein Zeichen) implementieren und die print Klasse kümmert sich um die Ausgabe von Worten und mehrstelligen Zahlen.

Du kannst dir ja gern mal meine lib für den HT16K33 ansehen:
https://werner.rothschopf.net/201909_arduino_ht16k33.htm.

da ist es auch: Segmente definieren und Zeichen zusammensetzen, eine Funktion "write" zum Ausgeben.

Aber ich würd's wie schon angesprochen nicht mit Ports machen und auf einen MAX7219 oder HT16K33 ausweichen. Übungen zum "Lernen" gibts sinnvollere :wink:

1 Like

Ja gibt es, werde das nächstemal mit etwas leichterem Anfangen. :smiley:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.