資料介紹
描述
多年來,我只是想用 LED 做一些能隨著我的心跳而閃爍的東西(不僅是當(dāng)我完全靜止不動(dòng),但有時(shí)會(huì)時(shí)不時(shí)地跳一下)。事實(shí)證明這出奇地困難,我嘗試了很多年但都失敗了。但現(xiàn)在不是了!
實(shí)際上,所有繁重的工作都是由uECG完成的——一種小型可穿戴 ECG 設(shè)備,它是開源的,并且有一個(gè) Arduino 友好的輸出引腳(該引腳隨著每次心跳而變高/變低)。處理這些引腳狀態(tài)比處理 ECG 信號(hào)要容易得多,而且我已經(jīng)盡力從中獲得最大收益。
UPD:你可能想檢查這個(gè)項(xiàng)目的第二次迭代,它通過無線電鏈路接收數(shù)據(jù)。
1. 原理圖
由于我們這里只使用數(shù)字信號(hào),所以非常簡單。但作為可穿戴設(shè)備,如果大多數(shù)連接都是焊接的,它會(huì)更可靠(也更?。獙?duì)于快速測試來說,沒有必要這樣做,但如果你打算在一些繁重的活動(dòng)中佩戴它,我強(qiáng)烈建議這樣做。
示意圖如下所示:
![pYYBAGPi-FWAdnl0AAFSlvJRmHM499.png](https://file.elecfans.com/web2/M00/8F/8B/pYYBAGPi-FWAdnl0AAFSlvJRmHM499.png)
- LED 環(huán)的 DI 引腳連接到引腳 D11(可在代碼中配置)
- uECG 設(shè)備的 DRV 引腳連接到引腳 D3(也可配置)
- 電池的 + 連接到 Arduino 5V 和 LED 環(huán)形 5V 輸入
- 電池 - 連接到 Arduino GND、環(huán)形 GND 和 uECG 的 GND
我直接使用 LiPo 電池作為 5V 輸入 - 沒有錯(cuò)誤,如果你將它連接到 Vin - 它不會(huì)可靠地工作(Vin 上的穩(wěn)壓器會(huì)引入電壓降,我們在這里絕對(duì)買不起)。問題是,只要輸入電壓不低于 3.4 伏,Arduino 就是穩(wěn)定的。LiPo 電池在充滿電時(shí)的起始電壓為 4.2 伏,僅當(dāng)剩余電量少于 15% 時(shí)才達(dá)到 3.4 伏。因此,對(duì)于任何大于 ~200 mAh 的電池,您可以獲得不錯(cuò)的運(yùn)行時(shí)間。除此之外,請記住電池應(yīng)該通過一些連接器連接 :) 因?yàn)槟阆雽⑺鼜脑韴D上斷開并偶爾充電一次。
2. 代碼
該程序以一種簡單的方式工作:它不斷讀取 D3 引腳,并在檢測到變化時(shí) - 將該變化的時(shí)間推入 20 元素?cái)?shù)組。第一個(gè)和最后一個(gè)元素之間的差值除以 20,即為每次節(jié)拍的平均時(shí)間(以毫秒為單位)。因此,將 1 分鐘(60000 毫秒)除以該數(shù)字即可得出 BPM 值。您可以調(diào)整數(shù)組中的元素?cái)?shù)量。較少數(shù)量的元素會(huì)導(dǎo)致更快的響應(yīng),但結(jié)果不太穩(wěn)定(節(jié)拍檢測中的任何問題都會(huì)導(dǎo)致計(jì)算出的 BPM 大幅跳躍)。更多的元素會(huì)提供更穩(wěn)定的數(shù)據(jù),但當(dāng) BPM 快速變化時(shí)響應(yīng)更慢。
然后將 BPM 映射到顏色(當(dāng) BPM 從低到高時(shí),藍(lán)色->綠色->黃色->粉紅色->紅色),并映射到 LED 的數(shù)量:80 BPM 八段亮起,110 - 11 等等(比例也可在代碼中調(diào)整)。
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
// DI pin of LED ring
#define PIN 11
// number of pixels in the ring
#define NUMPIXELS 16
// input pin for connecting uECG
int in_pin = 3;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin(); // This initializes the NeoPixel library.
pinMode(in_pin, INPUT); //set pin to input mode
digitalWrite(in_pin, 1); //enable PULLUP: this is critical, uECG doesn't have internal pull-up
}
//we store last 20 heartbeats to averge BPM over them
//with higher value, it will become more reliable,
//but it will take more time to see output change when BPM changes
#define BEAT_HIST 20
long beats[BEAT_HIST];
void push_beat(long ms) //shift all beats in array and insert current one
{
for(int x = 0; x < BEAT_HIST-1; x++)
{
beats[x] = beats[x+1];
}
beats[BEAT_HIST-1] = ms;
}
int get_bpm() //using time difference between first and last beats
{
long dt = beats[BEAT_HIST-1] - beats[0];
long bpm = BEAT_HIST * 60000 / dt;
return bpm;
}
long last_pix_upd = 0; //to keep track of when we updated pixels previous time
int prev_in_state = 0; //previous state of input pin: we want to process only changes of state
void loop()
{
long ms = millis();
int in_state = digitalRead(in_pin); //1 when no beat detected, 0 in beat
if(in_state == 1 && prev_in_state == 0) //react only to change
{
push_beat(ms);
}
prev_in_state = in_state;
if(ms - last_pix_upd > 10) //don't update pixels too often
{
int r, g, b;
last_pix_upd = ms;
int bpm = get_bpm();
int max_bright = 120; //value of maximum brightness, max 255. But you don't always want it at max :)
float dd = 20; //change in BPM between color tones (blue->green->yellow->pink->red)
float t1 = 90, t2, t3, t4; //t1 - "base" BPM, lower than t1 would be blue
t2 = t1 + dd;
t3 = t2 + dd;
t4 = t3 + dd;
//code for changing color depending in which t1...t4 range we are now
if(bpm < t1){ r = 0; g = 0; b = max_bright; }
else if(bpm < t2) { r = 0; g = max_bright * (bpm-t1)/dd; b = max_bright - g; }
else if(bpm < t3) { r = max_bright * (bpm-t2)/dd; g = max_bright - r; b = r/4; }
else if(bpm < t4) { r = max_bright; g = 0; b = max_bright/2 - max_bright * (bpm-t3)/(2*dd); }
else {r = max_bright; g = 0; b = 0; }
if(in_state) //when not in beat, 1/4 intensity, so only beats are highlighted
{
r *= 0.25;
g *= 0.25;
b *= 0.25;
}
int on_pixels = (bpm+5)/10; //number of used LEDs: for 60 BPM, 6 LEDs will be on, for 120 - 12 etc
for(int i=0;i<NUMPIXELS;i++)
{
if(i < on_pixels) pixels.setPixelColor(i, pixels.Color(r,g,b));
else pixels.setPixelColor(i, pixels.Color(0,0,0)); //turn off all other LEDs
}
pixels.show();
}
}
3. 組裝成可穿戴設(shè)備
將 Arduino 放在環(huán)內(nèi)很方便 - 它的尺寸幾乎完美匹配。電池也適合附近。不要忘記 uECG 是放在胸部上的——因此您需要一根帶連接器的電線,首先放置它,然后穿上帶有其他組件的襯衫,然后插入連接器。否則戴上它真的很不方便-相信我,我試過了))
![pYYBAGPi-ImAJ5blAAlxQ5SW6zs489.jpg](https://file.elecfans.com/web2/M00/8F/8C/pYYBAGPi-ImAJ5blAAlxQ5SW6zs489.jpg)
![poYBAGPi-I2AIfaqAAF3Ff8hFR4918.jpg](https://file.elecfans.com/web2/M00/8F/07/poYBAGPi-I2AIfaqAAF3Ff8hFR4918.jpg)
基本上就是這樣 - 如果一切都正確完成,在您插入所有連接器后的 30 秒內(nèi),它將開始閃爍并指示 BPM。
4. 現(xiàn)場測試
我在步行和跑步時(shí)對(duì)其進(jìn)行了測試 - 發(fā)現(xiàn)在跑步過程中,電池會(huì)在 ECG 傳感器上方反彈,從而扭曲其讀數(shù)。當(dāng)我稍微移動(dòng)它時(shí),結(jié)果發(fā)現(xiàn)連接 uECG 和 Arduino 的電線太短,每一步都會(huì)拉動(dòng) ECG 傳感器,再次扭曲讀數(shù)。總的來說,我只有在行走和站立時(shí)才能獲得可靠的節(jié)拍,但在跑步時(shí)卻不行——但我認(rèn)為我會(huì)改進(jìn)這一點(diǎn)。傳感器本身,當(dāng)我將它與不同的襯衫一起使用時(shí),在運(yùn)行期間也能正確顯示 BPM(通過其應(yīng)用程序檢查)。
此外,事實(shí)證明,胸部上的 LED 看起來很酷,但實(shí)際上毫無用處。低頭看脈真的很不方便。我想在下一次迭代中,我會(huì)制作某種可以指示節(jié)拍的腕帶。
PS 如果你對(duì) uECG 項(xiàng)目感興趣——你可以查看它的hackaday 頁面,那里有很多技術(shù)細(xì)節(jié)、PCB 設(shè)計(jì)、討論和項(xiàng)目日志
- 簡易物聯(lián)網(wǎng)漏水指示器
- 使用HTML和JavaScript設(shè)計(jì)指示器按鈕
- 水位指示器開源分享
- EUFORIS的水位指示器
- Learnelectronics低壓指示器開源
- 水位指示器開源項(xiàng)目
- 暫態(tài)錄波型故障指示器技術(shù)規(guī)范 6次下載
- 電平指示器的應(yīng)用實(shí)驗(yàn)電路原理圖免費(fèi)下載 29次下載
- 電池正常—欠壓指示器電路原理圖免費(fèi)下載 34次下載
- 電池欠壓指示器電路原理圖免費(fèi)下載 13次下載
- PIC16系列器件的內(nèi)部溫度指示器的簡介,使用和校準(zhǔn)詳細(xì)資料概述
- TMS320VC5509A(GHH指示器)的ORCAD符號(hào)的詳細(xì)資料概述 9次下載
- 內(nèi)部溫度指示器的使用與校準(zhǔn) 12次下載
- 故障指示器故障判定 9次下載
- LM324運(yùn)放制作電平指示器 296次下載
- 線路故障指示器為什么變成紅色 517次閱讀
- 內(nèi)置超級(jí)電容模塊的故障指示器有哪些特性? 491次閱讀
- 水位指示器電路圖分享 4973次閱讀
- 典型指示器電路圖分享 1473次閱讀
- 電池電量指示器電路圖分享 9737次閱讀
- 對(duì)稱電源平衡指示器電路原理圖 977次閱讀
- 分享一個(gè)水位指示器電路 1039次閱讀
- 節(jié)拍頻率指示器電路分享 949次閱讀
- 如何構(gòu)建一個(gè)信箱開路指示器電路 855次閱讀
- 簡單易用的電源就緒指示器可檢測欠壓和過壓 2781次閱讀
- 一個(gè)獨(dú)特的水位指示器電路 2343次閱讀
- LED溫度指示器電路圖分析 2331次閱讀
- 閃爍指示器電路圖 6273次閱讀
- 倒帶終止指示器電路圖講解 2832次閱讀
- 相序指示器原理_相序指示器的相序檢測工作原理_三相交流電相序檢測原理 3.7w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論