Lot­to­zah­len auf eine SD-Karte schrei­ben

Lese­zeit: 6 Minu­ten
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-Kartenmodul auf eine SD-Karte gespei­chert wer­den.

Benö­tig­te Bau­tei­le:

  • Berüh­rungs­sen­sor
  • SD-Kartenleser
  • Lei­tungs­dräh­te

Ach­te auf die Pin-Belegung des SD-Kartenlesers!
Die SD-Karte muss mit FAT32 for­ma­tiert sein!

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 Aus­wahl:

Die bereits ein­ge­bau­te Biblio­thek SD oder die Biblio­thek SdFat.
Sketch → Biblio­thek ein­bin­den → Biblio­the­ken ver­wal­ten

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-Konvention 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 Varia­blen::

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;

include <ArduinoSort.h>
/* 
  Bibliothek ArduinoSort 
  Download:   https://github.com/emilv/ArduinoSort/releases   
  Installieren: 
  Sketch -> Bibliothek einbinden -> Zip-Bibliothek hinzufügen
*/ 

// Bezeichnung der Textdatei
File ZiehungLotto;

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

// 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 setup-Teil muss die SD-Karte gestar­tet wer­den und die Abfra­ge vor­be­rei­tet wer­den:

void setup() 
{ 
  // Zufallsgenerator starten
  randomSeed(analogRead(0));
  pinMode(SENSOR, INPUT);
  Serial.begin(9600);
  /*  
    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(CSPIN)) 
  { 
    Serial.println(F("Initialisierung fehlgeschlagen!"));
  }
  else Serial.println(F("Initialisierung abgeschlossen")); 
  Serial.println("Datei Lottozahlen.txt l\u00f6schen (j/n)?");
}

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.

Im loop-Teil wird die Ein­ga­be ver­ar­bei­tet:

void loop()
{
  while (Serial.available() > 0)  
  { 
    // solange lesen, bis return \n eingegeben wurde     
    String Eingabe = Serial.readStringUntil("\n");

    // das letzte Zeichen ist return → soll entfernt werden
    Eingabe = Eingabe.substring(0, Eingabe.length() - 1); 
    /* 
      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("Datei Lottozahlen.txt entfernt!");        
      }
      else 
      {  
        Serial.println("Datei Lottozahlen.txt existiert nicht!"); 
      } 
    }  
    // bei jeder anderen Taste  
    else 
    {    
      // \u00fc = ü
      Serial.println("Lottozahlen werden der Datei Lottozahlen.txt  hinzugef\u00fcgt!"); 
    }
  }

Im wei­te­ren Teil wer­den die Zah­len gezo­gen und die Anzahl der Tref­fer ermit­telt.

  // Variable definieren
  String GespielteZahlen = "";   
  String GezogeneZahlen = "";
  int Treffer = 0;

  SensorLesen = digitalRead(SENSOR);
  if (SensorLesen == HIGH)
  {
    delay(200);

    // Ziehung der "angekreuzten" Zahlen
    Ziehung();
    /*
      Array Sortieren mit ArduinoSort
      sortArray(NameArray, AnzahlElemente)
      sortArrayReverse(NameArray, AnzahlElemente)
    */
    sortArray(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();

    sortArray(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
        if (SpielZahl[i] == LottoZahl[ii]) Treffer ++;
      }
    }

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

    /*
      Datei zum Schreíben (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("-----------------------------");

      // geänderte Ausgabe bei keinem Treffer
      if (Treffer == 0) ZiehungLotto.println("keine Treffer!");
      else
      {
        ZiehungLotto.println(String(Treffer) + " Treffer");
      }
      ZiehungLotto.println("-----------------------------");

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

Zum Schluss wird die Datei geöff­net und der Inhalt im Seri­el­len Moni­tor ange­zeigt.

    // Datei öffnen und Zahlen anzeigen
    ZiehungLotto = SD.open("Lottozahlen.txt");
    if (ZiehungLotto)
    {
      Serial.println("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 geoeffnet werden");
    }
  } 
}


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 23. Aug 2020 @ 22:35