Sketch für VFD-Shield für Arduino funktioniert auf Uno aber nicht auf dem Mega

Hallo zusammen,

kann mir jemand sagen, warum ein Sketch für das Arduino VFD-Shield von Axiris, welches ich bei Elektor erworben haben zwar auf dem Uno aber nicht auf dem Mega funktioniert? Ich habe einige Sketche für das Shield getestet (z. B. den Demo oder Thermometer Sketch). Ich möchte den Uno gegen den Mega austauschen, da ich dieses Shield als Uhr- und Thermometer- /Luftfeuchtigkeits- anzeige nutzen möchte und hierzu den Temperatursensor gegen den DHT22 austauschen und um die RTC3231 erweitern möchte. Es gibt auch ein Beispielsketch mit einer anderen RTC und dem Temperatursensor DS18B20.
Ich wollte dann die beiden gegen die obengenannten austauschen. Habe allerdings schon Schwierigkeiten bei Tausch des Arduino-Boards... :confused:

Ich muss dazu sagen, dass ich noch nicht so viel Erfahrung mit der Programierung habe.
Deswegen habe ich auch diese vorgefertigten Sketche getestet.
Kann mir jemand sagen, warum der Sketch nicht auf dem Mega funktioniert?

Wäre toll, wenn mir jemand den Grund nennen kann.

Vielen Dank.

Anbei der Sketch.

iv3thermometer.ino (9.6 KB)

meinst Du dieses hier: https://www.elektor.de/iv-3-vfd-shield-for-arduino-kit-150064-71

Laut Sketch im Anhang werden die Pins direkt über die Ports angesteuert. Beim Mega sind die Port B, C und D einfach auf anderen Pins.
Außerdem vewendet der Sketch den Timer 1 um die interruptroutine aufzurufen. Weiß nicht ob hier die Regieter beim UNO und MEGA gleich sind.

Du mußt den Sketch umschreiben. Oder frag den Verkäufer bzw Hersteller Axiris ob er einen Sketch für den MEGA hat

Grüße Uwe

uwefed:
Weiß nicht ob hier die Regieter beim UNO und MEGA gleich sind.

Die Register sind fast gleich (der Mega hat einen Kanal pro 16 Bit Timer mehr, aber Code für den UNO läuft damit auch, da die Bits an der gleichen Stelle sind). Aber natürlich sind die Ausgänge der Timer auf anderen Pins

Hallo uwefed,

ja, genau das Shield meine ich.

Vielen Dank für die schnelle Antwort. Bedeutet das, dass ich Ports

PORTC &= ~0b00001111; // Clear pin A[0..3]
PORTD &= ~0b11111100; // Clear pin 2..7
PORTB &= ~0b00000011; // Clear pin 8..9

anpassen muss, so das ich die Pins

pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
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);

weiterhin nutzen kann?

Besten Gruß
Corax

Hallo Serenifly,

auch Dir vielen Dank für Deine Hilfe.

Da das Shield feste Pins verwendet, muss ich den Sketch umschreiben um die Tubes anzusprechen?! Ich benötige ja schon Pin 2-10 und A0 bis A3.
Ich dachte, da die Pinbezeichnung (unter Output) der beiden Boards gleich ist, sollte es kein Problem sein.

Da habe ich mich anscheint geirrt.
An welcher Stelle muss ich es umschreiben?

Besten Gruß
Corax

Die Pins haben schon die gleiche Bezeichnung, hängen aber an verschidenen Ports.
Lies mal das: Arduino Reference - Arduino Reference
Weiß nicht an welchen Pins der Timer 1 hängt.

Grüße Uwe

Hallo Uwe,

vielen Dank für Deine Hilfe.

Ich werde mir die Portbelegung morgen durchlesen.

Besten Gruß und eine gute Nacht
Corax

Hallo Uwe,

wenn ich es richtig sehe,ist es gar nicht so einfach,den UNO gegen einen Mega auszutauschen.

Pin Mega uno

D2 PE4 PD2
D3 PE5 PD3
D4 PG5 PD4
D5 PE3 PD5
D6 PH3 PD6
D7 PH4 PD7

A1 PF1 PC1
A2 PF2 PC2
A3 PF3 PC3

Beim UNO werden für die Tubesteuerung nur zwei Ports verwendet (D und C) und beim Mega vier (E,G,H und F).
Sehe ich das richtig?

Besten Gruß
Corax

Ja, siehst Du richtig.
Es gibt eine schnellere Ansteuerung der Pins als digitalWrite() ohne direkt die Ports anzusteuern. Versuch mal ob die schnell genug ist um die IV3 multiplexen zu können.

vieleicht geht diese Bibiothek:

Grüße Uwe

Hallo Uwe,

vielen lieben Dank.

Was muss ich alles abändern, wenn ich diese Library in diesen Sketch einbinde. Folgende Änderungen habe ich vorgenommen:

#include <digitalWriteFast.h>

void setup ()
{
pinModeFast(A0,OUTPUT);
pinModeFast(A1,OUTPUT);
pinModeFast(A2,OUTPUT);
pinModeFast(A3,OUTPUT);
pinModeFast(2,OUTPUT);
pinModeFast(3,OUTPUT);
pinModeFast(4,OUTPUT);
pinModeFast(5,OUTPUT);
pinModeFast(6,OUTPUT);
pinModeFast(7,OUTPUT);
pinModeFast(8,OUTPUT);
pinModeFast(9,OUTPUT);
pinModeFast(10,OUTPUT);

Muss ich dann die Zahlen, die jede Tube annehmen kann neu definieren? Was muss ich machen, damit die dementsprechenden Zahlen bzw. Zeichen korrrekt angezeigt werden? Wo nehme ich die Ports heraus und das Multiplexing (und vorallem wie) hinein?

Besten Gruß
Corax

iv3thermometer_Arduino_Mega.ino (9.75 KB)

Hallo Uwe,

ich habe jetzt versucht einmal mit einer anderen Library einfach nur eine Zahl mit dem Arduino Mega abzubilden:

Es gelingt mir aber nicht richtig. Es flackert und zeigt nicht die korrekten Zahlen an.

Liegt es daran, dass ich A0 bis A3 statt digitale Pins verwende? An diese Pins bin ich ja durch das Shield gebunden...

Oder habe ich etwas anderes falsch gemacht?

/*
pin 2

pin 7 | | pin 3
| |
pin 8 ---
| | pin 4
pin 6 | |
--- . pin 9
pin 5
*/

#include "SevSeg.h"
SevSeg sevseg;

void setup(){
byte numDigits = 4;
byte digitPins[] = {A0, A1, A2, A3};
byte segmentPins[] = {6, 5, 2, 3, 4, 7, 8, 9};

bool resistorsOnSegments = true;
bool updateWithDelaysIn = true;
byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
}

void loop(){
sevseg.setNumber(1234, 3);
sevseg.refreshDisplay();
}

Versuch mal die Ausgänge einzeln mittels digitalWrite() zu setzen.
A0 bia A4 können und werden hier als Digitale Pins verwendet.
Grüße Uwe

Hallo Uwe,

wenn ich die einzelnenSegmente anspreche funktioniert alles.
Ich habe jedes einzelne Segment (und Tube) ausprobiert und alle lassen sich korrekt ansteuern.

Allerdings weiß ich nicht genau, wie ich multiplexen kann und so für jedes Segment eine andere Zahl oder Zeichen anzeigen lassen kann...

Könntest Du mir da bitte helfen?

Vielen Dank.

Besten Gruß
Corax

Code:

/*
      pin 2
       ---
pin 7 |   | pin 3
      |   |
pin 8  ---
      |   | pin 4
pin 6 |   |
       --- . pin 9
      pin 5
*/

void setup(){
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);

pinMode(2, OUTPUT);  
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}

void loop(){
   digitalWrite(A0, HIGH);  //linke Tube
   digitalWrite(A1, HIGH);  //zweite Tube 
   digitalWrite(A2, HIGH);  //dritte Tube
   digitalWrite(A3, HIGH);  //rechte Tube

   digitalWrite(2, HIGH);   //oben
   digitalWrite(3, HIGH);   //oben rechst
   digitalWrite(4, HIGH);   //unten rechts
   digitalWrite(5, HIGH);   //unten  
   digitalWrite(6, HIGH);   //unten links
   digitalWrite(7, HIGH);   //oben links
   digitalWrite(8, HIGH);  //mitte
   digitalWrite(9, HIGH);   //Punkt

 delay(2000); 
   
   digitalWrite(A0, LOW);
   digitalWrite(A1, LOW);
   digitalWrite(A2, LOW);
   digitalWrite(A3, LOW);

   digitalWrite(2, LOW);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);

   delay(2000);
}

Multiplexen heißt jede Röhre kurz und nacheinander anzusteuern.
Die Pins 2 bis 9 sind die Segmente und die Pins A0 bia A3 sind die Gitter der 4 VFD Röhren.
Du steuerst die Segmente an (Ich weiß nicht ob Du LOW oder HIGH geben mußt) und ein Gitter; Da erscheint die Zahl auf einer der Röhren. Dann machst Du mit der nächsten weiter. usw.
Die Umschaltfrequenz sollte über 200Hz sein da ansonsten ein Flimmern zu sehen ist.
Grüße Uwe

Hallo Uwe,

ich die Frequenz höher als 100Hz stelle flackert er nicht mehr, aber die Zahlen werden nicht korrekt dargestellt (selbst bei 250HZ). Sprich, der Controller schaft nicht schnell genug abzuschalten, so das noch einige andere Segmente der anderen Zahlen in der jeweiligen Zahl erscheint....

Was kann ich dagegen tun, damit die Zahlen nihct flackern,aber trotzdem klar dargestellt werden?

Code:

/*
       pin 2
        ---
 pin 7 |   | pin 3
       |   |
 pin 8  ---
       |   | pin 4
 pin 6 |   |
        --- . pin 9
       pin 5
*/

void setup(){
 pinMode(A0, OUTPUT);
 pinMode(A1, OUTPUT);
 pinMode(A2, OUTPUT);
 pinMode(A3, OUTPUT);

 pinMode(2, OUTPUT);  
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
}

void loop(){
    digitalWrite(A0, HIGH);  //linke Tube
    digitalWrite(A1, LOW);  //zweite Tube 
    digitalWrite(A2, LOW);  //dritte Tube
    digitalWrite(A3, LOW);  //rechte Tube

    digitalWrite(2, LOW);   //oben
    digitalWrite(3, HIGH);   //oben rechst
    digitalWrite(4, HIGH);   //unten rechts
    digitalWrite(5, LOW);   //unten  
    digitalWrite(6, LOW);   //unten links
    digitalWrite(7, LOW);   //oben links
    digitalWrite(8, LOW);  //mitte
    digitalWrite(9, HIGH);   //Punkt

  delayMicroseconds(500); 
    
    digitalWrite(A0, LOW);
    digitalWrite(A1, HIGH);
    digitalWrite(A2, LOW);
    digitalWrite(A3, LOW);

    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);

   delayMicroseconds(500); 
    
    digitalWrite(A0, LOW);
    digitalWrite(A1, LOW);
    digitalWrite(A2, HIGH);
    digitalWrite(A3, LOW);

    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    
  delayMicroseconds(500);  
    
    digitalWrite(A0, LOW);
    digitalWrite(A1, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A3, HIGH);

    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);  
        
  delayMicroseconds(500);   
}

Besten Gruß
Corax

Setze Deinen Sketch bitte in Codetags (</>-Button im Forumseditor oder [code] davor und [/code] dahinter - ohne *).

Gruß Tommy

Hallo Tommy56,

vielen Dank für den Hinweis. Ich habe den Post angepast.

@ Uwe,

mit dem Tipp von Dir digitalWriteFast klappt es deutlich besser. Man sieht die anderen Segment nicht mehr so sehr stark.

Wie kann ich jetzt den DHT22 einbinden?

/*
       pin 2
        ---
 pin 7 |   | pin 3
       |   |
 pin 8  ---
       |   | pin 4
 pin 6 |   |
        --- . pin 9
       pin 5
*/

#include <digitalWriteFast.h>

void setup(){
 pinModeFast(A0, OUTPUT);
 pinModeFast(A1, OUTPUT);
 pinModeFast(A2, OUTPUT);
 pinModeFast(A3, OUTPUT);

 pinModeFast(2, OUTPUT);  
 pinModeFast(3, OUTPUT);
 pinModeFast(4, OUTPUT);
 pinModeFast(5, OUTPUT);
 pinModeFast(6, OUTPUT);
 pinModeFast(7, OUTPUT);
 pinModeFast(8, OUTPUT);
 pinModeFast(9, OUTPUT);
}

void loop(){
    digitalWriteFast(A0, HIGH);  //linke Tube
    digitalWriteFast(A1, LOW);  //zweite Tube 
    digitalWriteFast(A2, LOW);  //dritte Tube
    digitalWriteFast(A3, LOW);  //rechte Tube

    digitalWriteFast(2, LOW);   //oben
    digitalWriteFast(3, HIGH);   //oben rechst
    digitalWriteFast(4, HIGH);   //unten rechts
    digitalWriteFast(5, LOW);   //unten  
    digitalWriteFast(6, LOW);   //unten links
    digitalWriteFast(7, LOW);   //oben links
    digitalWriteFast(8, LOW);  //mitte
    digitalWriteFast(9, HIGH);   //Punkt

  delayMicroseconds(800); 
    
    digitalWriteFast(A0, LOW);
    digitalWriteFast(A1, HIGH);
    digitalWriteFast(A2, LOW);
    digitalWriteFast(A3, LOW);

    digitalWriteFast(2, HIGH);
    digitalWriteFast(3, HIGH);
    digitalWriteFast(4, LOW);
    digitalWriteFast(5, HIGH);
    digitalWriteFast(6, HIGH);
    digitalWriteFast(7, LOW);
    digitalWriteFast(8, HIGH);
    digitalWriteFast(9, LOW);

   delayMicroseconds(800); 
    
    digitalWriteFast(A0, LOW);
    digitalWriteFast(A1, LOW);
    digitalWriteFast(A2, HIGH);
    digitalWriteFast(A3, LOW);

    digitalWriteFast(2, HIGH);
    digitalWriteFast(3, HIGH);
    digitalWriteFast(4, HIGH);
    digitalWriteFast(5, HIGH);
    digitalWriteFast(6, LOW);
    digitalWriteFast(7, LOW);
    digitalWriteFast(8, HIGH);
    digitalWriteFast(9, LOW);
    
  delayMicroseconds(800);  
    
    digitalWriteFast(A0, LOW);
    digitalWriteFast(A1, LOW);
    digitalWriteFast(A2, LOW);
    digitalWriteFast(A3, HIGH);

    digitalWriteFast(2, LOW);
    digitalWriteFast(3, HIGH);
    digitalWriteFast(4, HIGH);
    digitalWriteFast(5, LOW);
    digitalWriteFast(6, LOW);
    digitalWriteFast(7, HIGH);
    digitalWriteFast(8, HIGH);
    digitalWriteFast(9, LOW);  
        
  delayMicroseconds(800);   
}

Es wird bessere wenn Du das Gate (A0 bis A3) abschaltest, die Segmente für die nächste Ziffer setzt und dann das nächste Gate aktivierst. So bleiben die Geisterbilder aus.

Grüße Uwe

Hallo Uwe,

vielen Dank für den super Tipp. Ich habe jetzt zwischendurch nicht nur A0-A3 abgeschaltet, sondern gleich alle, damit geht es am allerbesten. Bei 500 Microsekunden funktioniert es noch nicht ganz so gut.

Das klappt sowohl mit pinModeFast/ digitalWriteFast als auch ohne Fast.

Was ist hier besser?

/*
       pin 2
        ---
 pin 7 |   | pin 3
       |   |
 pin 8  ---
       |   | pin 4
 pin 6 |   |
        --- . pin 9
       pin 5
*/

#include <digitalWriteFast.h>

void setup(){
 pinModeFast(A0, OUTPUT);
 pinModeFast(A1, OUTPUT);
 pinModeFast(A2, OUTPUT);
 pinModeFast(A3, OUTPUT);

 pinModeFast(2, OUTPUT);  
 pinModeFast(3, OUTPUT);
 pinModeFast(4, OUTPUT);
 pinModeFast(5, OUTPUT);
 pinModeFast(6, OUTPUT);
 pinModeFast(7, OUTPUT);
 pinModeFast(8, OUTPUT);
 pinModeFast(9, OUTPUT);
}

void loop(){
    digitalWriteFast(A0, LOW);  //linke Tube
    digitalWriteFast(A1, LOW);  //zweite Tube 
    digitalWriteFast(A2, LOW);  //dritte Tube
    digitalWriteFast(A3, LOW);  //rechte Tube


    digitalWriteFast(2, LOW);
    digitalWriteFast(3, LOW);
    digitalWriteFast(4, LOW);
    digitalWriteFast(5, LOW);
    digitalWriteFast(6, LOW);
    digitalWriteFast(7, LOW);
    digitalWriteFast(8, LOW);
    digitalWriteFast(9, LOW); 

delayMicroseconds(800); 

    digitalWriteFast(A0, HIGH);  //linke Tube
    digitalWriteFast(A1, LOW);  //zweite Tube 
    digitalWriteFast(A2, LOW);  //dritte Tube
    digitalWriteFast(A3, LOW);  //rechte Tube

    digitalWriteFast(2, LOW);   //oben
    digitalWriteFast(3, HIGH);   //oben rechst
    digitalWriteFast(4, HIGH);   //unten rechts
    digitalWriteFast(5, LOW);   //unten  
    digitalWriteFast(6, LOW);   //unten links
    digitalWriteFast(7, LOW);   //oben links
    digitalWriteFast(8, LOW);  //mitte
    digitalWriteFast(9, HIGH);   //Punkt

  delayMicroseconds(800); 
  
      digitalWriteFast(A0, LOW);  //linke Tube
    digitalWriteFast(A1, LOW);  //zweite Tube 
    digitalWriteFast(A2, LOW);  //dritte Tube
    digitalWriteFast(A3, LOW);  //rechte Tube


    digitalWriteFast(2, LOW);
    digitalWriteFast(3, LOW);
    digitalWriteFast(4, LOW);
    digitalWriteFast(5, LOW);
    digitalWriteFast(6, LOW);
    digitalWriteFast(7, LOW);
    digitalWriteFast(8, LOW);
    digitalWriteFast(9, LOW); 

delayMicroseconds(800); 
    
    digitalWriteFast(A0, LOW);
    digitalWriteFast(A1, HIGH);
    digitalWriteFast(A2, LOW);
    digitalWriteFast(A3, LOW);

 
    digitalWriteFast(2, HIGH);
    digitalWriteFast(3, HIGH);
    digitalWriteFast(4, LOW);
    digitalWriteFast(5, HIGH);
    digitalWriteFast(6, HIGH);
    digitalWriteFast(7, LOW);
    digitalWriteFast(8, HIGH);
    digitalWriteFast(9, LOW);

   delayMicroseconds(800); 
   
     digitalWriteFast(A0, LOW);  //linke Tube
    digitalWriteFast(A1, LOW);  //zweite Tube 
    digitalWriteFast(A2, LOW);  //dritte Tube
    digitalWriteFast(A3, LOW);  //rechte Tube


    digitalWriteFast(2, LOW);
    digitalWriteFast(3, LOW);
    digitalWriteFast(4, LOW);
    digitalWriteFast(5, LOW);
    digitalWriteFast(6, LOW);
    digitalWriteFast(7, LOW);
    digitalWriteFast(8, LOW);
    digitalWriteFast(9, LOW); 

delayMicroseconds(800); 
    
    digitalWriteFast(A0, LOW);
    digitalWriteFast(A1, LOW);
    digitalWriteFast(A2, HIGH);
    digitalWriteFast(A3, LOW);


    digitalWriteFast(2, HIGH);
    digitalWriteFast(3, HIGH);
    digitalWriteFast(4, HIGH);
    digitalWriteFast(5, HIGH);
    digitalWriteFast(6, LOW);
    digitalWriteFast(7, LOW);
    digitalWriteFast(8, HIGH);
    digitalWriteFast(9, LOW);
    
  delayMicroseconds(800);  

      digitalWriteFast(A0, LOW);  //linke Tube
    digitalWriteFast(A1, LOW);  //zweite Tube 
    digitalWriteFast(A2, LOW);  //dritte Tube
    digitalWriteFast(A3, LOW);  //rechte Tube


    digitalWriteFast(2, LOW);
    digitalWriteFast(3, LOW);
    digitalWriteFast(4, LOW);
    digitalWriteFast(5, LOW);
    digitalWriteFast(6, LOW);
    digitalWriteFast(7, LOW);
    digitalWriteFast(8, LOW);
    digitalWriteFast(9, LOW); 

delayMicroseconds(800); 
    
    digitalWriteFast(A0, LOW);
    digitalWriteFast(A1, LOW);
    digitalWriteFast(A2, LOW);
    digitalWriteFast(A3, HIGH);


    digitalWriteFast(2, LOW);
    digitalWriteFast(3, HIGH);
    digitalWriteFast(4, HIGH);
    digitalWriteFast(5, LOW);
    digitalWriteFast(6, LOW);
    digitalWriteFast(7, HIGH);
    digitalWriteFast(8, HIGH);
    digitalWriteFast(9, LOW);  
        
  delayMicroseconds(800);   
}

Besten Gruß
Corax

Hallo Uwe,

folgendes Skript habe ich gefunden und angepasst. Es funktioniert sehr gut und flackert nicht und zeigt auch alle Zahlen korrekt an.

Leider verstehe ich einige Zeilen nicht:

void displayNumber(int toDisplay)

lightNumber(toDisplay % 10);
toDisplay /= 10;

lightNumber(10); //--> (ist das die Pause zwichen den einzelnen Zahlen? das was ich jetzt auch gemacht habe (alles ausschalten zwischen dem Multiplexen?)

/*
       pin 2
        ---
 pin 7 |   | pin 3
       |   |
 pin 8  ---
       |   | pin 4
 pin 6 |   |
        --- . pin 9
       pin 5
*/


int digit1 = A0; 
int digit2 = A1; 
int digit3 = A2; 
int digit4 = A3;

int pin2 = 2; 
int pin3 = 3; 
int pin4 = 4; 
int pin5 = 5; 
int pin6 = 6; 
int pin7 = 7; 
int pin8 = 8;
int pin9 = 9;

void setup(){

 
 pinMode(digit1, OUTPUT);
 pinMode(digit2, OUTPUT);
 pinMode(digit3, OUTPUT);
 pinMode(digit4, OUTPUT);

 pinMode(pin2, OUTPUT);  
 pinMode(pin3, OUTPUT);
 pinMode(pin4, OUTPUT);
 pinMode(pin5, OUTPUT);
 pinMode(pin6, OUTPUT);
 pinMode(pin7, OUTPUT);
 pinMode(pin8, OUTPUT);
 pinMode(pin9, OUTPUT);
}

void loop(){


  displayNumber(millis()/1000);

   
}

void displayNumber(int toDisplay) {

  long beginTime = millis();


for(int digit = 4 ; digit > 0 ; digit--) {

    
    switch(digit) {
    case 1:
      digitalWrite(digit1, HIGH);
      break;
    case 2:
      digitalWrite(digit2, HIGH);
      break;
    case 3:
      digitalWrite(digit3, HIGH);
      break;
    case 4:
      digitalWrite(digit4, HIGH);
      break;
    }


  lightNumber(toDisplay % 10);
    toDisplay /= 10;

delayMicroseconds(800); 

lightNumber(10);

    digitalWrite(digit1, LOW);
    digitalWrite(digit2, LOW);
    digitalWrite(digit3, LOW);
    digitalWrite(digit4, LOW);

     }

  while( (millis() - beginTime) < 10) ; 
}
 void lightNumber(int numberToDisplay) {


switch (numberToDisplay){

  case 0:
    digitalWrite(pin2, HIGH);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, HIGH);
    digitalWrite(pin6, HIGH);
    digitalWrite(pin7, HIGH);
    digitalWrite(pin8, LOW);
    break;

  case 1:
    digitalWrite(pin2, LOW);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, LOW);
    digitalWrite(pin6, LOW);
    digitalWrite(pin7, LOW);
    digitalWrite(pin8, LOW);
    break;

  case 2:
    digitalWrite(pin2, HIGH);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, LOW);
    digitalWrite(pin5, HIGH);
    digitalWrite(pin6, HIGH);
    digitalWrite(pin7, LOW);
    digitalWrite(pin8, HIGH);
    break;

  case 3:
    digitalWrite(pin2, HIGH);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, HIGH);
    digitalWrite(pin6, LOW);
    digitalWrite(pin7, LOW);
    digitalWrite(pin8, HIGH);
    break;

  case 4:
    digitalWrite(pin2, LOW);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, LOW);
    digitalWrite(pin6, LOW);
    digitalWrite(pin7, HIGH);
    digitalWrite(pin8, HIGH);
    break;

  case 5:
    digitalWrite(pin2, HIGH);
    digitalWrite(pin3, LOW);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, HIGH);
    digitalWrite(pin6, LOW);
    digitalWrite(pin7, HIGH);
    digitalWrite(pin8, HIGH);
    break;

  case 6:
    digitalWrite(pin2, HIGH);
    digitalWrite(pin3, LOW);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, HIGH);
    digitalWrite(pin6, HIGH);
    digitalWrite(pin7, HIGH);
    digitalWrite(pin8, HIGH);
    break;

  case 7:
    digitalWrite(pin2, HIGH);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, LOW);
    digitalWrite(pin6, LOW);
    digitalWrite(pin7, LOW);
    digitalWrite(pin8, LOW);
    break;

  case 8:
    digitalWrite(pin2, HIGH);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, HIGH);
    digitalWrite(pin6, HIGH);
    digitalWrite(pin7, HIGH);
    digitalWrite(pin8, HIGH);
    break;

  case 9:
    digitalWrite(pin2, HIGH);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, HIGH);
    digitalWrite(pin5, HIGH);
    digitalWrite(pin6, LOW);
    digitalWrite(pin7, HIGH);
    digitalWrite(pin8, HIGH);
    break;

   case 10:
    digitalWrite(pin2, LOW);
    digitalWrite(pin3, LOW);
    digitalWrite(pin4, LOW);
    digitalWrite(pin5, LOW);
    digitalWrite(pin6, LOW);
    digitalWrite(pin7, LOW);
    digitalWrite(pin8, LOW);
    break;   
}
}

Könntest Du mir die Zeilen (Befehle) erklären?

Vielen Dank.

Besten Gruß
Corax