selfmade:
Gibt es hier irgendwo ein umfangreiches Beispielprogramm was eben mit vielen Unterfunktionen etc. arbeitet was auch etwas dokumentiert ist.
Wenn ich den Aufbau und die Logik dahinter sehe komme ich schneller voran
Hier mal ein kurzes Beispielprogramm, das einmal pro Minute die Temperatur "mißt" (die Messung wird nur durch eine Zufallsfunktion simuliert) und alle 10 Minuten den PH-Wert.
Das Programm zeigt, wie ich an so etwas herangehe:
void setup() {
Serial.begin(9600);
}
float temperatur;
#define TEMPINTERVALL 60*1000L // 60 Sekunden
float phWert;
#define PHINTERVALL 10*60*1000L // 10 Minuten
void eingabeTemperatur()
{
static unsigned long letzteMessung=-TEMPINTERVALL;
unsigned long now=millis();
if (now-letzteMessung>TEMPINTERVALL) // 1 Minute
{
temperatur=20+random(50)/10.0; // Test only: Zufallswert "messen"
letzteMessung=now;
Serial.println("Debug-Meldung: Temperatur gemessen");
}
}
void eingabePH()
{
static unsigned long letzteMessung=-PHINTERVALL;
unsigned long now=millis();
if (now-letzteMessung>PHINTERVALL) // 60 Minuten
{
phWert=7+random(10)/10.0; // Test only: Zufallswert "messen"
letzteMessung=now;
Serial.println("Debug-Meldung: PH-Wert gemessen");
}
}
void verarbeitung()
{
// nichts
}
void ausgabe()
{ // einmal pro Sekunde den Wert in der Anzeige aktualisieren
static unsigned long letzteAnzeige=0;
unsigned long now=millis();
if (now-letzteAnzeige>1000) // 1 Sekunde
{
Serial.print("Temp: ");Serial.print(temperatur);Serial.print('\t');
Serial.print("PH: ");Serial.print(phWert);Serial.println();
letzteAnzeige=now;
}
}
void loop() {
eingabeTemperatur();
eingabePH();
verarbeitung();
ausgabe();
}
Jedes Programm wird in verschiedene "Tasks" (= Funktionen) aufgeteilt, die in der loop-Funktion reihum immer wieder abgearbeitet werden. Eine sinnvolle Aufteilung der Tasks erfolgt nach dem "EVA-Prinzip":
- Eingabe
- Verarbeitung
- Ausgabe
Die EVA-Trennung ist deshalb so sinnvoll, weil sie die spätere Wartbarkeit und Erweiterung des Programms sehr vereinfacht. So könnte man Eingaben von Tastaturbedienung auf Drehgeber umstellen. Oder auf Infrarot-Fernbedienung. Oder die Ausgabe erstmal für Serial programmieren und später ein LCD-Textdisplay umschreiben. Oder auf die Ausgabe per Netzwerk auf einem Webbrowser, der die Daten abruft.
Nur "Debug-Ausgaben" auf Serial, um sich während der Programmentwicklung zwischendurch mal etwas auf Serial ausgeben zu lassen, um den Stand von Variablen zu prüfen, sind außen vor, und können überall im Code eingestreut werden.
Der Trick dabei, dass scheinbar "alles gleichzeitig" abläuft, liegt darin:
a) Aufrufe der "delay" Funktion mit langen delay-Zeiten bei interaktiven Programmen stets vermeiden!
b) Jede Task-Funktion so programmieren, dass sie in kürzester Zeit abgearbeitet ist
So können dann die Schritte Eingabe-Verarbeitung-Ausgabe viele tausend mal pro Sekunde ablaufen und im Programm "passiert" tatsächlich eigentlich nur dann etwas, wenn die Zeit reif dafür ist, z.B. einmal pro Sekunde, einmal pro Minute oder einmal alle 10 Minuten.