Wür­feln ein­stel­li­ge 7-Segment-Anzeige und Fernbedienung

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF
Navi­ga­ti­on

Wird eine belie­bi­ge Tas­te auf der Fern­be­die­nung gedrückt, wür­felt das Pro­gramm eine Zahl und zeigt sie auf dem 7-Segment-Display an. Kurz ange­zeig­te Zufalls­zah­len simu­lie­ren den Wür­fel­vor­gang, bevor die end­gül­tig gewür­fel­te Zahl ange­zeigt wird.

So sieht es aus:

Benö­tig­te Bauteile:

  • Keyes Fern­be­die­nung
  • Infra­rotem­pfän­ger
  • Laut­spre­cher
  • ein­stel­li­ge 7-Segment-Anzeige
  • Lei­tungs­dräh­te

Die Zah­len, die dar­ge­stellt wer­den sol­len, wer­den als Binär­wert notiert. Eine 1 steht für Seg­ment ein­schal­ten, eine 0 zeigt das Seg­ment nicht an. Die Rei­hen­fol­ge der Zif­fern ent­spricht der Rei­hen­fol­ge der Pins. Die ers­te Zif­fer schal­tet Pin 2, die zwei­te Pin 3 und die letz­te Pin 9.

Ach­te auf die Pin­be­le­gung des Infrarotempfängers.

Ach­te dar­auf, dass die Bat­te­rie rich­tig ein­ge­legt wur­de. Der Minus-Pol liegt oben.

Benö­tig­te Bibliothek:

Suche die Biblio­thek IRremote ...

… kli­cke auf Instal­lie­ren.

Ardui­no IDE 2x:

🔗 Umwand­lung von Zah­len­sys­tem (exter­ner Link, abge­ru­fen am 12.3.2021)

Die Fern­be­die­nung sen­det beim Druck auf die Tas­ten einen Zahlencode.

Die Tas­ten­codes bezie­hen sich auf die Keyes-Fernbedienung und die Opensmart-Fernbedienung.

Tas­ten­codes Keyes-Fernbedienung (hexa­de­zi­mal und dezimal)

obenlinksrechtsuntenOK1234
0×46
70
0×44
68
0×43
67
0×15
21
0×40
64
0×16
22
0×19
25
0xD
13
0xC
12
56789+0#
0×18
24
0x5E
94
0×8
8
0x1C
28
0x5A
90
0×42
66
0×52
82
0x4A
74

Tas­ten­codes Open-Smart-Fernbedienung (hexa­de­zi­mal und dezimal)

Ein/ausMenuTest+| ◄ ◄►►|0-
0×45
69
0×47
71
0×44
68
0×40
64
0×40
64
0×7
7
0×15
21
0×9
9
0×16
22
0×19
25
C123456789
0xD
13
0xC
12
0×18
24
0x5E
94
0×8
8
0x1C
28
0x5A
90
0×42
66
0×52
82
0x4A
74

Die Tas­ten­codes kannst du mit fol­gen­dem Pro­gramm her­aus­fin­den. Sie wer­den im Seri­el­len Moni­tor angezeigt. 

# include <IRremote.h>

int EmpfaengerPin = 11;

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  // Empfänger starten
  IrReceiver.begin(EmpfaengerPin);
}

void loop()
{
  // Daten lesen
  if (IrReceiver.decode())
  {
    /*
      printIRResultMinimal zeigt die verwendete Taste
      P = Protokoll
      C = Kommando in Hex
    */

    Serial.print(F("P = Protokoll C = Taste hexadezimal: "));
    IrReceiver.printIRResultMinimal(&Serial);
    Serial.print(F(" Dezimal: "));
    Serial.println(IrReceiver.decodedIRData.command);

    delay(200);

    // nächsten Wert lesen
    IrReceiver.resume();
  }
}

Bin­de die benö­tig­te Biblio­thek ein und defi­nie­re den Pin des Empfängers.

# include <IRremote.h>

byte Zahlen[6] = 
{
  B01100000,  // 1
  B11001101,  // 2
  B11101001,  // 3
  B01100011,  // 4
  B10101011,  // 5
  B10101111,  // 6
};

int EmpfaengerPin = 11;
int LAUTSPRECHER = 10;

Der setup-Teil. Beach­te die Kommentare.

void setup() 
{
  // Pins auf OUTPUT setzen
  for (int i = 2; i <= 9; i++) {
    pinMode(i, OUTPUT);
  }

  // Infrarot-Empfänger starten
  IrReceiver.begin(EmpfaengerPin);

  // Zufallsgenerator starten
  randomSeed(analogRead(0));

  Serial.begin(9600);
}

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  /*
    der Bereich der Zahlen 1 bis 6
    als oberer Wert muss 7 angegeben werden,
    weil immer nach unten gerundet wird
  */
  int Minimum = 1;
  int Maximum = 7;
  
  // Daten lesen -> beliebige Taste gedrückt
  if (IrReceiver.decode())
  {
    /*
      printIRResultMinimal zeigt die verwendete Taste
      P = Protokoll
      C = Kommando in Hex
      auskommentiert lassen wenn die Tastencodes bekannt sind
      Serial.print(F("P = Protokoll C = Taste hexadezimal: "));
      IrReceiver.printIRResultMinimal(&Serial);
      Serial.print(F(" Dezimal: "));
      Serial.println(IrReceiver.decodedIRData.command);
    */
    delay(100);
  
    // nächsten Wert lesen
    IrReceiver.resume();
    
    // Würfeleffekt
    // in schneller Folge werden 10 Zufallszahlen angezeigt
    for (int i = 0; i < 10; i++)
    {
      // gewürfelte Zahl anzeigen
      byte Zahl = ZufallsZahl(Minimum, Maximum);
      delay(100);
      ZahlZeigen(Zahlen[Zahl - 1]);
    }
    tone(LAUTSPRECHER, 1000, 10);
  }
}

Im loop-Teil wird die Funk­ti­on Zahl­Zei­gen() auf­ge­ru­fen. Als Para­me­ter wird ihr ein Ele­ment des Arrays Zah­len – eine der Binär­wer­te für die Zahl 9 bis 0 – übergeben.

void ZahlZeigen(byte ArrayZahl)
{
  // Bits des Arrays ArrayZahl prüfen
  // von Pin 2 bis Pin 9 durchlaufen
  for (int i = 2; i <= 9; i++)
  {
    /*
      vergleicht das Byte ArrayZahl mit dem Byte B10000000
      befindet sich an beiden Positionen eine 1
      das Ergebnis der Prüfung ist also nicht 0
      -> Segment einschalten
      ist eine der Positionen eine 0
      das Ergebnis der Prüfung ist 0
      -> Segment ausschalten
      1 Bit nach links schieben -> nächstes Bit prüfen
      nach 8 Durchläufen sind alle Segmente (Pins) richtig geschaltet
    */
    if ((ArrayZahl & B10000000) != 0) digitalWrite(i, HIGH);
    else  digitalWrite(i, LOW);
    ArrayZahl = ArrayZahl << 1;
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 1. Dez 2022 @ 17:25