Thiết kế hệ thống đo nhịp tim Thiết kế hệ thống đo nhịp tim Thiết kế hệ thống đo nhịp tim luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - NGUYỄN SỸ HIỆP THIẾT KẾ HỆ THỐNG ĐO NHỊP TIM Chuyên ngành: Kỹ thuật y sinh LUẬN VĂN THẠC SĨ KỸ THUẬT KỸ THUẬT Y SINH NGƯỜI HƯỚNG DẪN KHOA HỌC: PGS.TS NGUYỄN TIẾN DŨNG Hà nội - 2016 LỜI CAM ĐOAN Tôi xin cam đoan luận văn tơi nghiên cứu Hệ thống phần cứng chương trình phần mềm tơi thiết kế xây dựng Các thông tin số liệu luận văn hồn tồn trung thực, xác có nguồn gốc rõ ràng Trong q trình nghiên cứu tơi có tham khảo số tài liệu, báo có danh mục tài liệu tham khảo liệt kê cuối luận văn Học viên Nguyễn Sỹ Hiệp MỤC LỤC LỜI CAM ĐOAN MỤC LỤC 1DANH MỤC HÌNH ẢNH DANH MỤC BẢNG BIỂU DANH MỤC CÁC TỪ VIẾT TẮT MỞ ĐẦU CHƯƠNG 1: TỔNG QUAN 1.1 Mở đầu 1.2 Giới thiệu chung nhịp tim 1.2.1 Nhịp tim bình thường 1.2.2 Rối loạn nhịp tim 10 1.3 Phương pháp xác định nhịp tim 12 1.3.1 Nghe tim 12 1.3.2 Điện tâm đồ (ECG) 13 1.3.3 Phương pháp đo nhịp tim Oscillometric 15 1.3.4 Đo nhịp tim áp dụng phương pháp đo quang thể tích (Photoplethysmogram) 17 1.4 Một số thiết bị điện tử đo nhịp tim thị trường 18 1.4.1 Các thiết bị đeo tay 18 1.4.2 Thiết bị đo nhịp tim bỏ túi 19 2.1 Giới thiệu kit vi điều khiển Arduino 21 2.2 Phân loại kit Arduino 23 2.2.1 Arduino Uno 23 2.2.2 Arduino Mega 2560 25 2.2.3 Arduino Fio 27 2.3 Lập trình Arduino 30 2.3.1 Giới thiệu môi trường lập trình 30 2.3.2 Giao diện phần mềm lập trình Arduino 30 2.3.3 Nạp chương trình chạy ứng dụng 32 2.3.4 Cấu trúc chương trình lập trình Arduino 33 2.4 Giới thiệu cảm biến nhịp tim XD-58 34 2.4.1 Đặc điểm cảm biến XD-58 34 2.4.2 Cấu trúc cảm biến xung XD-58 34 2.4.3 Mạch cảm biến xung 37 2.5 Lí lựa chọn hỉnh hiển thị LCD 16x2 38 2.5.1 Cơng nghệ hình hiển thị 38 2.5.2 Đặc điểm chung của LCD 16x2 39 2.6 Kết luận chương 55 CHƯƠNG 3: THIẾT KẾ HỆ THỐNG ĐO NHỊP TIM 56 3.1 Ý tưởng thiết kế 56 3.2 Yêu cầu hệ thống 56 3.3 Giải pháp thiết kế 57 3.4 Thiết kế hệ thống 58 3.4.1 Sơ đồ khối hệ thống 58 3.4.2 Chức khối 58 3.4.3 Linh kiện sử dụng cho khối 58 3.5 Phân tích hoạt động hệ thống 61 3.6 Thực thi thiết kế 64 3.6.1 Sơ đồ nguyên lý tổng thể hệ thống 64 3.6.2 Sơ đồ mạch in hệ thống 64 3.7 Kết đạt 65 3.8 Đánh giá kết hệ thống đo nhịp tim 66 3.8.1 Sai sô đo lường 66 3.8.2 Tiến hành đo kiểm thử thực tế 70 3.9 Kết luận chương 75 3.10 Kết luận hướng phát triển 76 TÀI LIỆU THAM KHẢO 77 PHỤ LỤC 78 1DANH MỤC HÌNH ẢNH Hình 1.1: Nhịp tim chậm .10 Hinh 1.2: Máy tạo nhịp tim 11 Hình 1.3: Nghe tiếng tim .12 Hình 1.4 Một thiết bị nghe nhịp tim hãng microlife 13 Hình 1.5: chu kì tín hiệu điện tim bình thường 13 Hình 1.6: Tín hiệu điện tâm đồ bình thường 14 Hình 1.7 Giấy điện tim, cách tính thời gian biên độ .15 Hình 1.8: Nguyên tắc đo nhịp tim phương pháp Ocillometric thiết bị đo Ocillometric 16 Hình 1.9: Dạng tín hiệu nhịp đập nhịp tim .16 Hình 1.10: Sự truyền ánh sáng qua động mạch .17 Hình 1.11: Vị trí đặt nguồn sáng cảm biến .17 Hình 1.12: Đồng hồ đeo tay Samsung Gear Fit 18 Hình 1.13: Máy đo nồng độ oxy bão hòa máu nhịp xung Acare OxiSmarter I 19 Hình 2.1: Một Kit vi điều khiểnt Arduino .21 Hình 2.2: Hình ảnh Arduino Uno 23 Hình 2.3: Arduino Mega 2560 .25 Hình 2.4: Arduino Mega Fio 27 Hình 2.5: Giao diện sau cài đặt xong phần mêm IDE .30 Hình 2.6: Giao diện Arduino IDE 30 Hình 2.7: Vùng thơng báo .32 Hình 2.8: Lấy ví dụ có sẵn Arduino .32 Hình 2.9: Nạp chương trình cho Arduino 33 Hình 2.10: Bộ kit cảm biến xung XD- 58C .34 Hình 2.11: Mặt trước cảm biến xungXD- 58 34 Hình 2.12: Hình ảnh mặt sau cảm biến nhịp tim XD-58 35 Hình 2.13: Các chân cảm biến nhịp tin XD-58 .35 Hình 2.14: Cách gắn cảm biến xung vào ngón tay 36 Hình 2.15: Mạch nguyên lý cảm biến xung nhịp tim 37 Hình 2.16: Cảm biến APDS9008 37 Hình 2.17: Màn hình SSD1322 OLED 38 Hình 2.18: Mặt trước mặt sau hình LCD TFT 2.4 UART + TouchSceen 38 Hình 2.19: Màn hình LCD 16x2 39 Hình 2.20: Sơ đồ chân LCD 16x2 40 Hình 2.21: Sơ đồ khối HD44780 42 Hình 2.22 : Giản đồ xung cập nhật AC 44 Hình 2.23 : Mối liên hệ địa DDRAM vị trí hiển thị LCD .44 Hình 2.24: Mối liên hệ địa ROM liệu tạo mẫu kí tự 45 Hình 2.25: Mối liên hệ địa CGRAM, liệu CGRAM, mã kí tự 47 Hình 2.26: Giao tiếp bit 53 Hình 2.27: Giao tiếp bit 54 Hình 3.1: Sơ đồ tổng quan hệ thống 57 Hình 3.2: Sơ đồ khối hệ thống thiết bị đo nhịp tim 58 Hình 3.3: Cảm biến nhịp tim 59 Hình 3.4: Khối xử lí trung tâm sử dụng Arduino Uno 60 Hình 3.5: LCD 16x2 60 Hình 3.6: Sơ đồ mạch cảm biến dựa cảm biến xung 61 Hình 3.7: Lưu đồ thuật toán điều khiển Arduino .63 Hình 3.8: Sơ đồ nguyên lý hệ thống 64 Hình 3.9: Sơ đồ mạch layout 64 Hình 3.10: Sơ đồ mạch in 65 Hình 3.11: Các linh kiện hệ thống .65 Hình 3.12: Hình ảnh sản phẩm hoàn thiện 66 Hình 3.13: Giá trị phép đo hiển thị .66 Hình 3.14: Sử dụng đồng thời hai thiết bị đo thời điểm 70 Hình 3.15: Kết thủ bên phải sử dụng máy OMRON HEM7200 bên trái sử dụng cảm biến XD-58 .71 DANH MỤC BẢNG BIỂU Bảng 2.1: Arduino Toolbar 31 Bảng 2.2: Chức chân LCD 16x2 40 Bảng 2.3: Chức chân RS R/W theo mục đích sử dụng 43 Bảng 2.4 : Bảng mã kí tự (ROM code A00) 46 Bảng 2.5: Tập lệnh LCD 48 Bảng 2.6: Maximun Rating 51 Bảng 2.7: Miền làm việc bình thường 51 Bảng 3.1: Khi thể trạng thái nghỉ 71 Bảng 3.2: Khi thể vừa vận động xong .73 DANH MỤC CÁC TỪ VIẾT TẮT Từ viết tắt Tên tiếng anh Tên tiếng việt Alternating Current Dòng điện xoay chiều Beats Per Minute Số nhịp tim đập phút DC Direct Current Dòng điện chiều DP Diastolic Presure Huyết áp tâm trương Electrocardiography Điện tâm đồ AC BPM ECG EEPROM I2C Electrically Erasable Programmable Read Only Memory Bộ nhớ đọc Inter-Integrated Circuit Bus giao tiếp IC với Integrated Development Môi trường biên dịch IDE Environment LCD Liquid Crystals Display Màn hình tinh thể lỏng LED Light Emitting Diode Diode phát quang PIC Programmable Intelligent Compute Máy tính khả trình thơng minh Phương pháp điều chế độ rộng PWM RX Pulse Width Modulation xung Receiver Chân nhận liệu chuẩn đồng nối tiếp truyền SPI Serial Peripheral Interface liệu chế độ song cơng tồn phần TX Transmitter Chân truyền liệu chuẩn truyền liệu cho bus USB ngoại vi Universal Serial Bus dành cho việc truyền liệu từ MOSI thiết bị chủ động đến thiết bị bị Master Out Slave In động MỞ ĐẦU Ngày khoa học công nghệ ngày phát triển, vi điều khiển AVR vi điều khiển PIC ngày thơng dụng hồn thiện hơn, nói xuất Arduino vào năm 2005 giáo sư Massimo Banzi trường Interraction Design Instistute Ivrea (IDII) Italia mở hướng cho vi điều khiển Sự xuất Arduino hỗ trợ cho người nhiều lập trình thiết kế Phần cứng thiết bị tích hợp nhiều chức mã nguồn mở Ngơn ngữ lập trình Java lại dễ sử dụng tương thích với ngơn ngữ C, C++ hệ thư viện phong phú chia sẻ miễn phí Chính lý nên Arduino dần phổ biến phát triển ngày mạnh mẽ Arduino có nhiều ứng dụng hay sống: Robot, game tương tác, máy bay không người lái, đo nhiệt độ môi trường Trong giám sát nhịp tim khả mà Arduino đảm nhận Hiện có nhiều thiết bị sử dụng để đo nhịp tim xác người thiết bị phòng khám bệnh viện, hay smartphone Tuy nhiên khơng cần thời gian tới gặp bác sĩ hay bỏ khoản tiền lớn mua smartphone để đo nhịp tim Chỉ với kit Arduino lòng bàn tay cảm biến nhịp tim (pulse sensor) nhỏ nhắn, tự kiểm tra nhịp tim người thân thơng qua hình hiển thị máy tính hình LCD với giá thành thấp Việc lắp đặt, sử dụng mạch đơn giản thuận tiện Đề tài luận văn chia làm ba chương, chương đề cập đến vấn đề sau Chương Tổng quan thiết bị đo Chương Giới thiệu kit vi điều khiển Arduino uno, cảm biến nhịp tim XD58 LCD 16x2 Chương Thiết kế hệ thống đo nhịp tim CHƯƠNG 1: TỔNG QUAN 1.1 Mở đầu Nhịp tim thông số quan trọng thể, dựa vào để đánh giá sức khỏe con người, tưởng chừng quen thuộc nắm rõ Khi bệnh nhân đến khám bệnh cơng việc bác sĩ thường kiểm tra nhịp tim, huyết áp, suốt q trình điều trị thơng số thường xuyên thu thập kiểm tra Công việc tưởng chừng đơn giản thực tế lại có ý nghĩa lớn cơng tác chuẩn đốn điều trị cho bệnh nhân, đặc biệt với người có bệnh tim mạch bệnh nhân hậu phẫu Ngày với phát triển kinh tế, kéo theo mặt trái môi trường ngày trở lên ô nhiễm Chính mà sức khỏe người dễ bị ảnh hưởng Vấn đề theo dõi sức khỏe thường xuyên thân trở lên cấp thiết, việc theo dõi nhịp tim giúp phát kịp thời tín hiệu xấu sức khỏe Ngoài việc theo dõi nhịp tim góp phần hỗ trợ việc rèn luyện thể, nâng cao sức khỏe người 1.2 Giới thiệu chung nhịp tim Nhịp tim xác định số lần đập tim phút có ảnh hưởng nhiều đến sức khỏe người Nói cách khác biết nhịp tim thể cho ta biết nhiều thơng tin tình trạng sức khỏe thân 1.2.1 Nhịp tim bình thường Đối với người độ tuổi từ 18 trở lên, nhịp tim bình thường nghỉ ngơi từ 60 đến 100 nhịp phút.Thông thường người khỏe mạnh, nhịp tim thấp Một vận động viên chuyên nghiệp chế độ xả nhịp tim họ khoảng 40 nhịp phút Ví dụ tay đua xe đạp Lance Armstrong, nhịp tim bình thường anh có 32 nhịp phút Theo quan y tế quốc gia vương quốc Anh, tiêu chuẩn nhịp tim lý tưởng lứa tuổi: - Bé sơ sinh: 120-160 nhịp phút - Bé tuổi từ tháng -12 tháng: 80-140 nhịp phút - Trẻ từ đến năm: 80-130 nhịp phút - Trẻ từ đến tuổi: 75-120 nhịp phút phép đo lường Ta loại bỏ sai số ngẫu nhiên giảm thiểu tới mức tùy ý muốn cách tăng lên số lần đo n cách tương ứng 3.8.2 Tiến hành đo kiểm thử thực tế Nhằm loại trừ yếu tố gây sai số hệ thống sai số nhầm lẫn Tiến hành đo thử nghiệm thực tế thể người trường hợp lí tưởng Đảm bảo lần đo thực điều kiện Ngoài ra, Nhằm đánh giá độ xác phép đo tác giả tiến hành đo nhiều lần thể trạng thái khác (trạng thái nghỉ, suy nghĩ, vận động, sau ngủ dậy ) tiến hành đo song song đồng thời hai thiết bị thời điểm thể người thiết bị sản phẩm luận văn thiết bị lại máy đo nhịp tim huyết áp Omron Hem-7200 Một sản phẩm tin dùng thị trường Với độ tin cậy xác cao 3.8.2.1 Cách thực - Quấn miếng dính chặt vào ngón tay Đảm bảo cho cảm biến nhịp tim XD58 tiếp xúc tốt với da Không bị kênh, hở khiến ánh sáng bên lọt vào - Quấn vịng bít máy Omron Hem-7200 vào bắp tay cịn lại Vịng trịn bít nằm vị trí ngang tim Dán miếng dính cố định lại vịng bít Hình 3.14: Sử dụng đồng thời hai thiết bị đo thời điểm 70 Hình 3.15: Kết thủ bên phải sử dụng máy OMRON HEM7200 bên trái sử dụng cảm biến XD-58 3.8.2.2 Kết thu Kết thu sau tiến hành đo nhiều người, tuổi trưởng thành Độ tuổi từ 20 tới 50 Khi thể trạng thái khác Bảng 3.1: Khi thể trạng thái nghỉ Lần đo Cảm biến Omron XD-58 Hem 7200 70 6.76 73 0.09 69 12.96 73 0.09 72 0.36 74 0.49 65 57.76 64 86.49 73 0.16 75 2.89 72 0.36 75 2.89 70 6.76 68 28.09 75 5.76 75 2.89 68 21.16 68 28.09 10 67 31.36 66 53.29 11 80 54.76 77 13.69 12 75 5.76 73 0.09 13 74 1.96 75 2.89 71 14 71 2.56 74 0.49 15 76 11.56 78 22.09 16 70 6.76 69 18.49 17 75 5.76 76 7.29 18 78 29.16 79 32.49 29 79 40.96 79 32.49 20 76 11.56 77 13.69 21 68 21.16 69 18.49 22 70 6.76 72 1.69 23 70 6.76 73 0.09 24 78 29.16 80 44.89 25 76 11.56 74 0.49 26 77 19.36 76 7.29 27 70 6.76 74 0.49 28 72 0.36 73 0.09 29 71 2.56 69 18.49 30 73 0.16 72 1.69 Giá trị 72.6 13.96 73.3 14.75 trung bình Từ bảng số liệu ta thấy độ sai lệch đo cảm biến XD-58 với thiết bị Omron Hem-7200 với kết đo tương ứng từ - nhịp Và giá trị kì vọng, tức giá trị nhịp tim trung bình lần đo sử dụng cảm biến XD-58 72.6 nhịp/phút Còn với thiết bị Omron Hem-7200 73.3 nhịp/phút Dựa vào phương sai đo mức độ tin cậy kì vọng Ta tiến hành tính phương sai phép đo thu bảng Phương sai sử dụng cảm biến XD-58 (3.2) Dn = 13.96 Tương tự áp dụng cơng thức tính phương sai sử dụng thiết bị Omton Hem-7200 72 Dn= 14.75 Kết thu ta thấy giá trị phương sai phép đo sử dụng cảm biến XD58 thiết bị Omron Hem-7200 xấp xỉ Và 13.96 14.75 Điều có nghĩa kì vọng hai giá trị có độ tin cậy tương đương Trong kì vọng giá trị trung bình hai phép đo sử dụng Cảm biến XD-58 thiết bị Omron Hem-7200 có giá trị 72.6 nhịp/phút 73.3 nhịp/phút xấp xỉ Phương sai có giả trị nhỏ có mức độ tin cậy Ở bảng số liệu dễ dàng nhận thấy phương sai phép đo sử dụng cảm biến XD-58 có độ tin cậy kì vọng cao Tiến hành đo sau thể vận động, từ vận động nhẹ tới vận động nặng Ta thu bảng số liệu Bảng 3.2: Khi thể vừa vận động xong Lần đo Cảm biến XD-58 87 259 84 345.96 87 259 87 243.36 88 228 87 243.36 89 198.8 88 213.16 90 171.6 89 184.96 90 171.6 90 158.76 90 171.6 93 92.16 95 65.61 95 57.76 95 65.61 95 57.76 10 96 50.41 96 43.56 11 96 50.41 97 31.36 12 98 26 97 31.36 13 98 26 97 31.36 14 98 26 98 21.16 15 99 16.81 98 21.16 16 99 16.81 100 6.76 17 100 9.61 105 5.76 Omron Hem 7200 73 18 105 3.61 105 5.76 29 107 15.21 107 19.36 20 109 34.81 109 40.96 21 110 47.61 110 54.76 22 111 62.41 112 88.36 23 115 141.61 114 129.96 24 116 166.41 115 153.76 25 117 193.21 116 179.56 26 120 285.61 117 207.36 27 120 285.61 117 207.36 28 121 320.41 120 302.76 29 122 357.21 120 302.76 30 125 479.61 121 338.56 Giá trị 103.1 140.2 102.6 127.4 trung bình Từ bảng số liệu ta thu giá trị nhịp tim trung bình giá trị đo xấp xỉ nhau, giá trị nhịp tim trung bình đo cảm biến XD-58 thiết bị Omron Hem-7200 103.1 nhịp/phút 102.6 nhịp phút Áp dụng cơng thức tính phương sai (3.2) Ta thu phương sai sử dụng cảm biến XD-58 Dn =140.2 Và phương sai sử dụng thiết bị Omron Hem-7200 Dn = 127.4 Giá trị nhịp tim bảng số liệu 3.2 có độ chênh lệch lớn so với bảng số liệu 3.1 cường độ vận động thay đổi từ vận động nhẹ vận động nặng dẫn tới nhịp tim có giá trị thay đổi theo Đây lí khiến cho phương sai thu có giá trị lớn so với phương sai bảng số liệu 3.1 Dựa vào phương sai 74 thấy rõ giá kì vọng phép đo sử dụng thiết bị Omron Hem-7200 đáng tin cậy Tuy nhiên giá trị phương sai chênh ít, khơng nhiều 3.8.2.3 Đánh giá sản phẩm Sau tiến hành đo thử nghiệm đồng thời thiết bị sử dụng cảm biến XD58 thiết bị Omron Hem-7200 giá trị đo thu gần Khơng có chênh lệch lớn kết hai thiết bị lần đo Độ tin cậy phép đo nhịp tim sử dụng cảm biến XD-58 tương đương với Phép đo sử dụng thiết bị Omron Hem-7200 Các yếu tố gây sai số ảnh hưởng đến kết đo nhiễu ánh sáng, tiến hành phép đo chưa xác, nhiệt độ mơi trường Và đặc biệt trạng thái thể vận động, suy nghĩ dẫn tới thay đổi nhịp tim, khoảng thời gian phút giá trị nhịp tim bị ảnh hưởng yếu tố kể Sau thiết kế xây dựng xong phần cứng Từ kết thu thông qua số lần thử nghiệm hoạt động hệ thống đánh sau: a) Ưu điểm hệ thống - Hệ thống hoạt động ổn định đáp ứng theo yêu cầu thiết kế - Hệ thống xác định nhịp tim bệnh nhân với sai khác nhỏ so với giá trị thực tế - Hệ thống chạy ổn định - Hình ảnh hiển thị LCD rõ ràng - Hệ thống phần cứng cấu trúc nhỏ gọn, đẹp mắt - Chi phí thiết kế hệ thống thấp - Hệ thống tiêu thụ điện b) Nhược điểm hệ thống - Hệ thống chưa tích hợp nhiều chức - Kết đo cịn có tương sai số lần đo - Chất lượng mạch chưa cao làm thủ cơng tay 3.9 Kết luận chương Chương trình bày việc thực thi thiết kế Module đo giám sát nhịp tim - Xây dựng thiết kế hệ thống phần cứng kèm hình ảnh minh họa sản phẩn phần cứng thu - Phân tích hoạt động hệ thống đo nhịp tim sử dụng module XD-58 75 - Tiến hành đo kiểm thử thực tế đánh giá kết hệ thống đo nhịp tim - Đánh giá yếu tố ảnh hưởng đến sai số phép đo đưa ưu nhược điểm hệ thống 3.10 Kết luận hướng phát triển Sau khoảng thời gian nghiên cứu xây dựng hệ thống đo hiển thị giá trị nhịp tim đến hoàn thành Kết hệ thống hoạt động theo yêu cầu đề tài Hệ thống đo nhịp tim hiển thị rõ nét giá trị lên hình LCD Với độ xác cao Cuốn luận văn xây dựng cách chi tiết đầy đủ nội dung lý thuyết phần thiết kế giải toàn nội dung đề cương đăng ký luận văn cao học Tuy nhiên hệ thống hạn chế, phát triển chức đo nhịp tim, cần bổ sung thêm chức khác nữa, đo huyết áp, nhiệt độ Ngoài chưa lưu trữ liệu lần đo trước Trong thời gian tới tác giả tiếp tục nghiên cứu để tích hợp thêm nhiều chức để hệ thống ngày hoàn thiện 76 TÀI LIỆU THAM KHẢO [1] PGS.TS Hà Hoàng Kiệm, Thực hành cấp cứu điều trị bệnh nội khoa, NXB YH 2010) [2] Bộ môn sinh lý học, Sinh lý học, Trường Đại học y Hà Nội, 2009 [3] Nguyễn Quang Tuấn, Thực hành đọc điện tim,NXB Y học, 2014 [7] Lê Cảnh Trung - Phạm Quang Huy, Lập trình điều khiển với Arduino, 2014 [8]MichaelMargollisandNicholasWeldin,ArduinoCookbook,O’ReillyMedia,Inc, 2011 [4] http://acaretech.com/00_2Pulse_Oximeter_OxismaterI.html, truy cập cuối ngày 25/9/2016 [5] http://www.arduino.cc/ , truy cập cuối ngày 20/09/2016 [6 ]http://arduino.vn/, truy cập cuối ngày 20/09/2016 [9]http://pulsesensor.com/ [10]https://en.wikipedia.org/wiki/ListofArduinoboards_and_compatiblesystems/ [11]https://en.wikipedia.org/wiki/Arduino#cite_note-smartprojects-11/ 77 PHỤ LỤC Code chương trình nạp cho Arduino Uno #include // VARIABLES volatile int rate[10]; // used to hold last ten IBI values volatile unsigned long sampleCounter = 0; volatile unsigned long lastBeatTime = 0; // used to determine pulse timing // used to find the inter beat interval volatile int P =512; // used to find peak in pulse wave volatile int T = 512; // used to find trough in pulse wave volatile int thresh = 512; // used to find instant moment of heart beat volatile int amp = 100; // used to hold amplitude of pulse waveform volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM volatile boolean secondBeat = true; // used to seed rate array so we startup with reasonable BPM void interruptSetup(){ // Initializes Timer2 to throw an interrupt every 2mS TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS AND 11, AND GO INTO CTC MODE TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED } int pulsePin = A3; int blinkPin = 13; // Pulse Sensor purple wire connected to analog pin // pin to blink led at each beat int fadePin = A5; // pin to fancy classy fading blink at each beat int fadeRate = A1; // used to fade LED on with PWM on fadePin 78 int test = 1; // these variables are volatile because they are used during the interrupt service routine! volatile int BPM; // used to hold the pulse rate volatile int Signal; // holds the incoming raw data volatile int IBI = 600; // holds the time between beats, the Inter-Beat Interval volatile boolean Pulse = false; // true when pulse wave is high, false when it's low volatile boolean QS = false; // becomes true when Arduoino finds a beat byte heart[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 }; byte smile[8] = { 0b00000, 0b00000, 0b01010, 0b00000, 0b10001, 0b01110, 0b00000, 79 0b00000 }; void setup(){ pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat! pinMode(fadePin,OUTPUT); // pin that will fade to your heartbeat! Serial.begin(115200); interruptSetup(); // we agree to talk fast! // sets up to read Pulse Sensor signal every 2mS LiquidCrystal lcd(5, 6, 11, 10, 9, 8); // RS , E , D4 , D5 , D6 , D7 lcd.begin(16,2);// initialize lcd on 16 bit row display lcd.setCursor(2,0);//set lcd cursor at col.3 row lcd.print("THIET BI DO");//display heart rate lcd.setCursor(4,1); lcd.print("NHIP TIM"); delay(7000);//wait for sec //lcd.clear(); //lcd.setCursor(0,0); //lcd.print("NHIP TIM = "); } // THIS IS THE TIMER INTERRUPT SERVICE ROUTINE // Timer makes sure that we take a reading every miliseconds ISR(TIMER2_COMPA_vect){ cli(); // triggered when Timer2 counts to 124 // disable interrupts while we this Signal = analogRead(pulsePin); sampleCounter += 2; // read the Pulse Sensor // keep track of the time in mS with this variable int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise // find the peak and trough of the pulse wave 80 if(Signal < thresh && N > (IBI/5)*3){ // avoid dichrotic noise by waiting 3/5 of last IBI if (Signal < T){ // T is the trough T = Signal; // keep track of lowest point in pulse wave } } if(Signal > thresh && Signal > P){ P = Signal; } // thresh condition helps avoid noise // P is the peak // keep track of highest point in pulse wave // NOW IT'S TIME TO LOOK FOR THE HEART BEAT // signal surges up in value every time there is a pulse if (N > 250){ // avoid high frequency noise if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){ Pulse = true; // set the Pulse flag when we think there is a pulse digitalWrite(blinkPin,HIGH); // turn on pin 13 LED IBI = sampleCounter - lastBeatTime; lastBeatTime = sampleCounter; if(firstBeat){ // measure time between beats in mS // keep track of time for next pulse // if it's the first time we found a beat, if firstBeat == TRUE firstBeat = false; return; // clear firstBeat flag // IBI value is unreliable so discard it } if(secondBeat){ // if this is the second beat, if secondBeat == TRUE secondBeat = false; for(int i=0; i