Phần mềma Lưu đồ thuật toán, giải thuật của mạchb Giải thích lưu đồ thuật toánDưới đây là giải thích chi tiết vD tnng bước của thuật toán:- Start: Đây là bước bắt đgu của thuật toán, nhằ
Trang 1TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI
KHOA SƯ PHẠM KĨ THUẬT
BÁO CÁO ĐỀ TÀI
MÔN LẬP TRÌNH HỆ THỐNG NHÚNG
Họ và tên sinh viên: Bùi Phương Thảo
Mã sinh viên: 7051104030 Lớp: K70A
Giảng viên hướng dẫn: Phạm Khánh Tùng
Hà Nội, 2023
Trang 2MỤC LỤC
1 Nhiệm vụ thiết kế hệ thống nhúng 2
2 Giải pháp thực hiện: 2
2.1 Phần cứng 2
2.1.1) Mô đun và linh kiện sử dụng 2
2.1.2) Sơ đồ mạch điện 2
2.1.3) Giải thích sơ đồ mạch điện 2
2.2 Phần mềm 5
a) Lưu đồ thuật toán, giải thuật của mạch 5
b) Giải thích lưu đồ thuật toán 5
c) Code chương trình nhúng 6
3 Nhận xét và đánh giá 9
3.1 Nhận xét về hệ thống nhúng 10
a) Đánh giá theo các tiêu chí đã đD ra 10
b) Eu điFm của mô hình đo 10
c) NhưHc điFm của mô hình đo 10
3.2 Giải pháp nâng cao chất lượng hệ thống nhúng 10
3.3 Đề xuất hướng phát triển hệ thống nhúng 11
Trang 31 Nhiệm vụ thiết kế hệ thống nhúng
Đo oxy và cảm biến nhịp tim Max30100 với ESP8266 qua điện thoại
2 Giải pháp thực hiện:
2.1 Phần cứng
2.1.1) Mô đun và linh kiện sử dụng
- Module ESP8266
- Test broad
- Dây cắm
- Cảm biến đo nhịp tim Max30100
- Màn hình OLED Display 0.96”
2.1.2) Sơ đồ mạch điện
Trang 42.1.3) Giải thích sơ đồ mạch điện
a) Cảm biến nhịp tim và oxy trong máu Max30100
*) Thông số kĩ thuật:
- Đèn LED tích hHp
- Nhỏ gọn 5,6mm x 2,8 mm x 1,2mm
- Hoạt động năng lưHng thấp
- Tốc độ mẫu có thF lập trình
- Dòng tắt máy cực thấp
- Tích hHp huỷ ảnh sáng xung quanh
- Điện áp: 3.3VDC
- IC chính: Max30100
- Giao tiếp: I2C, mức tín hiệu TTL
*) Nguyên lí hoạt động
Khi áp chdt mdt cảm biến vào da, nơi có mạch máu chảy (thưfng là áp vào tai, đgu ngón tay, đF dh kip) Đgu phát sj phát ra ánh sáng đi vào trong da Dòng ánh sáng đó sj bị khuếch tán ra xung quanh, và một phgn đi tới quang trk ggn đgu phát Do bị lp vào nên lưHng máu k phấn cản biến sj thay đmi, cụ thF khi không có
áp lực do tim đập, máu sj dồn ra xung quanh, lưHng ánh sáng tn đgu phát sj vD đgu thu nhiDu hơn so với tim đập, máu chảy qua nơi có cảm biến áp vào
Sự thay đmi là rất nhỏ, nên phgn cảm nhận ánh sáng (quang trk) thưfng có mạch IC đF khuếch đại tín hiệu thay đmi này, đưa vD các mạch lọc, đếm hodc các mạch ADC đF tính toán ra nhịp tim
Tín hiệu đgu ra là tín hiệu analog, dao động theo các mạch đập nhịp tim b) Module ESP8266
*) Thông số kĩ thuật
- Microcontroller: ESP8266EX
- Điện áp hoạt động: 3.3V DC
Trang 5- Số chân I/O: 17 chân GPIO
- Kết nối mạng: WiFi 802.11 b/g/n
- Giao diện mạng: TCP/IP
- Đồng hồ thfi gian thực (RTC): không tích hHp
- Bộ nhớ trong: 4MB
- RAM: 80KB
- Cmng nạp: Micro-USB
- Hỗ trH các giao thức: MQTT, CoAP, HTTP/HTTPS
- Kích thước: 49 x 24.5 x 13mm
c) Màn hình OLED
*) Thông số kĩ thuật
- Điện áp sử dụng: 2.2 ~ 5.5 VDC
- Công suất tiêu thụ: 0.04w
- Góc hiFn thị: lớn hơn 160 độ
- Số điFm hiFn thị: 128x64
- Độ rộng màn hình: 0.96 inch
- Giao tiếp: I2C
- Driver: SSD1306
d) Đầu nối phần cứng
Trang 62.2 Phần mềm
a) Lưu đồ thuật toán, giải thuật của mạch
b) Giải thích lưu đồ thuật toán
Dưới đây là giải thích chi tiết vD tnng bước của thuật toán:
- Start: Đây là bước bắt đgu của thuật toán, nhằm chỉ ra rằng toàn bộ quá trình đo và xử lý dữ liệu bắt đgu tn đây
- Khai báo các biến cần dùng: Trong bước này, chúng ta khai báo các biến cgn thiết đF lưu trữ và xử lý dữ liệu như giá trị nhịp tim, giá trị oxy, giá trị ngưỡng cảnh báo (nếu có)
- Setup(): Bước này thưfng đưHc sử dụng trong môi trưfng lập trình Arduino hodc ESP8266 đF khki tạo các cài đdt ban đgu cho việc sử dụng vi điDu khiFn Trong thuật toán này, chúng ta thực hiện các công việc sau:
+ Khki tạo cảm biến Max30100 đF chuẩn bị cho việc đo
Trang 7+ Khki tạo module ESP8266 và kết nối WiFi đến mạng, đF sau này có thF gửi dữ liệu qua mạng WiFi
+ Khki tạo cmng Serial đF gửi dữ liệu tn vi điDu khiFn đến máy tính hodc thiết bị khác qua cmng Serial
+ Thiết lập thfi gian ldp cảm biến (2ms) bằng cách sử dụng hàm
delayMicroseconds(2000) ĐiDu này đảm bảo việc đọc dữ liệu tn cảm biến dihn ra mỗi 2ms
- Đọc dữ liệu từ cảm biến mỗi 2m/s bằng hàm AnalogRead(): Trong bước này, vi điDu khiFn sử dụng hàm AnalogRead() đF đọc giá trị tn cảm biến
Max30100 Cảm biến Max30100 là một cảm biến nhịp tim và oxy máu, vì vậy nó
có thF cung cấp các giá trị tương ứng với nhịp tim và mức oxy máu
- Tính toán, xử lý dữ liệu thu được: Sau khi đọc dữ liệu tn cảm biến, chúng
ta có thF thực hiện các bước tính toán và xử lý dữ liệu Ví dụ, ta có thF lọc tín hiệu, chuyFn đmi giá trị analog sang giá trị đo đạc thực tế (như phgn trăm oxy máu), hodc thực hiện các phlp tính khác phụ thuộc vào yêu cgu cụ thF của ứng dụng
- In và xuất dữ liệu ra cổng Serial: Dữ liệu đã đưHc xử lý và tính toán sj đưHc in và xuất ra cmng Serial sử dụng hàm Serial.print() hodc Serial.println() ĐiDu này cho phlp ta hiFn thị dữ liệu nhịp tim và oxy trên màn hình máy tính thông qua cmng Serial, đF dh dàng theo dõi và kiFm tra kết quả
- So sánh tín hiệu và cảnh báo: Bước này là tùy chọn, tùy thuộc vào yêu cgu của ứng dụng Nếu cgn, chúng ta có thF so sánh giá trị đo đưHc với giá trị ngưỡng cảnh báo (đưHc khai báo trong bước 2) Nếu giá trị đo đạc vưHt quá ngưỡng an toàn (ví dụ: nhịp tim quá cao hodc SpO2 quá thấp), chúng ta có thF đưa ra cảnh báo
đF cảnh báo ngưfi dùng vD tình trạng không bình thưfng của dữ liệu đo đạc
- Lặp lại từ bước 4: Sau khi hoàn thành việc xử lý và xuất dữ liệu, thuật toán tiếp tục ldp lại tn bước 4 ĐiDu này đảm bảo quá trình đo và xử lý dữ liệu đưHc thực hiện liên tục cho đến khi ngưng hoạt động hodc có lệnh dnng tn ngưfi dùng
- Kết thúc: Bước cuối cùng của thuật toán chỉ ra rằng quá trình đo và xử lý
dữ liệu đã kết thúc
c) Code chương trình nhúng
#include <dummy.h>
//Pulse Heart Rate BPM and Oxygen SpO2 Monitor
#define BLYNK_TEMPLATE_ID "TMPL62mVW2jHj"
#define BLYNK_TEMPLATE_NAME "Giám sát"
Trang 8#define BLYNK_AUTH_TOKEN "wKBO6ERYs2HhwX5cXGdR3CHRQmVMsFRt"
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Blynk.h>
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
#define REPORTING_PERIOD_MS 1000
OakOLED oled;
char auth[] = "wKBO6ERYs2HhwX5cXGdR3CHRQmVMsFRt" ; // Authentication Token Sent by Blynk
char ssid[] = "P101" ; //WiFi SSID
char pass[] = "0936156222" ; //WiFi Password
// Connections : SCL PIN - D1 , SDA PIN - D2 , INT PIN - D0
PulseOximeter pox;
float BPM, SpO2;
uint32_t tsLastReport = ; 0
const unsigned char bitmap [] PROGMEM=
{
0x 00 , 0x 00 , 0x 00 , 0x 00 , 0x 01 , 0x 80 , 0x 18 , 0x 00 , 0x 0f , 0x e0 , 0x 7f , 0x 00 , 0x 3f , 0x f9 , 0x ff , 0x c0 ,
0x 7f , 0x f9 , 0x ff , 0x c0 , 0x 7f , 0x ff , 0x ff , 0x e0 , 0x 7f , 0x ff , 0x ff , 0x e0 , 0x ff , 0x ff , 0x ff , 0x , f0
0x ff , 0x f7 , 0x ff , 0x f0 , 0x ff , 0x e7 , 0x ff , 0x f0 , 0x ff , 0x e7 , 0x ff , 0x f0 , 0x 7f , 0x db , 0x ff , 0x , e0
0x 7f , 0x 9b , 0x ff , 0x e0 , 0x 00 , 0x 3b , 0x c0 , 0x 00 , 0x 3f , 0x f9 , 0x 9f , 0x c0 , 0x 3f , 0x fd , 0x bf , 0x c0 ,
0x 1f , 0x fd , 0x bf , 0x 80 , 0x 0f , 0x fd , 0x 7f , 0x 00 , 0x 07 , 0x fe , 0x 7e , 0x 00 , 0x 03 , 0x fe , 0x fc , 0x 00 ,
0x 01 , 0x ff , 0x f8 , 0x 00 , 0x 00 , 0x ff , 0x f0 , 0x 00 , 0x 00 , 0x 7f , 0x e0 , 0x 00 , 0x 00 , 0x 3f , 0x c0 , 0x 00 ,
0x 00 , 0x 0f , 0x 00 , 0x 00 , 0x 00 , 0x 06 , 0x 00 , 0x 00 , 0x 00 , 0x 00 , 0x 00 , 0x 00 , 0x 00 , 0x 00 , 0x 00 , 0x 00
} ;
void onBeatDetected()
{
Serial println("Beat Detected!") ;
oled drawBitmap( 60 20 , , bitmap, , , ; 28 28 1)
Trang 9oled display() ;
}
void setup()
{
Serial begin(115200) ;
oled begin() ;
oled clearDisplay() ;
oled setTextSize( ) 1 ;
oled setTextColor( ) 1 ;
oled setCursor(0 0) , ;
oled println("Initializing pulse oximeter ")
oled display() ;
pinMode(16 , OUTPUT ; )
Blynk begin( auth, ssid, pass ; )
Serial print("Initializing Pulse Oximeter ")
if ( pox begin())
{
Serial println("FAILED")
oled clearDisplay() ;
oled setTextSize( ) 1 ;
oled setTextColor( ) 1 ;
oled setCursor(0 0) , ;
oled println("FAILED")
oled display() ;
for( ;; ; )
}
else
{
oled clearDisplay() ;
oled setTextSize( ) 1 ;
oled setTextColor( ) 1 ;
oled setCursor(0 0) , ;
oled println("SUCCESS") ;
oled display() ;
Serial println("SUCCESS") ;
pox setOnBeatDetectedCallback( onBeatDetected ; )
}
// The default current for the IR LED is 50mA and it could be changed by uncommenting the following line.
//pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
Trang 10void loop()
{
pox update () ;
Blynk run() ;
BPM = pox getHeartRate() ;
SpO2 = pox getSpO2() ;
if (millis() - tsLastReport > REPORTING_PERIOD_MS )
{
Serial print("Heart rate:") ;
Serial print( BPM ; )
Serial print(" SpO2:") ;
Serial print( SpO2 ; )
Serial println(" %") ;
Blynk virtualWrite( V7, BPM ; )
Blynk virtualWrite( V8, SpO2 ; )
oled clearDisplay() ;
oled setTextSize( ) 1 ;
oled setTextColor( ) 1 ;
oled setCursor(0 , 16) ;
oled println pox getHeartRate ( ()) ;
oled setTextSize( ) 1 ;
oled setTextColor( ) 1 ;
oled setCursor(0 0) , ;
oled println("Heart BPM") ;
oled setTextSize( ) 1 ;
oled setTextColor( ) 1 ;
oled setCursor(0 30) , ;
oled println("Spo2") ;
oled setTextSize( ) 1 ;
oled setTextColor( ) 1 ;
oled setCursor(0 , 45) ;
oled println pox getSpO2 ( ()) ;
oled display() ;
tsLastReport = millis() ;
}
}
3 Nhận xét và đánh giá
Trang 113.1 Nhận xét về hệ thống nhúng
a) Đánh giá theo các tiêu chí đZ đ[ ra
SRn phSm lTm ra đV đWt đXYc nhZng ti[u ch\ c]n hX^ng t^i lT th_n
thi`t v^i mai trXbng vT ngXbi sc ddng tWo cho he sf thga mái, dh
sc ddng v^i vTi thao tác đin giRn, tjn \t nkng lXYng vT đl tin cmy
cao, chi ph\ thnp pho hYp v^i mei ngXbi
b) \u đi]m của mô hình đo
- V^i thipt kp nhX tr[n mWch đo nhqp tim hoWt đlng tjt vT rn
đqnh, ph]n csng vT ph]n mtn tXing th\ch v^i nhitu thipt bq, dh
dTng sc ddng ti`n lYi mT giá thTnh lW ru hin so v^i các thipt bq
khác ngoTi thq trXbng
- Qua thfc nghi`m thfc tp cho thny thipt bq dh sc ddng vT
đWt đXYc các y[u c]u đvt ra nhX sau:
+ Dh dTng sc ddng chx v^i vTi thao tac din giRn
+ Nhanh chyng cho ra kpt quR
+ Cy đl ch\nh xác cao vT sai sj nhg
+ Nhitu thang sj li[n quan cho ta cái nh{n trfc quan hin
c) Nhược đi]m của mô hình đo
+ Do thiếu điDu kiện lên thiết bị còn to và cồng kDnh
+ Do lập trình bằng vi xử lý lên vẫn có sai số không đáng kF
3.2 Giải pháp nâng cao chất lượng hệ thống nhúng
ĐF nâng cao chất lưHng hệ thống nhúng đo oxy và cảm biến nhịp tim Max30100 với ESP8266 qua điện thoại Android, ta có thF thực hiện một số giải pháp sau:
- Thực hiện chuyFn đmi ADC (Analog-to-Digital Conversion) tốt hơn: + Đảm bảo rằng việc đọc dữ liệu tn cảm biến Max30100 thông qua chuyFn đmi ADC đưHc thực hiện đúng cách và chính xác
+ Tối ưu hóa chế độ làm việc của cảm biến và các tham số liên quan đF đạt đưHc
độ chính xác cao hơn
- Xử lý và lọc tín hiệu tốt hơn:
Trang 12+ Sử dụng các thuật toán xử lý tín hiệu như FIR (Finite Impulse Response) hodc IIR (Infinite Impulse Response) đF lọc nhihu và nâng cao độ tin cậy của dữ liệu đo đạc
+ Thực hiện việc xử lý tín hiệu phgn cứng (hardware) nếu có thF đF giảm tải xử
lý của vi điDu khiFn
- Thực hiện giao tiếp dữ liệu thông qua giao thức truyDn thông mn định: + Sử dụng giao thức truyDn thông như MQTT hodc HTTP đF gửi dữ liệu đo đạc
tn ESP8266 đến điện thoại Android
+ Đảm bảo cơ chế xử lý dữ liệu gửi/nhận đáng tin cậy và bảo mật
- Thực hiện tích hHp với các dịch vụ đám mây hodc lưu trữ dữ liệu: + Nếu cgn, tích hHp ứng dụng với các dịch vụ đám mây như Firebase hodc Amazon Web Services đF lưu trữ dữ liệu đo đạc và quản lý dữ liệu tn xa
+ Cung cấp tính năng đồng bộ hóa dữ liệu giữa ứng dụng Android và các thiết bị khác
3.3 Đề xuất hướng phát triển hệ thống nhúng
Đ} phát tri}n t~ ma h{nh đo thTnh thipt bq đo đ•i hgi c]n rnt
nhitu cang ssc, các l]n th~ nghi`m, n_ng cnp, thay thp Đji v^i
ma h{nh đo nTy ch€ng ta cy th} thipt kp các bl lec tji Xu hin nZa
nh•m khai phdc lWi g]n nhX hoTn toTn dWng t\n hi`u Ph]n mtm
trong tXing lai cy chsc nkng chuSn đoán dfa tr[n các thang sj đo
đXYc đ} h‚ trY bác sƒ đXa ra quypt đinh cuji cong
V^i vi`c sng ddng c„a vi xc l…, ch€ng ta cy th} phát tri}n đ†
án mlt cách đa nkng hin nhX cy th} hi}n thq tr[n đi`n thoWi
thang minh hovc qua mWng wifi đ} bác s‡ vT ngXbi nhT b`nh
nh_n theo dˆi mlt cách ti`n lYi hin
Ma h{nh cy th} đXYc thipt kp nhg gen hin nhb sc ddng các vi
đitu khi}n nhg hin nhXng v‰n đRm bRo các ti[u chuSn nhX ti[u
thd ngu†n thnp, t\ch hYp các ADC, DAC Khi kpt hYp v^i k‡ thumt
bj tr\ vT chjng nhihu tjt th{ ma h{nh cy th} đXYc chp tWo nhg gen
hin hi`n nay hin rnt nhitu