Pro­gramm­tei­le auslagern

Lese­zeit: 6 Minu­ten

Metho­den und ➨Funk­tio­nen wer­den nor­ma­ler­wei­se neben dem setup- und dem loop-Teil in einer ein­zi­gen Datei abge­spei­chert. Häu­fig ver­wen­de­te Pro­gramm­tei­le kön­nen in einer sepa­ra­ten Datei aus­ge­la­gert werden.

Bei­spiel:

Im Pro­gramm ➨Ein­mal­eins­rei­hen soll die Metho­de Rei­he­An­zei­gen aus­ge­la­gert werden :

Erstel­le mit einem belie­bi­gen Text­edi­tor eine Datei ReiheAnzeigen.h.

void ReiheAnzeigen(long Reihe) 
{
  Serial.print("Einmaleins der ");
  Serial.println(Reihe);

  for (int zaehler = 1; zaehler <= 10; zaehler++) 
  {
    Serial.print(zaehler);
    Serial.print(" * ");
    Serial.print(Reihe);
    Serial.print(" = ");
    Serial.print(zaehler * Reihe);
    Serial.print("\n");
  }
  Serial.print("-------------------------------\n");
}

Spei­che­re die­se Datei im glei­chen Ord­ner, in dem sich auch die .ino Datei befindet.

Das eigent­li­che Programm:

// Datei ReiheAnzeigen.h einbinden
# include "ReiheAnzeigen.h"

String Eingabe = "";

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

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

  Serial.println("Einmaleins: Gib eine Zahl ein!");
  Serial.println("------------------------------"); 
}

void loop() 
{
  while (Serial.available() > 0) 
  {
    // Eingabe im Seriellen Monitor lesen
    char Zahl = Serial.read();

    // auf Zahl prüfen
    if (isDigit(Zahl)) Eingabe += Zahl;
    }

    // Enter/Senden gedrückt
    if (Zahl == '\n') 
    {
      // eingegebene Zahl zu int umwandeln
      long Reihe = Eingabe.toInt();

      // Methode ReiheAnzeigen aus ReiheAnzeigen.h aufrufen
      ReiheAnzeigen(Reihe);
      Eingabe = "";
    }
  }
}

Wei­te­res Beispiel:

Im Pro­gramm ➨Lot­to­zah­len - Anzei­ge im Seri­el­len Moni­tor sol­len Metho­den und Funk­tio­nen aus­ge­la­gert werden:

Erstel­le mit einem belie­bi­gen Text­edi­tor eine Datei Ziehung.h.

int Ziehung(int LottoZahl[], int Anzahl, int Minimum, int Maximum)
{
  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
      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
        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;
      }
    }
  }
  return LottoZahl[Anzahl];
}

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

void LottzahlenAnzeigen(int Treffer, String GespielteZahlen, String GezogeneZahlen, String AnzahlTreffer, int Durchlauf)
{
   // Anzeige Serieller Monitor

    Serial.println("Ziehung " + String(Durchlauf));
    Serial.println("-----------------------------");

    Serial.println("Gespielte Zahlen");
    Serial.println("-----------------------------");
    Serial.println(GespielteZahlen);
    Serial.println("-----------------------------");


    // Anzeige der Zahlen Serieller Monitor
    Serial.println("Gezogene Zahlen");
    Serial.println("-----------------------------");
    Serial.println(GezogeneZahlen);
    Serial.println("-----------------------------");

    if (Treffer == 0) Serial.println("keine richtige Zahl!");
    else if (Treffer == 1) Serial.println("Treffer: " + AnzahlTreffer + "(" + String(Treffer) + " richtige Zahl)");
    else Serial.println("Treffer: " + AnzahlTreffer + "(" + String(Treffer) + " richtige Zahlen)");
    Serial.println("-----------------------------");
}

Spei­che­re die­se Datei im glei­chen Ord­ner, in dem sich auch die .ino Datei befindet.

Das eigent­li­che Programm:

// Ziehung.h einbinden
# include "Ziehung.h"

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

int LottoZahl[Anzahl];

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

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

void setup()
{
  Serial.begin(9600);
  
  // Zufallsgenerator starten
  randomSeed(analogRead(0));

  // auf serielle Verbindung warten
  while (!Serial) {;}Serial.println("z = N\u00e4chste Ziehung");
}

void loop()
{
  String GespielteZahlen = "";
  String GezogeneZahlen = "";
  String Eingabe = "";
  String AnzahlTreffer = "";

  int Treffer = 0;

  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // solange lesen, bis return \n = return eingegeben wurde
    Eingabe = Serial.readStringUntil('\n');

    // das letzte Zeichen ist return = \n → soll entfernt werden
    Eingabe = Eingabe.substring(0, Eingabe.length() - 1);
  }

  // wenn "z" eingegeben wurde
  if (Eingabe == "z")
  {
    // Ziehung der "angekreuzten" Zahlen
    Ziehung(LottoZahl, Anzahl, Minimum, Maximum);

    /*
      Array Sortieren mit ArduinoSort
      sortArray(NameArray, AnzahlElemente)
      sortArrayReverse(NameArray, AnzahlElemente)
    */
    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(LottoZahl, Anzahl, Minimum, Maximum);

    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
        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] + " ";
    }

    Durchlauf ++;
    LottzahlenAnzeigen(Treffer, GespielteZahlen, GezogeneZahlen, AnzahlTreffer, Durchlauf);
  }
}