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

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

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

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
  Float über I2C zwischen 2 Arduinos UNO Marduino_UNO 23 9.178 18.08.2020 11:53
Letzter Beitrag: hotsystems
  Neo-Pixel über Mail-Inhalte steuern weserjunge 7 477 21.07.2020 19:24
Letzter Beitrag: Tommy56
  Auto mit Kamera über Bluetooth gnagfloW 4 615 19.06.2020 08:23
Letzter Beitrag: gnagfloW
  Steuerung über Infrarot und Bluetooth SimonTau 4 684 20.05.2020 07:37
Letzter Beitrag: Corvus
  Lauftext mit WS2812, der über Seriellen Monitor eingegeben wird Bastian 3 573 12.05.2020 16:47
Letzter Beitrag: Tommy56
  Fehler bei delay über 32767 Kleingärtner 5 594 07.05.2020 18:51
Letzter Beitrag: Kleingärtner
  Aktion bei Wert über- oder unterschreiten Kleingärtner 18 1.472 05.05.2020 20:19
Letzter Beitrag: hotsystems
  Betätigung d. Sensors soll Steuerung abschalten und nur über Taster einschalten Floydi 12 1.199 26.04.2020 07:47
Letzter Beitrag: MicroBahner
  Waage über RS 232 / Serial auswerten 425t 9 1.074 31.03.2020 06:44
Letzter Beitrag: 425t
  Vorlage für Char Array über Serielle Schnittstelle Luis90 2 637 08.03.2020 18:05
Letzter Beitrag: hotsystems

Gehe zu:


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