37款傳感器與執行器的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止這37種的。鑒於本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里准備逐一動手嘗試系列實驗,不管成功(程序走通)與否,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百:MAX30102血氧儀手腕心率脈搏檢測心跳傳感器模塊
MAX30102
是一種綜合性脈搏血氧測定法,心率監測模塊。它包括內部LED,光電探測器、光學元件和低噪聲電子設備具有環境光抑制功能。max30102提供了完整的系統解決方案,簡化流程設計適用於移動和可穿戴設備。MAX30102在單個1.8V電源上工作為內部LED提供單獨的5.0V電源。通信通過標准I2c兼容接口。模塊可以通過軟件關閉零備用電流,允許電源軌始終保持通電。
應用
●可穿戴設備
●健身輔助設備
MAX30102的優點和特點
●心率監測器和脈搏血氧計傳感器輸入LED反射溶液
●微型5.6毫米x 3.3毫米x 1.55毫米14針光學模塊
•集成的蓋玻片提供最佳、堅固的
●移動設備超低功率運行
•可編程采樣率和LED電流節電
•低功率心率監測器(<1兆瓦)
•超低停機電流(0.7μA,典型值)
●快速數據輸出能力
•采樣率高
●強大的運動偽影復原能力
•高信噪比
-40°C至+85°C工作溫度范圍
MAX30102手腕心率模塊
有兩個發光二極管,一個光檢測器,優化光學和低噪聲的仿真信號處理,以檢測脈搏血氧飽和度和心臟速率信號。
1、只需要將手指頭緊貼在傳感器上,就能估計 脈搏血氧飽和度(SpO2)及脈搏(相當於心跳)。
2、攜帶氧氣的紅血球能吸收較多紅外光(850-1000nm),未攜帶氧氣的紅血球則是吸收較多的紅光(600-750nm)。
3、因此pulse oximeter就是一個迷你的分光計,利用不同紅血球之吸收光譜的原理,來分析血氧飽和度。
4、這種實時而快速的測量方式,也廣泛被運用在許多臨床的參考。
MAX30102手腕心率模塊電原理圖
經過多方尋找,從一個研究MAX30102算法的程序中找到了一個經過親自驗證有效的實際血氧標定計算公式:
SpO2=-45.060*R*R+ 30.354 *R + 94.845
其中的R可以通過紅光和紅外光光強的對數值計算得到,這個標定表達式實際上是對血氧飽和度的二次曲線擬合,是經過測量得到的。最后終於可以輸出血氧飽和度數據了。
MAX30102手腕心率模塊主要應用
輔助健身設備
智能電話
平板電腦
可穿戴設備
MAX30102的發光部分包括兩個LED,一個是紅光LED(660nm),另一個是紅外光LED(880nm),這個是測量血氧飽和度SPO2最常見的配置。接收部分是一個對可見光和紅外光都敏感的光電二極管,其接收的光強度信號轉換為電流信號,經過環境光消除電路后,最后被自帶的18位ADC進行采樣轉化,至此模擬部分完成。AD轉化后的數字經過數字濾波后儲存在數據寄存器中,最后可通過I2C總線被外接MCU讀取。在硬件上,LED的電源和其他部分的電源不是同一個,因為LED為了保證足夠的出射光強,需要瞬間大電流(最大50ma),這就要求LED的正向電壓足夠大(要求3.1V以上)。而其余的AD轉換和I2C總線部分,為了實現低功耗要求電壓足夠小(要求1.8V),所以傳感器需要兩路獨立的電源。此外,由於LED電源會產生瞬間大電流,所以電源引腳附近要加一個大電容減輕對電源電壓的影響。
傳統的脈搏測量方法主要有三種:一是從心電信號中提取;二是從測量血壓時壓力傳感器測到的波動來計算脈率;三是光電容積法。前兩種方法提取信號都會限制病人的活動,如果長時間使用會增加病人生理和心理上的不舒適感。而光電容積法脈搏測量作為監護測量中最普遍的方法之一,其具有方法簡單、佩戴方便、可靠性高等特點。
光電容積法的基本原理是利用人體組織在血管搏動時造成透光率不同來進行脈搏和血氧飽和度測量的。其使用的傳感器由光源和光電變換器兩部分組成,通過綁帶或夾子固定在病人的手指、手腕或耳垂上。光源一般采用對動脈血中氧合血紅蛋白(HbO2)和去氧血紅蛋白(Hb)有選擇性的特定波長的發光二極管(一般選用660nm附近的紅光和900nm附近的紅外光)。當光束透過人體外周血管,由於動脈搏動充血容積變化導致這束光的透光率發生改變,此時由光電變換器接收經人體組織反射的光線,轉變為電信號並將其放大和輸出。由於脈搏是隨心臟的搏動而周期性變化的信號,動脈血管容積也呈現周期性變化,因此光電變換器的電信號變化周期就是脈搏率。
MAX30102手腕心率模塊實驗接線示意圖
實驗開源代碼
/* 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程) 實驗一百: MAX30102血氧儀手腕心率脈搏檢測心跳傳感器模塊 1、安裝庫:IDE-工具-管理庫-搜索“MAX30105”-安裝 2、項目:串口讀取測量數據 3、連線(I2C): VIN → 3.3V GND → GND SDA 接 A4 SCL 接 A5 */ #include <Wire.h> #include "MAX30105.h" #include "heartRate.h" MAX30105 particleSensor; const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good. byte rates[RATE_SIZE]; //Array of heart rates byte rateSpot = 0; long lastBeat = 0; //Time at which the last beat occurred float beatsPerMinute; int beatAvg; void setup(){ Serial.begin(115200); Serial.println("Initializing..."); // Initialize sensor if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed { Serial.println("MAX30105 was not found. Please check wiring/power. "); while (1); } Serial.println("Place your index finger on the sensor with steady pressure."); particleSensor.setup(); //Configure sensor with default settings particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED } void loop(){ long irValue = particleSensor.getIR(); if (checkForBeat(irValue) == true) { //We sensed a beat! long delta = millis() - lastBeat; lastBeat = millis(); beatsPerMinute = 60 / (delta / 1000.0); if (beatsPerMinute < 255 && beatsPerMinute > 20) { rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array rateSpot %= RATE_SIZE; //Wrap variable //Take average of readings beatAvg = 0; for (byte x = 0 ; x < RATE_SIZE ; x++) beatAvg += rates[x]; beatAvg /= RATE_SIZE; } } Serial.print("IR="); Serial.print(irValue); Serial.print(", BPM="); Serial.print(beatsPerMinute); Serial.print(", Avg BPM="); Serial.print(beatAvg); Serial.println(); delay(1000); }
Initializing...
Place your index finger on the sensor with steady pressure.
正在初始化…
將食指穩定地放在傳感器上。
(初始化后的串口數據-未放上手指)
實驗串口返回情況
模塊電原理圖之二