INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Mittelwert über 30sek. ermitteln
31.01.2020, 11:40 (Dieser Beitrag wurde zuletzt bearbeitet: 31.01.2020 11:43 von Gerdchen03.)
Beitrag #1
Mittelwert über 30sek. ermitteln
Ich möchte mit einem ESP32 DEVkit V1 einen Mittelwert von Messwerten, über einen Zeitabschnitt von 30 Sekunden ermitteln. Dazu habe ich diese Seite gefunden.
http://shelvin.de/den-mittelwert-fortlau...-funktion/

Hier wird zwar nicht über die Zeit, sondern über eine bestimmte Anzahl von Messwerten gemittelt, das wäre aber auch OK.

Ich habe dazu folgendes getestet:
Code:
float mittelWert(int E);
      float mittel, summe = 0;
      werte[zaehlerMittelWerte] = E;
      for (int k = 0; k < anzahlMittelWerte; k++) summe += werte[k];
      mittel = (float) summe / anzahlMittelWerte;
      zaehlerMittelWerte++;
      if (zaehlerMittelWerte >= anzahlMittelWerte) zaehlerMittelWerte = 0;
      return mittel;

Aber da bekomme ich einen Fehler:
return-statement with a value, in function returning 'void' [-fpermissive]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.01.2020, 11:57
Beitrag #2
RE: Mittelwert über 30sek. ermitteln
Manchmal scheint die Lösung recht einfach ;-)

Ich habe jetzt das programmiert, und es scheint zu passen:
Code:
#define anzahlMittelWerte 100
int werte[anzahlMittelWerte];
int zaehlerMittelWerte = 0;      
float mittel, summe = 0;
werte[zaehlerMittelWerte] = E;
for (int k = 0; k < anzahlMittelWerte; k++) summe += werte[k];
mittel = (float) summe / anzahlMittelWerte;
zaehlerMittelWerte++;
if (zaehlerMittelWerte >= anzahlMittelWerte) zaehlerMittelWerte = 0;
Emit = mittel;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 08:44
Beitrag #3
RE: Mittelwert über 30sek. ermitteln
(31.01.2020 11:57)Gerdchen03 schrieb:  Manchmal scheint die Lösung recht einfach ;-)

Schon mal hier im Forum gesucht?

Auf einem Esp32 solltest du "double" anstatt "float" verwenden, das Ergebnis wird dadurch genauer!

Um auf 30 Sekunden zu kommen:

Entweder den FiFo Puffer so groß machen das genau die Anzahl der Messwerte für die Zeit reinpassen.

Hier ein Beispiel mit Puffer für 60 Minuten, 24 Stunden und 7 Tage

Wenn die Anzahl der Messwerte im gewünschten Zeitraum unterschiedlich sind kann man zwei Zeiger auf das Array mitführen die den Zeitlichen Abstand repräsentieren.

Am Rande: Für den Esp... gibt es eine eigene Rubrik im Forum wegen der 32 bit.

Gruß Fips

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 10:57
Beitrag #4
RE: Mittelwert über 30sek. ermitteln
Danke für deine Antwort.

Zitat:Auf einem Esp32 solltest du "double" anstatt "float" verwenden, das Ergebnis wird dadurch genauer!
Macht sich das bemerkbar, wenn ich auf eine Stelle hinter dem Komma runde?

Das mit dem FiFo Puffer hab ich mir mal angeschaut, aber für mich als absoluter Anfänger ist das nicht so leicht, den Code zu lesen. Da muss ich mich in Ruhe einarbeiten.

Welche Vorteile hätte die Lösung im Vergleich zu meiner?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 12:07
Beitrag #5
RE: Mittelwert über 30sek. ermitteln
(01.02.2020 10:57)Gerdchen03 schrieb:  Danke für deine Antwort.

Zitat:Auf einem Esp32 solltest du "double" anstatt "float" verwenden, das Ergebnis wird dadurch genauer!
Macht sich das bemerkbar, wenn ich auf eine Stelle hinter dem Komma runde?

Ich sehe bei dir kein runden!
Bei kleinen Werten und bei den ganz großen(uint64_t) macht sich das bemerkbar.
Die Template Funktion ist für alle einfachen Datentypen von C++ geeignet.

(01.02.2020 10:57)Gerdchen03 schrieb:  Das mit dem FiFo Puffer hab ich mir mal angeschaut, aber für mich als absoluter Anfänger ist das nicht so leicht, den Code zu lesen. Da muss ich mich in Ruhe einarbeiten.

Welche Vorteile hätte die Lösung im Vergleich zu meiner?

Bei einem Fifo Buffer oder Ringspeicher wird fortlaufend der älteste Wert im Array überschrieben. So stehen zu jedem Zeitpunkt die aktuellen Daten der letzten Periode x (meinetwegen 30 Sekunden) drin.

Wie befüllst du denn dein Array?

Gruß Fips

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 13:53 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2020 13:55 von Gerdchen03.)
Beitrag #6
RE: Mittelwert über 30sek. ermitteln
Stimmt, der Codeschnippsel zeigt das Runden bzw. Abbrechen nach der ersten Kommastelle nicht.
Ich mache die Ausgabe so: DrawData("Avg.", abs(Emit), 1, 80, 60, true);
Dort ist dann festgelegt, dass nur einen Kommastelle angezeigt wird.

In das array wird hier geschrieben:
werte[zaehlerMittelWerte] = E;

E ist der Wert, den ich Mitteln möchte.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 14:03 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2020 14:04 von Fips.)
Beitrag #7
RE: Mittelwert über 30sek. ermitteln
(01.02.2020 13:53)Gerdchen03 schrieb:  Stimmt, der Codeschnippsel zeigt das Runden bzw. Abbrechen nach der ersten Kommastelle nicht.
Ich mache die Ausgabe so: DrawData("Avg.", abs(Emit), 1, 80, 60, true);
Dort ist dann festgelegt, dass nur einen Kommastelle angezeigt wird.

In das array wird hier geschrieben:
werte[zaehlerMittelWerte] = E;

E ist der Wert, den ich Mitteln möchte.

Und E ist?

werte[zaehlerMittelWerte] = E;
So kann man doch bestimmt kein Array füllen, oder?

Gruß Fips

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 18:38
Beitrag #8
RE: Mittelwert über 30sek. ermitteln
E ist ein Wert, der über die serielle Schnittstelle ausgelesen wird. Ob man so ein array füllen kann, weiß ich nicht. Ich kann nur sagen, es scheint zu klappen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  n Bytes über UDP empfangen Igom 5 193 21.02.2021 10:30
Letzter Beitrag: Tommy56
  Arduino über Serielle Schnittstelle rücksetzen Rainer2 5 299 12.02.2021 13:31
Letzter Beitrag: Tommy56
  zweiten Wert über Serial einlesen vlakvark 7 499 14.12.2020 21:06
Letzter Beitrag: Tommy56
  Servo im Programm über einen Taster betätigen CB2311 26 1.371 08.12.2020 19:21
Letzter Beitrag: Tommy56
  Sensordaten über lokales Netzwerk speichern Dave298 10 956 02.12.2020 22:17
Letzter Beitrag: hotsystems
  Variable über serielle Eingabe befüllen ? Foto-Ralf 23 1.469 21.11.2020 11:23
Letzter Beitrag: Tommy56
  Motor über L298N Bridge drehen funktioniert nicht mt14516 3 512 10.11.2020 21:04
Letzter Beitrag: mt14516
  Float über I2C zwischen 2 Arduinos UNO Marduino_UNO 23 10.894 18.08.2020 11:53
Letzter Beitrag: hotsystems
  Neo-Pixel über Mail-Inhalte steuern weserjunge 7 971 21.07.2020 19:24
Letzter Beitrag: Tommy56
  Auto mit Kamera über Bluetooth gnagfloW 4 1.070 19.06.2020 08:23
Letzter Beitrag: gnagfloW

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste