Siebensegment-Anzeige, 4 stellig

Hallo,

Ich möchte für ein Zählwerk gern eine 4 stellige Siebensegment-Anzeige ansteuern. http://www.ferromel.de/tronic_184.htm

Dafür muss man GND auf den Ansteuerungspin der Ziffer bringen, die man beleuchten möchte und + eben an das entsprechende Segment.
Liegt GND an allen Ziffern an, dann leuchtet das Segment entsprechend bei allen Ziffern.

Hier kommen wir zu meinem Problem: Wie realisiere ich es, dass GND nicht immer anliegt, sondern so wie ein Signal an und ab gestellt werden kann. Kann ich einen normalen Digitalpin vielleicht zu einem GND-Pin machen?

Kann ich einen normalen Digitalpin vielleicht zu einem GND-Pin machen?

So etwa:

const byte Pin = 10; // z.B.
void setup() {
digitalWrite(Pin, LOW);
}

void loop () {
...
pinMode (Pin, OUTPUT); // = GND 
...
pinMode (Pin,INPUT);  // hochohmig = disabled
...
}

Digital-Pins sind entweder High, Low oder hochohming (Tristate). In deinem Fall fließt Strom wenn du digitalWrite(..., LOW) machst, und kein Strom bei digitalWrite(..., HIGH) - wenn auf der anderen Seite der LED High/+ anliegt.

4-stellige Anzeigen werden gemultiplext, d.h. man hat die 7 (oder 8 ) Pins für die Ziffer + Punkt und dann einen Pin pro Anzeige. Man schaltet dann eine Ziffer kurz an und gibt den Wert aus. Dann schaltet man auf die nächste Ziffer. Das umschalten macht man all 10-20ms so dass es wie ein stehendes Bild aussieht.

Hier ist eine Anleitung dafür (für zwei Ziffern mit gemeinsamer Anode):
http://codeandlife.com/2012/02/24/7-segment-multiplexing-with-uln2003-pnp-transistors/

Das ist reiner AVR Code, aber läuft so auch auf dem Arduino wenn man die Pins korrekt belegt und eventuell anpasst. Wenn die Pins nicht alle auf dem gleichen Port liegen muss man das zusammebasteln der Zahlen aus den einzelnen Segmenten aber anders machen.

also wie man die verschaltet hab ich mir schon angelesen. Ich müsst jetzt nur wissen, wie ich den entsprechenden Ziffern-Pin auf GND lege und eben schaltbar gestalte.

Michaels Variante ist jetzt die Software-Lösung, bei Serenifly's Lösung wirds in der Hardware mit nem Transistor gemacht.

Geht beides oder?

Das ist auch Code auf der Seite. Aber das wird für dich etwas zu kompliziert sein, da da direkte Manipulation verwendet wird.

Wie gesagt, wenn du einen Pin mit digitalWrite auf Low schaltet und extern High anlegst, fließt Strom in den Pin (sink current). Das ist bei der Anzeige der Fall. Da hängt dann halt die LED dazwischen. Wenn du High anlegst und extern auch High ist fließt kein Strom, da kein Potentialunterschied.

Dass mit dem Transistor und Treiber ist so gemacht, weil der Arduino nur begrenzt Strom liefern kann. Wobei 10mA pro Segment noch gehen. Das reicht normalerweise.

Korrektur:
Ein I/O Pin macht maximal 40mA. Du kannst daher zwar den Strom von einem Segment in den Arduino fließen lassen (wobei man da wie gesagt 15mA nicht überschreiten sollte, da es da noch ein Limit pro Port gibt).

ABER, du kannst nicht den ganzen Strom für eine Ziffer (maximal 7-8 Segmente) aus einem Pin ziehen. Das wären mehr als 70mA. Deshalb der Transistor.

Und den Pin wie oben als hochohmigen Eingang zu schalten funktioniert zwar, ist aber nicht unbedingt nötig. Als Ausgang definieren und dann mit digitalWrite arbeiten reicht.

Guck dir mal den SAA1064 von NXP (ehemals Philips) an. Der erledigt das für dich :slight_smile:
http://www.nxp.com/documents/data_sheet/SAA1064_CNV.pdf
Seite 12 ist der Schaltplan in dem PDF
Es gibt auch eine Lib dafür im Netz
https://github.com/mymaestro/Arduino-projects/tree/master/SAA1064-library/libraries/SAA1064
Der Chip kostet ca. 2€. Über ein 4 adriges Kabel läßt sich das Display auch vom Controller abgesetzt etwas weiter entfernt montieren.
Für den SAA1064 benötigst du Anzeigen mit gemeinsamer Anode. Für Anzeigen mit gemeinsamer Katode kann man den MAX7219 nehmen (der kann bis zu 8 Stellen ansteuern)

Gruß Gerald

Es wurde nicht explizit gesagt: Die LED des Display brauchen Vorwiderstände um den Strom zu begrenzen.
Grüße Uwe

Hallo,

der SAA1064 ist ein feiner Chip (und braucht keine Vorwiderstände). Was mich beim experimentieren damit ein wenig gestört hatte, war der Wahnsinnsdrahtverhau, der entsteht, wenn man keine passende Platine dazu hat.

So

sah mein Entwurf für das Breadboard aus.

Ich habe neulich mal den 74LS47 (gemeinsame Anode, braucht Vorwiderstände) ausprobiert. Der decodiert BCD-Code auf eine 7-Segment-Anzeige. Ist zwar lange nicht so komfortabel wie der SAA1064, aber für ein "schnelles Display zwischendurch" gut zu gebrauchen.

Gruß,
Ralf

Ich habe dieses Projekt gestern gemacht :slight_smile: hier meine Lösung.

Arduino Leonardo, 5461AS 4x7egment:

Habs mal schnell mit 4 einzelnen hingezeichnet, ich habe ein Modul verwendet.
Natürlich sollte man Transistoren zwischen den Anzeigen und den Ausgängen verwenden, und die Widerstände an den einzelnen Segmenten verwenden, so war aber mein schneller Aufbau.

int pin1 = 1;
int pin2 = 2;                                    //                            --1--
int pin3 = 3;                                    //                         6 |     | 2
int pin4 = 4;                                    //                           |--7--|
int pin5 = 5;                                    //                         5 |     | 3
int pin6 = 6;                                    //                            --4--
int pin7 = 7;
int gnd1 = 9;                                 //                          gnd1 is display 1's gnd
int gnd2 = 10;      //                          gnd2 is display 2's gnd
int gnd3 = 11;                                 //                          gnd1 is display 1's gnd
int gnd4 = 12; 
int pindp = 13;

int timer = 5000;                                       //   The value, part of the FADING display
int value;  

void setup(){
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);           //The following sets up all of the pins for use.
  pinMode(pin5, OUTPUT);
  pinMode(pin6, OUTPUT);
  pinMode(pin7, OUTPUT);
  pinMode(gnd1, OUTPUT);
  pinMode(gnd2, OUTPUT);
  pinMode(gnd3, OUTPUT);
  pinMode(gnd4, OUTPUT);
}
void loop() {
  
  
                           
    
    
   digitalWrite(pin1, 1);
   digitalWrite(pin2, 1);
   digitalWrite(pin3, 0);
   digitalWrite(pin4, 1);
   digitalWrite(pin5, 1);
   digitalWrite(pin6, 0);
   digitalWrite(pin7, 1);
   digitalWrite(gnd1, 0); 
   digitalWrite(gnd2, 1); 
   digitalWrite(gnd3, 1); 
   digitalWrite(gnd4, 1); 
   delay(5);                                                       
   digitalWrite(pin1, 1);
   digitalWrite(pin2, 1);
   digitalWrite(pin3, 1);
   digitalWrite(pin4, 1);
   digitalWrite(pin5, 1);
   digitalWrite(pin6, 1);
   digitalWrite(pin7, 0);
   digitalWrite(gnd1, 1);
   digitalWrite(gnd2, 0);
   digitalWrite(gnd3, 1); 
   digitalWrite(gnd4, 1); 
   delay(5);
     digitalWrite(pin1, 0);
   digitalWrite(pin2, 1);
   digitalWrite(pin3, 1);
   digitalWrite(pin4, 0);
   digitalWrite(pin5, 0);
   digitalWrite(pin6, 0);
   digitalWrite(pin7, 0);
   digitalWrite(gnd1, 1); 
   digitalWrite(gnd2, 1); 
   digitalWrite(gnd3, 0); 
   digitalWrite(gnd4, 1); 
   delay(5);                                                       
   digitalWrite(pin1, 1);
   digitalWrite(pin2, 1);
   digitalWrite(pin3, 1);
   digitalWrite(pin4, 1);
   digitalWrite(pin5, 0);
   digitalWrite(pin6, 0);
   digitalWrite(pin7, 1);
   digitalWrite(gnd1, 1);
   digitalWrite(gnd2, 1);
   digitalWrite(gnd3, 1); 
   digitalWrite(gnd4, 0); 
   delay(5);
  
  

}

Hallo,

tut mir leid, ich versteh’s nicht. Was willst Du uns damit zeigen? Wie man es nicht machen soll?

Gruß,
Ralf

Die Schaltung ist Falsch. die Vorwiderstände kommen auf jedes Einzelne LED/ Segment und nicht auf dem gemeinsamen Anschluß des Displays. Also nicht auf die Pins 9-12 sondern auf die Pins 1 bis 8. Du solltest den Pin 1 nicht verwenden da ansonsten die Übertragung des Sketches nicht funktioniert. Benutze die Pins 2 bis 13. Die Vorwiderstände müssen so benessen sein daß die Pins nicht überlastet werden. Pins 8 bis 13 nicht mehr als 40mA wenn alle Segmente eingeschaltet sind. also max 5mA pro Segment.
Grüße Uwe