Go Down

Topic: 7-Segment [SA 40-19 RT] - Anschließen - und ansteuern (Read 924 times) previous topic - next topic

HotSystems

Man kann das Bild leider immer erst mit dem Editoren des Beitrages einstellen :-(
Daher dauert das immer einen Kleinen augenblick, da warst du schneller als ich. :-).

Die sind alle klein bei mir :-)

Puhh, da bin ich aber froh, das das mit dem Bild doch noch geklappt hat, ;-) *Spaß*

Ok, 1/4W also 0,25W, somit würden die ausreichen :-) die ich habe für das was ich sie benötige.

DANKE.

Alles klar, ich war wohl zu schnell. ;)  ;)
Kommt aber selten vor.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Muecke

So ich habe die 7 Segmente bekommen und wie auf dem Bild angeschlossen.



Zum testen habe ich mir jetzt den Code mal zusammen gebastelt.

Jetzt möchte ich mir eine Funktion schreiben, mit der ich die Ziffern entsprechende aufrufen kann.
Das Teil sieht echt Cool aus, und ist verdammt groß :-).

Code: [Select]
int a = 7;
  int b = 8;
  int c = 4;
  int d = 3;
  int e = 2;
  int f = 6;
  int g = 5;


void setup() {
 
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  
// Ausgabe 0
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
delay(1000); // warten für 1 sekunden

// Ausgabe 1
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
delay(1000); // warten für 1 sekunden

// Ausgabe 2
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
delay(1000); // warten für 1 sekunden

// Ausgabe 3
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
delay(1000); // warten für 1 sekunden

// Ausgabe 4
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
delay(1000); // warten für 1 sekunden

// Ausgabe 5
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
delay(1000); // warten für 1 sekunden

// Ausgabe 6
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
delay(1000); // warten für 1 sekunden

// Ausgabe 7
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
delay(1000); // warten für 1 sekunden

// Ausgabe 8
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
delay(1000); // warten für 1 sekunden

// Ausgabe 9
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
delay(1000); // warten für 1 sekunden
}

void loop() { }



Gruß Mücke



- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

agmue

Jetzt möchte ich mir eine Funktion schreiben, mit der ich die Ziffern entsprechende aufrufen kann.
Kleine Anregung von mir. Ob die Bits an der richtigen Stelle sind, kann ich mangels 7-Segmentanzeige nicht testen.

Code: [Select]
//                   a  b  c  d  e  f  g
const byte pins[] = {7, 8, 4, 3, 2, 6, 5};
const byte digits[] = {
  //gfedcba
  0b0111111, // 0
  0b0000110, // 1
  0b1011011, // 2
  0b1001111, // 3
  0b1100110, // 4
  0b1101101, // 5
  0b1111101, // 6
  0b0100111, // 7
  0b1111111, // 8
  0b1101111  // 9
};
void ausgabe(byte zahl)
{
  zahl = zahl % 10; // um die Feldgrenzen nicht zu überschreiten
  byte d = digits[zahl];
  for (byte j = 0; j < sizeof(pins); j++)
  {
    bool hl = d & 1 << j;
    digitalWrite(pins[j], hl);
  }
}

void setup() {
  for (byte j = 0; j < sizeof(pins); j++)
  {
    pinMode(pins[j], OUTPUT);
  }
}

void loop()
{
  for (byte j = 0; j < 10; j++)
  {
    ausgabe(j);
    delay(1000);
  }
}

Muecke

@agmue: Das ist ein sehr Interessantes Programm.
Jedoch muss ich mich da mal mit etwas mehr zeit dran setzen, um das richtig nachvollziehen zu können.

Was ich auf Anhieb verstanden habe ist das du die Pins in ein Array gesteckt hast, das dann wider aufgerufen wird beim Pin Deklarieren als  OUTPUT.

Den Rest muss ich mir genauer anschauen, denn ich möchte das schon verstehen. Was ich da mache.

ich hätte das zwar etwas anders gelöst, bin aber für neue Dinge immer Offen ;-).

Danke dir.

Gruß Mücke
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

agmue


ElEspanol

Studier und versteh den Sketch von agmue, ist gut und effizient gemacht

Muecke

Löse es, wie Du magst :)
Öm, ja, so dass ich den Code auch in ein Paar Wochen noch verstehe zumindest.

Studier und versteh den Sketch von agmue, ist gut und effizient gemacht
Das habe ich vor.

Jedoch zuerst meine Version, wie ich es vorhatte.

Code: [Select]
int a = 7;
  int b = 8;
  int c = 4;
  int d = 3;
  int e = 2;
  int f = 6;
  int g = 5;

void setup()
{
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}

void loop()
{
  for (int j = 0; j < 11; j++)
    {
      Segment(j);
      delay(1000);
    } 
}

void Segment(int Zahl)
{
  switch (Zahl)
  {
  case 0:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    break;
  case 1:
    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    break;
  case 2:
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, LOW);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      break;
  case 3:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    break;
  case 4:
    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
  case 5:
    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
  case 6:
    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
  case 7:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    break;
  case 8:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
  case 9:
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
  default:
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW); 
  }
}


jetzt muss ich mir, das von agmue genauer anschauen, denn das macht das selbe, nur deutlich schlanker :-)
ein Paar Sachen verstehe ich auf Anhieb, bei einigen Dingen muss ich erst nachschlagen und schauen was das eigendlich ist, und wie das funktioniert.
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

ElEspanol

Du hast z.B. viele Kopien des im Prinzip identischen Codes in der switch/case.
Sowas lagert man in Funktionen (oder Klassen) aus und übergibt nur die entsprechenden Variablen, die jeweils anders sind.
Auch packt man idealerweise gleichartige Variablen in Arrays, da kann man schön drüber iterieren. Sprich for-Schleife und nur 1 x PinMode anstatt 8 Mal pinmode

Nur so als Anregung zum verstehen von agmues Sketch.

Muecke

Servus miteinander,

ich sitze gerade daran den CODE von agmue #17 nachzuvollziehen.

Dazu würde ich gerne Oben anfangen und ein paar Fragen stellen.


Der Teil:
Code: [Select]
const byte digits[] = {
  //gfedcba
  0b0111111, // 0
  0b0000110, // 1
  0b1011011, // 2
  0b1001111, // 3
  0b1100110, // 4
  0b1101101, // 5
  0b1111101, // 6
  0b0100111, // 7
  0b1111111, // 8
  0b1101111  // 9
};


den Verstehe ich nicht ganz.
Mir isst klar das hier die Pins für die einzelnen Ziffern auf LOW (0) bzw. HIGH (1) gesetzt werden.
Doch ich kapiere es nicht wie.

Kann mir das einer erklären?


so verstehe ich aktuell auch die AUSGABE nicht so richtig :-(
Code: [Select]
void ausgabe(byte zahl)
{
  zahl = zahl % 10; // um die Feldgrenzen nicht zu überschreiten
  byte d = digits[zahl];
  for (byte j = 0; j < sizeof(Segment_1_PIN); j++)
  {
    bool hl = d & 1 << j;
    digitalWrite(Segment_1_PIN[j], hl);
  }
}

ich kann mir ganz grob aus mahlen was da passiert, ich verstehe es aber nicht :-(
ich hoffe das das kommt wenn ich den Obern Teil verstanden habe.


Gruß Mücke
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

agmue

Hallo Crazy Mosquito,

zur ersten Frage nehme ich als Beispiel die Ziffer "2". Das steht "0b1011011", was einer binären Darstellung einer Zahl entspricht. Wenn Du in Windows den Rechner öffnest, auf "Ansicht/Programmierer" wechselst, dann "Bin" und "Byte" wählst, kannst Du "1011011" eingeben. Wähle "Dez" für "91" oder "Hex" für "5B" in der Anzeige. Für den µC ist das immer die selbe Folge von Nullen und Einsen.

Jedem Bit im Byte ist ein Digit zugeordnet, dem Bit 0 ganz rechts das Digit a. Da es nur sieben Digits gibt, habe ich auch nur sieben Bits im Byte angegeben. Also "0b1011011" steht im Byte mit "01011011".


Für die zweite Frage steckt der Kern hier:

Code: [Select]
bool hl = d & 1 << j;

In der Schleife enthält j die Nummer für das zu prüfende Digit, also "0" für "a", "6" für "g". Mit 1 << j wird eine "1" oder 0b00000001 j-mal nach links verschoben. Nullmal verschieben macht nichts, sechsmal ergibt 0b01000000 (oder 0x40 oder 64).

Mittels "&" wird eine bitweise UND-Verknüpfung gemacht.

Beispiel für die Ziffer "2" j=0:
00000001  nullmal verschobene 1
01011011  Ziffer 2
00000001  Ergebnis


Beispiel für die Ziffer "2" j=5:
00100000  fünfmal verschobene 1
01011011  Ziffer 2
00000000  Ergebnis


Beispiel für die Ziffer "2" j=6:
01000000  sechsmal verschobene 1
01011011  Ziffer 2
01000000  Ergebnis


Die Variable hl hat den Tyo bool, speichert also HIGH oder LOW (true oder false). Dabei gelten alle Werte größer Null als HIGH (true) und alle Werte gleich Null als LOW (false).

In den Beispielen mit j=0 und j=6 ist also das Ergebnis HIGH (true), bei j=5 LOW (false).

Mittels digitalWrite(Segment_1_PIN[j], hl); wird das Digit j auf HIGH oder LOW gesetzt.

Muecke

Servus Agmue,

ich glaube ich wies was du meinst.

ich muss das noch mal im Ruhe durch gehen, und nebenher aufschreiben, leider bin ich jetzt wider unterwegs und wies nicht wie schnell ich dazu komme, ich melde mich aber noch mal deshalb!

Gruß Mücke
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Go Up