Wür­feln ein­stel­li­ge 7-Seg­ment-Anzei­ge und Fernbedienung

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

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-Seg­ment-Dis­play 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 der Infrarotempfänger

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 19.2.23)

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

Tas­ten­codes Keyes-Fernbedienung

Pfeil oben
Tas­ten­code70
Pfeil linksTas­te OKPfeil rechts
Tas­ten­code686467
Pfeil unten
Tas­ten­code21
Tas­te 1Tas­te 22Tas­te 3
Tas­ten­code222513
Tas­te 4Tas­te 5Tas­te 6
Tas­ten­code122494
Tas­te 7Tas­te 8Tas­te 9
Tas­ten­code82890
Tas­te *Tas­te 0Tas­te #
Tas­ten­code668274

➨Tas­ten­codes Open­Smart Fernbedienung

➨Test­pro­gramm belie­bi­ge Fernbedienung

Die Tas­ten­codes für die Keyes-Fern­be­die­nung kannst du mit fol­gen­dem Pro­gramm her­aus­fin­den. Sie wer­den im Seri­el­len Moni­tor angezeigt. 

// benötigte Bibliothek einbinden
# include "IRremote.h"

// der Pin, an dem der Infrarot-Empfänger angeschlossen ist
int EmpfaengerPin = 11;

void setup()
{
  // Seriellen Monitor starten
  Serial.begin(9600);

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

void loop()
{
  // decode() -> Daten lesen
  if (IrReceiver.decode())
  {
    // kurzes delay, damit nur ein Tastendruck gelesen wird
    delay(200);

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

    /*
      der Empfänger empfängt zwischendurch Signale,
      die nicht ausgewertet werden können
      es sollen dehalb nur die korrekt erkannten Tasten ausgewertet werden
      die Dezimalwerte der korrekten erkannten Tasten liegen zwischen > 0 und < 95
      es wird abgefragt, ob das empfangene Kommando decodedIRData.command
      zwischen 0 und (&&) 95 liegt
    */
    if (IrReceiver.decodedIRData.command > 0 && IrReceiver.decodedIRData.command < 95)
    {
      Serial.print("Dezimalwert: ");

      // IrReceiver.decodedIRData.command = Wert der gedrückten Taste
      Serial.print(IrReceiver.decodedIRData.command);
      Serial.print(" -> ");

      // Werte abfragen und anzeigen
      if (IrReceiver.decodedIRData.command == 22) Serial.println("Taste 1");
      if (IrReceiver.decodedIRData.command == 25) Serial.println("Taste 2");
      if (IrReceiver.decodedIRData.command == 13) Serial.println("Taste 3");
      if (IrReceiver.decodedIRData.command == 12) Serial.println("Taste 4");
      if (IrReceiver.decodedIRData.command == 24) Serial.println("Taste 5");
      if (IrReceiver.decodedIRData.command == 94) Serial.println("Taste 6");
      if (IrReceiver.decodedIRData.command == 8) Serial.println("Taste 7");
      if (IrReceiver.decodedIRData.command == 28) Serial.println("Taste 8");
      if (IrReceiver.decodedIRData.command == 90) Serial.println("Taste 9");
      if (IrReceiver.decodedIRData.command == 82) Serial.println("Taste 0");
      if (IrReceiver.decodedIRData.command == 66) Serial.println("Taste *");
      if (IrReceiver.decodedIRData.command == 74) Serial.println("Taste #");
      if (IrReceiver.decodedIRData.command == 68) Serial.println("Pfeil links");
      if (IrReceiver.decodedIRData.command == 67) Serial.println("Pfeil rechts");
      if (IrReceiver.decodedIRData.command == 70) Serial.println("Pfeil oben");
      if (IrReceiver.decodedIRData.command == 21) Serial.println("Pfeil unten");
      if (IrReceiver.decodedIRData.command == 64) Serial.println("OK");
    }
  }
}

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 set­up-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(A0));

  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 ZahlZ­ei­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: 6. Okt 2023 @ 10:48