Countdown

Nach der Einführung ins Arduino-Board, wollen wir hier einen Countdown mit einer 7-Segment-Anzeige (wie im Digitalwecker) ansteuern.

Vorbereitung

Um zu wissen wie wir die Anzeige anschließen müssen suchen wir das Datenblatt im Wiki: 7-Segment-Anzeige - SA08-11SRWA und finden folgende Grafik:

Beispiel: Um den obersten Strich (a) anzuschalten verbinden wir GND mit den linken oberen Pin (1) und HIGH auf den Pin rechts oben (16). Alternativ auch 3,5 und/oder 11.

Hardware

Wir steuern jedes der 7 Segmente mit einem port (2-8) an. Bitte daran denken, dass jedes Segement einen Widerstand benötigt.

Bei der Belegung ist zu beachten, dass das Segment (a) auf Port 2 liegt, Segment (b) auf Port 3, usw.

Software

Beim Programmieren der Funktion sollte man systematisch vorgehen (Divide and Conquer).

  1. Für jede Zahl eine switch/case erstellen, der die Ports entsprechend schaltet
  2. eine Schleife die von einer geg. Variable rückwärts zählt

Zu testen gibts es hier einen fertigen Quellcode, der aber nicht die Vorgaben oben beinhaltet -> umschreiben.

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);
  digitalWrite(9, 0);  // start with the "dot" off
}

void loop() {
 // write '9'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 // write '8'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 // write '7'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(1000);
 // write '6'
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 // write '5'
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 // write '4'
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 // write '3'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 01);
 digitalWrite(7, 01);
 digitalWrite(8, 0);
 delay(1000);
 // write '2'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 01);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 01);
 digitalWrite(8, 0);
 delay(1000);
 // write '1'
 digitalWrite(2, 01);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 01);
 digitalWrite(6, 01);
 digitalWrite(7, 01);
 digitalWrite(8, 01);
 delay(1000);
 // write '0'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 01);
 delay(4000);
}

Erweitern

Nun wollen wir die Anzeige auf zwei Ziffern erweitern, dazu sind Anpassungen in der Hardware und Software vorzunehmen:

Hardware: Wir brauchen einen Transistor der zwischen den beiden Anzeigen hin-und-her schaltet. Dadurch sparen wir Pins am Arduino, weil wir so jeden mehrfach belegen können.

Software: mit einer Modulo10 Rechnung, können wir die jeweilige Ziffer der zwei Anzeigen ermitteln.

 Lösung:

#include <math.h>

byte(x)=34;            // Zahl von der gestartet werden soll
void zahl (int var);

void setup() {         //Pins auf Ausgabe schalten  
  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(13, OUTPUT);
  pinMode(12, OUTPUT);

}
void loop() {        //Hauptfunktion
  int(y)=0;          //Neue variablen definieren, y=rechte Ziffer, 
  int(z)=0;          //z= linke Ziffer
  y=x%10;            //Startwert der rechten Ziffer durch Modulo
  z=x-y;
  z=z/10;            //Startwert der linken Ziffer

  do{                               //große Schleife zählt die linke Ziffer immer uns 1 runter
    do{                             //kleine Schleife zählt die rechte Ziffer immer uns 1 runter
      for (int i=0; i <= 125; i++){ //Schleife zum Anzeigen der Ziffern
        digitalWrite(13, 0);        //Rechte Ziffer ausschalten: Transistor auf 13 aus 
        digitalWrite(12, 1);        //Linke enschalten: Transistor auf 12 an
        zahl (z);                   //Aufrufen der Pinbelegung für die Ziffer z
        delay(2);                  // 2ms warten um die Ziffer zu sehen
        digitalWrite(13, 1);        //Rechte Ziffer anschalten: Transistor 13 einschalten
        digitalWrite(12, 0);        //Linke aus: Transistor 12 aus
        zahl (y);                  //Aufrufen der Pinbelegung für die Ziffer y
        delay(2);
      }
      y=y-1;                      // rechte Ziffer um 1 reduzieren
    }
    while (y>=0);                  // Schleife abbrechen, wenn die rechte 0 angezeigt wurde
    z=z-1;                         // linke Ziffer um 1 reduzieren
    y=9;                          //rechte Ziffer wieder auf 9 setzen
  }
  while (z>=0);                  // Schleife beenden wenn beide 0 angezeigt haben
  delay(5000);                    //5 Sekunden warten, dann neustarten
}   

void zahl(int var) {          // ZahlenFunktionen
  switch (var) {
  case 9:
    // write '9'
    digitalWrite(2, 0);
    digitalWrite(3, 0);
    digitalWrite(4, 0);
    digitalWrite(5, 0);
    digitalWrite(6, 1);
    digitalWrite(7, 0);
    digitalWrite(8, 0);
    break;
  case 8:
    // write '8'
    digitalWrite(2, 0);
    digitalWrite(3, 0);
    digitalWrite(4, 0);
    digitalWrite(5, 0);
    digitalWrite(6, 0);
    digitalWrite(7, 0);
    digitalWrite(8, 0);
    break;
  case 7 :
    // write '7'
    digitalWrite(2, 0);
    digitalWrite(3, 0);
    digitalWrite(4, 0);
    digitalWrite(5, 1);
    digitalWrite(6, 1);
    digitalWrite(7, 1);
    digitalWrite(8, 1);
    break;

  case 6:
    // write '6'
    digitalWrite(2, 0);
    digitalWrite(3, 1);
    digitalWrite(4, 0);
    digitalWrite(5, 0);
    digitalWrite(6, 0);
    digitalWrite(7, 0);
    digitalWrite(8, 0);
    break;

  case 5:
    // write '5'
    digitalWrite(2, 0);
    digitalWrite(3, 1);
    digitalWrite(4, 0);
    digitalWrite(5, 0);
    digitalWrite(6, 1);
    digitalWrite(7, 0);
    digitalWrite(8, 0);
    break;
  case 4:
    // write '4'
    digitalWrite(2, 1);
    digitalWrite(3, 0);
    digitalWrite(4, 0);
    digitalWrite(5, 1);
    digitalWrite(6, 1);
    digitalWrite(7, 0);
    digitalWrite(8, 0);
    break;

  case 3:
    // write '3'
    digitalWrite(2, 0);
    digitalWrite(3, 0);
    digitalWrite(4, 0);
    digitalWrite(5, 0);
    digitalWrite(6, 01);
    digitalWrite(7, 01);
    digitalWrite(8, 0);
    break;

  case 2:
    // write '2'
    digitalWrite(2, 0);
    digitalWrite(3, 0);
    digitalWrite(4, 01);
    digitalWrite(5, 0);
    digitalWrite(6, 0);
    digitalWrite(7, 01);
    digitalWrite(8, 0);
    break;

  case 1:
    // write '1'
    digitalWrite(2, 01);
    digitalWrite(3, 0);
    digitalWrite(4, 0);
    digitalWrite(5, 01);
    digitalWrite(6, 01);
    digitalWrite(7, 01);
    digitalWrite(8, 01);
    break;

  case 0:
    // write '0'
    digitalWrite(2, 0);
    digitalWrite(3, 0);
    digitalWrite(4, 0);
    digitalWrite(5, 0);
    digitalWrite(6, 0);
    digitalWrite(7, 0);
    digitalWrite(8, 01);
    break;
  }
}