beginner34:
Wie fangt ihr mit sowas an, erstellt ihr erst auf dem Papier einen kleinen Code oder fangt ihr gleich am Rechner an oder macht ihr erst ein Flussdiagramm? Wie gehts bei euch los?
Also ich setze mich (üblicherweise) gleich an den Rechner und schreibe nichts auf Papier vor.
Das erste am Programm ist (fast immer) ein "Serial.begin(9600)" in die setup-Funktion zu schreiben, für serielle Debug-Ausgaben.
Und dann versuche ich, das Programm ganz klassisch nach dem EVA-Prinzip in drei Teile aufzuteilen:
E - Eingabe
V - Verarbeitung
A - Ausgabe
Grobes Grundgerüst für ein Programm, bei dem ständig neue Daten eingehen und verarbeitet werden:
void setup() {
Serial.begin(9600);
Serial.println("Start");
}
void eingabe() {};
void verarbeitung() {};
void ausgabe() {};
void loop() {
eingabe();
verarbeitung();
ausgabe();
}
Oder für ein Programm, das nur arbeiten soll, wenn neue Daten eingegeben werden:
void setup() {
Serial.begin(9600);
Serial.println("Start");
}
boolean eingabe() {return true;};
void verarbeitung() {};
void ausgabe() {};
void loop() {
if (eingabe())
{
verarbeitung();
ausgabe();
}
}
Zum Bereich "Eingabe" gehört, sich eine für das Programm angemessene Datenstruktur zu überlegen für die Daten, mit denen dann gearbeitet werden soll. Im Bereich "Eingabe" werden die Daten dann initialisiert oder eingelesen oder bei interaktiven Programmen die Bedienelemente (Buttons, Drehgeber, Potis, Sensoren) abgefragt.
Zum Bereich "Verarbeitung" gehört es dann, die in die Datenstruktur eingelesenen Werte zu verarbeiten, Berechnungen durchzuführen und die Ausgabe vorzubereiten, z.B. die auszugebenden Daten in eine vorbereitete Ausgabedatenstruktur zu übergeben.
Und zum Bereich "Ausgabe" gehört es dann schließlich, die Daten auszugeben, auf eine serielle Schnittstelle, auf ein LCD-Display, LEDs ein- und auszuschalten oder blinken zu lassen, eine Datei auf SD-Karte zu erzeugen, die Daten per Funk zu versenden oder sie in eine HTML-Webseite zu leiten.
Die Funktionen heißen zwar nicht unbedingt Eingabe(), Verarbeitung() und Ausgabe(), aber so ist die modulare Aufteilung. Und wegen der Trennung in diese verschiedenen Teilaufgaben ist es auch relativ einfach möglich, die Arbeitsweise eines Moduls jederzeit auszutauschen.
Durch die modulare Aufteilung ist es möglich, dass eine Eingabefunktion, die später vielleicht seine Daten von einem Temperatursensor erhält, dann ganz im Anfang nur so aussieht:
long readTemperature() // Temperatur in Zehntelgrad auslesen
{
return 213;
}
Oder eine Funktion, die die Daten am Ende auf einem LCD ausgeben soll so:
long showTemperature(long temp) // Ausgabe auf LCD
// Parameter temp in Zehntelgrad
{
Serial.print(temp/10);Serial.print(".");Serial.println(temp%10);
}
So dass vielleicht weder die Eingabe gleich zu Anfang so funktioniert wie es am Ende sein soll, noch die Ausgabe, sondern dass diese Funktionen am Anfang mehr oder weniger nur "simuliert" werden. Von einem ganz simpel hingeschriebenen Programmgerüst. Und dann im Rahmen einer "schrittweisen Verfeinerung" des Programms tatsächlich erst schrittweise entwickelt wird, mit allem drum und dran.