SlideShare a Scribd company logo
GVHD: TS. Phan Văn Ca
Họ tên Sinh viên Mssv
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HCM
KHOA ĐÀO TẠO CHẤT LƯỢNG CAO
MÔN HỌC: Hệ thống nhúng
Báo Cáo Dự Án
THIẾT BỊ ĐO NHỊP TIM VÀ
NỒNG ĐỘ SpO2
TP. Hồ Chí Minh – Tháng 12 năm 2023
MỤC LỤC
CHƯƠNG 1: GIỚI THIỆU...................................................................................................................2
1.1. PHÂN TÍCH VẤN ĐỀ...........................................................................................................2
1.2. YÊU CẦU CỦA NGƯỜI DÙNG...........................................................................................2
1.3. YÊU CẦU KỸ THUẬT..........................................................................................................3
1.3.1. Yêu cầu về phần cứng .........................................................................................................3
1.3.2. Yêu cầu về phần mềm..........................................................................................................3
1.3.3. Yêu cầu về thiết kế và sử dụng:...........................................................................................4
1.4. BỐ CỤC ..................................................................................................................................4
CHƯƠNG 2: THIẾT KẾ.......................................................................................................................5
2.1. TỔNG QUAN VỀ LINH KIỆN .................................................................................................5
2.1.1. NODE MCU ESP8266 ........................................................................................................5
2.1.2. MAX30102 ......................................................................................................................... 12
2.1.3. MÀN HÌNH OLED ........................................................................................................... 14
2.1.4. NGUỒN PIN...................................................................................................................... 14
2.2. CÁCH THỨC HOẠT ĐỘNG ................................................................................................. 15
2.2.1. Nguyên lý hoạt động.......................................................................................................... 15
2.2.2. Quy trình hoạt động.......................................................................................................... 16
CHƯƠNG 3: CẤU TRÚC HỆ THỐNG............................................................................................ 19
3.1. SƠ ĐỒ KHỐI TỔNG QUAN............................................................................................. 19
3.2. THIẾT KẾ CHI TIẾT ........................................................................................................ 20
CHƯƠNG 4: SẢN PHẨM CUỐI CÙNG.......................................................................................... 21
4.1. HÌNH ẢNH SẢN PHẨM.................................................................................................... 21
4.2. LỊCH TRÌNH HOÀN THIỆN............................................................................................ 21
4.3. HƯỚNG DẪN SỬ DỤNG................................................................................................... 22
4.4. KẾT QUẢ ĐẠT ĐƯỢC...................................................................................................... 22
4.5. HƯỚNG PHÁT TRIỂN...................................................................................................... 22
CHƯƠNG 5: KẾT LUẬN .................................................................................................................. 24
TÀI LIỆU THAM KHẢO .................................................................................................................. 25
1
 Thuật ngữ và viết tắt
I2C Inter-Integrated Circuit.
SpO2 Saturation of peripheral oxygen
FDA U.S. Food and Drug Administration
 References
List of Tables & Figures
2
CHƯƠNG 1: GIỚI THIỆU
Dự án này xây dựng một thiết bị đo nhịp tim và nồng độ oxy trong máu với bộ xử lý trung
tâm là vi điều khiển Node MCU ESP8266. Thiết bị sẽ đo nhịp tim bằng cách sử dụng cảm biến
nhịp tim và đo nồng độ oxy bằng cảm biến oxy Max30102. Dữ liệu cảm biến sẽ được xử lý bởi
Node MCU ESP8266 và hiển thị lên màn hình OLED 0.96 inch. Ngoài ra, dữ liệu cũng được
gửi qua kết nối Wi-Fi tới ứng dụng Blynk để hiển thị.
Mục đích của dự án là xây dựng một thiết bị đo nhịp tim và oxy máu đơn giản, nhỏ gọn, dễ
sử dụng với chi phí thấp. Thiết bị có thể ứng dụng trong lĩnh vực y tế để theo dõi sức khỏe, đặc
biệt là đối với những người có vấn đề về tim mạch và hô hấp.
1.1. PHÂN TÍCH VẤN ĐỀ
Trong thời đại số hoá hiện nay, vấn đề y tế sức khỏe đóng vai trò quan trọng trong đời sống
của con người. Các công cụ và thiết bị y tế càng ngày càng được phát triển và trang bị nhiều
tính năng và hiệu suất cao hơn để đáp ứng nhu cầu của người sử dụng. Trong đó, ở các cơ sở y
tế hoặc tại hộ gia đình có người bị bệnh, việc giám sát các chỉ số sinh tồn quan trọng như nhịp
tim và nồng độ oxy trong máu là rất cần thiết.
Tuy nhiên, các phương pháp và thiết bị đo lường hiện có vẫn còn một số hạn chế đáng kể.
Cụ thể:
- Kích thước lớn, không thuận tiện mang theo người:
- Công nghệ tiên tiến dẫn đến giá thành cao. Không nhiều người tiếp cận được.
- Các thiết bị thiếu tính kết nối, lưu trữ lâu dài
- Các thiết bị còn phức tạp, khó sử dụng.
- Không phù hợp cho tất cả người sử dụng (về độ tuổi).
Do đó, việc phát triển các thiết bị đo nhịp tim và oxy máu với ưu điểm về kích thước, giá
thành, khả năng kết nối và xử lý dữ liệu là vô cùng cấp thiết.
1.2. YÊU CẦU CỦA NGƯỜI DÙNG
Mục tiêu của dự án về THIẾT BỊ ĐO NHỊP TIM VÀ OXY NỒNG ĐỘ SpO2 là nghiên cứu
và thiết kế thiết bị có thể đáp ứng được những nhu cầu sau đây
1. Xây dựng một thiết bị đo nhịp tim và SpO2 với kích thước nhỏ gọn, vừa lòng bàn
tay, dễ mang theo người. Kích thước nhỏ hơn 1 chiếc Smartphone (nhỏ hơn 10cm).
2. Thiết bị có kết cấu liền khối, chắc chắn, có thể chống va đập trong quá trình sử dụng.
3. Thiết bị có thể sử dụng được với mọi lứa tuổi, giới tính.
4. Giá thành thiết bị khoảng 400.000 VNĐ, giá thành đủ để phổ cập cho tất cả những
loại khách hàng
3
5. Thiết bị có cách sử dụng đơn giản, có duy nhất một nút bấm để dễ dàng sử dụng.
6. Có thể sạc bằng nhiều nguồn: nguồn adapter điện thoại, sạc dự phòng,…
7. Cổng sạc loại Type-C để có thể dùng dây sạc điện thoại sạc cho thiết bị.
8. Thời gian sử dụng thiết bị liên tục đạt tối thiểu 6h.
9. Tuổi thọ trung bình là 2 năm.
1.3. YÊU CẦU KỸ THUẬT
1.3.1. Yêu cầu về phần cứng
1. Vi điều khiển: Sử dụng loại Vi điều khiển có chức năng xử lý thông tin nhận được
từ cảm biến. Có thể xuất dữ liệu ra màn hình OLED để hiển thị và đưa dữ liệu lên
đám mây để xử lý và lưu trữ. Công suất sử dụng của Vi điều khiển thấp để kéo dài
thời gian sử dụng.
2. Cảm biến đo nhịp tim và đo oxy máu: sử dụng loại cảm biến vừa đo được nhịp tim,
vừa đo được oxy trong máu với tỉ lệ chính xác tới 85% so với tình trạng thực tế. Và
khác biệt không quá 10% so với các cảm biến được chấp thuận bởi FDA.
3. Màn hình hiển thị: màn hình hiển thị sắc nét, to rõ các thông số theo yêu cầu được
hiển thị. Công suất sử dụng của màn thấp để tiết kiệm pin.
4. Nguồn: sử dụng nguồn từ pin để có thể mang thiết bị đi những nơi khác mà không
cần phải cắm dây nguồn. Pin có dòng xả gấp 2 lần dòng tiêu thụ tối đa của các thiết
bị sử dụng nguồn. Pin có dung lượng đủ để có thể kéo dài thời gian hoạt động của
thiết bị ít nhất 6 tiếng.
5. Mạch sạc: Mạch sạc dùng để sạc lại điện cho Pin. Mạch sạc có cổng sạc thông dụng,
có thể dùng dây sạc điện thoại kết nối vào. Mạch sạc có chức năng sạc và và xả, đồng
thời bảo vệ nguồn pin bằng việc tự ngắt khi pin được sạc đủ hoặc khi điện áp pin
thấp, cần được sạc lại.
6. Có phần vỏ nhựa bên ngoài để bảo vệ và tích hợp các linh kiện trên vào cùng một
khối.
1.3.2. Yêu cầu về phần mềm
1. Chương trình được nạp vào vi điều khiển có chức năng đọc và xử lý dữ liệu từ cảm
biến, sau đó xuất dữ liệu ra màn hình để hiển thị thông số nhịp tim và SpO2 và đưa
lên máy chủ đám mây.
2. Ứng dụng đám mây cho phép lưu trữ, và xử lý, hiển thị dữ liệu ở dạng biểu đồ trực
quan. Cho phép người dùng đăng nhập và quản lý dữ liệu qua app Blynk.
3. Giao diện hiển thị trên phần mềm thân thiện, dễ sử dụng.
4
1.3.3. Yêu cầu về thiết kế và sử dụng:
1. Thiết kế nhỏ gọn, trọng lượng nhẹ để mang theo tiện lợi.
2. Quy trình sử dụng đơn giản, dễ thao tác cho người dùng.
3. Giao diện trên màn hình thể hiện theo thời gian thực trực quan, dễ hiểu.
4. Giao diện trên ứng dụng Blynk thể hiện theo thời gian thực trực quan, dễ hiểu.
5. Sai số của cảm biến đo nhịp tim trong khoảng ±5% hoặc ±3 nhịp/phút và sai số SpO2
là ±5%.
6. Vận hành 95% thời gian sử dụng.
7. Pin có chu kì sạc xả tối đa 1000 lần.
8. Tuổi thọ tối đa trong điều kiện sử dụng tiêu chuẩn: 1,5 – 2 năm. (nhiệt độ sử dụng
trong khoảng từ 15-35 độ, độ ẩm bình thường)
1.4. BỐ CỤC
Đề cương này có bố cục như sau:
Chương 1: Giới thiệu
Chương 2: Thiết kế
Chương 3: Kế hoạch sơ bộ
Chương 4: Kết Luận
Chương 5: Tài liệu tham khảo
5
CHƯƠNG 2: THIẾT KẾ
2.1. TỔNG QUAN VỀ LINH KIỆN
2.1.1. NODE MCU ESP8266
6
- Vi điều khiển: chip ESP8266EX của Espressif, xung nhịp 80MHz hoặc 160 MHz.
- Bộ nhớ:
 Lưu trữ firmware: bộ nhớ flash tích hợp trong chip ESP8266, dung lượng thường
từ 1MB đến 4MB.
 RAM: thông thường từ 32KB đến 80KB.
- Kết nối không dây:
 Wi-Fi 802.11 b/g/n, tần số 2.4GHz.
 Phù hợp để làm Access Point hoặc kết nối với Wi-Fi Router.
 Tốc độ truyền tải: 54Mbps ở chế độ 802.11g, 72Mbps ở chế độ 802.11n.
7
- Giao tiếp:
 GPIO: 17 pin GPIO có thể lập trình để điều khiển và đọc dữ liệu từ các cảm
biến.
 Giao thức kết nối: SPI, I2C, UART.
 PWM, I2S, ADC.
- Nguồn:
 Điện áp hoạt động: 2.5V – 5V
 Dòng điện tiêu thụ: Chế độ Active: 80mA, chế độ Sleep: 10uA
- Nhiệt độ hoạt động: -40°C đến 125°C.
Như vậy, ESP8266 là một module Wi-Fi thích hợp cho các ứng dụng IoT với đặc tính nhỏ
gọn, tiết kiệm điện năng và khả năng tích hợp cảm biến tốt.
Chi tiết:
Esp8266 gồm có các khối chính sau:
Power supply
Power-on sequence and reset
Flash
Crystal oscillator
RF
External resistor
UART
Digital Power Supply
ESP8266EX có hai chân kỹ thuật số để cấp nguồn là Pin11 và Pin17. Đối với nguồn điện kỹ
thuật số, không cần bổ sung thêm tụ lọc. Dải điện áp hoạt động của các chân nguồn điện kỹ
thuật số là 1,8 V ~ 3,3 V.
8
Analog Power Supply
ESP8266EX có 5 chân analog để cấp nguồn, bao gồm Pin1, Pin3, Pin4 là chân cấp nguồn
cho PA và LNA bên trong; và Pin29, Pin30 cho PLL nội bộ. Điện áp hoạt động cho các chân
cấp nguồn analog là 2,5 V ~ 3,6 V.
Flash
Đèn flash demo được sử dụng trên ESP8266EX là SPI Flash có ROM 2 MB trong gói SOP8
(208 triệu). Pin21 SD_CLK được kết nối với chân CLK flash cùng với điện trở 0402 trong kết
9
nối nối tiếp, giúp giảm dòng điện và loại bỏ sự gián đoạn bên ngoài. Điện trở ban đầu của điện
trở là 200 Ω.
Crystal Oscillator
ESP8266EX có thể hỗ trợ bộ tạo dao động tinh thể 40 MHz, 26 MHz và 24 MHz. Vui
lòng chọn đúng loại bộ tạo dao động tinh thể được sử dụng trong Công cụ tải xuống ESP Flash.
Trong thiết kế mạch, các tụ điện C1 và C2, được nối đất, được thêm vào các cực đầu vào và
đầu ra tương ứng của bộ dao động tinh thể. Giá trị của hai tụ điện có thể linh hoạt, dao động từ
6 pF đến 22 pF. Tuy nhiên, giá trị điện dung cụ thể của C1 và C2 phụ thuộc vào việc thử nghiệm
10
thêm và điều chỉnh hiệu suất tổng thể của toàn bộ mạch. Độ chính xác của tinh thể phải là ± 10
PPM.
RF
Trở kháng của đầu ra ESP8266 PA là 39 + j6 Ω nên trở kháng phù hợp là 39-j6 Ω (từ anten
đến chip)
UART
Người dùng cần kết nối điện trở 499 R với đường dây U0TXD để triệt tiêu sóng hài 80 MHz.
11
Theo mặc định, UART0 sẽ xuất ra một số thông tin được in khi bật nguồn ESP8266EX. Đối
với các ứng dụng nhạy cảm với tính năng này, người dùng có thể trao đổi các chân của UART
(UART SWAP) trong quá trình khởi tạo hệ thống, nghĩa là trao đổi U0TXD, U0RXD với
U0RTS (GPIO15), U0CTS (GPIO13). Sau khi trao đổi, GPIO15 và GPIO13 sẽ được kết nối
tương ứng với MCU_RXD và MCU_TXD dưới dạng U0TXD và U0RXD được hoán đổi để
liên lạc nối tiếp.
GPIO15, chốt đóng đai của ESP8266EX, cần ở mức điện áp thấp khi bật chip. Do đó, trong
khi hệ thống được bật nguồn, để đảm bảo GPIO15 không bị kéo lên từ bên ngoài, điều này sẽ
khiến hệ thống chuyển nhầm sang chế độ khởi động, một mạch cách ly sẽ được thêm vào. Khi
hệ thống được bật, Q1 bị tắt theo mặc định và GPIO15 thực sự bị ngắt kết nối khỏi MCU_RXD.
Sau khi chương trình bắt đầu chạy, GPIO5 có thể bật Q1, sau đó GPIO15 được kết nối với
MCU_RXD, cho phép cách ly GPIO15 khi bật nguồn. IO của ESP8266EX là mức logic 3,3 V.
Trong trường hợp giao tiếp nối tiếp với hệ thống logic CMOS 5 V, cần thêm một mạch chuyển
đổi mức bên ngoài.
12
2.1.2. MAX30102
13
- Công nghệ đo: Quang học dựa trên nguyên lý quang phổ kế dùng 2 đèn LED (đỏ và hồng
ngoại) và quang kế photodiode.
- Phương thức đo: Đo độ thay đổi hấp thụ ánh sáng (của oxyhemoglobin và
deoxyhemoglobin) qua ngón tay/vành tai để xác định nhịp tim và SpO2.
- Độ chính xác:
 Nhịp tim: ±2% hoặc ±1 bpm
 SpO2: ±2%
- Phạm vi đo:
 Nhịp tim: 30 - 250 bpm
 SpO2: 70 - 100%
- Điện áp hoạt động: 1.8V hoặc 3.3V
- Dòng tiêu thụ:
 Chế độ ngủ: 0.7uA
 Chế độ hoạt động: 4.5mA
 Chế độ đo: 7mA
- Giao tiếp: I2C
- Độ phân giải: 15 - 18bit
- Tốc độ lấy mẫu: 50 – 3200 sps (mẫu trên giây)
- Kích thước: 3.3 x 2.4 x 0.83 mm
14
Như vậy, MAX30102 là cảm biến nhịp tim và SpO2 chính xác, nhỏ gọn, tiêu thụ điện thấp,
phù hợp cho các thiết bị di động…
2.1.3. MÀN HÌNH OLED
- Kích thước màn hình: 0.96 inch
- Độ phân giải: 128x64 pixel
- Tốc độ refresh: 100Hz
- Công nghệ hiển thị: OLED
- Giao tiếp: I2C, SPI
- Điện áp hoạt động: 3.3V-5V
- Mật độ điểm ảnh: 290-300 pixel/inch
- Góc nhìn: 160 độ
- Độ tương phản: 10,000:1
- Độ sáng tối đa: 1000 cd/m2
- Tuổi thọ màn hình: 100,000 giờ
- Màu hiển thị: Vàng, xanh dương, trắng
- Khả năng hiển thị chữ: Hỗ trợ font chữ, ký tự đặc biệt
- Tiêu thụ điện năng: Hoạt động: 12mA, ngủ: 0.1μA
2.1.4. NGUỒN PIN
15
Pin sạc Lipo Polymer – Li-Po 3.7V (có mạch bảo vệ sạc) – dung lượng 1500mAh (hoạt động
liên tục 18.5 tiếng nếu Node MCU ESP8266 tiêu thụ dòng 80mA). Sử dụng mạch sạc TP4056
để sạc pin.
2.2. CÁCH THỨC HOẠT ĐỘNG
2.2.1. Nguyên lý hoạt động
Thiết bị sử dụng cảm biến nhịp tim MAX30102 dựa trên nguyên lý quang phổ kế xuyên qua
mô biểu bì để đo nhịp tim. Cảm biến oxy máu dùng nguyên lý điện hóa để xác định nồng độ
oxy trong máu SpO2. Node MCU ESP8266 đóng vai trò bộ não xử lý tín hiệu từ các cảm biến,
hiển thị dữ liệu qua màn hình OLED và gửi dữ liệu lên đám mây (Blynk).
2.2.1.1. Max30102
Cảm biến nhịp tim và oxy trong máu MAX30102 hoạt động dựa trên nguyên lý phát hiện
ánh sáng hấp thụ bởi máu trong các mô và mạch máu. MAX30102 sử dụng công nghệ phản xạ
ánh sáng hồng ngoại (IR) và ánh sáng đỏ để đo lường nồng độ oxy (SpO2) và nhịp tim (HR)
của người dùng.
16
Cảm biến được tích hợp các đèn LED hồng ngoại và đèn LED đỏ, cùng với một bộ lọc quang
để tạo ra ánh sáng phù hợp để xuyên qua da và mô màu đỏ. Đèn LED hồng ngoại thẩm thấu
sâu vào da, trong khi đèn LED đỏ thẩm thấu xa hơn. Khi ánh sáng được chiếu qua da, nó sẽ gặp
phản xạ từ máu chảy trong các mạch máu dưới da.
Cảm biến sử dụng photodiodes để đo lượng ánh sáng phản xạ từ máu. Các photodiodes nhận
tín hiệu ánh sáng và chuyển đổi chúng thành dữ liệu Analog. Sau đó, dữ liệu này được khuếch
đại và chuyển đổi thành dữ liệu kỹ thuật số bằng một bộ chuyển đổi analog-số (ADC).
2.2.2. Quy trình hoạt động
1. Người dùng đặt thiết bị lên ngón tay.
17
2. Cảm biến MAX30102 phát ra ánh sáng đỏ và hồng ngoại xuyên qua mô, đo độ hấp thụ
ánh sáng để xác định nhịp tim và SpO2.
3. Tín hiệu từ cảm biến nhịp tim và oxy máu được truyền tới ESP8266 thông qua giao
tiếp I2C.
4. ESP8266 xử lý và tính toán các thông số nhịp tim, SpO2.
5. Dữ liệu được hiển thị lên màn hình OLED và đồng thời gửi lên máy chủ đám mây
thông qua kết nối Wi-Fi.
6. Dữ liệu được lưu trữ và phân tích trên đám mây như hiển thị thông số, sơ đồ.
2.2.3. Sơ đồ khối quy trình hoạt động cơ bản
2.2.4. Sơ đồ khối quy trình hoạt động chi tiết
Cảm biến nhịp tim
MAX30102 thu và
gửi dữ liệu tới
NODE MCU
ESP8266
ESP8266 xử lý
mà tính toán
thông số nhịp tim,
SpO2
Hiển thị dữ
liệu trên màn
hình Oled
Gửi dữ liệu lên
Blynk để tính
toán, lưu trữ
18
19
CHƯƠNG 3: CẤU TRÚC HỆ THỐNG
3.1. SƠ ĐỒ KHỐI TỔNG QUAN
Sơ đồ khối tổng quát về thiết bị
Giải thích
 Cảm biến MAX30102 có nhiệm vụ đo độ thay đổi hấp thụ ánh sáng (của
oxyhemoglobin và deoxyhemoglobin) qua ngón tay/vành tai để xác định nhịp tim
và SpO2, chuyển đổi dữ liệu đo được thành tín hiệu điện với độ phân giải 18bit rồi
chuyển thành tín hiệu nhị phân (TTL), rồi gửi về NODE MCU ESP8266 qua giao
thức I2C.
 NODE MCU ESP8266 có nhiệm vụ đọc dữ liệu nhận được từ cảm biến MAX30102,
xử lý dữ liệu nhận được, sau đó xuất dữ liệu nhịp tim và nồng độ SpO2 ra thẳng màn
hình OLED. Đồng thời, dữ liệu được gửi lên đám mây (Blynk) thông qua kết nối
Wi-Fi lên Internet đã được thiết lập trong chương trình.
 Màn hình OLED sẽ nhận dữ liệu từ NODE MCU ESP8266 qua giao thức I2C rồi
hiển thị số nhịp tim và tỉ lệ phần trăm SpO2.
 App Blynk đã được lập trình để hiển thị và lưu trữ dữ liệu được nhận từ NODE
MCU ESP8266 từ Internet thông qua kết nối Wi-Fi. Dữ liệu sẽ được hiển thị ở dạng
số trực tiếp và sơ đồ theo thời gian nhằm giám sát và theo dõi.
 Nguồn pin 3,7V Li-Po được sử dụng để cấp nguồn cho NODE MCU ESP8266, từ
đó NODE MCU ESP8266 sẽ cấp nguồn cho cảm biến MAX30102 và màn hình
OLED. Mạch sạc được nối vào nguồn pin, sử dụng cổng Micro-USB để sạc.
20
3.2. THIẾT KẾ CHI TIẾT
21
CHƯƠNG 4: SẢN PHẨM CUỐI CÙNG
4.1. HÌNH ẢNH SẢN PHẨM
4.2. LỊCH TRÌNH HOÀN THIỆN
22
4.3. HƯỚNG DẪN SỬ DỤNG
Sản phẩm sử dụng bằng cách: nhấn nút nhấn màu đen để bật, tắt thiết bị. Thiết bị sẽ tự động kết
nối với WiFi đã được thiết lập từ trước. Sau đó đưa ngón tay đặt lên cảm biến và giữ trong vòng
khoảng 2 phút để cảm biến đọc chính xác được nhịp tim và SpO2 của người sử dụng. Thiết bị
có thể sạc bằng cổng sạc Type C vào mạch sạc cho pin cấp nguồn cho mạch.
4.4. KẾT QUẢ ĐẠT ĐƯỢC
- Thiết bị phát hiện được ngón tay khi đặt lên.
- Thiét bị đo được nhịp tim và SpO2.
- Thiết bị xuất được dữ liệu ra màn OLED.
- Thiết bị kết nối được với WiFi
- Thiết bị xuất được dữ liệu lên Blynk Server
4.5. HƯỚNG PHÁT TRIỂN
- Thiết kế một hệ thống có thể sử dụng ở thực tế.
23
- Lập trình có thể tối ưu năng lượng tiêu thụ hơn.
- Tối ưu tốc độ xử lý để không gây mất kiên nhẫn cho người dùng.
- Cập nhật dữ liệu lên một phần mềm, máy chủ thực tế
24
CHƯƠNG 5: KẾT LUẬN
Dự án thiết bị đo nhịp tim và oxy trong máu với lõi là NODE MCU ESP8266 là một dự án
vô cùng thú vị và ý nghĩa. Đây là dự án ứng dụng công nghệ IoT và vi điều khiển vào lĩnh vực
y tế, góp phần cải thiện sức khỏe con người. Dự án kết hợp nhiều công nghệ phần cứng-phần
mềm hiện đại như vi điều khiển ESP8266, cảm biến nhịp tim MAX30102, màn hình OLED,
kết nối Wi-Fi... đòi hỏi người thực hiện phải nghiên cứu kỹ lưỡng, rèn luyện các kỹ năng thiết
kế và lập trình. Sản phẩm cuối cùng là một thiết bị đo lường nhịp tim và oxy máu nhỏ gọn, chi
phí thấp, dễ sử dụng. Đây cũng là bước khởi đầu có thể phát triển thành sản phẩm thương mại
hoặc nền tảng cho nhiều ứng dụng y tế thông minh trong tương lai. Vì vậy, đây hứa hẹn là một
dự án thực sự thú vị và thử thách.
25
TÀI LIỆU THAM KHẢO
[1]: ESP8266EX
Datasheet, https://www.espressif.com/sites/default/files/documentation/0a-
esp8266ex_datasheet_en.pdf (10/10/2023)
[2]: MAX30102 datasheet, https://www.analog.com/media/en/technical-documentation/data-
sheets/max30102.pdf (10/10/2023)
[3]:https://www.terasic.com.tw/cgibin/page/archive.pl?Language=English&CategoryNo=139
&No=593&PartNo=2#heading (10/10/2023)
[4]: Oled 0,96 inches datasheet https://www.waveshare.com/w/upload/7/71/0.96inch-OLED-
UserManual.pdf (10/10/2023)
26
CHƯƠNG TRÌNH CỦA VI ĐIỀU KHIỂN
#include <Wire.h>
#include "MAX30105.h" //sparkfun MAX3010X library
//#include <Adafruit_GFX.h> //OLED libraries
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include "heartRate.h"
#define BLYNK_TEMPLATE_ID "TMPL6jsuewbWy"
#define BLYNK_TEMPLATE_NAME "PulseSpO2"
#define BLYNK_AUTH_TOKEN "MlgGwdPvU0kWSC3onXu-B53WAyaFgu6O"
#define BLYNK_PRINT Serial
#include <Blynk.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char auth[] = "MlgGwdPvU0kWSC3onXu-B53WAyaFgu6O"; // Authentication Token Sent
by Blynk
char ssid[] = "Tro sinh vien lau 4"; //WiFi SSID
char pass[] = "0902511322";
MAX30105 particleSensor;
///////////////////////////////////////////////////////////////////////////////////
const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
float beatsPerMinute;
int beatAvg;
double oxi;
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
27
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//Declaring the display name (display)
///////////////////////////////////////////////////////////////////////////////////
#define USEFIFO
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display
display.display();
/////////////////////////////////////////////
Serial.begin(115200);
// Serial.println("Initializing...");
Blynk.begin(auth, ssid, pass);
// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
{
Serial.println("MAX30102 was not found. Please check wiring/power/solder jumper at MH-ET
LIVE MAX30102 board. ");
while (1);
}
//Setup to sense a nice looking saw tooth on the plotter
//byte ledBrightness = 0x7F; //Options: 0=Off to 255=50mA
byte ledBrightness = 75; //Options: 0=Off to 255=50mA
byte sampleAverage = 8; //Options: 1, 2, 4, 8, 16, 32
byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
//Options: 1 = IR only, 2 = Red + IR on MH-ET LIVE MAX30102 board
int sampleRate = 3200; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
int pulseWidth = 411; //Options: 69, 118, 215, 411
int adcRange = 16384; //Options: 2048, 4096, 8192, 16384
// Set up the wanted parameters
particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);
//Configure sensor with these settings
}
double avered = 0; double aveir = 0;
28
double sumirrms = 0;
double sumredrms = 0;
int i = 0;
int tam = 0;
int Num = 100;//calculate SpO2 by this sampling interval
double ESpO2 = 93.0;//initial value of estimated SpO2
double FSpO2 = 0.6; //filter factor for estimated SpO2
double frate = 0.95; //low pass filter for IR/red LED value to eliminate AC component
#define TIMETOBOOT 2 // wait for this time(msec) to output SpO2
#define SCALE 88.0 //adjust to display heart beat and SpO2 in the same scale
#define SAMPLING 1 //if you want to see heart beat more precisely , set SAMPLING to 1
#define FINGER_ON 35000 // if red signal is lower than this , it indicates your finger is not on the
sensor
#define MINIMUM_SPO2 0.0
void loop()
{
Blynk.run();
uint32_t ir, red , green;
double fred, fir;
double SpO2 = 0; //raw SpO2 before low pass filtered
#ifdef USEFIFO
particleSensor.check(); //Check the sensor, read up to 3 samples
while (particleSensor.available()) {//do we have new data
#ifdef MAX30105
red = particleSensor.getFIFORed(); //Sparkfun's MAX30105
ir = particleSensor.getFIFOIR(); //Sparkfun's MAX30105
#else
red = particleSensor.getFIFOIR(); //why getFOFOIR output Red data by MAX30102 on MH-ET
LIVE breakout board
ir = particleSensor.getFIFORed(); //why getFIFORed output IR data by MAX30102 on MH-ET
LIVE breakout board
#endif
i++;
fred = (double)red;
29
fir = (double)ir;
avered = avered * frate + (double)red * (1.0 - frate);//average red level by low pass filter
aveir = aveir * frate + (double)ir * (1.0 - frate); //average IR level by low pass filter
sumredrms += (fred - avered) * (fred - avered); //square sum of alternate component of red level
sumirrms += (fir - aveir) * (fir - aveir);//square sum of alternate component of IR level
if ((i % SAMPLING) == 0) {//slow down graph plotting speed for arduino Serial plotter by thin out
if ( millis() > TIMETOBOOT) {
if (ir < FINGER_ON) ESpO2 = MINIMUM_SPO2; //indicator for finger detached
if (ESpO2 <= -1)
{
ESpO2 = 0;
}
if (ESpO2 > 100)
{
ESpO2 = 100;
}
oxi = ESpO2+45;
if (oxi > 100)
{
oxi = 100;
}
//Serial.print(" Oxygen % = ");
//Serial.println(ESpO2); //low pass filtered SpO2
}
}
if ((i % Num) == 0) {
double R = (sqrt(sumredrms) / avered) / (sqrt(sumirrms) / aveir);
// Serial.println(R);
SpO2 = -23.3 * (R - 0.4) + 100;
//http://ww1.microchip.com/downloads/jp/AppNotes/00001525B_JP.pdf
ESpO2 = FSpO2 * ESpO2 + (1.0 - FSpO2) * SpO2;//low pass filter
// Serial.print(SpO2);Serial.print(",");Serial.println(ESpO2);
//Serial.print(" Oxygen2 % = ");
//Serial.println(ESpO2); //low pass filtered SpO2
30
sumredrms = 0.0; sumirrms = 0.0; i = 0;
break;
}
particleSensor.nextSample(); //We're finished with this sample so move to next sample
//Serial.println(SpO2);
//////////////////////////////////////////////////////////////////////////////
long irHR = particleSensor.getIR();
if(irHR > 7000){ //If a finger is detected
display.clearDisplay(); //Clear the display
//display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little
heart)
display.setTextSize(1); //Near it display the average BPM you can display the
BPM if you want
display.setTextColor(WHITE);
display.setCursor(40,2);
display.setRotation(3);
display.println("Beat");
display.setRotation(0);
display.setTextSize(3);
display.setCursor(20,5);
display.println(beatAvg);
//Blynk.virtualWrite(V1, beatAvg);
display.setCursor(107,5);
display.setTextSize(1);
display.print("bpm");
//display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little
heart)
display.setTextSize(1); //Near it display the average BPM you can display the
BPM if you want
display.setTextColor(WHITE);
display.setRotation(3);
display.setCursor(5,2);
display.println("SpO2");
display.setTextSize(3);
display.setRotation(0);
31
display.setCursor(20,35);
display.println(oxi,1);
// Blynk.virtualWrite(V2, oxi);
display.setCursor(120,35);
display.setTextSize(1);
display.print("%");
display.display();
//delay(100);
if (checkForBeat(irHR) == true) //If a heart beat is detected
{
display.clearDisplay(); //Clear the display
//display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE); //Draw the second picture (bigger
heart)
display.setTextSize(1); //And still displays the average BPM
display.setTextColor(WHITE);
display.setRotation(3);
display.setCursor(40,2);
display.println("Tim");
display.setRotation(0);
display.setTextSize(3);
display.setCursor(20,5);
display.println(beatAvg);
Blynk.virtualWrite(V1, beatAvg);
display.setCursor(107,5);
display.setTextSize(1);
display.print("bpm");
//display.clearDisplay(); //Clear the display
//display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little
heart)
display.setTextSize(1); //Near it display the average BPM you can display the
BPM if you want
display.setTextColor(WHITE);
display.setCursor(5,2);
32
display.setRotation(3);
display.println("SpO2");
display.setTextSize(3);
display.setRotation(0);
display.setCursor(20,35);
display.println(oxi,1);
Blynk.virtualWrite(V2, oxi);
display.setCursor(120,35);
display.setTextSize(1);
display.print("%");
display.display();
//tone(3,1000); //And tone the buzzer for a 100ms you can reduce it it will
be better
delay(100);
//noTone(3);
//delay(100);
//Deactivate the buzzer to have the effect of a "bip"
//We sensed a beat!
long delta = millis() - lastBeat; //Measure duration between two beats
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0); //Calculating the BPM
if (beatsPerMinute < 255 && beatsPerMinute > 20) //To calculate the average we strore
some values (4) then do some math to calculate the average
{
rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
rateSpot %= RATE_SIZE; //Wrap variable
//Take average of readings
beatAvg = 0;
for (byte x = 0 ; x < RATE_SIZE ; x++)
beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
33
}
}
if (irHR < 7000){ //If no finger is detected it inform the user and put the average BPM to 0 or it
will be stored for the next measure
beatAvg=0;
beatAvg=0;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(3,25);
display.println("No Finger!");
Blynk.virtualWrite(V1,0);
Blynk.virtualWrite(V2,0);
display.display();
//noTone(3);
}
////////////////////////////////////////////////////////////////
}
#endif
}

More Related Content

Similar to bao cao he thong nhung123@fmdfsdmfsfmsmfsm

Giám sát mức tiêu thụ điện, nước bằng công nghệ IOT.pdf
Giám sát mức tiêu thụ điện, nước bằng công nghệ IOT.pdfGiám sát mức tiêu thụ điện, nước bằng công nghệ IOT.pdf
Giám sát mức tiêu thụ điện, nước bằng công nghệ IOT.pdf
Man_Ebook
 
KHÓA LUẬN TỐT NGHIỆP ĐTCNK).docx
KHÓA LUẬN TỐT NGHIỆP ĐTCNK).docxKHÓA LUẬN TỐT NGHIỆP ĐTCNK).docx
KHÓA LUẬN TỐT NGHIỆP ĐTCNK).docx
kimpham15892
 
NGHIÊN CỨU ỨNG DỤNG KỸ THUẬT MẠNG KHÔNG DÂY VÀO GIÁM SÁT SỰ THAY ĐỔI CỦA MÔI ...
NGHIÊN CỨU ỨNG DỤNG KỸ THUẬT MẠNG KHÔNG DÂY VÀO GIÁM SÁT SỰ THAY ĐỔI CỦA MÔI ...NGHIÊN CỨU ỨNG DỤNG KỸ THUẬT MẠNG KHÔNG DÂY VÀO GIÁM SÁT SỰ THAY ĐỔI CỦA MÔI ...
NGHIÊN CỨU ỨNG DỤNG KỸ THUẬT MẠNG KHÔNG DÂY VÀO GIÁM SÁT SỰ THAY ĐỔI CỦA MÔI ...
NgnNguyn317517
 
Hệ thống đo, giám sát và điều khiển các thông số môi trường trong nhà trồng n...
Hệ thống đo, giám sát và điều khiển các thông số môi trường trong nhà trồng n...Hệ thống đo, giám sát và điều khiển các thông số môi trường trong nhà trồng n...
Hệ thống đo, giám sát và điều khiển các thông số môi trường trong nhà trồng n...
Man_Ebook
 

Similar to bao cao he thong nhung123@fmdfsdmfsfmsmfsm (20)

THIẾT KẾ VÀ THI CÔNG HỆ THỐNG GIÁM SÁT THỜI TIẾT TRONG NÔNG NGHIỆP ỨNG DỤNG C...
THIẾT KẾ VÀ THI CÔNG HỆ THỐNG GIÁM SÁT THỜI TIẾT TRONG NÔNG NGHIỆP ỨNG DỤNG C...THIẾT KẾ VÀ THI CÔNG HỆ THỐNG GIÁM SÁT THỜI TIẾT TRONG NÔNG NGHIỆP ỨNG DỤNG C...
THIẾT KẾ VÀ THI CÔNG HỆ THỐNG GIÁM SÁT THỜI TIẾT TRONG NÔNG NGHIỆP ỨNG DỤNG C...
 
THIẾT KẾ VÀ THI CÔNG HỆ THỐNG GIÁM SÁT THỜI TIẾT TRONG NÔNG NGHIỆP ỨNG DỤNG C...
THIẾT KẾ VÀ THI CÔNG HỆ THỐNG GIÁM SÁT THỜI TIẾT TRONG NÔNG NGHIỆP ỨNG DỤNG C...THIẾT KẾ VÀ THI CÔNG HỆ THỐNG GIÁM SÁT THỜI TIẾT TRONG NÔNG NGHIỆP ỨNG DỤNG C...
THIẾT KẾ VÀ THI CÔNG HỆ THỐNG GIÁM SÁT THỜI TIẾT TRONG NÔNG NGHIỆP ỨNG DỤNG C...
 
Điều khiển quạt từ xa bằng hồng ngoại
Điều khiển quạt từ xa bằng hồng ngoạiĐiều khiển quạt từ xa bằng hồng ngoại
Điều khiển quạt từ xa bằng hồng ngoại
 
Giám sát mức tiêu thụ điện, nước bằng công nghệ IOT.pdf
Giám sát mức tiêu thụ điện, nước bằng công nghệ IOT.pdfGiám sát mức tiêu thụ điện, nước bằng công nghệ IOT.pdf
Giám sát mức tiêu thụ điện, nước bằng công nghệ IOT.pdf
 
Thiết kế máy đo tim
Thiết kế máy đo timThiết kế máy đo tim
Thiết kế máy đo tim
 
ĐỒ ÁN - Cân điện tử sử dụng mạch arduino có kết nối với giao diện máy tính.docx
ĐỒ ÁN - Cân điện tử sử dụng mạch arduino có kết nối với giao diện máy tính.docxĐỒ ÁN - Cân điện tử sử dụng mạch arduino có kết nối với giao diện máy tính.docx
ĐỒ ÁN - Cân điện tử sử dụng mạch arduino có kết nối với giao diện máy tính.docx
 
KHÓA LUẬN TỐT NGHIỆP ĐTCNK).docx
KHÓA LUẬN TỐT NGHIỆP ĐTCNK).docxKHÓA LUẬN TỐT NGHIỆP ĐTCNK).docx
KHÓA LUẬN TỐT NGHIỆP ĐTCNK).docx
 
Do an can_dien_tu_1185 (1)
Do an can_dien_tu_1185 (1)Do an can_dien_tu_1185 (1)
Do an can_dien_tu_1185 (1)
 
Đề tài: Hệ thống giám sát điện năng tiêu thụ trong hộ gia đình
Đề tài: Hệ thống giám sát điện năng tiêu thụ trong hộ gia đìnhĐề tài: Hệ thống giám sát điện năng tiêu thụ trong hộ gia đình
Đề tài: Hệ thống giám sát điện năng tiêu thụ trong hộ gia đình
 
Luận Văn Nghiên Cứu Thiết Kế Và Xây Dựng Hệ Thống Truyền Đông Điện Động Cơ Mộ...
Luận Văn Nghiên Cứu Thiết Kế Và Xây Dựng Hệ Thống Truyền Đông Điện Động Cơ Mộ...Luận Văn Nghiên Cứu Thiết Kế Và Xây Dựng Hệ Thống Truyền Đông Điện Động Cơ Mộ...
Luận Văn Nghiên Cứu Thiết Kế Và Xây Dựng Hệ Thống Truyền Đông Điện Động Cơ Mộ...
 
NGHIÊN CỨU ỨNG DỤNG KỸ THUẬT MẠNG KHÔNG DÂY VÀO GIÁM SÁT SỰ THAY ĐỔI CỦA MÔI ...
NGHIÊN CỨU ỨNG DỤNG KỸ THUẬT MẠNG KHÔNG DÂY VÀO GIÁM SÁT SỰ THAY ĐỔI CỦA MÔI ...NGHIÊN CỨU ỨNG DỤNG KỸ THUẬT MẠNG KHÔNG DÂY VÀO GIÁM SÁT SỰ THAY ĐỔI CỦA MÔI ...
NGHIÊN CỨU ỨNG DỤNG KỸ THUẬT MẠNG KHÔNG DÂY VÀO GIÁM SÁT SỰ THAY ĐỔI CỦA MÔI ...
 
Hệ thống đo, giám sát và điều khiển các thông số môi trường trong nhà trồng n...
Hệ thống đo, giám sát và điều khiển các thông số môi trường trong nhà trồng n...Hệ thống đo, giám sát và điều khiển các thông số môi trường trong nhà trồng n...
Hệ thống đo, giám sát và điều khiển các thông số môi trường trong nhà trồng n...
 
Đề tài: Thiết kế và thi công cân điện tử, HAY, 9đ
Đề tài: Thiết kế và thi công cân điện tử, HAY, 9đĐề tài: Thiết kế và thi công cân điện tử, HAY, 9đ
Đề tài: Thiết kế và thi công cân điện tử, HAY, 9đ
 
Luận văn: Bảo vệ trong trạm biến áp tự động hóa sử dụng IEC
Luận văn: Bảo vệ trong trạm biến áp tự động hóa sử dụng IECLuận văn: Bảo vệ trong trạm biến áp tự động hóa sử dụng IEC
Luận văn: Bảo vệ trong trạm biến áp tự động hóa sử dụng IEC
 
Hệ Thống Khóa Cửa Thông Minh dùng Arduino (Nguyễn Đức Ngọc Cảnh).doc
Hệ Thống Khóa Cửa Thông Minh dùng Arduino (Nguyễn Đức Ngọc Cảnh).docHệ Thống Khóa Cửa Thông Minh dùng Arduino (Nguyễn Đức Ngọc Cảnh).doc
Hệ Thống Khóa Cửa Thông Minh dùng Arduino (Nguyễn Đức Ngọc Cảnh).doc
 
Báo cáo thực tập điện tử Điều khiển thiết bị trong nhà qua đường dây điện tho...
Báo cáo thực tập điện tử Điều khiển thiết bị trong nhà qua đường dây điện tho...Báo cáo thực tập điện tử Điều khiển thiết bị trong nhà qua đường dây điện tho...
Báo cáo thực tập điện tử Điều khiển thiết bị trong nhà qua đường dây điện tho...
 
Đồ án Thiết kế hệ thống điều khiển và giảm sát mức nước và áp suất của một nồ...
Đồ án Thiết kế hệ thống điều khiển và giảm sát mức nước và áp suất của một nồ...Đồ án Thiết kế hệ thống điều khiển và giảm sát mức nước và áp suất của một nồ...
Đồ án Thiết kế hệ thống điều khiển và giảm sát mức nước và áp suất của một nồ...
 
Đề tài: Thiết kế và thi công mô hình công viên 4.0, HOT, 9đ
Đề tài: Thiết kế và thi công mô hình công viên 4.0, HOT, 9đĐề tài: Thiết kế và thi công mô hình công viên 4.0, HOT, 9đ
Đề tài: Thiết kế và thi công mô hình công viên 4.0, HOT, 9đ
 
Đề tài: Thiết kế và thi công khung ảnh điện tử, HAY, 9đ
Đề tài: Thiết kế và thi công khung ảnh điện tử, HAY, 9đĐề tài: Thiết kế và thi công khung ảnh điện tử, HAY, 9đ
Đề tài: Thiết kế và thi công khung ảnh điện tử, HAY, 9đ
 
Điều khiển thiết bị điện tử bằng Android thông qua Bluetooth, 9đ
Điều khiển thiết bị điện tử bằng Android thông qua Bluetooth, 9đĐiều khiển thiết bị điện tử bằng Android thông qua Bluetooth, 9đ
Điều khiển thiết bị điện tử bằng Android thông qua Bluetooth, 9đ
 

bao cao he thong nhung123@fmdfsdmfsfmsmfsm

  • 1. GVHD: TS. Phan Văn Ca Họ tên Sinh viên Mssv BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HCM KHOA ĐÀO TẠO CHẤT LƯỢNG CAO MÔN HỌC: Hệ thống nhúng Báo Cáo Dự Án THIẾT BỊ ĐO NHỊP TIM VÀ NỒNG ĐỘ SpO2 TP. Hồ Chí Minh – Tháng 12 năm 2023
  • 2. MỤC LỤC CHƯƠNG 1: GIỚI THIỆU...................................................................................................................2 1.1. PHÂN TÍCH VẤN ĐỀ...........................................................................................................2 1.2. YÊU CẦU CỦA NGƯỜI DÙNG...........................................................................................2 1.3. YÊU CẦU KỸ THUẬT..........................................................................................................3 1.3.1. Yêu cầu về phần cứng .........................................................................................................3 1.3.2. Yêu cầu về phần mềm..........................................................................................................3 1.3.3. Yêu cầu về thiết kế và sử dụng:...........................................................................................4 1.4. BỐ CỤC ..................................................................................................................................4 CHƯƠNG 2: THIẾT KẾ.......................................................................................................................5 2.1. TỔNG QUAN VỀ LINH KIỆN .................................................................................................5 2.1.1. NODE MCU ESP8266 ........................................................................................................5 2.1.2. MAX30102 ......................................................................................................................... 12 2.1.3. MÀN HÌNH OLED ........................................................................................................... 14 2.1.4. NGUỒN PIN...................................................................................................................... 14 2.2. CÁCH THỨC HOẠT ĐỘNG ................................................................................................. 15 2.2.1. Nguyên lý hoạt động.......................................................................................................... 15 2.2.2. Quy trình hoạt động.......................................................................................................... 16 CHƯƠNG 3: CẤU TRÚC HỆ THỐNG............................................................................................ 19 3.1. SƠ ĐỒ KHỐI TỔNG QUAN............................................................................................. 19 3.2. THIẾT KẾ CHI TIẾT ........................................................................................................ 20 CHƯƠNG 4: SẢN PHẨM CUỐI CÙNG.......................................................................................... 21 4.1. HÌNH ẢNH SẢN PHẨM.................................................................................................... 21 4.2. LỊCH TRÌNH HOÀN THIỆN............................................................................................ 21 4.3. HƯỚNG DẪN SỬ DỤNG................................................................................................... 22 4.4. KẾT QUẢ ĐẠT ĐƯỢC...................................................................................................... 22 4.5. HƯỚNG PHÁT TRIỂN...................................................................................................... 22 CHƯƠNG 5: KẾT LUẬN .................................................................................................................. 24 TÀI LIỆU THAM KHẢO .................................................................................................................. 25
  • 3. 1  Thuật ngữ và viết tắt I2C Inter-Integrated Circuit. SpO2 Saturation of peripheral oxygen FDA U.S. Food and Drug Administration  References List of Tables & Figures
  • 4. 2 CHƯƠNG 1: GIỚI THIỆU Dự án này xây dựng một thiết bị đo nhịp tim và nồng độ oxy trong máu với bộ xử lý trung tâm là vi điều khiển Node MCU ESP8266. Thiết bị sẽ đo nhịp tim bằng cách sử dụng cảm biến nhịp tim và đo nồng độ oxy bằng cảm biến oxy Max30102. Dữ liệu cảm biến sẽ được xử lý bởi Node MCU ESP8266 và hiển thị lên màn hình OLED 0.96 inch. Ngoài ra, dữ liệu cũng được gửi qua kết nối Wi-Fi tới ứng dụng Blynk để hiển thị. Mục đích của dự án là xây dựng một thiết bị đo nhịp tim và oxy máu đơn giản, nhỏ gọn, dễ sử dụng với chi phí thấp. Thiết bị có thể ứng dụng trong lĩnh vực y tế để theo dõi sức khỏe, đặc biệt là đối với những người có vấn đề về tim mạch và hô hấp. 1.1. PHÂN TÍCH VẤN ĐỀ Trong thời đại số hoá hiện nay, vấn đề y tế sức khỏe đóng vai trò quan trọng trong đời sống của con người. Các công cụ và thiết bị y tế càng ngày càng được phát triển và trang bị nhiều tính năng và hiệu suất cao hơn để đáp ứng nhu cầu của người sử dụng. Trong đó, ở các cơ sở y tế hoặc tại hộ gia đình có người bị bệnh, việc giám sát các chỉ số sinh tồn quan trọng như nhịp tim và nồng độ oxy trong máu là rất cần thiết. Tuy nhiên, các phương pháp và thiết bị đo lường hiện có vẫn còn một số hạn chế đáng kể. Cụ thể: - Kích thước lớn, không thuận tiện mang theo người: - Công nghệ tiên tiến dẫn đến giá thành cao. Không nhiều người tiếp cận được. - Các thiết bị thiếu tính kết nối, lưu trữ lâu dài - Các thiết bị còn phức tạp, khó sử dụng. - Không phù hợp cho tất cả người sử dụng (về độ tuổi). Do đó, việc phát triển các thiết bị đo nhịp tim và oxy máu với ưu điểm về kích thước, giá thành, khả năng kết nối và xử lý dữ liệu là vô cùng cấp thiết. 1.2. YÊU CẦU CỦA NGƯỜI DÙNG Mục tiêu của dự án về THIẾT BỊ ĐO NHỊP TIM VÀ OXY NỒNG ĐỘ SpO2 là nghiên cứu và thiết kế thiết bị có thể đáp ứng được những nhu cầu sau đây 1. Xây dựng một thiết bị đo nhịp tim và SpO2 với kích thước nhỏ gọn, vừa lòng bàn tay, dễ mang theo người. Kích thước nhỏ hơn 1 chiếc Smartphone (nhỏ hơn 10cm). 2. Thiết bị có kết cấu liền khối, chắc chắn, có thể chống va đập trong quá trình sử dụng. 3. Thiết bị có thể sử dụng được với mọi lứa tuổi, giới tính. 4. Giá thành thiết bị khoảng 400.000 VNĐ, giá thành đủ để phổ cập cho tất cả những loại khách hàng
  • 5. 3 5. Thiết bị có cách sử dụng đơn giản, có duy nhất một nút bấm để dễ dàng sử dụng. 6. Có thể sạc bằng nhiều nguồn: nguồn adapter điện thoại, sạc dự phòng,… 7. Cổng sạc loại Type-C để có thể dùng dây sạc điện thoại sạc cho thiết bị. 8. Thời gian sử dụng thiết bị liên tục đạt tối thiểu 6h. 9. Tuổi thọ trung bình là 2 năm. 1.3. YÊU CẦU KỸ THUẬT 1.3.1. Yêu cầu về phần cứng 1. Vi điều khiển: Sử dụng loại Vi điều khiển có chức năng xử lý thông tin nhận được từ cảm biến. Có thể xuất dữ liệu ra màn hình OLED để hiển thị và đưa dữ liệu lên đám mây để xử lý và lưu trữ. Công suất sử dụng của Vi điều khiển thấp để kéo dài thời gian sử dụng. 2. Cảm biến đo nhịp tim và đo oxy máu: sử dụng loại cảm biến vừa đo được nhịp tim, vừa đo được oxy trong máu với tỉ lệ chính xác tới 85% so với tình trạng thực tế. Và khác biệt không quá 10% so với các cảm biến được chấp thuận bởi FDA. 3. Màn hình hiển thị: màn hình hiển thị sắc nét, to rõ các thông số theo yêu cầu được hiển thị. Công suất sử dụng của màn thấp để tiết kiệm pin. 4. Nguồn: sử dụng nguồn từ pin để có thể mang thiết bị đi những nơi khác mà không cần phải cắm dây nguồn. Pin có dòng xả gấp 2 lần dòng tiêu thụ tối đa của các thiết bị sử dụng nguồn. Pin có dung lượng đủ để có thể kéo dài thời gian hoạt động của thiết bị ít nhất 6 tiếng. 5. Mạch sạc: Mạch sạc dùng để sạc lại điện cho Pin. Mạch sạc có cổng sạc thông dụng, có thể dùng dây sạc điện thoại kết nối vào. Mạch sạc có chức năng sạc và và xả, đồng thời bảo vệ nguồn pin bằng việc tự ngắt khi pin được sạc đủ hoặc khi điện áp pin thấp, cần được sạc lại. 6. Có phần vỏ nhựa bên ngoài để bảo vệ và tích hợp các linh kiện trên vào cùng một khối. 1.3.2. Yêu cầu về phần mềm 1. Chương trình được nạp vào vi điều khiển có chức năng đọc và xử lý dữ liệu từ cảm biến, sau đó xuất dữ liệu ra màn hình để hiển thị thông số nhịp tim và SpO2 và đưa lên máy chủ đám mây. 2. Ứng dụng đám mây cho phép lưu trữ, và xử lý, hiển thị dữ liệu ở dạng biểu đồ trực quan. Cho phép người dùng đăng nhập và quản lý dữ liệu qua app Blynk. 3. Giao diện hiển thị trên phần mềm thân thiện, dễ sử dụng.
  • 6. 4 1.3.3. Yêu cầu về thiết kế và sử dụng: 1. Thiết kế nhỏ gọn, trọng lượng nhẹ để mang theo tiện lợi. 2. Quy trình sử dụng đơn giản, dễ thao tác cho người dùng. 3. Giao diện trên màn hình thể hiện theo thời gian thực trực quan, dễ hiểu. 4. Giao diện trên ứng dụng Blynk thể hiện theo thời gian thực trực quan, dễ hiểu. 5. Sai số của cảm biến đo nhịp tim trong khoảng ±5% hoặc ±3 nhịp/phút và sai số SpO2 là ±5%. 6. Vận hành 95% thời gian sử dụng. 7. Pin có chu kì sạc xả tối đa 1000 lần. 8. Tuổi thọ tối đa trong điều kiện sử dụng tiêu chuẩn: 1,5 – 2 năm. (nhiệt độ sử dụng trong khoảng từ 15-35 độ, độ ẩm bình thường) 1.4. BỐ CỤC Đề cương này có bố cục như sau: Chương 1: Giới thiệu Chương 2: Thiết kế Chương 3: Kế hoạch sơ bộ Chương 4: Kết Luận Chương 5: Tài liệu tham khảo
  • 7. 5 CHƯƠNG 2: THIẾT KẾ 2.1. TỔNG QUAN VỀ LINH KIỆN 2.1.1. NODE MCU ESP8266
  • 8. 6 - Vi điều khiển: chip ESP8266EX của Espressif, xung nhịp 80MHz hoặc 160 MHz. - Bộ nhớ:  Lưu trữ firmware: bộ nhớ flash tích hợp trong chip ESP8266, dung lượng thường từ 1MB đến 4MB.  RAM: thông thường từ 32KB đến 80KB. - Kết nối không dây:  Wi-Fi 802.11 b/g/n, tần số 2.4GHz.  Phù hợp để làm Access Point hoặc kết nối với Wi-Fi Router.  Tốc độ truyền tải: 54Mbps ở chế độ 802.11g, 72Mbps ở chế độ 802.11n.
  • 9. 7 - Giao tiếp:  GPIO: 17 pin GPIO có thể lập trình để điều khiển và đọc dữ liệu từ các cảm biến.  Giao thức kết nối: SPI, I2C, UART.  PWM, I2S, ADC. - Nguồn:  Điện áp hoạt động: 2.5V – 5V  Dòng điện tiêu thụ: Chế độ Active: 80mA, chế độ Sleep: 10uA - Nhiệt độ hoạt động: -40°C đến 125°C. Như vậy, ESP8266 là một module Wi-Fi thích hợp cho các ứng dụng IoT với đặc tính nhỏ gọn, tiết kiệm điện năng và khả năng tích hợp cảm biến tốt. Chi tiết: Esp8266 gồm có các khối chính sau: Power supply Power-on sequence and reset Flash Crystal oscillator RF External resistor UART Digital Power Supply ESP8266EX có hai chân kỹ thuật số để cấp nguồn là Pin11 và Pin17. Đối với nguồn điện kỹ thuật số, không cần bổ sung thêm tụ lọc. Dải điện áp hoạt động của các chân nguồn điện kỹ thuật số là 1,8 V ~ 3,3 V.
  • 10. 8 Analog Power Supply ESP8266EX có 5 chân analog để cấp nguồn, bao gồm Pin1, Pin3, Pin4 là chân cấp nguồn cho PA và LNA bên trong; và Pin29, Pin30 cho PLL nội bộ. Điện áp hoạt động cho các chân cấp nguồn analog là 2,5 V ~ 3,6 V. Flash Đèn flash demo được sử dụng trên ESP8266EX là SPI Flash có ROM 2 MB trong gói SOP8 (208 triệu). Pin21 SD_CLK được kết nối với chân CLK flash cùng với điện trở 0402 trong kết
  • 11. 9 nối nối tiếp, giúp giảm dòng điện và loại bỏ sự gián đoạn bên ngoài. Điện trở ban đầu của điện trở là 200 Ω. Crystal Oscillator ESP8266EX có thể hỗ trợ bộ tạo dao động tinh thể 40 MHz, 26 MHz và 24 MHz. Vui lòng chọn đúng loại bộ tạo dao động tinh thể được sử dụng trong Công cụ tải xuống ESP Flash. Trong thiết kế mạch, các tụ điện C1 và C2, được nối đất, được thêm vào các cực đầu vào và đầu ra tương ứng của bộ dao động tinh thể. Giá trị của hai tụ điện có thể linh hoạt, dao động từ 6 pF đến 22 pF. Tuy nhiên, giá trị điện dung cụ thể của C1 và C2 phụ thuộc vào việc thử nghiệm
  • 12. 10 thêm và điều chỉnh hiệu suất tổng thể của toàn bộ mạch. Độ chính xác của tinh thể phải là ± 10 PPM. RF Trở kháng của đầu ra ESP8266 PA là 39 + j6 Ω nên trở kháng phù hợp là 39-j6 Ω (từ anten đến chip) UART Người dùng cần kết nối điện trở 499 R với đường dây U0TXD để triệt tiêu sóng hài 80 MHz.
  • 13. 11 Theo mặc định, UART0 sẽ xuất ra một số thông tin được in khi bật nguồn ESP8266EX. Đối với các ứng dụng nhạy cảm với tính năng này, người dùng có thể trao đổi các chân của UART (UART SWAP) trong quá trình khởi tạo hệ thống, nghĩa là trao đổi U0TXD, U0RXD với U0RTS (GPIO15), U0CTS (GPIO13). Sau khi trao đổi, GPIO15 và GPIO13 sẽ được kết nối tương ứng với MCU_RXD và MCU_TXD dưới dạng U0TXD và U0RXD được hoán đổi để liên lạc nối tiếp. GPIO15, chốt đóng đai của ESP8266EX, cần ở mức điện áp thấp khi bật chip. Do đó, trong khi hệ thống được bật nguồn, để đảm bảo GPIO15 không bị kéo lên từ bên ngoài, điều này sẽ khiến hệ thống chuyển nhầm sang chế độ khởi động, một mạch cách ly sẽ được thêm vào. Khi hệ thống được bật, Q1 bị tắt theo mặc định và GPIO15 thực sự bị ngắt kết nối khỏi MCU_RXD. Sau khi chương trình bắt đầu chạy, GPIO5 có thể bật Q1, sau đó GPIO15 được kết nối với MCU_RXD, cho phép cách ly GPIO15 khi bật nguồn. IO của ESP8266EX là mức logic 3,3 V. Trong trường hợp giao tiếp nối tiếp với hệ thống logic CMOS 5 V, cần thêm một mạch chuyển đổi mức bên ngoài.
  • 15. 13 - Công nghệ đo: Quang học dựa trên nguyên lý quang phổ kế dùng 2 đèn LED (đỏ và hồng ngoại) và quang kế photodiode. - Phương thức đo: Đo độ thay đổi hấp thụ ánh sáng (của oxyhemoglobin và deoxyhemoglobin) qua ngón tay/vành tai để xác định nhịp tim và SpO2. - Độ chính xác:  Nhịp tim: ±2% hoặc ±1 bpm  SpO2: ±2% - Phạm vi đo:  Nhịp tim: 30 - 250 bpm  SpO2: 70 - 100% - Điện áp hoạt động: 1.8V hoặc 3.3V - Dòng tiêu thụ:  Chế độ ngủ: 0.7uA  Chế độ hoạt động: 4.5mA  Chế độ đo: 7mA - Giao tiếp: I2C - Độ phân giải: 15 - 18bit - Tốc độ lấy mẫu: 50 – 3200 sps (mẫu trên giây) - Kích thước: 3.3 x 2.4 x 0.83 mm
  • 16. 14 Như vậy, MAX30102 là cảm biến nhịp tim và SpO2 chính xác, nhỏ gọn, tiêu thụ điện thấp, phù hợp cho các thiết bị di động… 2.1.3. MÀN HÌNH OLED - Kích thước màn hình: 0.96 inch - Độ phân giải: 128x64 pixel - Tốc độ refresh: 100Hz - Công nghệ hiển thị: OLED - Giao tiếp: I2C, SPI - Điện áp hoạt động: 3.3V-5V - Mật độ điểm ảnh: 290-300 pixel/inch - Góc nhìn: 160 độ - Độ tương phản: 10,000:1 - Độ sáng tối đa: 1000 cd/m2 - Tuổi thọ màn hình: 100,000 giờ - Màu hiển thị: Vàng, xanh dương, trắng - Khả năng hiển thị chữ: Hỗ trợ font chữ, ký tự đặc biệt - Tiêu thụ điện năng: Hoạt động: 12mA, ngủ: 0.1μA 2.1.4. NGUỒN PIN
  • 17. 15 Pin sạc Lipo Polymer – Li-Po 3.7V (có mạch bảo vệ sạc) – dung lượng 1500mAh (hoạt động liên tục 18.5 tiếng nếu Node MCU ESP8266 tiêu thụ dòng 80mA). Sử dụng mạch sạc TP4056 để sạc pin. 2.2. CÁCH THỨC HOẠT ĐỘNG 2.2.1. Nguyên lý hoạt động Thiết bị sử dụng cảm biến nhịp tim MAX30102 dựa trên nguyên lý quang phổ kế xuyên qua mô biểu bì để đo nhịp tim. Cảm biến oxy máu dùng nguyên lý điện hóa để xác định nồng độ oxy trong máu SpO2. Node MCU ESP8266 đóng vai trò bộ não xử lý tín hiệu từ các cảm biến, hiển thị dữ liệu qua màn hình OLED và gửi dữ liệu lên đám mây (Blynk). 2.2.1.1. Max30102 Cảm biến nhịp tim và oxy trong máu MAX30102 hoạt động dựa trên nguyên lý phát hiện ánh sáng hấp thụ bởi máu trong các mô và mạch máu. MAX30102 sử dụng công nghệ phản xạ ánh sáng hồng ngoại (IR) và ánh sáng đỏ để đo lường nồng độ oxy (SpO2) và nhịp tim (HR) của người dùng.
  • 18. 16 Cảm biến được tích hợp các đèn LED hồng ngoại và đèn LED đỏ, cùng với một bộ lọc quang để tạo ra ánh sáng phù hợp để xuyên qua da và mô màu đỏ. Đèn LED hồng ngoại thẩm thấu sâu vào da, trong khi đèn LED đỏ thẩm thấu xa hơn. Khi ánh sáng được chiếu qua da, nó sẽ gặp phản xạ từ máu chảy trong các mạch máu dưới da. Cảm biến sử dụng photodiodes để đo lượng ánh sáng phản xạ từ máu. Các photodiodes nhận tín hiệu ánh sáng và chuyển đổi chúng thành dữ liệu Analog. Sau đó, dữ liệu này được khuếch đại và chuyển đổi thành dữ liệu kỹ thuật số bằng một bộ chuyển đổi analog-số (ADC). 2.2.2. Quy trình hoạt động 1. Người dùng đặt thiết bị lên ngón tay.
  • 19. 17 2. Cảm biến MAX30102 phát ra ánh sáng đỏ và hồng ngoại xuyên qua mô, đo độ hấp thụ ánh sáng để xác định nhịp tim và SpO2. 3. Tín hiệu từ cảm biến nhịp tim và oxy máu được truyền tới ESP8266 thông qua giao tiếp I2C. 4. ESP8266 xử lý và tính toán các thông số nhịp tim, SpO2. 5. Dữ liệu được hiển thị lên màn hình OLED và đồng thời gửi lên máy chủ đám mây thông qua kết nối Wi-Fi. 6. Dữ liệu được lưu trữ và phân tích trên đám mây như hiển thị thông số, sơ đồ. 2.2.3. Sơ đồ khối quy trình hoạt động cơ bản 2.2.4. Sơ đồ khối quy trình hoạt động chi tiết Cảm biến nhịp tim MAX30102 thu và gửi dữ liệu tới NODE MCU ESP8266 ESP8266 xử lý mà tính toán thông số nhịp tim, SpO2 Hiển thị dữ liệu trên màn hình Oled Gửi dữ liệu lên Blynk để tính toán, lưu trữ
  • 20. 18
  • 21. 19 CHƯƠNG 3: CẤU TRÚC HỆ THỐNG 3.1. SƠ ĐỒ KHỐI TỔNG QUAN Sơ đồ khối tổng quát về thiết bị Giải thích  Cảm biến MAX30102 có nhiệm vụ đo độ thay đổi hấp thụ ánh sáng (của oxyhemoglobin và deoxyhemoglobin) qua ngón tay/vành tai để xác định nhịp tim và SpO2, chuyển đổi dữ liệu đo được thành tín hiệu điện với độ phân giải 18bit rồi chuyển thành tín hiệu nhị phân (TTL), rồi gửi về NODE MCU ESP8266 qua giao thức I2C.  NODE MCU ESP8266 có nhiệm vụ đọc dữ liệu nhận được từ cảm biến MAX30102, xử lý dữ liệu nhận được, sau đó xuất dữ liệu nhịp tim và nồng độ SpO2 ra thẳng màn hình OLED. Đồng thời, dữ liệu được gửi lên đám mây (Blynk) thông qua kết nối Wi-Fi lên Internet đã được thiết lập trong chương trình.  Màn hình OLED sẽ nhận dữ liệu từ NODE MCU ESP8266 qua giao thức I2C rồi hiển thị số nhịp tim và tỉ lệ phần trăm SpO2.  App Blynk đã được lập trình để hiển thị và lưu trữ dữ liệu được nhận từ NODE MCU ESP8266 từ Internet thông qua kết nối Wi-Fi. Dữ liệu sẽ được hiển thị ở dạng số trực tiếp và sơ đồ theo thời gian nhằm giám sát và theo dõi.  Nguồn pin 3,7V Li-Po được sử dụng để cấp nguồn cho NODE MCU ESP8266, từ đó NODE MCU ESP8266 sẽ cấp nguồn cho cảm biến MAX30102 và màn hình OLED. Mạch sạc được nối vào nguồn pin, sử dụng cổng Micro-USB để sạc.
  • 22. 20 3.2. THIẾT KẾ CHI TIẾT
  • 23. 21 CHƯƠNG 4: SẢN PHẨM CUỐI CÙNG 4.1. HÌNH ẢNH SẢN PHẨM 4.2. LỊCH TRÌNH HOÀN THIỆN
  • 24. 22 4.3. HƯỚNG DẪN SỬ DỤNG Sản phẩm sử dụng bằng cách: nhấn nút nhấn màu đen để bật, tắt thiết bị. Thiết bị sẽ tự động kết nối với WiFi đã được thiết lập từ trước. Sau đó đưa ngón tay đặt lên cảm biến và giữ trong vòng khoảng 2 phút để cảm biến đọc chính xác được nhịp tim và SpO2 của người sử dụng. Thiết bị có thể sạc bằng cổng sạc Type C vào mạch sạc cho pin cấp nguồn cho mạch. 4.4. KẾT QUẢ ĐẠT ĐƯỢC - Thiết bị phát hiện được ngón tay khi đặt lên. - Thiét bị đo được nhịp tim và SpO2. - Thiết bị xuất được dữ liệu ra màn OLED. - Thiết bị kết nối được với WiFi - Thiết bị xuất được dữ liệu lên Blynk Server 4.5. HƯỚNG PHÁT TRIỂN - Thiết kế một hệ thống có thể sử dụng ở thực tế.
  • 25. 23 - Lập trình có thể tối ưu năng lượng tiêu thụ hơn. - Tối ưu tốc độ xử lý để không gây mất kiên nhẫn cho người dùng. - Cập nhật dữ liệu lên một phần mềm, máy chủ thực tế
  • 26. 24 CHƯƠNG 5: KẾT LUẬN Dự án thiết bị đo nhịp tim và oxy trong máu với lõi là NODE MCU ESP8266 là một dự án vô cùng thú vị và ý nghĩa. Đây là dự án ứng dụng công nghệ IoT và vi điều khiển vào lĩnh vực y tế, góp phần cải thiện sức khỏe con người. Dự án kết hợp nhiều công nghệ phần cứng-phần mềm hiện đại như vi điều khiển ESP8266, cảm biến nhịp tim MAX30102, màn hình OLED, kết nối Wi-Fi... đòi hỏi người thực hiện phải nghiên cứu kỹ lưỡng, rèn luyện các kỹ năng thiết kế và lập trình. Sản phẩm cuối cùng là một thiết bị đo lường nhịp tim và oxy máu nhỏ gọn, chi phí thấp, dễ sử dụng. Đây cũng là bước khởi đầu có thể phát triển thành sản phẩm thương mại hoặc nền tảng cho nhiều ứng dụng y tế thông minh trong tương lai. Vì vậy, đây hứa hẹn là một dự án thực sự thú vị và thử thách.
  • 27. 25 TÀI LIỆU THAM KHẢO [1]: ESP8266EX Datasheet, https://www.espressif.com/sites/default/files/documentation/0a- esp8266ex_datasheet_en.pdf (10/10/2023) [2]: MAX30102 datasheet, https://www.analog.com/media/en/technical-documentation/data- sheets/max30102.pdf (10/10/2023) [3]:https://www.terasic.com.tw/cgibin/page/archive.pl?Language=English&CategoryNo=139 &No=593&PartNo=2#heading (10/10/2023) [4]: Oled 0,96 inches datasheet https://www.waveshare.com/w/upload/7/71/0.96inch-OLED- UserManual.pdf (10/10/2023)
  • 28. 26 CHƯƠNG TRÌNH CỦA VI ĐIỀU KHIỂN #include <Wire.h> #include "MAX30105.h" //sparkfun MAX3010X library //#include <Adafruit_GFX.h> //OLED libraries #include <Adafruit_SSD1306.h> #include <Wire.h> #include "heartRate.h" #define BLYNK_TEMPLATE_ID "TMPL6jsuewbWy" #define BLYNK_TEMPLATE_NAME "PulseSpO2" #define BLYNK_AUTH_TOKEN "MlgGwdPvU0kWSC3onXu-B53WAyaFgu6O" #define BLYNK_PRINT Serial #include <Blynk.h> #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> char auth[] = "MlgGwdPvU0kWSC3onXu-B53WAyaFgu6O"; // Authentication Token Sent by Blynk char ssid[] = "Tro sinh vien lau 4"; //WiFi SSID char pass[] = "0902511322"; MAX30105 particleSensor; /////////////////////////////////////////////////////////////////////////////////// const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good. byte rates[RATE_SIZE]; //Array of heart rates byte rateSpot = 0; long lastBeat = 0; //Time at which the last beat occurred float beatsPerMinute; int beatAvg; double oxi; #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
  • 29. 27 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display) /////////////////////////////////////////////////////////////////////////////////// #define USEFIFO void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display display.display(); ///////////////////////////////////////////// Serial.begin(115200); // Serial.println("Initializing..."); Blynk.begin(auth, ssid, pass); // Initialize sensor if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed { Serial.println("MAX30102 was not found. Please check wiring/power/solder jumper at MH-ET LIVE MAX30102 board. "); while (1); } //Setup to sense a nice looking saw tooth on the plotter //byte ledBrightness = 0x7F; //Options: 0=Off to 255=50mA byte ledBrightness = 75; //Options: 0=Off to 255=50mA byte sampleAverage = 8; //Options: 1, 2, 4, 8, 16, 32 byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green //Options: 1 = IR only, 2 = Red + IR on MH-ET LIVE MAX30102 board int sampleRate = 3200; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200 int pulseWidth = 411; //Options: 69, 118, 215, 411 int adcRange = 16384; //Options: 2048, 4096, 8192, 16384 // Set up the wanted parameters particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings } double avered = 0; double aveir = 0;
  • 30. 28 double sumirrms = 0; double sumredrms = 0; int i = 0; int tam = 0; int Num = 100;//calculate SpO2 by this sampling interval double ESpO2 = 93.0;//initial value of estimated SpO2 double FSpO2 = 0.6; //filter factor for estimated SpO2 double frate = 0.95; //low pass filter for IR/red LED value to eliminate AC component #define TIMETOBOOT 2 // wait for this time(msec) to output SpO2 #define SCALE 88.0 //adjust to display heart beat and SpO2 in the same scale #define SAMPLING 1 //if you want to see heart beat more precisely , set SAMPLING to 1 #define FINGER_ON 35000 // if red signal is lower than this , it indicates your finger is not on the sensor #define MINIMUM_SPO2 0.0 void loop() { Blynk.run(); uint32_t ir, red , green; double fred, fir; double SpO2 = 0; //raw SpO2 before low pass filtered #ifdef USEFIFO particleSensor.check(); //Check the sensor, read up to 3 samples while (particleSensor.available()) {//do we have new data #ifdef MAX30105 red = particleSensor.getFIFORed(); //Sparkfun's MAX30105 ir = particleSensor.getFIFOIR(); //Sparkfun's MAX30105 #else red = particleSensor.getFIFOIR(); //why getFOFOIR output Red data by MAX30102 on MH-ET LIVE breakout board ir = particleSensor.getFIFORed(); //why getFIFORed output IR data by MAX30102 on MH-ET LIVE breakout board #endif i++; fred = (double)red;
  • 31. 29 fir = (double)ir; avered = avered * frate + (double)red * (1.0 - frate);//average red level by low pass filter aveir = aveir * frate + (double)ir * (1.0 - frate); //average IR level by low pass filter sumredrms += (fred - avered) * (fred - avered); //square sum of alternate component of red level sumirrms += (fir - aveir) * (fir - aveir);//square sum of alternate component of IR level if ((i % SAMPLING) == 0) {//slow down graph plotting speed for arduino Serial plotter by thin out if ( millis() > TIMETOBOOT) { if (ir < FINGER_ON) ESpO2 = MINIMUM_SPO2; //indicator for finger detached if (ESpO2 <= -1) { ESpO2 = 0; } if (ESpO2 > 100) { ESpO2 = 100; } oxi = ESpO2+45; if (oxi > 100) { oxi = 100; } //Serial.print(" Oxygen % = "); //Serial.println(ESpO2); //low pass filtered SpO2 } } if ((i % Num) == 0) { double R = (sqrt(sumredrms) / avered) / (sqrt(sumirrms) / aveir); // Serial.println(R); SpO2 = -23.3 * (R - 0.4) + 100; //http://ww1.microchip.com/downloads/jp/AppNotes/00001525B_JP.pdf ESpO2 = FSpO2 * ESpO2 + (1.0 - FSpO2) * SpO2;//low pass filter // Serial.print(SpO2);Serial.print(",");Serial.println(ESpO2); //Serial.print(" Oxygen2 % = "); //Serial.println(ESpO2); //low pass filtered SpO2
  • 32. 30 sumredrms = 0.0; sumirrms = 0.0; i = 0; break; } particleSensor.nextSample(); //We're finished with this sample so move to next sample //Serial.println(SpO2); ////////////////////////////////////////////////////////////////////////////// long irHR = particleSensor.getIR(); if(irHR > 7000){ //If a finger is detected display.clearDisplay(); //Clear the display //display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little heart) display.setTextSize(1); //Near it display the average BPM you can display the BPM if you want display.setTextColor(WHITE); display.setCursor(40,2); display.setRotation(3); display.println("Beat"); display.setRotation(0); display.setTextSize(3); display.setCursor(20,5); display.println(beatAvg); //Blynk.virtualWrite(V1, beatAvg); display.setCursor(107,5); display.setTextSize(1); display.print("bpm"); //display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little heart) display.setTextSize(1); //Near it display the average BPM you can display the BPM if you want display.setTextColor(WHITE); display.setRotation(3); display.setCursor(5,2); display.println("SpO2"); display.setTextSize(3); display.setRotation(0);
  • 33. 31 display.setCursor(20,35); display.println(oxi,1); // Blynk.virtualWrite(V2, oxi); display.setCursor(120,35); display.setTextSize(1); display.print("%"); display.display(); //delay(100); if (checkForBeat(irHR) == true) //If a heart beat is detected { display.clearDisplay(); //Clear the display //display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE); //Draw the second picture (bigger heart) display.setTextSize(1); //And still displays the average BPM display.setTextColor(WHITE); display.setRotation(3); display.setCursor(40,2); display.println("Tim"); display.setRotation(0); display.setTextSize(3); display.setCursor(20,5); display.println(beatAvg); Blynk.virtualWrite(V1, beatAvg); display.setCursor(107,5); display.setTextSize(1); display.print("bpm"); //display.clearDisplay(); //Clear the display //display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little heart) display.setTextSize(1); //Near it display the average BPM you can display the BPM if you want display.setTextColor(WHITE); display.setCursor(5,2);
  • 34. 32 display.setRotation(3); display.println("SpO2"); display.setTextSize(3); display.setRotation(0); display.setCursor(20,35); display.println(oxi,1); Blynk.virtualWrite(V2, oxi); display.setCursor(120,35); display.setTextSize(1); display.print("%"); display.display(); //tone(3,1000); //And tone the buzzer for a 100ms you can reduce it it will be better delay(100); //noTone(3); //delay(100); //Deactivate the buzzer to have the effect of a "bip" //We sensed a beat! long delta = millis() - lastBeat; //Measure duration between two beats lastBeat = millis(); beatsPerMinute = 60 / (delta / 1000.0); //Calculating the BPM if (beatsPerMinute < 255 && beatsPerMinute > 20) //To calculate the average we strore some values (4) then do some math to calculate the average { rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array rateSpot %= RATE_SIZE; //Wrap variable //Take average of readings beatAvg = 0; for (byte x = 0 ; x < RATE_SIZE ; x++) beatAvg += rates[x]; beatAvg /= RATE_SIZE; }
  • 35. 33 } } if (irHR < 7000){ //If no finger is detected it inform the user and put the average BPM to 0 or it will be stored for the next measure beatAvg=0; beatAvg=0; display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(3,25); display.println("No Finger!"); Blynk.virtualWrite(V1,0); Blynk.virtualWrite(V2,0); display.display(); //noTone(3); } //////////////////////////////////////////////////////////////// } #endif }