第1部分:
用Raspberry Pi Zero和羅姆SensorMedal製作健康管理設備!
第2部分:
根據感測器的值計算步數、距離和卡路里,並將資料發送到LINE!
大家好,我是吉田!
本文是製作旨在解決運動不足問題的健康管理設備專案的第三部分。這次我們將使用脈搏感測器來測量心率並將測量資料用於健康管理。
由於測量生物資訊非常容易,因此可以讓這些資訊有很多用處。
本部分所需零件
Raspberry Pi Zero W
心率感測器
NeoPixel LED燈帶
本部分的流程
1. 脈搏感測器及其使用方法
這次我決定使用脈搏感測器來測量運動時的心率。脈搏感測器是用來測量隨著心臟跳動和泵血而增加或減少的血管體積變化的設備。這種感測器配有LED和資料接收IC,透過使LED光照指尖,可以檢測從血管返回的光線情況。
首先,需要準備脈搏感測器和 Raspberry Pi Zero。
這個脈搏感測器與Raspberry Pi等相連接的引腳是Grove引腳(四個連接引腳組合在一起的引腳)。根據線纜顏色分別與Raspberry Pi的GND(黑色)和3.3V電源(紅色)連接。作為GPIO,將黃色引腳部分與GPIO12相連接。
現在讓我們編寫一個程式來使這個脈搏感測器工作。當heart.py能像下面這樣獲得20秒的心率時,表明已經能夠開始測量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
pi@raspizero:~/Programs $ sudo vi heart.py --- #!/usr/bin/env python import time from collections import deque import RPi.GPIO as GPIO class HeartRateMonitor: INTERRUPT_PIN = 12 MAX_DETECTED_TIMES_COUNT = 20 MAX_PULSE_INTERVAL = 2.0 def __init__(self): GPIO.setmode(GPIO.BCM) GPIO.setup(self.INTERRUPT_PIN, GPIO.IN) self._init_array() def _init_array(self): self.detected_times = deque([]) def _calc_heart_rate(self): return 1200.0 / (self.detected_times[-1] - self.detected_times[0]) def _interrupt(self): self.detected_times.append(time.time()) if(len(self.detected_times) == 1): return interval = self.detected_times[-1] - self.detected_times[-2] heart_rate = -1 if interval > self.MAX_PULSE_INTERVAL: print('Heart rate measure error. Monitoring will restart!') self._init_array() return if(len(self.detected_times) >= self.MAX_DETECTED_TIMES_COUNT): heart_rate = self._calc_heart_rate() self.detected_times.popleft() print("HeartRate: {heart_rate}, Interval: {interval}".format(heart_rate = heart_rate, interval = interval)) def execute(self): print('Please ready your heart rate monitor.') time.sleep(3) while True: GPIO.wait_for_edge(self.INTERRUPT_PIN, GPIO.RISING) self._interrupt() if __name__ == '__main__': monitor = HeartRateMonitor() monitor.execute() |
下面我們用夾子夾住指尖,測量一下心率吧。
運行程式並確認是否可以準確測量20秒左右的心率,確認可以後,即可顯示59 BPS(每秒心率)或60 BPS等數據。
2. 根據心率和活動量點亮LED燈
確認能夠測量心率後,我們需要連接LED並用光的顏色來顯示相應的測量結果。如果心率過快,可能會收到警報。
這一次,我將使用名為“NeoPixel”的彩色LED燈帶。這是一種接有多個LED的帶狀燈,您可以將其切割成任何您喜歡的尺寸來使用。這次我根據Raspberry Pi Zero的大小切割成了具有3個LED的燈帶。
這種帶狀LED燈具有+5V、Din和GND引腳,分別與Raspberry Pi的5V、GPIO21和GND連接。
有關如何使用NeoPixel的詳細介紹,可以參閱下面的Adafruit頁面,並可以從中獲取以下庫和示例程式。
在示例程式中,由於與GPIO21連接而設置為“pixel_pin = board.D21”,由於LED的數量為3而設置為“num_pixels = 3”。
1 2 3 |
pi@raspizero:~/ $ sudo pip3 install adafruit-circuitpython-neopixel pi@raspizero:~/ $ sudo wget https://learn.adafruit.com/pages/10683/elements/3005652/download -O neopixels.py pi@raspizero:~/ $ sudo python3 neopixels.py |
運行該示例程式,LED發出七種顏色的光。
為了使LED與心率聯動,我們在前面的heart.py程式中添加以下描述,創建heart_pixels.py程式。下面的黃色部分是在原來的heart.py程式中添加NeoPixel代碼的部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#!/usr/bin/env python #coding: utf-8 import board import neopixel pixel_pin = board.D21 num_pixels = 3 ORDER = neopixel.GRB pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER) normal_rate= 60 high_rate = 100 import time from collections import deque … print("HeartRate: {heart_rate}, Interval: {interval}".format(heart_rate = heart_rate, interval = interval)) if heart_rate > high_rate: pixels.fill((255,0,0)) pixels.show() time.sleep(0.1) elif heart_rate > normal_rate: pixels.fill((0,255,0)) pixels.show() time.sleep(0.5) elif heart_rate > 0: pixels.fill((0,0,255)) pixels.show() time.sleep(0.5) else: pixels.fill((255,255,255)) pixels.show() pixels.fill((0,0,0)) pixels.show() def execute(self): ... |
當heart_pixels.py這個程式運行時,LED先是白色光閃爍,當心率超過一定水準(這裡設置為100)時,會發出紅色光並發出警報。
如果心率在60以上100以下,綠色燈閃爍。如果心率超過100,則會發出紅色光和警報。
3. 讓SensorMedal也同時運行
現在,讓我們嘗試讓SensorMedal也可以同時運行。
為此,需要創建如下所示的shell腳本 (ble_steps_heart.sh)。nohup和&之間的部分將在後臺運行。
1 2 3 |
#!/bin/bash nohup sudo python3 /home/pi/Programs/heart_pixels.py & sudo python3 /home/pi/Programs/ble_steps_line.py |
下麵,像“.ble_steps_heart.sh”一樣運行程式,即可測量兩者的值。
LED燈帶會根據心率值發光,SensorMedal的數值還可以上傳到LINE等系統。
將其做成手錶式設備,將脈搏感測器戴在手指上並拿著SensorMedal,即可幫助您進行一天的健康管理了。
4. 總結
在這部分中,我們嘗試了使用脈搏感測器來測量日常生活中的脈搏和心率。透過這部分的介紹,我想您應該已經可以使用Raspberry Pi輕鬆獲取生物資訊並進行查看了。
此外,在這部分中,我們還瞭解了可以同時運行SensorMedal並上傳其測量結果。能夠測量步數和心率,這個作品已經越來越像健康管理設備了。
在下一部分中,我想把現有的計步器和心率監測儀功能結合起來,完成更這款像可穿戴設備的作品。
敬請期待!
相關連載一覽
第1部分:
用Raspberry Pi Zero和羅姆SensorMedal製作健康管理設備!
第2部分:
根據感測器的值計算步數、距離和卡路里,並將資料發送到LINE!
第3部分:一款用Raspberry Pi和感測器製作的可穿戴式小型健康管理設備!(本章)
第4部分:
連接顯示器並完成這款可穿戴式健康管理設備!