Wür­feln 7-Seg­ment-Anzei­ge mit Fernbedienung

# include "IRremote.h"

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

int EmpfaengerPin = 11;
int LAUTSPRECHER = 10;

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

  // Zufallsgenerator starten
  Serial.begin(9600);
  randomSeed(analogRead(A0));
}

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);
  }
}

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;
  }
}

int ZufallsZahl(int Minimum, int Maximum)
{
  int Zahl = random(Minimum, Maximum);
  return Zahl;
}

Letzte Aktualisierung: 25. Jul 2023 @ 13:25