Welche Bedeutung hat dieser Programmcode?

2 Antworten

Einen großen Teil des Codes könntest du bereits ohne Programmierkenntnisse deuten, wenn du nur einmal die Kommentare im Code lesen würdest (eingeleitet durch die zwei Slashes). 😉

Das Programm soll die aktuelle Uhrzeit sowie das aktuelle Datum formatiert auf einem beleuchteten LCD-Display anzeigen. Ersteres in der ersten Zeile (hh:mm:ss Uhr) des Displays, Zweiteres in der zweiten Zeile (dd.MM.yyyy).

Für die Ausgabe ist die print-Funktion des lcd-Objekts zuständig, welches bereits in Zeile 5 erstellt wird.

Nebenbei werden ebenso Ausgaben auf dem seriellen Monitor vorgenommen. Dies allerdings etwas anders formatiert (einzeilig, nach dem Muster: hhmmss dd MM yyyy). Damit einstellige Zahlen (0-9) diesmal mit einer führenden Null bedacht werden, wurde eine Funktion printDigits formuliert. Sie wird für die Ausgabe von Minuten und Sekunden angewendet. Wieso nicht auch für Stunden, kann ich nicht sagen.

Meine Farge wäre warum diese befehle lcd.print(„“) 3 mal oder so hintereinander auftauchen, (...)

Hier zunächst der Hinweis: Die deutschen Anführungszeichen sind falsch. Es müssten zwei hochgestellte Anführungszeichen sein.

Im Programm werden drei Leerzeichen hintereinander ausgegeben. Für mich sieht dies vorerst nach einer Lust-und-Laune-Aktion aus, doch womöglich erkennt man doch einen Unterschied, wenn man das Programm einmal praktisch einsetzt.

(...) und warum steht in den klammern nichts?

Damit kannst du dich wohl nur auf solche Aufrufe

day()
month()
year()
Serial.println();

usw. ...

beziehen.

Dazu muss wohl etwas weiter ausgeholt werden. Doch ich versuche, es kurz und einfach zu halten.

Programme lassen sich zunächst einmal in benannte Code-Blöcke aufteilen (Funktionen). So kann man eine Struktur in das Programm hineinbringen und die Lesbarkeit verbessern. Jede Funktion erfüllt eine bestimmte Aufgabe und lässt sich an verschiedenen Stellen des Programms wieder aufrufen.

Ein Beispiel:

void printSum(int numberOne, int numberTwo) // <<--- parameter list with 2 parameters
{
  int sum = numberOne + numberTwo;
  Serial.print("Result is " + sum);
}

void setup()
{
  printSum(1, 2);
  printSum(4, 7);
}

Hier wird eine Funktion printSum definiert, die die Summe zweier Zahlen berechnet und dann eine entsprechende Ausgabe auf dem seriellen Monitor dazu vornimmt. In der setup-Funktion (dem Einstiegspunkt für dein Programm) wird diese Funktion wiederum zweimal aufgerufen, jedesmal mit anderen Werten (die in der Funktion miteinander addiert werden sollen).

Du siehst also: Man kann Funktionen über die sogenannte Argumentenliste (die mit Klammern gruppierte Wertaufzählung)

printSum(1, 2); // <<--- argument list with two arguments

Werte übermitteln, die dann je nach Reihenfolge den ensprechenden Parametern (hier: numberOne, numberTwo) zugeordnet werden.

Aber nicht jede Funktion definiert Parameter, da sie vielleicht nicht notwendig sind. Eine Funktion printHello beispielsweise braucht keinen Parameter, denn sie weiß schon selbst, was sie ausgeben soll. Die Implementation dazu könnte so aussehen:

void printHello() // <<--- parameter list without parameters
{
  Serial.print("Hello");
}

void setup()
{
  printHello(); // <<--- argument list without arguments
}

Trotzdem sind die beiden Klammern sowohl bei der Definition (Parameterliste), als auch beim Aufruf (Argumentenliste) notwendig, denn es sind feste Sprachbestandteile. Würdest du sie weglassen, würde der Compiler weder Funktionsdefinition, noch Funktionsaufruf als jeweils solche erkennen können und einen Fehler zurückgeben.

Somit weißt du nun, der Ausdruck

day()

steht für einen Aufruf der Funktion day, deren Argumentenliste leer ist. Auf die Definition der Funktion lässt sich schließen, dass die Parameterliste keine Parameter auflistet.

unsigned long day()
{
  // ...
}

Interessant wäre für dich nun nur noch, dass man Werte nicht nur in Funktionen hineinreichen kann, sondern ebenso hinausreichen. Gut, eigentlich ist es bei Letzterem nur ein Wert und dessen Datentyp wird bei der Funktionsdefinition im Kopf, noch vor dem Namen bestimmt. Im obigen Fall ist unsigned long der erwartete Rückgabetyp (die Funktion muss sich daran halten, sie darf nicht stattdessen eine Zeichenkette o.ä. zurückgeben). Dies entspricht einer vorzeichenlosen Ganzzahl.

Die Rückgabe eines passenden Wertes muss mit dem return-Befehl erfolgen. Dieser Befehl bewirkt zugleich die Beendigung der Funktion.

Ein plumpes Beispiel, nur zur Veranschaulichung:

unsigned long day()
{
  // do something ...
  return 5;
}

Wenn day irgendwo aufgerufen wird, gibt sie stets den Wert 5 zurück. Man kann diesen Wert entweder konkret in einer Variable auffangen:

unsigned long currentDay = day();
// currentDay is 5 now

oder wie beim Programm, einfach gleich als Argument weiterreichen:

Serial.print(day());

Wenn eine Funktion keinen Wert zurückgeben soll, wird in der Definition der Rückgabetyp void angegeben (siehe setup-Funktion zum Vergleich).


User16487 
Fragesteller
 05.02.2021, 02:31

Wowwwww also eine bessere Antwort auf eine Frage habe ich nie bekommen vielen dank hat mir sehr viel weitergeholfen!!!

0

Wenn ich das richtig sehe, programmierst du im Arduino IDE. Mit dem Befehl Serial.print(); Kannst du in einer Zeile mehrere Texte/Sensorwerte usw. ausgeben.
Mit Serial.println(); (=print line) fängst du in einer neuen Zeile an (sprich Zeilenumbruch).

Ich bin mir nicht ganz sicher, aber ist das ein Leerzeichen in der Klammer (" ") ?
Das macht nur einen Abstand, wie Leerzeichen eben funktionieren :)
Die bessere Variante für viele Leerzeichen wäre Serial.print("\t");


User16487 
Fragesteller
 04.02.2021, 22:04

wie kann ich die anderen befehle aufklären lassen bzw. Kennen sie eine seite wo diese befehle beschrieben werden? Ich will diesen code für mich sage ich mal entziffern aber ist schon ziemlich kompliziert

0