- Cảm biến MAX30100
- Các thành phần bắt buộc
- Giao tiếp MAX30100 Oximeter với ESP32
- Adafruit IO với ESP32 để theo dõi nhịp tim
- Giải thích mã
- Trình diễn máy đo oxy xung dựa trên IoT
Đo oxy theo nhịp là một công cụ đo lường y tế được sử dụng rộng rãi và nó là một xét nghiệm không xâm lấn và không đau để đo mức độ bão hòa oxy trong máu của chúng ta, có thể dễ dàng phát hiện những thay đổi nhỏ trong oxy. Trong tình hình hiện tại của Covid-19, điều quan trọng là phải theo dõi mức oxy của nhiều bệnh nhân cùng lúc từ xa mà không cần tiếp xúc với bệnh nhân.
Vì vậy, trong dự án này, chúng tôi xây dựng một máy đo oxy xung sử dụng Máy đo oxy xung MAX30100 và ESP32 sẽ theo dõi mức Oxy trong máu và gửi dữ liệu qua internet bằng cách kết nối với mạng Wi-Fi. Bằng cách này, chúng tôi có thể theo dõi nhiều bệnh nhân từ xa bằng cách duy trì khoảng cách xã hội với bệnh nhân. Dữ liệu thu được sẽ được hiển thị dưới dạng biểu đồ giúp theo dõi và phân tích tình trạng của bệnh nhân dễ dàng hơn. Trước đây, chúng tôi cũng đã chế tạo các máy đo nhịp tim khác sử dụng cảm biến xung. Và nếu bạn quan tâm đến các dự án khác có liên quan đến Covid-19, bạn có thể xem Nhiệt kế cơ thể người, Nhiệt kế IR thông minh để theo dõi sốt và Máy quét nhiệt độ treo tường mà chúng tôi đã xây dựng trước đó.
Ngoài ứng dụng Covid-19, dự án này cũng có thể được sử dụng rộng rãi trong bệnh phổi tắc nghẽn mãn tính (COPD), hen suyễn, viêm phổi, ung thư phổi, thiếu máu, đau tim hoặc suy tim hoặc dị tật tim bẩm sinh.
Xin lưu ý rằng, cảm biến được sử dụng trong dự án này không được đánh giá về mặt y tế và dự án không được thử nghiệm cho các ứng dụng chống lỗi. Luôn sử dụng máy đo oxy xung được xếp hạng y tế để xác định mạch và mức oxy của bệnh nhân và thảo luận với bác sĩ. Dự án được thảo luận ở đây chỉ dành cho mục đích giáo dục.
Cảm biến MAX30100
Cảm biến MAX30100 được tích hợp mô-đun đo oxy xung và theo dõi nhịp tim. Nó giao tiếp với đường dữ liệu I2C và cung cấp thông tin SpO2 và Xung cho bộ vi điều khiển chủ. Nó sử dụng bộ tách sóng quang, các yếu tố quang học trong đó đèn LED hồng ngoại màu đỏ, xanh lá cây điều chế các xung LED. Dòng LED có thể cấu hình từ 0 đến 50mA. Hình ảnh dưới đây là cảm biến MAX30100.
Mô-đun cảm biến trên hoạt động với dải 1,8V đến 5,5V. Các điện trở kéo lên cho các chân I2C được bao gồm trong mô-đun.
Các thành phần bắt buộc
- Một kết nối WiFi
- ESP32
- Cảm biến MAX30100
- Id người dùng IO Adafruit và một trang tổng quan được tạo tùy chỉnh (Sẽ làm cho nó thêm nữa)
- Bộ cấp nguồn thích hợp 5V với dòng định mức ít nhất là 1A
- Cáp USB Micro USB sang USBA
- Một PC có Arduino IDE với môi trường lập trình ESP32.
Giao tiếp MAX30100 Oximeter với ESP32
Sơ đồ mạch hoàn chỉnh cho MAX30100 với ESP32 được đưa ra dưới đây.
Đây là một giản đồ rất đơn giản. Chân 21 và 22 của ESP32 devkit C được kết nối với cảm biến đo oxy xung MAX30100 bằng các chân SDA và SCL. Oximeter cũng được cấp nguồn bởi chân 5V trên bảng phát triển ESP32. Tôi đã thực hiện kết nối bằng bảng mạch và dây kết nối và thiết lập thử nghiệm của tôi trông như thế này-
Adafruit IO với ESP32 để theo dõi nhịp tim
Trước đây, chúng tôi đã xây dựng nhiều dự án Adafruit IO cho các ứng dụng IoT khác nhau. Adafruit IO là một nền tảng tuyệt vời, nơi có thể tạo bảng điều khiển tùy chỉnh. Để tạo bảng điều khiển tùy chỉnh cho cảm biến Pulse-Oximeter dựa trên IoT, hãy sử dụng các bước dưới đây-
Bước 1: Đầu tiên hãy đăng ký IO adafruit sau khi cung cấp Tên nắm tay, họ, địa chỉ email, tên người dùng và mật khẩu.
Bước 2: Cửa sổ trang tổng quan trống sẽ mở ra sau khi quá trình đăng nhập hoàn tất. Trong phân đoạn này, chúng tôi sẽ cần tạo trang tổng quan để hiển thị dữ liệu theo nhiều cách khác nhau. Do đó, đã đến lúc tạo trang tổng quan mới và cung cấp tên của trang tổng quan và mô tả.
Bước 3: Sau khi điền vào biểu mẫu trên, đã đến lúc tạo đồ thị và phần điều khiển cho cảm biến.
Chọn khối chuyển đổi. Nó sẽ được yêu cầu để BẬT hoặc TẮT cảm biến đo oxy xung.
Bước 4: Ghi lại tên khối. Như chúng ta thấy trong hình trên, chức năng bật tắt sẽ cung cấp hai trạng thái là BẬT và TẮT. Trong quá trình tương tự, hãy chọn khối đồ thị.
Phần đồ thị này cần được chọn hai lần vì hai đồ thị sẽ được hiển thị, Heart bit và SpO2. Cả hai phần đều được tạo. Như chúng ta thấy, chúng tôi đã chọn tất cả chức năng đầu vào và đầu ra.
Bước 5: Bước tiếp theo và cuối cùng là có key adafruit. Như chúng ta có thể thấy, chúng ta nhận được khóa adafruit và điều này cần được thêm vào mã.
IO Adafruit hiện đã được định cấu hình. Đã đến lúc chuẩn bị phần cứng và tạo phần sụn cho dự án này.
Giải thích mã
Mã này sử dụng nhiều thư viện và tất cả đều quan trọng. Các thư viện là thư viện cảm biến đo oxy xung MAX30100, Wire.h cho I2C, WiFi.h cho hỗ trợ liên quan đến WiFi trong thư viện ESP32, Adafruit MQTT và MQTT Client . Chương trình hoàn chỉnh có thể được tìm thấy ở cuối trang này.
Những thư viện được đề cập ở trên được bao gồm ở phần đầu của mã.
#include
Hai định nghĩa tiếp theo là WLAN SSID và WLAN Password. Điều này phải chính xác và nó sẽ được sử dụng bởi ESP32 để kết nối với mạng WiFi.
# xác định WLAN_SSID "xxxxxxxxx" # xác định WLAN_PASS "2581xxxxx2"
Tiếp theo, chúng tôi xác định các định nghĩa của Adafruit io.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Tốc độ cập nhật sẽ cập nhật dữ liệu sau mỗi 5 Giây, máy chủ sẽ là io.adafruit.com với cổng máy chủ là 1883. Tên người dùng và mật khẩu sẽ là tên người dùng và mật khẩu được tạo từ trang tổng quan IO adafruit. Nó sẽ khác cho tất cả và cần được tạo như được mô tả trong phần thiết lập adafruit.
Các cổng I2C được xác định sau đó như được hiển thị trong sơ đồ.
#define I2C_SDA 21 #define I2C_SCL 22
Tiếp theo, ba biến được sử dụng để lưu trữ báo cáo cuối cùng và giá trị bpm và spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTT hoạt động với mô hình pub-sub (xuất bản và đăng ký). Trong mô hình làm việc này, thiết bị gửi dữ liệu đến máy chủ Adafruit vẫn ở chế độ xuất bản trong đó máy chủ IO Adafruit đăng ký vào các điểm dữ liệu giống nhau. Do đó, bất cứ khi nào thiết bị xuất bản bất kỳ dữ liệu mới nào, máy chủ, vì nó được đăng ký cùng, sẽ nhận dữ liệu và đưa ra hành động cần thiết.
Điều tương tự cũng xảy ra khi máy chủ xuất bản dữ liệu và thiết bị đăng ký dữ liệu đó. Trong ứng dụng của chúng tôi, thiết bị gửi dữ liệu SPO2 và BPM đến máy chủ, vì vậy nó xuất bản giống nhau và nó nhận trạng thái BẬT-TẮT từ máy chủ, do đó đăng ký trạng thái này. Điều này được định cấu hình trong đoạn mã mô tả bên dưới-
Máy khách 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"); // Thông báo đường dẫn MQTT cho AIO theo mẫu:
Trong chức năng thiết lập , chúng tôi đang khởi động I2C, kết nối WiFi với SSID và Mật khẩu được xác định trước và bắt đầu quy trình đăng ký MQTT cho trạng thái chuyển đổi (Nút chuyển đổi được tạo trong bảng điều khiển Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (); Serial.println ("Đã kết nối WiFi"); Serial.println ("Địa chỉ IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Đang khởi tạo máy đo oxy xung.."); // Khởi tạo phiên bản PulseOximeter // Các lỗi thường do đấu dây I2C không đúng, thiếu nguồn // hoặc chip đích sai if (! Pox.begin ()) {Serial.println ("FAILED"); cho (;;); } else {Serial.println ("THÀNH CÔNG"); } // Dòng điện mặc định cho đèn LED hồng ngoại là 50mA và nó có thể được thay đổi // bằng cách bỏ ghi chú dòng sau. Kiểm tra MAX30100_Registers.h để biết tất cả // các tùy chọn có sẵn. thủy.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Đăng ký một cuộc gọi lại cho phát hiện nhịp pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Sau tất cả những điều này, max30100 được khởi động với cài đặt dòng dẫn. Các cài đặt hiện tại khác nhau cũng có sẵn trong tệp tiêu đề MAX30100 cho các cấu hình khác nhau. Chức năng gọi lại phát hiện nhịp tim cũng được bắt đầu. Sau tất cả các thiết lập này, cảm biến đo oxi sẽ dừng lại.
Trong chức năng vòng lặp , kết nối MQTT được khởi động và mô hình đăng ký được kiểm tra sau mỗi 5000 mili giây. Trong tình huống này, nếu công tắc được bật, nó sẽ bắt đầu đọc cảm biến đo oxy và công bố dữ liệu về Nhịp tim và giá trị SPO2. Nếu công tắc bị tắt, nó sẽ tạm dừng tất cả các tác vụ liên quan đến cảm biến đo oxy xung.
void loop () {MQTT_connect (); Đăng ký Adafruit_MQTT_Subscribe *; while ((subscription = mqtt.readSubscription (5000))) {if (subscription == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Đang khởi động POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Hàm thực thi tác vụ. * / "pox_read", / * Tên văn bản cho tác vụ. * / 1024 * 3, / * Kích thước ngăn xếp bằng chữ, không phải byte. * / NULL, / * Tham số được truyền vào tác vụ. * / 2, / * Mức độ ưu tiên mà tác vụ được tạo. * / & poxReadTaskHld); / * Được sử dụng để chuyển ra xử lý của tác vụ đã tạo. * /} độ trễ (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Hàm thực thi nhiệm vụ. * / "mqttPub", / * Tên văn bản cho nhiệm vụ. * / 1024 * 3, / * Kích thước ngăn xếp bằng chữ, không phải byte. * / NULL, / * Tham số được truyền vào nhiệm vụ. * / 2, / * Mức độ ưu tiên mà tác vụ được tạo. * / & mqttPubTaskHld); / * Được sử dụng để chuyển ra xử lý của tác vụ đã tạo. * /}} else {Serial.print (("Đang dừng POX…")); // Detele POX đọc tác vụ if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Xóa Tác vụ MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Được sử dụng để chuyển ra xử lý của tác vụ đã tạo. * /}} else {Serial.print (("Đang dừng POX…")); // Detele POX đọc tác vụ if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Xóa Tác vụ MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Được sử dụng để chuyển ra xử lý của tác vụ đã tạo. * /}} else {Serial.print (("Đang dừng POX…")); // Detele POX đọc tác vụ if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Xóa Tác vụ MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Trình diễn máy đo oxy xung dựa trên IoT
Mạch được kết nối đúng cách trong một breadboard và chương trình dưới đây được tải lên ESP32. Đảm bảo rằng bạn thay đổi thông tin đăng nhập Wi-Fi và Adafruit tương ứng trong mã của mình để làm cho nó hoạt động cho bạn.
Sau khi kết nối với WiFi và máy chủ Adafruit IO, nó bắt đầu hoạt động như mong đợi.
Như chúng ta có thể thấy rằng mức SPO2 đang hiển thị 96% và nhịp tim đang hiển thị từ 78 đến 81 bit mỗi phút. Nó cũng cung cấp thời gian khi dữ liệu được thu thập.
Như chúng ta có thể thấy trong hình trên, công tắc đã tắt và dữ liệu là 0. Bạn cũng có thể tìm thấy video hoạt động hoàn chỉnh của dự án ở cuối trang này.
Hy vọng bạn thích bài viết và học được điều gì đó hữu ích, nếu bạn có bất kỳ câu hỏi nào, vui lòng để lại trong phần bình luận bên dưới hoặc đăng chúng trên diễn đàn của chúng tôi.