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

Herzfrequenzmesser (tragbar und drahtlos mit EKG)

Komponenten und Verbrauchsmaterialien

uEKG-Gerät
Um den BPM tatsächlich zu messen. Es kann Daten über ein nRF24-kompatibles Protokoll senden
× 1
Arduino Nano R3
× 1
nRF24-Modul (generisch)
Jedes Modul würde hier funktionieren. Erforderlich, um BPM-Daten von uECG zu empfangen
× 1
Adafruit NeoPixel Ring:WS2812 5050 RGB LED
× 1
LiPo-Akku
Alle Akkus mit 200+ mAh Kapazität
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)

Über dieses Projekt

Dies ist eine zweite Iteration meines Herzüberwachungsprojekts, das vorherige zeigte Herzschläge auf einer Brust und war über Kabel mit uECG verbunden. Das sieht cool aus, ist aber überhaupt nicht praktikabel - Sie können nicht genau sehen, wie viele LEDs gerade leuchten, es befindet sich außerhalb Ihres normalen Sichtfelds und die Kabelverbindung mit dem uECG-Gerät verursacht viele Probleme für den Sensor selbst , also funktioniert es im Grunde nicht, wenn du läufst.

Diese Version löst all diese Probleme:Es wird am Handgelenk getragen, sodass Sie es sehen können, während Sie die Straße im Auge behalten, und es ist drahtlos, so dass keine Messwertverzerrung stattfindet, es funktioniert wirklich beim Laufen und ermöglicht es Ihnen, die Herzbelastung im Auge zu behalten.

1. Komponenten

Wie im vorherigen Projekt wird die gesamte harte Arbeit von uECG erledigt - es misst Daten und berechnet BPM an Bord. Aber auch, wenn es in den Direktverbindungsmodus geschaltet wird, sendet es alle diese Informationen (zusammen mit hochauflösenden EKG-Daten, die wir hier nicht verwenden) über ein Funkprotokoll, das mit dem generischen nRF24-Chip kompatibel ist. Die zweite kritische Komponente ist also das nRF24-Modul. Und Arduino Nano hat genau die richtige Größe, um unter einen kleinen LED-Ring zu passen, also verwende ich es als Controller (aber hier würde wirklich alles genauso gut funktionieren).

2. Schaltpläne

Das Anschließen des nRF24-Moduls ist nicht einfach, Sie müssen alle SPI-Kabel (MISO, MOSI, SCK, CS), auch das Chip-Enable-Kabel und die Stromversorgung anschließen. Und wenn Sie es in einer vernünftigen Größe haben möchten, müssen alle Stiftleisten entfernt und die Drähte direkt an die Pads gelötet werden. Der Anschluss von nRF allein erfordert also 7 Drähte, 14 Lötpunkte. Die gute Nachricht ist, dass alles andere einfach ist:Für den LED-Ring sind 1 Datenkabel und 2 Stromkabel erforderlich, und weitere 2 Stromkabel gehen in den Batterieanschluss.

Die Verbindungsliste ist wie folgt:
nRF24 Pin 1 (GND) - Arduinos GND
nRF24 Pin 2 (Vcc) - Arduinos 3.3v
nRF24 Pin 3 (Chip Enable) - Arduinos D9
nRF24 Pin 4 (SPI:CS) - Arduinos D8
nRF24 Pin 5 (SPI:SCK) - Arduinos D13
nRF24 Pin 6 (SPI:MOSI) - Arduinos D11
nRF24 Pin 7 ( SPI:MISO) - Arduinos D12
LED-Ring Power - Arduinos 5V
LED-Ring GND - Arduinos GND
LED-Ring DI - Arduinos D5
Batterie positiv (rot) - Arduinos 5V
Batterie negativ (schwarz) - Arduinos GND
(beachten Sie, dass die Batterie einen Stecker benötigt, damit sie getrennt und geladen werden kann)

Wichtiger Hinweis:Sie können keine MOSI-, MISO-, SCK-Drähte an andere Arduino-Pins anschließen. SPI-Hardware sitzt auf D11, D12, D13 und funktioniert nicht, wenn sie nicht dort angeschlossen ist. Alle anderen Pins können geändert werden (wenn Sie entsprechende Änderungen im Programm vornehmen).

3. Programm

Das einzig Komplizierte an der Software ist hier die HF-Kanalkonfiguration. Ich habe eine ganze Weile versucht, es zum Laufen zu bringen, bevor mir klar wurde, dass uECG und nRF24 unterschiedliche Bitreihenfolgen für die Pipe-Adresse verwenden. Als ich das behoben habe, hat alles sofort funktioniert :) Im Grunde lesen wir nur eingehende Pakete aus, verwenden ihr 5. Byte als BPM und filtern es (der HF-Kanal ist verrauscht, also erhalten Sie ab und zu zufällige Werte anstelle des korrekten Lesens, und Hardware-CRC ist aus Kompatibilitätsgründen deaktiviert). Danach wird BPM in Farbe und Anzahl der aktiven Pixel umgewandelt, und das war's.

#include 
#ifdef __AVR__
#include
#endif
#include
#include
#include
#include
int rf_cen =9; // nRF24-Chip-Aktivierungsstift
int rf_cs =8; //nRF24 CS Pin
RF24 rf(rf_cen, rf_cs);
//Pipe-Adresse - hartcodiert auf uECG-Seite
uint8_t pipe_rx[8] ={0x0E, 0xE6, 0x0D, 0xA7, 0 , 0, 0, 0};
// Welcher Pin des Arduino ist mit den NeoPixels verbunden?
#define PIN 5
// Wie viele NeoPixel sind am Arduino angeschlossen?
#define NUMPIXELS 16
Adafruit_NeoPixel Pixel =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
uint8_t swapbits(uint8_t a){ //uECG-Pipe-Adresse verwendet vertauschte Bitreihenfolge
// die Bitreihenfolge in einem einzelnen Byte umkehren
uint8_t v =0;
if(a &0x80) v |=0x01;
if(a &0x40) v |=0x02;
if(a &0x20) v |=0x04;
if(a &0x10) v |=0x08;
if(a &0x08) v |=0x10;
if(a &0x04) v |=0x20;
if(a &0x02) v |=0x40;
if(a &0x01) v |=0x80;
zurück v;
}
void setup() {
pixels.begin(); // Dies initialisiert die NeoPixel-Bibliothek.
for(int i=0;ipixels.setPixelColor(i, Pixel.Color(1,1,1));
}
pixels.show();
//nRF24 erfordert relativ langsames SPI, würde wahrscheinlich auch bei 2MHz funktionieren
SPI.begin();
SPI.setBitOrder(MSBFIRST );
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
for(int x =0; x <8; x++) //nRF24 und uECG haben unterschiedliche Bitreihenfolge für Pipe-Adresse
pipe_rx[x] =swapbits(pipe_rx[x]);
//Funkparameter konfigurieren
rf.begin();
rf.setDataRate(RF24_1MBPS);
rf.setAddressWidth(4);
rf.setChannel(22);
rf.setRetries(0, 0);
rf.setAutoAck(0);
rf.disableDynamicPayloads( );
rf.setPayloadSize(32);
rf.openReadingPipe(0, pipe_rx);
rf.setCRCLength(RF24_CRC_DISABLED);
rf.disableCRC();
rf.startListening(); //auf uECG-Daten hören
//Beachten Sie, dass uECG in den Rohdatenmodus geschaltet werden sollte (durch langes Drücken der Taste)
//um kompatible Pakete zu senden, sendet es standardmäßig Daten im BLE-Modus
//die von nRF24 nicht empfangen werden kann
}
long last_pix_upd =0;
byte in_pack[32];
int rf_bpm =0;
int bpm_hist [5]; //da wir CRC deaktiviert haben, müssen eingehende Daten gefiltert werden
void loop()
{
if(rf.available())
{
rf.read( in_pack, 32);
int bb =in_pack[5]; //BPM befindet sich im 5. Byte des Pakets
//detaillierte Paketstruktur befindet sich in den uECG-Dokumenten
//da wir aus Kompatibilitätsgründen keinen CRC haben, müssen wir filtern
// eingehende Daten, Funkkanal könnte verrauscht sein. Wir vergleichen die letzten 5
//erhaltenen BPM-Werte und verwenden nur einen, wenn alle 5 gleich waren.
//Da uECG etwa 100 Pakete pro Sekunde sendet, verursacht dies keine
// jede merkliche Verzögerung bei der Anzeige von Daten
for(int n =0; n <5-1; n++) //Verschiebe das BPM-History-Array um 1
bpm_hist[n] =bpm_hist[n+1];
bpm_hist[4] =bb; //neuen bpm-Wert hinzufügen
for(int n =0; n <5; n++) //überprüfe, ob alle gleich sind
if(bpm_hist[n] !=bb) bb =-1;
if(bb> 0) //wenn ja - als neu empfangene BPM speichern
rf_bpm =bb;
}
long ms =millis();
if( ms - last_pix_upd> 10) // Pixel nicht zu oft aktualisieren
{
int r, g, b;
last_pix_upd =ms;
int bpm =rf_bpm;
int max_hell =160; //Wert der maximalen Helligkeit, max. 255. Aber Sie wollen es nicht immer auf max :)
float dd =25; //Ä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; }
int on_pixels =(bpm-80)/8; //da es zum Laufen gedacht ist, zeige ich nicht
//weniger als 80 BPM, auf diese Weise ist es empfindlicher in
//Hochlastbereichen
for(int i=0;i{
//Pixel werden ohne besonderen Grund vom letzten zum ersten gesetzt,
// würden genauso gut funktionieren, wenn es vom ersten zum letzten gesetzt würde
if(i else Pixel.setPixelColor(NUMPIXELS-i-1, Pixel.Color(0, 0,0)); //alle anderen LEDs ausschalten
}
pixels.show();
}
}

4. Armbandmontage

Wenn alle Drähte gelötet sind, wird das Programm geflasht und Sie haben bestätigt, dass die uEKG-Daten empfangen wurden - es ist Zeit, alles zusammenzufassen.

Ich habe einen sehr einfachen Weg gewählt, um alles zusammenzuhalten - Thermokleber. Da die Teile selbst fast schon passen (Nano passt auf die äußere Ringgröße, nRF24-Modul passt auf die innere Ringgröße und die Batterie, obwohl sie kein Teil passt, steht aber irgendwie nicht im Weg - nicht sicher, wie es funktioniert, aber ich habe nur geklebt es da und irgendwie war es wirklich ok :) Dann habe ich es an ein beliebiges Armband genäht, das ich zur Hand hatte (Überbleibsel vom Lötstationspaket, ein Band, das zum Erden beim Löten verwendet wird), und das wars!

5. Testen

Zum Testen bin ich gelaufen, und es hat bis auf eine Überraschung gut funktioniert. Ich habe solche Einstellungen verwendet, dass bei 192 BPM alle LEDs an waren, da diese Herzfrequenz nach allen Empfehlungen für meine Parameter zu hoch ist. Die Überraschung war, dass ich es in nur wenigen Minuten Laufen übertroffen habe, ohne es zu merken. Ich dachte sogar, es könnte ein Sensorfehler sein, aber nein - als ich aufhörte, ging es nicht sofort runter, sondern es gab eine langsame Entspannung (Sensor ist 100% zuverlässig, wenn nicht viel Bewegung ist). Es stellt sich also heraus, dass ich eine Zeit lang deutlich über meiner gesunden Schwelle trainiere (zumindest das, was für einen normalen Erwachsenen meines Alters/Gewichts gesund sein sollte). Es ist interessant:Ich betreibe (Amateur-)Sport seit meiner Kindheit, aber ich hatte als Teenager Herzprobleme und sie schienen mit der Zeit zu verschwinden. Aber ich weiß aus Erfahrung, dass mir jede Belastung, die höher war als ein schneller Spaziergang, wirklich schwer fiel, trotzdem habe ich weiter trainiert - und das hat mein Limit mit der Zeit so weit erhöht, dass ich mich jetzt ziemlich fit betrachte. Und jetzt habe ich eine Frage - ist mein BPM aufgrund dieser Herzprobleme in der Jugend einfach höher als normal, oder treibe ich wirklich zu hart, ohne es zu merken? Jedenfalls muss ich damit etwas anfangen - entweder max BPM am Monitor erhöhen oder weniger intensiv trainieren. :)

PS Überraschenderweise hat sich uECG als EMG-Sensor sehr gut bewährt - Sie können es in meinem Robotic Hand Control-Projekt nachlesen

Code

  • bpm_watch.ino
bpm_watch.inoArduino
#include #ifdef __AVR__ #include #endif#include #include #include #include int rf_cen =9; // nRF24-Chip aktivieren Pinint rf_cs =8; // nRF24 CS pinRF24 rf(rf_cen, rf_cs); // Pipe-Adresse - hartcodiert auf uECG sideuint8_t pipe_rx[8] ={0x0E, 0xE6, 0x0D, 0xA7, 0, 0, 0, 0}; // Welcher Pin auf dem Arduino ist mit den NeoPixels verbunden?#define PIN 5// Wie viele NeoPixels sind mit dem Arduino verbunden?#define NUMPIXELS 16Adafruit_NeoPixel Pixel =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);uint8_t swapbits(uint8_t pipe a) .{ //u Adresse verwendet vertauschte Bitreihenfolge // die Bitreihenfolge in einem einzelnen Byte umkehren uint8_t v =0; if(a &0x80) v |=0x01; if(a &0x40) v |=0x02; if(a &0x20) v |=0x04; if(a &0x10) v |=0x08; if(a &0x08) v |=0x10; if(a &0x04) v |=0x20; if(a &0x02) v |=0x40; if(a &0x01) v |=0x80; Rückgabe v;}void setup() {pixel.begin(); // Dies initialisiert die NeoPixel-Bibliothek. for(int i=0;i 0) // wenn ja - als neu empfangene BPM speichern rf_bpm =bb; } lange ms =millis(); if(ms - last_pix_upd> 10) // Pixel nicht zu oft aktualisieren { int r, g, b; last_pix_upd =ms; int bpm =rf_bpm; int max_hell =160; // Wert der maximalen Helligkeit, max 255. Aber Sie wollen es nicht immer auf max :) float dd =25; // Ä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

Kein Dokument.

nrf24_led_ring_o2Gij5oigT.fzz

Herstellungsprozess

  1. Renesas und Altran entwickeln tragbare Chipsätze mit 3db Access UWB
  2. Heimwerker-Umwelt- und Luftqualitätsmonitor
  3. Python- und Raspberry Pi-Temperatursensor
  4. Überwachen Sie Ihre Haustemperatur mit Ihrem Raspberry Pi
  5. Ferngesteuerter Herzfrequenzmesser
  6. Erstellen von Monitor-Ambilight mit Arduino
  7. DIY-Voltmeter mit Arduino und Smartphone
  8. Herzfrequenzmesser mit IoT
  9. In die Kleidung integrierte Sensoren überwachen die Herzfrequenz
  10. Materialien und Komponenten, die mit CNC-Maschinen hergestellt wurden