Gefundenes Projekt Parkplatz

Hallo…

Habe eine Projekt gefunden das ich Nachgebaut habe , etwas verändert und nun gehen mir die zahlen aus.

einmal das Video

#include <Servo.h>
Servo myservo1;  // create servo object to control a servo
Servo myservo2;  // create servo object to control a servo

#define ServoI    12        //Connected to the servo motor.
#define ServoO    11        //Connected to the servo motor.
#define Bright    2        //servo library disable PWM on pins 9 and 10.
#define Exit      9         //Pin connected to the EXIT button.
#define In        8         //Pin connected to the IN button.

#define BarLow    177       //Low position of the barrier.
#define BarUpI     90        //Up position of the barrier.
#define BarUpO     80        //Up position of the barrier.
#define CAPACITY  9         //Capacity of the parking lot.
#define INTEN     100        //Display intensity %

//Pins conections to segments (cathodes).
#define  segA  30
#define  segB  31
#define  segC  32
#define  segD  33
#define  segE  34
#define  segF  35
#define  segG  36

//Array with the segments to represent the decimal numbers (0-9).
byte segments[10] = {
// pgfedcba  <--- segments
  B00111111, // number 0
  B00000110, // number 1
  B01011011, // number 2
  B01001111, // number 3
  B01100110, // number 4
  B01101101, // number 5
  B01111101, // number 6
  B00000111, // number 7
  B01111111, // number 8
  B01101111  // number 9
};

void setup(){
  myservo1.attach(ServoI);          // attaches the servo.
  myservo2.attach(ServoO);          // attaches the servo.

  pinMode(Exit, INPUT);           // set "EXIT" button pin to input
  pinMode(In, INPUT);             // set "IN" button pin to input
  digitalWrite(Exit, HIGH);       // Connect Pull-Up resistor.
  digitalWrite(In, HIGH);         // Connect Pull-Up resistor.
  pinMode(segA,OUTPUT);
  pinMode(segB,OUTPUT);
  pinMode(segC,OUTPUT);
  pinMode(segD,OUTPUT);
  pinMode(segE,OUTPUT);
  pinMode(segF,OUTPUT);
  pinMode(segG,OUTPUT);
  pinMode(Bright,OUTPUT);
  analogWrite(Bright,255*INTEN/100);
  myservo1.write(BarLow);          //Barrier in the low position
  myservo2.write(BarLow);          //Barrier in the low position
//  delay(1000);
}

int  Available= 9;                    // Number of places available.

//================================================================
void loop(){
Display(Available);
if(digitalRead(In)==0)
{
  if(Available != 0){
    Available--;
    myservo1.write(BarUpI);
    delay(3000);
    myservo1.write(BarLow);
    }
  }
if(digitalRead(Exit)==0)
{
  if(Available != CAPACITY){
    Available++;
    myservo2.write(BarUpO);
    delay(3000);
    myservo2.write(BarLow);
    }
  }
}

/*-------------------------------------------------------------------
Put the segments according to the number.
--------------------------------------------------------------------*/
void Display(int number){
byte segs =  ~segments[number];        //"~" is used for commom anode.

digitalWrite(segA, bitRead(segs, 0) );
digitalWrite(segB, bitRead(segs, 1) );
digitalWrite(segC, bitRead(segs, 2) );
digitalWrite(segD, bitRead(segs, 3) );
digitalWrite(segE, bitRead(segs, 4) );
digitalWrite(segF, bitRead(segs, 5) );
digitalWrite(segG, bitRead(segs, 6) );
}

Im gegensatz zum Video ist da eine 2te Schranke, das ist auch so gewollt und das ist auch soweit schon ganz OK nur stehen meist auf dem Parkplatz für das ich das Projekt haben möchte, meist mehr als 10 Fahrzeuge !

was ich gerne erfahren möchte ist, welche ICs ich als Treiber für die 7 Segmentanzeige nehmen kann und was ich am Code wo ändern müsste ?.. ¿

ich muss sagen das ich in der sache noch sehr unerfahren bin da ich eher Modellbauer bin.

wünsche noch schöne restweihnachten und schon mal guten rutsch in programierte 2014

Bei Anzeigen mit gemeinsamer Anode kann man einfach einen ULN2803 (NPN Darlington Array) als Treiber verwenden und einen PNP Transistor an jeder Ziffer. Dann multiplext man das Ganze. Eventuell noch ein HC5959 Schieberegister wenn man Pins sparen will.

So:

Die Basiswiderstände der Transistoren sind dabei ca. 1k

Für gemeinsame Kathode geht ein UDN2981 (PNP Array) und NPNs für die Ziffern.

Dabei legt man die Daten an das Display, schaltet eine Ziffer für ein paar ms ein, schaltet das Display aus, legt die Daten für die nächste Ziffer an, schaltet diese Ziffer für ein paar ms ein, etc...

Siehe auch hier:
http://www.mikrocontroller.net/articles/AVR-Tutorial:7-Segment-Anzeige#Mehrere_7-Segment_Anzeigen.28Multiplexen.29

EDIT:
Hier gibt es sogar eine Lib dafür:
http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo
Die ist aber sowie es aussieht fest für NPN Transistoren! Da müsste man in der Lib die Ansteuerung von HIGH auf LOW ändern, wenn man PNPs hat (in der update() Methode)!!

Das ist aber auch gar nicht schwer per Hand zu programmieren.

danke Serenifly für deine antwort

soweit danke mal für deine Hilfe
was mich noch ein wenig Stört ist das soviele Drähte dann im Umlauf sind

dachte da an einen 4511 oder ähnlichen das ich max 6 -7 kabel verbauen kann, wenn geht noch weniger!

Gruss

Wie gesagt, mit einem HC595 sparst du mehr als mit einem 4511. Da kommt man mit 3 Leitungen aus:

Ist ein Schieberegister und braucht daher Daten, Clock und Latch Enable.

Die Ansteuerung ist in die Arduino IDE mit shiftOut() integriert:

Wenn dir das Multiplexen zu kompliziert ist, kannst du auch zwei 595 kaskadieren und damit die Anzeigen ansteuern. Du hast da aber nur 8.75 mA Strom pro Segment (auch wenn es in dem Beispiel anders aufgebaut ist. Das ist da außerhalb der Spezifikation). Wenn du mehr brauchst auch hier jeweils einen ULN oder UDN (je nach Display) dazwischen bauen.

Hi Nochmal ....

nur damit es auch oben haften bleibt !

ich kann mit einen HC595 beide ansteuern , soweit OK ! da ich noch ULN 2803 liegen habe denke ich mal das ich dann auch welche nehme mit gemeinsamer anode nehme. für die anoden spannung kann ich ja dann denke ich einen BC 547 oder gleichen nehmen denke ich mal.

ich werde mal meine Bestellung rausjagen damit ich die Teile noch dieses Jahr bekomme .
wenn ich dann soweit bin das ich wieder Hilfe brauche dann melde ich mich wieder

Lieben dank noch mal
Gruss

Der BC547 ist ein NPN! Du braucht bei gemeinsamer Anode PNPs. z.B. BC557C oder BC327-40. Der genaue Typ ist aber egal solange es ein PNP ist.

Du solltest vielleicht noch bedenken, dass an einer Darlington-Schaltung ca. 0,9V an dem Treiber IC abfallen:

Dann noch mal ca. 0,2V an dem PNP Transistor. Falls du wie in dem Video blaue LEDs hast (Uf ca. 3,4V) werden die Vorwiderstände sehr klein. Das ist an sich kein Problem, aber man sollte eventuell den Strom (pro Segment, nicht pro Ziffer) mit einem Multimeter ausmessen. Da das gemultiplext ist, schadet es aber auch nicht wenn etwas mehr Strom fließt, da die LEDs bei zwei Ziffern nur 50% der Zeit an sind.

Die_Pulle:
was ich gerne erfahren möchte ist, welche ICs ich als Treiber für die 7 Segmentanzeige nehmen kann und was ich am Code wo ändern müsste ?... ¿

Vierstellige 7-Segmentanzeigen mit fertig montiertem Backpack-IC und Ansteuerung für den I2C-Bus gibt es von Chinaversendern für unter 5 EUR anschlußfertig zu kaufen, z.B. das hier ist ziemlich gängig:
http://www.seeedstudio.com/wiki/Grove_-_4-Digit_Display

Passende Library mit Programmierbeispiel gibt's zum Download.