Lot­to­zah­len auf eine SD-Kar­te schreiben

Lese­zeit: 7 Minu­ten

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

Der Ardui­no „spielt“ für dich 6 Zah­len. Anschlie­ßend wer­den die Lot­to­zah­len gezo­gen, auf­stei­gend sor­tiert und auf die Anzahl der über­ein­stim­men­den Zah­len unter­sucht. Die Lot­to­zah­len sol­len mit einem SD-Kar­ten­mo­dul auf eine SD-Kar­te gespei­chert werden.

So sieht es aus:

Benö­tig­te Bauteile:

  • Berüh­rungs­sen­sor
  • SD-Kar­ten-Modul
  • Lei­tungs­dräh­te

Ach­te auf die Pin-Bele­gung des SD-Kar­ten-Moduls!
Die SD-Kar­te muss mit FAT32 for­ma­tiert sein!

SD-Kar­ten-Modul

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Als Biblio­the­ken ste­hen zwei zur Auswahl:

Die bereits ein­ge­bau­te Biblio­thek SD oder die Biblio­thek SdFat.

Die Biblio­thek SdFAT hat gegen­über der Biblio­thek SD den Vor­teil, dass sie auch mit län­ge­ren Datei­na­men (über die DOS-Kon­ven­ti­on 8.3 hin­aus) umge­hen kann. In der eigent­li­chen Pro­gram­mie­rung unter­schei­den sie sich nicht.

Beim Pro­gramm­start soll abge­fragt wer­den, ob die bis­he­ri­ge Datei gelöscht wer­den soll.

Bin­de die benö­tig­ten Biblio­the­ken ein und defi­nie­re die Variablen::

# include <SdFat.h>
/*
  Alternative:
  die bereits eingebaute Bibliothek verwenden:
  # include <SD.h>
  Der Dateiname muss dann auf 8.3 gekürzt werden
*/

// Bezeichnung der SD-Karte
// entfällt bei der Bibliothek SD
SdFat SD;

// Bezeichnung der Textdatei
File ZiehungLotto;

// Datenpin für das SD-Kartenmodul
int DatenPin = 4;

// Daten-Logger-Shield
// int DatenPin = 10;

// Pin des Sensors
int SENSOR = 7;

// Array für die gezogenen Zahlen
int LottoZahl[6];

// Array für die angekreuzten Zahlen
int SpielZahl[6];

// Minimum/Maximum der Zufallszahlen
int Minimum = 1;
int Maximum = 49;

// Anzahl der zu ziehenden Zahlen
int Anzahl = 6;
int SensorLesen;

Im set­up-Teil muss die SD-Kar­te gestar­tet wer­den und die Abfra­ge vor­be­rei­tet werden:

void setup() 
{
  // Zufallsgenerator starten
  randomSeed(analogRead(0));

  // bei Verwendung eines Tasters:
  pinMode(SENSOR, INPUT_PULLUP);

  // bei Verwendung eines Berührungssensors
  //pinMode(SENSOR, INPUT);

  Serial.begin(115200);

  // auf serielle Verbindung warten
  while (!Serial) { ; }
  /*
    SD-Karte mit Angabe des Datenpins starten
    wenn die Intialisierung fehlschlägt
    - keine SD-Karte vorhanden
    - falsche Pinbelegung
    → es wird eine Fehlermeldung angezeigt
  */
  if (!SD.begin(DatenPin)) 
  {
    Serial.println(F("Initialisierung fehlgeschlagen!"));
  } 
  else Serial.println(F("Initialisierung abgeschlossen"));
  Serial.println("Datei Lottozahlen.txt l\u00f6schen (j/n)?");
}
Download

Ver­wen­de für Bestim­mung der Spiel­zah­len und die Zie­hung der Lot­to­zah­len die Funk­ti­on ➨Zie­hung.

int Ziehung() 
{  
  for (int i = 0; i < Anzahl; i ++)   
  {   
    /*  
      die Lottozahl gilt solange als bereits gezogen    
      bis in der for-Schleife nachgewiesen wird, dass sie neu ist         
      und BereitsGezogen den Wert false hat   
    */ 
    bool BereitsGezogen = true;    
    while (BereitsGezogen)   
    {    
      // Zahl ziehen    
      LottoZahl[i] = random(Minimum, Maximum);  
      BereitsGezogen = false;       
      /*      
        Zufallszahl mit den bereits gezogenen Zahlen vergleichen          
        i wird in der ersten for-Schleife hochgezählt  
        alle bisherigen Zahlen (ii) werden mit den bisher gezogenen             
        (außer der gerade gezogenen) Zahlen verglichen (ii < i)         
        ist sie identisch, erhält BereitsGezogen den Wert true 
        es wird erneut eine Zufallszahl bestimmt  
        wenn die Zahl neu ist, (BereitsGezogen hat noch den Wert false)   
        wird die while-Schleife verlassen und die nächste Zahl   
        gezogen  
      */ 
      for (int ii = 0; ii < i; ii ++)   
      {
         if (LottoZahl[i] == LottoZahl[ii]) BereitsGezogen = true;       
      }
    }
  }
  /*
     das Array mit den Zahlen wird an das Hauptprogramm zurückgegeben 
     beim ersten Aufruf sind es die gespielten Zahlen
     beim zweiten Aufruf die gezogenen Lottozahlen
  */
   return LottoZahl[Anzahl];
}

Die Funk­ti­on Zah­len­Sor­tie­ren() sor­tiert die Lot­to­zah­len aufsteigend.

void ZahlenSortieren(int Zahlen[], int Groesse)
{
  // unsortierten Bereich des Arrays durchlaufen
  for (int i = 0; i < (Groesse - 1); i++) 
  { 
    // bei jedem Durchlauf wird das jeweils letzte Element weggelassen 
    for (int ii = 0; ii < (Groesse - (i + 1)); ii++) 
    {
      /* 
        wenn die aktuelle Zahl größer als die nachfolgende Zahl ist   
        -> aktuelle Zahl temporär speichern
        -> Zahlen vertauschen
        -> temporäre Zahl der nachfolgenden Zahl zuweisen
      */
      if (Zahlen[ii] > Zahlen[ii + 1])
      {
        int zwischengespeicherteZahl = Zahlen[ii];
        Zahlen[ii] = Zahlen[ii + 1];
        Zahlen[ii + 1] = zwischengespeicherteZahl;
      }
    }
  }
}
Download

Der loop-Teil. Beach­te die Kommentare.

void loop() 
{
  while (Serial.available() > 0) {
    while (Serial.available() > 0) 
    {
      char Eingabe = Serial.read();

      /*
        prüfen, ob die Datei existiert
        wenn ja → Datei Lottozahlen.txt löschen
      */
      if (Eingabe == 'j') 
      {
        if (SD.exists("Lottozahlen.txt")) 
        {
          // Datei entfernen
          SD.remove("Lottozahlen.txt");
          Serial.println(F("Datei Lottozahlen.txt entfernt!"));
        } 
        else 
        {
          Serial.println(F("Datei Lottozahlen.txt existiert nicht!"));
        }
      }

      // bei jeder anderen Taste
      else 
      {
        // \u00fc = ü
        Serial.println(F("Lottozahlen werden der Datei Lottozahlen.txt hinzugef\u00fcgt!"));
      }
    }
  }
  String AnzahlTreffer = "";
  String GespielteZahlen = "";
  String GezogeneZahlen = "";
  int Treffer = 0;
  SensorLesen = digitalRead(SENSOR);
  
  // bei Verwendung eines Tasters:
  // if (SensorLesen == LOW)

  // bei Verwendung eines Berührungssensors
  if (SensorLesen == LOW) 
  {
    delay(200);
    
    // Ziehung der "angekreuzten" Zahlen
    Ziehung();
    ZahlenSortieren(LottoZahl, 6);
    
    // String GespielteZahlen aus den Elementen des Arrays LottoZahl
    // zusammensetzen
    for (int i = 0; i < Anzahl; i++) 
    {
      GespielteZahlen = GespielteZahlen + LottoZahl[i] + " ";
      SpielZahl[i] = LottoZahl[i];
    }

    // Ziehung der Lottozahlen
    Ziehung();
    ZahlenSortieren(LottoZahl, 6);

    // Vergleichen der Elemente der Arrays SpielZahl und LottoZahl
    for (int i = 0; i < Anzahl; i++) {
      for (int ii = 0; ii < Anzahl; ii++) 
      {
        // Übereinstimmung gefunden -> Treffer um 1 erhöhen
        // AnzahlTreffer: String für übereinstimmende Zahlen erzeugen
        if (SpielZahl[i] == LottoZahl[ii]) {
          AnzahlTreffer = AnzahlTreffer + SpielZahl[i] + " ";
          Treffer++;
        }
      }
    }

    // String GezogeneZahlen aus den Elementen des Arrays LottoZahl
    // zusammensetzen
    for (int i = 0; i < Anzahl; i++) 
    {
      GezogeneZahlen = GezogeneZahlen + LottoZahl[i] + " ";
    }

    /*
      Datei zum Schreiben (FILE_WRITE) öffnen
      wenn sie noch nicht existiert, wird sie erstellt
    */
    ZiehungLotto = SD.open("Lottozahlen.txt", FILE_WRITE);
    if (ZiehungLotto) 
    {
      Serial.println("Schreibe Zahlen in Lottozahlen.txt ... ");
      Serial.println("-----------------------------");

      // Daten in die Datei schreiben
      ZiehungLotto.println("Gespielte Zahlen");
      ZiehungLotto.println(GespielteZahlen);
      ZiehungLotto.println("-----------------------------");
      ZiehungLotto.println("Gezogene Zahlen");
      ZiehungLotto.println(GezogeneZahlen);
      ZiehungLotto.println("-----------------------------");

      // keine Treffer
      if (Treffer == 0) ZiehungLotto.println("keine Treffer!");

      // getroffene Zahlen anzeigen
      else ZiehungLotto.println("Treffer: " + AnzahlTreffer);
      ZiehungLotto.println("-----------------------------");

      // Datei schließen
      ZiehungLotto.close();
      Serial.println("Abgeschlossen.");
      Serial.println();
    } 

    else 
    {
      Serial.println("Datei Lottozahlen.txt konnte nicht gelesen werden");
    }

    // Datei öffnen und Zahlen anzeigen
    ZiehungLotto = SD.open("Lottozahlen.txt");
    if (ZiehungLotto) 
    {
      Serial.println("Lese Lottozahlen.txt ...");

      // solange sich Zeilen in der Datei befinden ...
      while (ZiehungLotto.available()) 
      {
        // ... werden sie gelesen und im Seriellen Monitor ausgegeben
        Serial.write(ZiehungLotto.read());
      }

      // Datei schließen
      ZiehungLotto.close();
    } 
    else 
    {
      Serial.println("Lottozahlen konnte nicht geu00f6ffnet werden");
    }
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 13. Mrz 2023 @ 12:40