Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Herzschlaganzeige mit EKG

Komponenten und Verbrauchsmaterialien

uEKG-Gerät
× 1
Arduino Nano R3
× 1
Adafruit NeoPixel Ring:WS2812 5050 RGB LED
× 1
Li-Ionen-Akku 1000mAh
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)

Über dieses Projekt

Seit vielen Jahren wollte ich einfach nur etwas mit LEDs machen, die zu meinen Herzschlägen blinken (und nicht nur, wenn ich vollkommen still bleibe und doch hier und da einen Takt überspringe). Das stellte sich als überraschend schwierig heraus, ich habe es jahrelang versucht und bin gescheitert. Aber nicht mehr!

Tatsächlich wird alles schwere Heben von uECG erledigt - einem kleinen tragbaren EKG-Gerät, das Open Source ist und einen Arduino-freundlichen Ausgangspin hat (dieser Pin geht mit jedem Herzschlag hoch / niedrig). Die Verarbeitung dieser Pin-Zustände ist viel einfacher als die Verarbeitung des EKG-Signals, und ich habe versucht, das Beste daraus zu machen.
UPD:Vielleicht möchten Sie die zweite Iteration dieses Projekts überprüfen, die Daten über eine Funkverbindung empfängt.

1. Schaltpläne
Da wir hier nur mit digitalen Signalen arbeiten, ist es sehr einfach. Aber als Wearable wäre es viel zuverlässiger (und kleiner), wenn die meisten Verbindungen gelötet sind - für einen schnellen Test ist es nicht notwendig, aber wenn Sie es bei starker Aktivität tragen, empfehle ich das dringend.
Der Schaltplan sieht so aus:

  • DI-Pin des LED-Rings geht auf Pin D11 (im Code konfigurierbar)
  • DRV-Pin des uECG-Geräts geht auf Pin D3 (auch konfigurierbar)
  • Batterie + geht an Arduino 5V und LED Ring 5V Eingänge
  • Batterie - geht an Arduino GND, Ring GND und uECG GND

Ich habe den LiPo-Akku direkt als 5V-Eingang verwendet - es ist kein Fehler, wenn Sie ihn an Vin anschließen - es wird nicht zuverlässig funktionieren (Spannungsregler an Vin führt zu Spannungsabfall und wir können uns hier absolut keinen leisten). Die Sache ist, Arduino ist stabil, solange die Eingangsspannung nicht unter 3,4 Volt fällt. Der LiPo-Akku startet bei voller Ladung bei 4,2 Volt und erreicht 3,4 Volt erst, wenn weniger als 15% Ladung übrig sind. Mit jedem Akku, der größer als ~200 mAh ist, können Sie also eine anständige Betriebszeit erzielen. Abgesehen davon, denken Sie bitte daran, dass der Akku über einen, nun ja, Stecker angeschlossen werden sollte :) Weil Sie ihn von den Schaltplänen trennen und ab und zu aufladen möchten.

2. Code
Das Programm funktioniert auf einfache Weise:Es liest ständig den D3-Pin, und wenn eine Änderung erkannt wird, schiebt die Zeit dieser Änderung in ein 20-Elemente-Array. Die Differenz zwischen dem ersten und letzten Element, geteilt durch 20, ist die durchschnittliche Zeit pro Schlag (in Millisekunden). Wenn wir also 1 Minute (60000 Millisekunden) durch diese Zahl teilen, erhalten wir den BPM-Wert. Sie können die Anzahl der Elemente im Array anpassen. Eine kleinere Anzahl von Elementen würde zu einer schnelleren Reaktion führen, jedoch zu weniger stabilen Ergebnissen (jedes Problem bei der Beat-Erkennung würde zu einem großen Sprung der berechneten BPM führen). Eine höhere Anzahl von Elementen würde stabilere Daten liefern, aber eine langsamere Reaktion, wenn sich der BPM schnell ändert.

Dann wird BPM in Farbe (blau->grün->gelb->rosa->rot, wenn BPM von niedrig nach hoch geht) und in die Anzahl der LEDs abgebildet:für 80 BPM leuchten acht Segmente, für 110 - elf usw. (Skala auch im Code einstellbar).

#include 
#ifdef __AVR__
#include
#endif
// DI-Pin des LED-Rings
#define PIN 11
// Anzahl der Pixel im Ring
#define NUMPIXELS 16
// Eingangspin zum Anschluss von uECG
int in_pin =3;
Adafruit_NeoPixel Pixel =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin(); // Dies initialisiert die NeoPixel-Bibliothek.
pinMode(in_pin, INPUT); // Pin auf Eingabemodus setzen
digitalWrite (in_pin, 1); //PULLUP aktivieren:Dies ist wichtig, uECG hat keinen internen Pull-Up
}
//wir speichern die letzten 20 Herzschläge, um die BPM darüber zu durchschnittlichen
//mit einem höheren Wert, it wird zuverlässiger,
//aber es dauert länger, bis sich die Ausgabe ändert, wenn sich der BPM ändert
#define BEAT_HIST 20
lange Beats[BEAT_HIST];
void push_beat(long ms) //Alle Beats im Array verschieben und aktuellen einfügen
{
for(int x =0; x {
beats[x] =beats[x+1];
}
beats[BEAT_HIST-1] =ms;
}
int get_bpm() //Zeitdifferenz zwischen erstem und letztem Beat verwenden
{
long dt =beats[BEAT_HIST-1] - beats[0];
long bpm =BEAT_HIST * 60000 / dt;
return bpm;
}
lang last_pix_upd =0; //um nachzuverfolgen, wann wir Pixel früher aktualisiert haben
int prev_in_state =0; //vorheriger Zustand des Eingangspins:Wir wollen nur Zustandsänderungen verarbeiten
void loop()
{
long ms =millis();
int in_state =digitalRead(in_pin ); // wenn kein Beat erkannt, 0 im Beat
if(in_state ==1 &&prev_in_state ==0) //reagiere nur auf Veränderungen
{
push_beat(ms);
}
prev_in_state =in_state;
if(ms - last_pix_upd> 10) //Pixel nicht zu oft aktualisieren
{
int r, g, b;
last_pix_upd =ms;
int bpm =get_bpm();
int max_bright =120; //Wert der maximalen Helligkeit, max. 255. Aber Sie wollen es nicht immer auf max :)
float dd =20; //Änderung der BPM zwischen den Farbtönen (blau->grün->gelb->rosa->rot)
float t1 =90, t2, t3, t4; //t1 - "Basis" BPM, niedriger als t1 wäre blau
t2 =t1 + dd;
t3 =t2 + dd;
t4 =t3 + dd;
/ /Code zum Ändern der Farbe, je nachdem in welchem ​​t1...t4-Bereich wir uns jetzt befinden
if(bpm sonst if(bpm else if(bpm else if(bpm sonst {r =max_bright; g =0; b =0; }
if(in_state) //wenn nicht im Beat, 1/4 Intensität, also werden nur Beats hervorgehoben
{
r *=0.25;
g *=0.25;
b *=0.25;
}
int on_pixels =(bpm+5)/10; //Anzahl der verwendeten LEDs:bei 60 BPM leuchten 6 LEDs, bei 120 - 12 usw
for(int i=0;i{
if( i else Pixel.setPixelColor(i, Pixel.Color(0,0,0)); //alle anderen LEDs ausschalten
}
pixels.show();
}
}

3. Montage als Wearable
Es ist praktisch, Arduino im Ring zu platzieren - es passt fast perfekt zur Größe. Batterie passt auch in die Nähe. Vergessen Sie nicht, dass das uEKG auf einer Brust platziert wird - Sie brauchen also einen Draht mit Anschlüssen, legen Sie ihn zuerst an, dann ziehen Sie ein Hemd mit anderen Komponenten an und dann stecken Sie den Anschluss ein. Sonst wäre es wirklich unpraktisch, es anzuziehen - glaub mir, ich habe es versucht ))

Das war's im Grunde - wenn alles richtig gemacht wurde, beginnt es innerhalb von 30 Sekunden, nachdem Sie alle Stecker angeschlossen haben, zu blinken und zeigt BPM an.

4. Feldtests
Ich habe es beim Gehen und Laufen getestet - und festgestellt, dass die Batterie während des Laufens direkt über den EKG-Sensor springt und die Messwerte verfälscht. Als ich alles ein wenig bewegte, stellte sich heraus, dass das Kabel, das uECG mit Arduino verbindet, zu kurz ist und bei jedem Schritt den EKG-Sensor zieht, wodurch die Messwerte erneut verzerrt werden. Insgesamt habe ich verlässliche Beats nur beim Gehen und Stehen bekommen, aber nicht beim Laufen - aber ich denke, das werde ich verbessern. Der Sensor selbst, wenn ich ihn mit einem anderen Shirt verwendet habe, hat die BPM auch während des Laufs korrekt angezeigt (über seine App überprüft).

Es stellt sich auch heraus, dass LEDs auf einer Brust vielleicht cool aussehen, aber praktisch nutzlos sind. Es ist wirklich unpraktisch, nach unten zu schauen, um den Puls zu messen. Ich denke, in der nächsten Iteration werde ich eine Art Armband machen, das stattdessen Beats anzeigt.

PS Wenn Sie sich für das uECG-Projekt interessieren, können Sie die Hackaday-Seite besuchen, dort gibt es viele technische Details, PCB-Designs, Diskussions- und Projektprotokolle

Code

  • uECG_pixel_ring.ino
uECG_pixel_ring.inoArduino
#include #ifdef __AVR__ #include #endif// DI-Pin des LED-Rings#define PIN 11// Anzahl der Pixel im Ring#define NUMPIXELS 16// Eingang Pin zum Anschluss von uECGint in_pin =3; Adafruit_NeoPixel Pixel =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);void setup() {pixel.begin(); // Dies initialisiert die NeoPixel-Bibliothek. pinMode (in_pin, INPUT); // Pin auf Eingabemodus setzen DigitalWrite (in_pin, 1); // PULLUP aktivieren:Dies ist wichtig, uECG hat kein internes Pull-Up} // Wir speichern die letzten 20 Herzschläge, um die BPM darüber zu durchschnittlichen // mit einem höheren Wert wird es zuverlässiger, // aber es dauert länger Zeit, um die Ausgabeänderung zu sehen, wenn sich der BPM ändert#define BEAT_HIST 20long beats[BEAT_HIST];void push_beat(long ms) //Alle Beats im Array verschieben und aktuellen einfügen{for(int x =0; x  10) // Pixel nicht zu oft aktualisieren { int r, g, b; last_pix_upd =ms; int bpm =get_bpm(); int max_hell =120; // Wert der maximalen Helligkeit, max 255. Aber Sie wollen es nicht immer auf max :) float dd =20; // Änderung der BPM zwischen Farbtönen (blau->grün->gelb->pink->rot) float t1 =90, t2, t3, t4; //t1 - "Basis" BPM, niedriger als t1 wäre blau t2 =t1 + dd; t3 =t2 + dd; t4 =t3 + dd; // Code zum Ändern der Farbe, je nachdem, in welchem ​​t1 ... t4-Bereich wir uns jetzt befinden Wenn (bpm  

Schaltpläne


Herstellungsprozess

  1. Externer Defibrillator
  2. Nudelholz
  3. Künstliches Herz
  4. Künstliche Herzklappe
  5. Bewegungssensor mit Raspberry Pi
  6. Überwachen Sie Ihre Haustemperatur mit Ihrem Raspberry Pi
  7. Ferngesteuerter Herzfrequenzmesser
  8. System ermöglicht kontaktlose Überwachung des Herzrhythmus mit intelligenten Lautsprechern
  9. Electronic Tattoo ermöglicht eine ununterbrochene Herzüberwachung über längere Zeiträume
  10. Knöchelgelenk verstehen