DS18B20-Mittelwert

Hi Leute,
ich möchte x DS18B20 verbauen und von jedem, jede Minute die Temperatur abfragen, wenn das 10 mal gemacht wurde also 10min später möchte ich von jedem der Sensoren den Mittelwert der letzten 10min ausgeben. Kann mir wer sagen wie ich das am besten mache ?

Hallo,

du kannst
a) x mal den Wert aufaddieren und durch x teilen
b) du kannst kontinuierlich einen Mittelwert bilden

Nimm die Lib RunningMedian. Ist das beste und bequemste, was mir bisher in diesem Bereich untergekommen ist.
Hat z.B. eine Funktion, die die Ausreisser nicht berücksichtigt.

Hi
ersten Ultraschallsensor Wert ausßer acht lassen
Dort gibt's den running Median in einer angepassten Form - im Original ist Der auf einen Datentyp festgelegt - meine INT.

MfG

Int reicht doch für dem Temperaturbereich. Dann pack ich halt messwert*10 rein, dann hab ich meine Zehntel.
Bei mir läuft der RunningMedian super mit SR04 US-Sensor. Bei der wasserdichten Version hab ich da öfter falsche Und Null Messungen. Einen normalen Average verhagelt es da sofort.

Wenn Du jede Minute den Mittelwert der letzten 10 Minuten haben willst dann speichere die Werte in ein Array. Von diesem Array berechnest Du den Mittelwert.
Du überschreibst immer den ältesten Wert. Den nächsten / Letzten / ältesten Wert kannst Du Dir in einer Variable merken die Du nach jedem Abspeichern erhöhst. (das nennt man Ringbuffer).
Das ist so als wenn Du immer 10 Flaschen Bier zuhause haben willst und Du immer die Du am längsten hast trinken willst damit keine Flasche schlecht wird. Jetzt willst Du aber nicht immer alle 9 Flaschen verstellen sondern stellst die neu gekaufte Flasche an Stelle der fehlenden Flasche und markierst die neuste, älteste oder nächste Flasche mit einem Band.
Grüße Uwe

ElEspanol:
Dann pack ich halt messwert*10 rein, dann hab ich meine Zehntel.

Das ist überflüssig.

int16_t getTemp(const uint8_t*);

Gruß Fips

Derfips:
Das ist überflüssig.

int16_t getTemp(const uint8_t*);

Gruß Fips

Ich hab das allgemein gemeint, nicht speziell auf die ds18b20 Lib bezogen.

Hallo,

mit PN Anfragen für Dinge die in den Thread gehören machste dir keine Freunde.

Fürs aufaddieren machste dir mal paar Gedanken. Dafür benötigt man kein Array. Min/Max könnte man sich auch direkt beim einlesen merken.

Kontinuierliche Mittelwertbildung ist schon etwas aufwändiger, darüber hatte sich einmal GuntherB warme Gedanken gemacht. Habs zum testen verpackt. Mit den Einstellungen kannste rumspielen.

/*
  Doc_Arduino - german Arduino Forum
  IDE 1.8.12
  avr-gcc 9.3.0
  Arduino Mega2560
  28.04.2020
  License: GNU GPLv3
  https://forum.arduino.cc/index.php?topic=680835.0
  kontinuierliche Mittelwertbildung 
*/

const byte pinPoti = A0;   
const byte FILTERFAKTOR = 6;     // Filterfaktor zur Mittelwertbildung
float filteredValue;

void setup (void)
{
  Serial.begin(9600);
}


void loop (void)
{
  unsigned int raw = read_and_filter_Poti(100, pinPoti);  // liest zyklisch Poti ein und filtert
  seriellerMonitor(100, raw);
}


// ****** Funktionen ******* //
unsigned int read_and_filter_Poti (const unsigned long intervall, const byte pin)
{
  static unsigned long lastMillis = 0;
  unsigned long ms = millis();
  static unsigned int raw = 0;
  
  if (ms - lastMillis >= intervall)
  {
    lastMillis = ms;
    raw = analogRead(pin);

    // glättet eingelesene Potiwerte, dazu gehört obiger FILTERFAKTOR
    filtern(filteredValue, raw, FILTERFAKTOR);
  }

  return raw; // Rückgabewert nur wegen seriellen Monitor
}


void seriellerMonitor (const unsigned long intervall, const unsigned int newValue)
{
  static unsigned long lastMillis = 0;
  unsigned long ms = millis();

  if (ms - lastMillis >= intervall)
  {
    lastMillis = ms;

    Serial.print(newValue);
    Serial.print('\t');
    Serial.println(filteredValue); 
  }
}


// Grüsse an GuntherB - kontinuierliche Mittelwertbildung
/*****************************************************************************************
** Funktion Filtern()  by GuntherB                                                      **
******************************************************************************************
** Bildet einen Tiefpassfilter (RC-Glied) nach.                                         **
** FF = Filterfaktor;  Tau = FF / Aufruffrequenz                                        **
**                                                                                      **
** Input: FiltVal der gefilterte Wert, NewVal der neue gelesene Wert; FF Filterfaktor   **
** Output:  FiltVal                                                                     **
** genutzte Globale Variablen: Val  (call by Reference)                                 **
******************************************************************************************/
void filtern (float &filtVal, const unsigned int newVal, const byte FF)
{
  filtVal = ((filtVal * FF) + newVal) / (FF + 1);
}

(deleted)

Hallo,

aus meiner Wühlkiste noch ein Beispiel gleitender Mittelwert Berechnung für float Werten. Ist ebenfalls ein Tiefpass.

Heinz

/* Beispiel Gleitender Mittelwert berechnen
    ausgabe auf dem Plotter möglich
*/

float mibuffer1; // je Aufruf der Funktion ein eigenen buffer erforderlich
float wert;
float gmwert;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:

  wert = random(10) + 100; // simulierter Messwert
  gmwert = mittelwert(wert, mibuffer1, 10); // gemittelt
  Serial.print(wert); Serial.print("\t");
  Serial.println(gmwert);
}

// Berechnung gleitender Mttelwert--------------
float mittelwert( float Rohwert, float &buff, float filterFaktor)

{
  float mi ;
  buff = buff - buff / filterFaktor;
  buff = buff + Rohwert;
  mi = buff / filterFaktor;

  return mi;
}