NEWS
Darstellung einer Pulsoximetriekurve
-
@homoran Das ist nett, ich habs nicht so mit Foren :-D. Den Service nehme ich gern in Anspruch!
So hier die Anleitung für Dich und für alle anderen, die sowas auch nachbauen wollen:
Man Kaufe so einen ESP32 mit Wifi und BLE. Ich habe eine der heiß Lolin32 Lite, kostet 8 Euro oder so.
Dann installiert man auf Linux oder Win die Entwicklungsumgebung von Arduino ("Arduino IDE"). Richtet diese ein und sucht sich sein passendes Board aus.
USB verbinden und diesen Sketch für sich anpassen und hochladen: (OK schon etwas verkürzt . Man muss sich schon etwas mit Arduino Zeugs beschäftigen. Aber da gibt es ja etliche Videos.
Der Code ist übrigens nicht zu 100% von mir. Sind Bausteine von diversen Beispiel-Sketche, die einmal das Thema Wifi, BLE und MQTT behandeln. Quasi alles nur zusammengeklebt.Ich empfehle dringend einen BLE Scanner auf dem Handy mal vorab zu installieren. Ihr solltet quasi schon mal ohne IOBroker in der Lage sein, Eure Daten zu finden.
Die billigen Fingerpulsoximeter haben es so nicht mit Sicherheit. Ihr könnt die Daten in Klartext meist empfangen.//Für MQTT Kommunikation #include <ArduinoMqttClient.h> //Wifi Libs #include <WiFi.h> #include <WiFiMulti.h> WiFiMulti WiFiMulti; WiFiClient wifiClient; MqttClient mqttClient(wifiClient); //BLE Libs #include <ArduinoBLE.h> //Ein paar Customs-Settings const char broker[] = "192.168.1.75"; //Eure IOBroker IP muss hier rein int port = 1883; const char Topic_SPo2[] = "ESP-Oximeter/SPo2"; //Sauerstoffwert const char Topic_RP[] = "ESP-Oximeter/RP"; //puls const char Topic_unbekannt1[] = "ESP-Oximeter/unbekannt1"; // Erste Zahl, die den sogenannten PI-Wert darsgtellt const char Topic_unbekannt2[] = "ESP-Oximeter/unbekannt2"; // zweite Zahl const char Topic_DataArray[64] = "ESP-Oximeter/DataArray"; // 64 Bytes für die Wave-Kurve, hier kann man dann die 4 Takte des Herzens visualisieren. void setup() { //für LED Kontrolle, LED soll Statusanzeige sein, falls mal was nicht klappt pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); delay(10); // We start by connecting to a WiFi network //einen passenden hostnamen für das Netzwerk hinterlassen, sonst Chaos auf der Fritzbox. WiFiMulti.addAP("EURER WIFI Name", "WIFI Passwort"); WiFi.setHostname("ESP32-Oximeter-Broker"); //So steht Euer ESP dann bei FB oder sonstiger Router eindeutig in der Netzwerkliste Serial.println(); Serial.println(); Serial.print("Suche WiFi... "); while(WiFiMulti.run() != WL_CONNECTED) { Serial.print("."); delay(500); } //so ab hier sind wir schon mal mit Wifi verbunden Serial.println(""); Serial.println("WiFi verbunden"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); //LED mal anmachen Serial.println("LED: AN "); digitalWrite(LED_BUILTIN, HIGH); //------------------- MQTT Connection --------------------------- //Jetzt nach dem Wifi verbunden, den MQTT Broker auf dem IOBroker verbinden Serial.print("So wir probieren mal den MQTT Broker zu finden: "); Serial.println(broker); // Pass und USername stehen in der Instanz des MQTT Adapters auf IOBroker mqttClient.setUsernamePassword("Username", "Passwort"); if (!mqttClient.connect(broker, port)) { Serial.print("Bei MQTT ist irgendwas schiefgelaufen. Error code = "); Serial.println(mqttClient.connectError()); while (1); } Serial.println("Wir sind mit dem MQTT-Broker verbunden! Supi!"); Serial.println(); //------------------- Bluetooth Scan --------------------------- while (!Serial); // BLE Initialisieren if (!BLE.begin()) { Serial.println("starting Bluetooth® Low Energy module failed!"); while (1); } Serial.println("Scanne nun die BT-Umgebung"); Serial.println("Das Oximeter sollte eingeschaltet sein"); // starte BLE scan BLE.scan(); } //------------------- LOOP --------------------------- void loop() { // Mal schauen, ob ein paar Geräte gefunden werden konnten BLEDevice peripheral = BLE.available(); if (peripheral) { // Jo, welche gefunden, na dann mal im Serial-Monitor mal ausdrucken Serial.print("Found "); Serial.print(peripheral.address()); Serial.print(" '"); Serial.print(peripheral.localName()); Serial.print("' "); Serial.print(peripheral.advertisedServiceUuid()); Serial.println(); //Nach dem Oximter schauen, OXIMETER ist der Name, meines Pulsoximeters. Je nach Hersteller natürlich anders. Guckt mit dem Handy einfach nach. if (peripheral.localName() == "OXIMETER") { // Da ist meins !! BLE.stopScan(); //LED mal anmachen Serial.println("LED: AN "); digitalWrite(LED_BUILTIN, HIGH); //Los verbinde Dich... monitorSensorTagButtons(peripheral); // Wieder scan, wenn die Verbindung verloren gegangen ist BLE.scan(); } } } void monitorSensorTagButtons(BLEDevice peripheral) { // Auf gehts, das Device ist an und wir haben es per Scan gefunden. Auf und verbinden,,, Serial.println("Verbinde ..."); if (peripheral.connect()) { Serial.println("Juhu Verbunden..."); } else { Serial.println("Verbindung fehlgeschlagen! Evtl. mal alle Wifi-Geräte zuhause auf 5GHz umstellen. BLE läuft auch auf 2,4 Ghz"); return; } // discover peripheral attributes Serial.println("Hab folgenden service gefunden: 0xffe0 ..."); //FFe0 ist ein typischer servicename. Ihr seht mit einem BLE Scanner, welchen Service ihr suchen müsst. if (peripheral.discoverService("ffe0")) { Serial.println("Service entdeckt"); } else { Serial.println("Kann den Service auf dem BLE Gerät nicht finden."); peripheral.disconnect(); while (1); return; } // So jetzt mal die Werte anfragen... Erstmal sagen, was wir haben wollen: BLECharacteristic simpleKeyCharacteristic = peripheral.characteristic("ffe1"); // bei meinem Gerät wird unter ffe1 sauerstoff, Puls und andere werte sekündlich gestreamt // subscribe mal meinen key charateristic Serial.println("Subscribing to simple key characteristic ..."); if (!simpleKeyCharacteristic) { Serial.println("no simple key characteristic found!"); peripheral.disconnect(); return; } else if (!simpleKeyCharacteristic.canSubscribe()) { Serial.println("simple key characteristic is not subscribable!"); peripheral.disconnect(); return; } else if (!simpleKeyCharacteristic.subscribe()) { Serial.println("subscription failed!"); peripheral.disconnect(); return; } else { Serial.println("Subscribed"); } while (peripheral.connected()) { // so wir sind mit dem gerät verbunden // mal prüfen, ob der Wert aktualisiert wurde if (simpleKeyCharacteristic.valueUpdated()) { // jau, da ist was neues angekommen byte value = 0; Serial.println(); simpleKeyCharacteristic.readValue(value); printData(simpleKeyCharacteristic.value(), simpleKeyCharacteristic.valueLength()); } } // falls wir hier ankommen, wurde das Ding getrennt Serial.println("Pulsoximeter wurde getrennt!"); } void printData(const unsigned char data[], int length) { // Diese Sub-Routine nimmt nun die Daten auf. // in meinem Fall picke ich mir Byte 4 und 5 für SPo2 und Puls. // Byte 6 und 7 sind die PI-werte, da bastle ich noch rum, daher als Unbekannt markiert. // ansonsten das ganze array auch noch mal als Datenpunkt über den MQTT Broker rübermöppeln. // Jetzt die Daten an MQTT senden mqttClient.beginMessage(Topic_SPo2); mqttClient.print(data[4], DEC); mqttClient.endMessage(); mqttClient.beginMessage(Topic_RP); mqttClient.print(data[5],DEC); mqttClient.endMessage(); mqttClient.beginMessage(Topic_unbekannt1); mqttClient.print(data[6],DEC); mqttClient.endMessage(); mqttClient.beginMessage(Topic_unbekannt2); mqttClient.print(data[7],DEC); mqttClient.endMessage(); mqttClient.beginMessage(Topic_DataArray); //eben einen String zusammenbasteln, damit nur ein Datenpunkt verwendet wird. Geht sicherlich auch noch eleganter... String sTemp; int iWert; for (int i = 0; i < length; i++) { //dbSerialPrint((char)message[i]); iWert = int(data[i],DEC); sTemp += sChar + ","; } mqttClient.print(sTemp); mqttClient.endMessage(); }
-
-
@ralla66
Also der Code oben passt zum Pulsoximeter namens Health Tree, aber auch das Pulox PA 200 für 20 Euro geht damit, da stehen halt die Werte an anderer Stelle, aber das Pronzip ist das gleiche.Ich hoffe, das geht in Ordnung, wenn ich hier mal 2 Links von Amazon reinpacke, nur mal die Geräte zu zeigen. Verdiene nix daran. Aber nochmal es geht mit jedem billigen 10 Euro Noname Ding aus China.
PULOX:
https://amzn.eu/d/7P7BI9bHealth Tree
https://amzn.eu/d/bOoKl3YNur die Geräte von Breuer und von einem Hersteller, der so ein Armband mit einem Silikonfingersensor anbietet, sind etwas komplexer anzubinden. Für Anfänger rate ich bei diesen Geräten erstmal ab.
Mann muss vorher bei denen ein Key immer sekündlich auf das Gerät senden, sonst kommt da nix. Wer von der Materie hier mehr versteht, kann über die Android(!) IDE den Traffic zwischen offizieller App udn Device mitlesen und den diesen Key auslesen. -
Danke für die Informationen, hast du einen Link des Codes mit der Key Routine ?
Spiele dann mal mit.@Homoran ,
würde da gerne per Tasmota ESP32 und BLE mitspielen. Wie sollen die Daten in den IO kommen ?
Per Json ,Mqtt, was ist hier am besten ? Der Pulox PA 200 hat ja kein BLE müssten ja dann zum testen
das gleiche Produkt haben. Hier die Frage dann welcher. -
@ralla66 ich hab auch nur ein Lidl 20€ Pulsoximeter.
und letzte Woche meinen ersten ESP8266 gekauft.
war quasi geschenkt, weil ich dadurch keinen Versand mehr bezahlen musste.Will mich da irgendwann reinarbeiten
-
dann ist zuerst die Schnittstelle zu prüfen, welche sind da ?
BLE oder Kabel USB ? Denke mal BLE. -
@ralla66 Danke, aber so weit bin ich noch nicht.
Hab noch andere (nicht iob) Baustellen. bei iob aber auch -
@ralla66 sorry, ich hab so viele hier von den Dingern rumliegen. Das Pulox in der Version hat wirklich kein BT, da habe ich quatsch erzählt und mich mit so einem 10euro Ding vertan :
Wenn ihr schon ein Gerät habt, kauft erstmal nix. Installiert Euch einen BLE scanner, wie der für Android nRF:
Scannt mit dem Handy das Pulsoximeter. Ich hab das mal für Euch hier noch mal gescreenshotet:
Sobald per scan gefunden, probiert mal die Characteristiks aus und schaut wie hier z.b. ob ihr Daten empfängt. Die Original App des Geräts braucht ihr natürlich dafür nicht.
Wenn Daten kommen, dann sieht das ungefähr so aus:
Per USB Kabel braucht man da erstmal nix machen.
Ihr brauch eine USB Verbindjng nur beim hochladen des Codes auf dem ESP. -
@homoran scan doch mal mit nRF Connect wenn du ein Android Handy zur Hand hast. Gibt sicher auch was für Apples.
-
@alexaxel sagte in Darstellung einer Pulsoximetriekurve:
@homoran scan doch mal mit nRF Connect wenn du ein Android Handy zur Hand hast. Gibt sicher auch was für Apples.
da müsste doch dann ein BT Logo drauf sein.
ist es nicht@Ralla66 auf dem ESP auch nicht, ist ein ESP8266-12F
-
@homoran ja BT müssen beide schon haben. Also der ESP und das Pulsoximeter.
Ich habe gerade über den Hersteller meineS BT Geräts, das auf den der Arduino Code abgestimmt ist, diese günstige Variante für 20 Euro gefunden:
Die verwenden die gleiche App, wie bei meinem Gerät.
Ich gehe davon aus, dass Ihr damit sicher genauso an die Werte kommt. -
bestellt ist nun, lade bitte mal den Arduino Code hier ein oder verlinke den mal.
Mqtt, Wlan usw ist ja per ESP kein Problem, BLE ist neu für mich.
Muß mich das erst einarbeiten. NRF sollte ja ein spezielles BLE Protokoll sein. -
@ralla66 hatte ich schon. Schau mal, der Code ist weiter oben schon gepostet.
-
@ralla66 nRF Connect ist eine Testapp von Nordic, das sind die Lizenzgeber und Patentbesitzer von Bluetoith.
-
wäre halt die Quelle vom BLE Code interessant gewesen.
Nordic nRF ist mir nicht ganz unbekannt vom Hoymiles Projekt.
Ein Freund ist da gerade mit Developer Kit unterwegs, so richtig tief mit Assembler dran.
Dann warte ich mal aufs Paket und belese mich zu ESP BLE Stoff. -
@ralla66 Also alles zusammen kommt von mir. Aber basierend auf Beispielcodes die in der arduino IDE sind, wenn man das passende Board auswählt. Wenn man die ESP32 Bibliothek auswählt, hat man automatisch themensortierte Beispiele auf den Rechner.
-
Gerät sollte ja Freitag da sein, dann schau ich mal was so geht.
Eingerichtet ist alles soweit an Tools, ESP ist mal mit Tasmota BLE geflasht,
mal sehen was da geht. Werde mal einen BLE nRF Sniffer besorgen das soll ja mit
Wireshark Plugin gehen.
Rund um den Key wären Infos gut, hast du da Bilder der IDE da ? -
Wäre geil, wenn jemand auch noch nen Tipp für mein eigentliches Thema hätte.
Ich glaube, dass die geladenen Seiten in Vis keine Timeouts zulassen. So dass man eine Animation einbauen kann und das livechart eben mit den vielen Werten in sekundenintervallen nicht zurechtkommt. -
@ralla66 Die App die ich meine ist kein Sniffer, es ist eine Client-Anwendung, die einfach sich als Bluetooth-Client mit dem BT-Gerät (Server) verbindet. Es handelt sich also um eine ganz normale Client-Server Verbindung. Daher kann man auch Daten zum Device hochladen.
-
@alexaxel sagte in Darstellung einer Pulsoximetriekurve:
Wäre geil, wenn jemand auch noch nen Tipp für mein eigentliches Thema hätte
vielleicht die Frage mal anders stellen. Mal zum Kern der Sache.
Du brauchst Livedata oder es reicht mit Verzögerung von Max 5 Sec auch.
Einige Devices haben ja auch gespeicherte Datensätze, diese werden von dir
noch nicht betrachtet ?Gegeben sind 8 x 1 Byte die Werte Darstellen, zB Puls usw.
Diese sollen in einer View ( Kurven ) dargestellt werden.Ansatz 1:
Du stellst die Daten in einem View mit einem html Widget da.
Das scheint wohl nicht zu klappen wie du oben schriebst, richtig ?
Dann welches Widget geht nicht, eventuell ist der html Code nicht ok.
Bei html wird wohl kaum einer helfen können da sehr anspruchsvoll.
Eher der schwierige Weg.Ansatz 2:
Du parkst die Daten in einer Datenbank zwischen, entweder einzeln oder als Array.
Die Daten in einen Datenpunkt zu schreiben sollte möglich sein.
Ich als Beginner von Kurven würde mit History und Flot beginnen.
Die Experten hier können dir da aber viel besser helfen.aus einer DB eine Kurve darstellen, siehst du da Möglichkeiten ?