- Các thành phần bắt buộc
- Cảm biến xung SEN-11574
- Sơ đồ mạch cho giao tiếp cảm biến xung với vi điều khiển PIC
- Giải thích mã PIC16F877A cho Máy theo dõi nhịp tim
Nhịp tim là thông số quan trọng nhất trong việc theo dõi sức khỏe của bất kỳ người nào. Trong thời đại hiện đại của các thiết bị đeo được, có rất nhiều thiết bị có thể đo nhịp tim, huyết áp, bước chân, lượng calo đốt cháy và nhiều thứ khác. Các thiết bị này có cảm biến xung bên trong chúng để cảm nhận tốc độ xung. Hôm nay, chúng ta cũng sẽ sử dụng cảm biến xung với Bộ vi điều khiển PIC để đếm nhịp tim mỗi phút và Khoảng thời gian giữa các nhịp, các giá trị này sẽ được hiển thị thêm trên LCD 16x2 ký tự. Chúng tôi sẽ sử dụng vi điều khiển PIC PIC16F877A trong dự án này. Chúng tôi đã giao tiếp cảm biến xung với Arduino cho Hệ thống theo dõi bệnh nhân.
Các thành phần bắt buộc
- Bộ vi điều khiển PIC16F877A
- Tinh thể 20 Mhz
- Tụ điện 33pF 2 chiếc
- 4,7k điện trở 1 chiếc
- Màn hình LCD ký tự 16x2
- Nồi 10K để kiểm soát độ tương phản của màn hình LCD
- Cảm biến xung SEN-11574
- Dây đeo Velcro
- Bộ đổi nguồn 5V
- Breadboard và dây hookup
Cảm biến xung SEN-11574
Để đo nhịp tim, chúng ta cần một cảm biến xung. Ở đây chúng tôi đã lựa chọn cảm biến xung SEN-11574 dễ dàng có sẵn trên các cửa hàng trực tuyến hoặc ngoại tuyến. Chúng tôi đã sử dụng cảm biến này vì có mã mẫu được cung cấp từ nhà sản xuất, nhưng đó là mã Arduino. Chúng tôi đã chuyển đổi mã đó cho bộ vi điều khiển PIC của mình.
Cảm biến thực sự nhỏ và hoàn hảo để đọc nhịp tim qua dái tai hoặc trên đầu ngón tay. Nó có đường kính 0,625 ”và dày 0,125” tính từ mặt PCB tròn.
Cảm biến này cung cấp tín hiệu tương tự và cảm biến có thể được điều khiển với 3V hoặc 5V, mức tiêu thụ hiện tại của cảm biến là 4 mA, rất tốt cho các ứng dụng di động. Cảm biến đi kèm với ba dây với cáp móc dài 24 inch và đầu cắm nam berg ở cuối. Ngoài ra, cảm biến đi kèm với Dây đeo ngón tay Velcro để đeo trên đầu ngón tay.
Sơ đồ cảm biến xung cũng được cung cấp bởi nhà sản xuất và cũng có sẵn trên sparkfun.com.
Sơ đồ cảm biến bao gồm cảm biến nhịp tim quang học, mạch RC loại bỏ tiếng ồn hoặc các bộ lọc, có thể được nhìn thấy trong sơ đồ. R2, C2, C1, C3 và bộ khuếch đại hoạt động MCP6001 được sử dụng cho đầu ra tương tự được khuếch đại đáng tin cậy.
Có rất ít cảm biến khác để theo dõi nhịp tim nhưng cảm biến xung SEN-11574 được sử dụng rộng rãi trong các dự án Điện tử.
Sơ đồ mạch cho giao tiếp cảm biến xung với vi điều khiển PIC
Ở đây chúng tôi đã kết nối cảm biến xung qua chân thứ 2 của bộ vi điều khiển. Khi cảm biến cung cấp dữ liệu tương tự, chúng ta cần chuyển đổi dữ liệu tương tự thành tín hiệu kỹ thuật số bằng cách thực hiện các phép tính cần thiết.
Bộ tạo dao động Crystal 20Mhz được kết nối qua hai chân OSC của bộ vi điều khiển bằng hai tụ gốm 33pF. Các màn hình LCD được kết nối qua cổng RB của vi điều khiển.
Giải thích mã PIC16F877A cho Máy theo dõi nhịp tim
Mã hơi phức tạp cho người mới bắt đầu. Nhà sản xuất đã cung cấp mã mẫu cho cảm biến SEN-11574, nhưng nó được viết cho nền tảng Arduino. Chúng tôi cần chuyển đổi phép tính cho vi mạch của chúng tôi, PIC16F877A. Mã hoàn chỉnh được đưa ra ở cuối dự án này với một Video minh họa. Và các tệp C hỗ trợ có thể được tải xuống từ đây.
Luồng mã của chúng tôi tương đối đơn giản và chúng tôi đã thực hiện các bước bằng cách sử dụng trường hợp chuyển mạch . Theo nhà sản xuất, chúng tôi cần lấy dữ liệu từ cảm biến sau mỗi 2 mili giây. Vì vậy, chúng tôi đã sử dụng quy trình dịch vụ ngắt hẹn giờ sẽ kích hoạt một chức năng sau mỗi 2 mili giây.
Luồng mã của chúng tôi trong câu lệnh switch sẽ như thế này:
Trường hợp 1: Đọc ADC
Trường hợp 2: Tính Nhịp tim và IBI
Trường hợp 3: Hiển thị nhịp tim và IBI trên màn hình LCD
Trường hợp 4: IDLE (Không làm gì)
Bên trong chức năng ngắt bộ định thời, chúng ta thay đổi trạng thái của chương trình thành Trường hợp 1: Đọc ADC trên mỗi 2 mili giây.
Vì vậy, trong hàm main , chúng ta đã xác định trạng thái chương trình và tất cả các trường hợp chuyển đổi .
void main () { system_init (); main_state = READ_ADC; while (1) { switch (main_state) { case READ_ADC: { adc_value = ADC_Read (0); // 0 là số kênh main_state = CALCULATE_HEART_BEAT; phá vỡ; } case CALCULATE_HEART_BEAT: { tính_tình_thức (adc_value); main_state = SHOW_HEART_BEAT; phá vỡ; } case SHOW_HEART_BEAT: { if (QS == true) {// Đã tìm thấy nhịp tim // BPM và IBI đã được xác định // Bản thân được định lượng "QS" true khi Arduino tìm thấy nhịp tim QS = false; // đặt lại cờ Tự định lượng cho lần sau // 0.9 được sử dụng để nhận dữ liệu tốt hơn. thực sự không nên sử dụng BPM = BPM * 0.9; IBI = IBI / 0,9; lcd_com (0x80); lcd_puts ("BPM: -"); lcd_print_number (BPM); lcd_com (0xC0); lcd_puts ("IBI: -"); lcd_print_number (IBI); } } main_state = IDLE; phá vỡ; case IDLE: { break; } default: { } } } }
Chúng tôi đang sử dụng hai thiết bị ngoại vi phần cứng của PIC16F877A: Timer0 và ADC.
Bên trong tệp timer0.c, TMR0 = (uint8_t) (tmr0_mask & (256 - (((2 * _XTAL_FREQ) / (256 * 4)) / 1000)));
Tính toán này đang cung cấp ngắt bộ hẹn giờ 2 mili giây. Công thức tính toán là
// TimerCountMax - (((delay (ms) * Focs (hz)) / (PreScale_Val * 4)) / 1000)
Nếu chúng ta thấy hàm timer_isr , nó là-
void timer_isr () { main_state = READ_ADC; }
Trong hàm này, trạng thái chương trình được thay đổi thành READ_ADC sau mỗi 2ms.
Sau đó, hàm CALCULATE_HEART_BEAT được lấy từ mã ví dụ Arduino.
void Calcul_heart_beat (int adc_value) { Signal = adc_value; sampleCounter + = 2; // theo dõi thời gian trong mS với biến này int N = sampleCounter - lastBeatTime; // theo dõi thời gian kể từ nhịp cuối cùng để tránh nhiễu // tìm đỉnh và đáy của sóng xung if (Signal <thresh && N> (IBI / 5) * 3) {// tránh nhiễu lưỡng sắc bằng cách chờ 3/5 của IBI cuối cùng if (Signal <T) {// T là đáy T = Signal; // theo dõi điểm thấp nhất trong sóng xung } } …………. ………………………..
Hơn nữa, mã hoàn chỉnh được đưa ra bên dưới và được giải thích rõ bởi các bình luận. Dữ liệu cảm biến nhịp tim này có thể được tải lên thêm lên đám mây và được theo dõi qua internet từ mọi nơi, do đó nó trở thành hệ thống Theo dõi nhịp tim dựa trên IoT, hãy theo liên kết để tìm hiểu thêm.
Tải xuống tệp hỗ trợ C cho Dự án cảm biến xung PIC này từ đây.