- Αισθητήρας MAX30100
- Απαιτούμενα συστατικά
- Διασύνδεση MAX30100 Οξύμετρο με ESP32
- Adafruit IO με ESP32 για παρακολούθηση καρδιακού ρυθμού
- Επεξήγηση κώδικα
- Επίδειξη παλμικού οξύμετρου βάσει IoT
Η παλμική οξυμετρία είναι ένα ευρέως χρησιμοποιούμενο ιατρικό όργανο μέτρησης και είναι μια μη επεμβατική και ανώδυνη δοκιμή που μετρά το επίπεδο κορεσμού οξυγόνου στο αίμα μας που μπορεί εύκολα να ανιχνεύσει μικρές αλλαγές στο οξυγόνο. Στην τρέχουσα κατάσταση του Covid-19, έχει γίνει σημαντικό να παρακολουθείτε ταυτόχρονα το επίπεδο οξυγόνου πολλών ασθενών χωρίς να έρθετε σε επαφή με τον ασθενή.
Έτσι, σε αυτό το έργο, κατασκευάζουμε ένα παλμικό οξύμετρο χρησιμοποιώντας MAX30100 Pulse oximeter και ESP32 που θα παρακολουθεί το επίπεδο του οξυγόνου αίματος και θα στέλνει τα δεδομένα μέσω Διαδικτύου συνδέοντας σε ένα δίκτυο Wi-Fi. Με αυτόν τον τρόπο, μπορούμε να παρακολουθούμε πολλούς ασθενείς από απόσταση διατηρώντας την κοινωνική απόσταση με τους ασθενείς. Τα ληφθέντα δεδομένα θα εμφανίζονται ως γράφημα που διευκολύνει την παρακολούθηση και ανάλυση της κατάστασης του ασθενούς. Προηγουμένως, είχαμε κατασκευάσει και άλλες οθόνες καρδιακού ρυθμού χρησιμοποιώντας αισθητήρες παλμού. Και αν ενδιαφέρεστε για άλλα έργα που σχετίζονται με το Covid-19, μπορείτε να δείτε το θερμόμετρο ανθρώπινου σώματος, το Smart IR Thermometer για παρακολούθηση πυρετού και τον ανιχνευτή θερμοκρασίας Wall-Mount που δημιουργήσαμε νωρίτερα.
Εκτός από την εφαρμογή Covid-19, αυτό το έργο μπορεί επίσης να χρησιμοποιηθεί ευρέως σε χρόνια αποφρακτική πνευμονοπάθεια (ΧΑΠ), άσθμα, πνευμονία, καρκίνο του πνεύμονα, αναιμία, καρδιακή προσβολή ή καρδιακή ανεπάρκεια ή σε συγγενή καρδιακά ελαττώματα.
Σημειώστε ότι, ο αισθητήρας που χρησιμοποιείται σε αυτό το έργο δεν έχει βαθμολογηθεί ιατρικά και το έργο δεν έχει δοκιμαστεί για εφαρμογές χωρίς προστασία. Χρησιμοποιείτε πάντα ένα ιατρικά βαθμολογημένο παλμικό οξύμετρο για να προσδιορίσετε το επίπεδο παλμού και οξυγόνου του ασθενούς και να το συζητήσετε με έναν ιατρό. Το έργο που συζητήθηκε εδώ είναι μόνο για εκπαιδευτικούς σκοπούς.
Αισθητήρας MAX30100
Ο αισθητήρας MAX30100 είναι ενσωματωμένη μονάδα παρακολούθησης παλμικής οξυμετρίας και καρδιακού ρυθμού. Επικοινωνεί με τη γραμμή δεδομένων I2C και παρέχει τις πληροφορίες SpO2 και Pulse στην κεντρική μονάδα μικροελεγκτή. Χρησιμοποιεί φωτοανιχνευτές, οπτικά στοιχεία όπου το κόκκινο, πράσινο IR LED διαμορφώνει τους παλμούς LED. Το ρεύμα LED είναι ρυθμιζόμενο από 0 έως 50mA. Η παρακάτω εικόνα δείχνει τον αισθητήρα MAX30100.
Η παραπάνω μονάδα αισθητήρα λειτουργεί με εύρος 1.8V έως 5.5V. Οι αντιστάσεις έλξης για τους πείρους I2C περιλαμβάνονται στη μονάδα.
Απαιτούμενα συστατικά
- Σύνδεση WiFi
- ESP32
- Αισθητήρας MAX30100
- Αναγνωριστικό χρήστη Adafruit IO και πίνακας ελέγχου που δημιουργήθηκε ειδικά (Θα το κάνει ακόμη περισσότερο)
- 5V επαρκής μονάδα τροφοδοσίας με ονομαστικό ρεύμα τουλάχιστον 1Α
- Καλώδιο USB Micro USB σε USBA
- Ένας υπολογιστής με Arduino IDE με περιβάλλον προγραμματισμού ESP32.
Διασύνδεση MAX30100 Οξύμετρο με ESP32
Το πλήρες διάγραμμα κυκλώματος για MAX30100 με ESP32 δίνεται παρακάτω.
Αυτό είναι ένα πολύ απλό σχηματικό. Οι ακίδες 21 και 22 του ESP32 devkit C συνδέονται με τον αισθητήρα παλμού οξύμετρο MAX30100 με τις ακίδες SDA και SCL. Το Oximeter τροφοδοτείται επίσης από τον πείρο 5V στον πίνακα ανάπτυξης ESP32. Έκανα τη σύνδεσή μου χρησιμοποιώντας ένα breadboard και καλώδια σύνδεσης και η ρύθμιση δοκιμών μου μοιάζει με αυτό-
Adafruit IO με ESP32 για παρακολούθηση καρδιακού ρυθμού
Έχουμε ήδη κατασκευάσει πολλά έργα Adafruit IO για διαφορετικές εφαρμογές IoT. Το Adafruit IO είναι μια εξαιρετική πλατφόρμα όπου μπορεί να δημιουργηθεί ένας προσαρμοσμένος πίνακας ελέγχου. Για να δημιουργήσετε τον προσαρμοσμένο ταμπλό για αισθητήρα Pulse-Oximeter με βάση το IoT, ακολουθήστε τα παρακάτω βήματα-
Βήμα 1: Πρώτα εγγραφείτε στο Adafruit IO αφού δώσετε το όνομα Fist, το επώνυμο, τη διεύθυνση email, το όνομα χρήστη και τον κωδικό πρόσβασης.
Βήμα 2: Το κενό παράθυρο του πίνακα ελέγχου θα ανοίξει μετά την ολοκλήρωση της διαδικασίας σύνδεσης. Σε αυτό το τμήμα, θα χρειαστεί να δημιουργήσουμε έναν πίνακα ελέγχου για την εμφάνιση των δεδομένων με διάφορους τρόπους. Επομένως, είναι καιρός να δημιουργήσετε το νέο ταμπλό και να δώσετε το όνομα του ταμπλό και την περιγραφή.
Βήμα 3: Αφού συμπληρώσετε την παραπάνω φόρμα, είναι καιρός να δημιουργήσετε το γράφημα και την ενότητα ελέγχου για τον αισθητήρα.
Επιλέξτε το μπλοκ διακόπτη. Απαιτείται για ενεργοποίηση ή απενεργοποίηση του αισθητήρα παλμού-οξύμετρου.
Βήμα 4: Γράψτε το όνομα του μπλοκ. Όπως μπορούμε να δούμε στην παραπάνω εικόνα, η λειτουργία εναλλαγής θα παρέχει δύο καταστάσεις, ON και OFF. Στην ίδια διαδικασία, επιλέξτε το μπλοκ γραφημάτων.
Αυτή η ενότητα γραφήματος πρέπει να επιλεγεί δύο φορές καθώς θα εμφανίζονται δύο γραφήματα, το Heart bit και το SpO2. Και οι δύο ενότητες έχουν δημιουργηθεί. Όπως μπορούμε να δούμε, έχουμε επιλέξει όλες τις λειτουργίες εισόδου και εξόδου.
Βήμα 5: Το επόμενο και τελευταίο βήμα είναι να έχετε το κλειδί adafruit. Όπως μπορούμε να δούμε, λαμβάνουμε το κλειδί adafruit και αυτό πρέπει να προστεθεί στον κώδικα.
Το Adafruit IO έχει πλέον ρυθμιστεί. Είναι καιρός να προετοιμάσετε το υλικό και να δημιουργήσετε το υλικολογισμικό για αυτό το έργο.
Επεξήγηση κώδικα
Αυτός ο κώδικας χρησιμοποιεί πολλές βιβλιοθήκες και όλοι είναι σημαντικοί. Οι βιβλιοθήκες είναι MAX30100 Pulse oximeter library library, Wire.h για το I2C, WiFi.h για υποστήριξη σχετικά με WiFi σε ESP32, Adafruit MQTT και MQTT Client library. Το πλήρες πρόγραμμα βρίσκεται στο κάτω μέρος αυτής της σελίδας.
Αυτές οι βιβλιοθήκες που αναφέρονται παραπάνω περιλαμβάνονται στην αρχή του κώδικα.
#περιλαμβάνω
Οι επόμενοι δύο ορισμοί είναι οι κωδικοί πρόσβασης WLAN SSID και WLAN. Αυτό πρέπει να είναι ακριβές και θα χρησιμοποιηθεί από το ESP32 για σύνδεση με το δίκτυο WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Στη συνέχεια, ορίσαμε τους ορισμούς Adafruit io.
# καθορισμός AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Ο ρυθμός ενημέρωσης θα ενημερώνει τα δεδομένα σε κάθε 5 δευτερόλεπτα, ο διακομιστής θα είναι io.adafruit.com με θύρα διακομιστή του 1883. Το όνομα χρήστη και ο κωδικός πρόσβασης θα είναι το όνομα χρήστη και ο κωδικός πρόσβασης που δημιουργούνται από τον πίνακα εργαλείων Adafruit IO. Θα είναι διαφορετικό για όλους και πρέπει να δημιουργηθεί όπως περιγράφεται στην ενότητα ρύθμισης adafruit.
Οι θύρες I2C ορίζονται αργότερα όπως φαίνεται στο σχηματικό.
# καθορισμός I2C_SDA 21 # καθορισμός I2C_SCL 22
Στη συνέχεια, χρησιμοποιούνται τρεις μεταβλητές για την αποθήκευση της τελευταίας αναφοράς και της τιμής bpm και spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
Το MQTT λειτουργεί με ένα μοντέλο pub-sub (δημοσίευση και εγγραφή). Σε αυτό το μοντέλο εργασίας, η συσκευή που υποβάλλει τα δεδομένα στον διακομιστή Adafruit παραμένει σε κατάσταση δημοσίευσης όπου ο διακομιστής Adafruit IO εγγράφεται στα ίδια σημεία δεδομένων. Με αυτόν τον τρόπο, κάθε φορά που η συσκευή δημοσιεύει νέα δεδομένα, ο διακομιστής, όπως είναι εγγεγραμμένος στα ίδια, λαμβάνει τα δεδομένα και παρέχει την απαραίτητη ενέργεια.
Το ίδιο συμβαίνει όταν ο διακομιστής δημοσιεύει τα δεδομένα και η συσκευή εγγράφεται σε αυτά. Στην εφαρμογή μας, η συσκευή στέλνει τα δεδομένα των SPO2 και BPM στον διακομιστή, οπότε δημοσιεύει τα ίδια και λαμβάνει την κατάσταση ON-OFF από τον διακομιστή, εγγράφοντας έτσι σε αυτόν. Αυτό το πράγμα διαμορφώνεται στο απόσπασμα κώδικα που περιγράφεται παρακάτω-
Πελάτης WiFiClient; Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Σημειώστε ότι οι διαδρομές MQTT για AIO ακολουθούν τη φόρμα:
Στη λειτουργία εγκατάστασης , ξεκινάμε το I2C, συνδέουμε το WiFi με το προκαθορισμένο SSID και τον κωδικό πρόσβασης και ξεκινάμε τη διαδικασία συνδρομής MQTT για την κατάσταση εναλλαγής (Το κουμπί διακόπτη που δημιουργήθηκε στον πίνακα ελέγχου Adafruit IO).
άκυρη ρύθμιση () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); ενώ (WiFi.status ()! = WL_CONNECTED) {καθυστέρηση (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi συνδεδεμένο"); Serial.println ("Διεύθυνση IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Εκκίνηση παλμικού οξυμέτρου.."); // Αρχικοποίηση της παρουσίας PulseOximeter // Οι αστοχίες οφείλονται γενικά σε ακατάλληλη καλωδίωση I2C, έλλειψη τροφοδοσίας // ή σε λάθος τσιπ στόχου εάν (! Pox.begin ()) {Serial.println ("FAILED"); Για(;;); } αλλιώς {Serial.println ("ΕΠΙΤΥΧΙΑ"); } // Το προεπιλεγμένο ρεύμα για την υπέρυθρη λυχνία LED είναι 50mA και θα μπορούσε να αλλάξει // αποσυσκευάζοντας την παρακάτω γραμμή Ελέγξτε MAX30100_Registers.h για όλες τις // διαθέσιμες επιλογές. πανώλης.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Καταχωρήστε μια επιστροφή κλήσης για την εντοπισμό ρυθμού pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Μετά από όλα αυτά, το max30100 ξεκινά με μια τρέχουσα ρύθμιση LED. Διαφορετικές τρέχουσες ρυθμίσεις είναι επίσης διαθέσιμες στα αρχεία κεφαλίδας MAX30100 για διαφορετικές διαμορφώσεις. Ξεκινά επίσης μια λειτουργία ανάκλησης ανίχνευσης καρδιακού παλμού. Μετά από όλες αυτές τις ρυθμίσεις, ο αισθητήρας οξύμετρου σταματά.
Στη λειτουργία βρόχου , ξεκινά η σύνδεση MQTT και το μοντέλο συνδρομής ελέγχεται κάθε 5000 χιλιοστά του δευτερολέπτου. Σε αυτήν την περίπτωση, εάν ο διακόπτης είναι ενεργοποιημένος, αρχίζει να διαβάζει τον αισθητήρα οξυμέτρου και να δημοσιεύει τα δεδομένα του καρδιακού παλμού και της τιμής SPO2. Εάν ο διακόπτης είναι απενεργοποιημένος, αναστέλλει όλες τις εργασίες που σχετίζονται με τον αισθητήρα παλμικού οξυμέτρου.
void loop () {MQTT_connect (); Adafruit_MQTT_Subscribe * συνδρομή; ενώ ((συνδρομή = mqtt.readSubscription (5000))) {if (συνδρομή == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Έναρξη POX…")); startReadPOX (); BaseType_t xΕπιστρέφεται; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Λειτουργία που υλοποιεί την εργασία. * / "pox_read", / * Όνομα κειμένου για την εργασία. * / 1024 * 3, / * Μέγεθος στοίβας σε λέξεις, όχι bytes. * / NULL, / * Η παράμετρος πέρασε στην εργασία. * / 2, / * Προτεραιότητα κατά την οποία δημιουργείται η εργασία. * / & poxReadTaskHld); / * Χρησιμοποιείται για να ξεπεράσει τη λαβή της δημιουργημένης εργασίας * /} καθυστέρηση (100) εάν (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Λειτουργία που υλοποιεί την εργασία. * / "mqttPub", / * Όνομα κειμένου για την εργασία. * / 1024 * 3, / * Μέγεθος στοίβας με λέξεις, όχι byte. * / NULL, / * Η παράμετρος πέρασε στην εργασία. * / 2, / * Προτεραιότητα κατά την οποία δημιουργείται η εργασία. * / & mqttPubTaskHld); / * Χρησιμοποιείται για να ξεπεράσει τη λαβή της δημιουργημένης εργασίας. * /}} άλλο {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Διαγράψτε την εργασία MQTT Pub εάν (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Χρησιμοποιείται για να ξεπεράσει τη λαβή της δημιουργημένης εργασίας. * /}} άλλο {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Διαγράψτε την εργασία MQTT Pub εάν (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Χρησιμοποιείται για να ξεπεράσει τη λαβή της δημιουργημένης εργασίας. * /}} άλλο {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Διαγράψτε την εργασία MQTT Pub εάν (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Επίδειξη παλμικού οξύμετρου βάσει IoT
Το κύκλωμα είναι σωστά συνδεδεμένο σε ένα breadboard και το πρόγραμμα που δίνεται παρακάτω μεταφορτώνεται στο ESP32. Βεβαιωθείτε ότι αλλάξατε τα διαπιστευτήρια Wi-Fi και Adafruit ανάλογα με τον κώδικά σας, ώστε να λειτουργήσει για εσάς.
Μετά τη σύνδεση με το διακομιστή WiFi και Adafruit IO, άρχισε να λειτουργεί όπως αναμενόταν.
Όπως μπορούμε να δούμε ότι το επίπεδο SPO2 δείχνει 96% και ο καρδιακός παλμός δείχνει 78 έως 81 bit ανά λεπτό. Παρέχει επίσης την ώρα κατά την οποία συλλαμβάνονται τα δεδομένα.
Όπως μπορούμε να δούμε στην παραπάνω εικόνα, ο διακόπτης είναι απενεργοποιημένος και τα δεδομένα είναι 0. Το πλήρες βίντεο εργασίας του έργου βρίσκεται επίσης στο κάτω μέρος αυτής της σελίδας.
Ελπίζω να απολαύσατε το άρθρο και να μάθετε κάτι χρήσιμο, αν έχετε απορίες, αφήστε το στην παρακάτω ενότητα σχολίων ή δημοσιεύστε τα στα φόρουμ μας.