Beste Option um Sensordaten möglichst in Echtzeit über das Internet anzeigen zu lassen

Das war der Ansatz in #3 - aber da wir schon bei #21 sind, wollte er das nicht.

Nu denn... Vielleicht hilft es ja, wenn es oft genug wiederholt wird.

Dazu muss man #3 aber recht kreativ interpretieren.

Ein Browser-Refresh klingt für mich auch nach alles anderem als einer MiddleTier-Lösung.
Und ein struct alleine verschickt sich auch nicht so gut. Oder schreibt sich selbst in eine Datenbank.
Und wie Du schon vollkommen richtig schreibst, sind wir jetzt bei #21 und seit dem hat sich schon einiges wieder relativiert. Wie z.B. die InfluxDB, RaspberryPi, ein Notebook, usw. Warum nicht auch der generelle Ansatz?
Aber das weißt Du vermutlich alles schon längst...

1 Like

Guten Abend @all. Ich muss mir das alles nochmal in Ruhe durchlesen, war zwischenzeitlich sehr mit der Hardware beschäftigt und habe die Zeit im Fusion 360 die Gehäuse gezeichnet, gedruckt, gelötet und zu dem Algo weiter gelesen. Den Thread hab ich nicht vergessen, nur kann es manchmal etwas dauern bis ich einen Punkt fertig hab und zum nächsten komme. Ich habe nun etwas gegoogelt und würde es mittels BLE machen wollen. Ich dachte daran einen ESP32 an den Laptop anzuschließen und von diesem dann die Daten direkt an den PC (an den COM), da dieser mittels BLE mit dem Arduino verbunden ist. Dort wird dann am PC alles in Echtzeit angezeigt und in einem Interwall von 10 Sek. sendet mit der ESP via Wifi ins lokale Netzwerk (hier hab ich mySQL mal installiert) ein Datenpaket mit Zeitstempel.

Die Tipps hier sehe ich mir alle in Ruhe nochmal ganz genau an, ev ist das dort ja schon beantwortet. :slight_smile:

"ann kann im Hintergrund, in einem separaten Task," ist damit ein paralleler Task gemeint? Also wirklich parallel? Ich hatte mal gelesen, dass dies im ESP möglich ist, aber da muss ich mich erst schlau machen. :slight_smile:

Deinen Hardwareaufbau habe ich noch nicht ganz verstanden.
Du hast einen ESP32, welcher die Daten hardwareseitig abruft.
Der soll diese dann weiterleiten (zur Speicherung & Anzeige) und in Deinen Tests war WiFi* zu langsam?
Daher möchtest Du ggf. eine Direktverbindung zwischen 2 ESP´s per Bluetooth testen und vom 2. ESP die Werte Seriell am Lapotop/Computer weiter verarbeiten?

*WiFi ist ja nur die Verbindung, die wird definitiv schnell genug sein und auch schneller als Bluetooth.
Da haben ja schon einige Vorredner aufgezeigt, dass hier das Bottleneck nicht an der Übertragung liegt, sondern an der Umsetzung.
Also dem ESP32 die Authentifizierung und Übertragung direkt an die Datenbank zu überlassen.

Auch hier ist ein MiddleTier cleverer. Also z.B. ein Dienst, der sich dauerhaft mit der DB verbindet und i.d.R. deutlich schneller mit den Transaktionen ist als ein ESP32 per Wifi.
Der ESP kann sich nun z.B. per Sockets verbinden und (nahezu) ohne jeden Overhead die blanken Daten versenden. Die "harte" Arbeit übernimmt dann der PC/Laptop.
Und klar, für den PC ist das ein leichtes zwei separate Tasks (Prozesse) aufzumachen um die Datenbank und den Graphen zu füttern.

Der vollständigkeit halber: Ja, der ESP kann mit FreeRTOS auch die volle Power seiner zwei Kerne verwenden und parallel arbeiten. Aber dann gibt es weiterhin nur ein Wifi oder BT.

1 Like

Ursprünglich wollte ich alle Daten via Wifi in eine Datenbank senden, hierbei hatte ich eine Cloud genützt, dass dies ein Fehler bzgl der Geschwindigkeit ist, ist mir bereits bewusst. :slight_smile: Jetzt tendiere ich zu BLE wegen der Akkulaufzeit, werde aber auch eine direkte Verbindung via Wifi an eine lokale Datenbank antesten, hab mir hierzu mySQL und InfluxDB runtergeladen, mySQL läuft bereits. Bevor ich hier aber weiter arbeiten kann muss ich erst mein Signal filtern und da hänge ich gerade dabei diesen Filter zu programmieren:

struct meanDiffFilter_t
{
  float values[MEAN_FILTER_SIZE];
  byte index;
  float sum;
  byte count;
};

float MAX30100::meanDiff(float M, meanDiffFilter_t* filterValues)
{
  float avg = 0;

  filterValues->sum -= filterValues->values[filterValues->index];
  filterValues->values[filterValues->index] = M;
  filterValues->sum += filterValues->values[filterValues->index];

  filterValues->index++;
  filterValues->index = filterValues->index % MEAN_FILTER_SIZE;

  if(filterValues->count < MEAN_FILTER_SIZE)
    filterValues->count++;

  avg = filterValues->sum / filterValues->count;
  return avg - M;
}

Sowie:

struct butterworthFilter_t
{
  float v[2];
  float result;
};
void MAX30100::lowPassButterworthFilter( float x, butterworthFilter_t * filterResult )
{  
  filterResult->v[0] = filterResult->v[1];

  //Fs = 100Hz and Fc = 10Hz
  filterResult->v[1] = (2.452372752527856026e-1 * x) + (0.50952544949442879485 * filterResult->v[0]);

  //Fs = 100Hz and Fc = 4Hz
  //filterResult->v[1] = (1.367287359973195227e-1 * x) + (0.72654252800536101020 * filterResult->v[0]); //Very precise butterworth filter 

  filterResult->result = filterResult->v[0] + filterResult->v[1];
}

Die Codes sind von hier: Implementing pulse oximeter using MAX30100 - MORF - Coding And Engineering

Die Libs des Autors vollständig hier: xcoder123/MAX30100: Driver for MAX30100 using arduino (github.com)

Ist jetzt OT, aber ev kann mir hier wer "on the fly" schnell weiterhelfen. Soweit ich das nun bisher kapiert habe nutzt ich struct als "Kontainer" um die Variablen dort reinzupacken. Aber so ganz konnte ich die Codes noch nicht einbinden.

b2t. Das mit MiddleTier habe ich mir notiert und das schaue ich mir auch mal an, danke für den Tipp!

Das verstehe ich nicht. Hängt doch davon ab, wie oft du den Filter aufrufst.
Und warum die Funktion nix (void) liefert, verstehe ich auch nicht.

Aber egal, sind ja nur Schnipsel aus einer Lib, die in einem Tutorial erklärt werden. Ein wichtiger Punkt im Tutorial ist übrigens:

any low pass filter would do just fine.

Ich würde vorschlagen, dieser Thread handelt davon, die "Beste Option um Sensordaten möglichst in Echtzeit über das Internet anzeigen zu lassen" zu finden.

Wie man sinnvoll aus Rohdaten Informationen filtert, ist ein spannendes Thema, aber etwas anderes. Da ist das verlinkte Tutorial nicht schlecht, ich würde aber empfehlen, um reinzukommen sich erstmal den Sensor und die Lib zu besorgen, um alles 1:1 nachvollziehen zu können, bevor man das als Grundlage für eine eigene Auswertungssoftware nimmt.

Nur die Schnipsel unverändert aus dem Tutorial hier zu zeigen, bringt jedenfalls höchstens ein "und, was ist dein Problem damit?" als Reaktion.

1 Like

Sehe ich auch so, war vorschnell abgeschickt und ich hatte bzgl der Frage oben dann doch einen anderen Thread aufgemacht. (Wollte ich zuerst vermeiden, aber mit dem OT ist es igw doch blöd). Den Sensor habe ich übrigens bereits und auch mit Gehäuse und geschirmten Kabel an den ESP verbunden, die Daten lade ich bisweilen über das Wifi direkt in die Datenbank (aktuell noch in die Cloud, aber sobald ich die Filter habe und den Sauerstoffwert besser hinbekomme [es klappt schon, nur ist mir der Wert noch zu ungenau] gehe ich das Thema hier nochmal an und werde die verschiedenen Lösungen hier im Thread durchgehen. Dann gebe ich auch eine Rückmeldung, welche Option für mich am besten funktioniert hat.

Gerade versuche ich das mit den Pfeilen zu verstehen, Struct scheine ich kapiert zu haben. :slight_smile:
Grüße

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.