Liebe Arduino-/C-Experten,
ich habe gerade als Programmierneuling mein erstes Projekt abgeschlossen. Es handelt sich um eine einfache Temperatursteuerung (Thermostat). Da mein Code sicherlich alles andere als "elegant" ist, versuche ich ihn nun nach und nach aufzuhübschen. Bei meiner Internetsuche nach geeigneten Codeschnipseln bin ich zum Thema "Messwerte glätten" auf diese Methode gestoßen. Bei dieser ergaben sich bei mir etliche Fragezeichen und ich würde mich sehr freuen, wenn mir jemand meine Fragen (siehe unten) zu diesem Code beantworten könnte.
/* Glaettung, einfaches Beispiel
Liest Werte eines analogen Eingangs und bildet einen Mittelwert
Inspiriert durch: http://arduino.cc/en/Tutorial/Smoothing
von David A. Mellis <dam@mellis.org>
modifiziert 2012-09-04 durch Tom Igoe
modifiziert 2013-02-07 durch fribbe http://macherzin.net
Code ist in der Public Domain
*/
const int anzahlMessungen = 10; // Mittelwert wird aus 10 Werten gebildet
const int intervall = 10; // Messungen alle 10 mS, ggf. anpassen
int messungen[anzahlMessungen]; // Array fuer Messwerte
int zeiger = 0; // Zeiger des aktuellen Messwerts
int gesamtSumme = 0; // aktueller Gesamtwert
int durchschnitt = 0; // Mittelwert
int dieseMessung = 0; // aktueller Messwert
boolean status = 0; // Flag fuer ersten Durchlauf
const int sensorPin = A0; // Sensor an Pin 0 analog
void setup()
{
Serial.begin(9600); // starte serielle Kommunikation
while (!Serial) // warte auf Verbindung serieller Port, nur für Leonardo usw.
{
;
}
}
void loop()
{
gesamtSumme = gesamtSumme - messungen[zeiger]; // substrahiere letzte Messung
messungen[zeiger] = analogRead(sensorPin); // lese Sensor
gesamtSumme = gesamtSumme + messungen[zeiger]; // addiere Wert zur Summe
zeiger = zeiger + 1; // zur naechsten Position im Array
if (zeiger >= anzahlMessungen) // wenn Ende des Arrays erreicht ... zurueck zum Anfang
{
if (status == 1) // wenn Array erstmalig aufgefuellt ...
{
Serial.println(durchschnitt); // geglaettete Ausgabe auf serieller Konsole
}
status = 1; // erste 10 Werte eingelesen, Array ist gefüllt, Status geaendert
zeiger = 0; // und wieder von vorn
}
durchschnitt = gesamtSumme / anzahlMessungen; // berechne Mittelwert
delay(intervall); // zur Stabilisierung
}
// haben fertig und HaLoF
Ich gehe davon aus, dass das "int dieseMessung" in der loop die Variable "messung" sein soll.
Frage 1:
Wozu wird das hier gemacht?
gesamtSumme = gesamtSumme - messungen[zeiger];
Frage2:
Laufen nicht irgendwann die Variablen vom Typ int "gesamtSumme" und "durchschnitt" über? Ich kann nirgends erkennen, dass sie irgendwann auf Null zurückgesetzt werden.
Frage 3:
was hat es genau mit dem "status" auf sich? Warum wird erst beim nächsten Durchlauf der Mittelwert ausgespuckt?
Frage 4:
Gibt es eine Diskrepanz zwischen "int messungen[anzahlMessungen];" und if (zeiger >= anzahlMessungen) (Array hat 10 Positionen, der Zeiger fängt aber bei Null an)
Ich entschuldige mich im Voraus für meine dämlichen Fragen (der Code wird ja wohl funktionieren) und bin dankbar, wenn mir jemand meine Knoten im Gehirn löst.
Vielen Dank und Gruß,
nescius