|
|
第41行: |
第41行: |
| *接法 | | *接法 |
| **本传感器可连接到核心的以下接口:'''D2~D13''' | | **本传感器可连接到核心的以下接口:'''D2~D13''' |
| + | |
| + | ==文档== |
| + | *原理图:'''[[File: Microduino_Pulse.Zip]]''' |
| + | *Touch Button datasheet:'''[[File: Microduino_Sensor-Pulse datasheet.pdf]]''' |
| | | |
| ==开发== | | ==开发== |
− | ===设备=== | + | ===程序下载=== |
− | {|class="wikitable"
| + | *下载并解压程序'''[[File:Microduino_Sensor-Touch Pulse_Test.zip]]''' |
− | |-
| |
− | |模块||数量||功能
| |
− | |-
| |
− | |[[mCookie-CoreUSB/zh]]||1||核心板
| |
− | |-
| |
− | |[[mCookie-Hub/zh]]||1||传感器转接板
| |
− | |-
| |
− | |[[Microduino Sensor-Pulse/zh]]||1||心率传感器模块
| |
− | |}
| |
− | | |
− | *其他硬件设备
| |
− | **USB数据连接线 一根
| |
− | | |
− | ===准备===
| |
− | *Setup 1:将心率传感器和Hub的A0接起来。 | |
− | [[file:mCookie-pulse-sensor.JPG|600px|center]] | |
− | *Setup 2:将CoreUSB,Hub,pulse连接在一起。通过USB数据线将接入电脑。
| |
− | [[file:mCookie-pir-pc.JPG|600px|center]]
| |
− | | |
− | ===实验:检测心率跳动===
| |
− | *打开Arduino IDE,将下列代码复制到IDE中。
| |
− | <source lang="cpp">
| |
− | #define PIN A0
| |
| | | |
− | unsigned long time0;
| + | ===程序烧写=== |
− | unsigned long time_cache0;
| + | {{Upload |
− | bool sta = false, sta_cache = true;
| + | |nameA=[[Microduino-Core/zh]]、[[Microduino-USBTTL/zh]] |
− | unsigned long getTime0() {
| + | |nameB=[[Microduino-USBTTL/zh]] |
− | sta_cache = sta;
| + | |boardName=Microduino/mCookie-Core(328p)、Atmega328P@16M,5V |
− | sta = digitalRead(PIN);
| + | |fileName=Microduino_Sensor-Touch Pulse_Test.ino |
− | delayMicroseconds(200);
| + | }} |
− | if (sta == HIGH && sta_cache == LOW) {
| |
− | time_cache0 = time0;
| |
− | time0 = millis();
| |
− | return (time0 - time_cache0);
| |
− | }
| |
− | else {
| |
− | return 0;
| |
− | }
| |
− | } | |
| | | |
− | #define time1_MAX 200
| + | ===硬件搭建=== |
− | #define time1_MIN 50 //过快的波
| + | *参考下图将Sensor-Crash传感器连接'''[[Microduino-Sensorhub/zh]]'''的数字口D6。 |
| + | <br> |
| + | [[file:Microduino-sensorhub_Crash.JPG|thumb|400px|left]] |
| + | <br style="clear: left"/> |
| | | |
− | unsigned long time1;
| + | ===效果观察=== |
− | unsigned long time1_cache;
| + | *下载完毕后,打开串口监视器。 |
− | boolean time1_sta_error = false;
| |
− | unsigned long getTime1(unsigned long _t) {
| |
− | time1_cache = _t;
| |
− | if (time1_cache) { //有数据时才执行滤波
| |
− | if (time1_cache < time1_MAX) { //滤最小阈值
| |
− | if (time1_cache < time1_MIN) { //若有过快的波,开启标志位
| |
− | // Serial.println("make");
| |
− | time1_sta_error = true;
| |
− | }
| |
− | return 0;
| |
− | }
| |
− | else {
| |
− | // Serial.print(".");
| |
− | if (time1_sta_error) { //如果被标志 则本次波形无效
| |
− | // Serial.println("make done");
| |
− | time1_sta_error = false;
| |
− | return 0;
| |
− | }
| |
− | return time1_cache;
| |
− | }
| |
− | }
| |
− | else {
| |
− | return 0;
| |
− | }
| |
− | }
| |
− | | |
− | #define pulse_MIN 40
| |
− | #define pulse_MAX 180
| |
− | #define pulse_UPDATA 5
| |
− | int pulse_num = 0;
| |
− | unsigned long pulse_vol = 0;
| |
− | unsigned long pulse_cache = 0;
| |
− | unsigned long pulse(unsigned long _t) {
| |
− | if (_t) {
| |
− | unsigned long _pulse_vol = 60000 / _t;
| |
− | // Serial.print("_pulse_vol:");
| |
− | // Serial.println(_pulse_vol);
| |
− | if ((_pulse_vol > pulse_MIN) && (_pulse_vol < pulse_MAX)) {
| |
− | pulse_vol += _pulse_vol;
| |
− | pulse_num++;
| |
− | if (pulse_num > (pulse_UPDATA - 1)) {
| |
− | // Serial.println("OUTPUT");
| |
− | unsigned long _pulse = pulse_vol / pulse_UPDATA;
| |
− | pulse_num = 0;
| |
− | pulse_vol = 0;
| |
− | pulse_cache = _pulse;
| |
− | return _pulse;
| |
− | }
| |
− | else {
| |
− | return pulse_cache;
| |
− | }
| |
− | }
| |
− | else {
| |
− | pulse_num = 0;
| |
− | pulse_vol = 0;
| |
− | return 0;
| |
− | }
| |
− | }
| |
− | else {
| |
− | return 0;
| |
− | }
| |
− | }
| |
− | | |
− | | |
− | // the setup routine runs once when you press reset:
| |
− | void setup() {
| |
− | // initialize serial communication at 9600 bits per second:
| |
− | pinMode(A0, INPUT);
| |
− | Serial.begin(9600);
| |
− | | |
− | Serial.println("hello");
| |
− | }
| |
− | | |
− | // the loop routine runs over and over again forever:
| |
− | void loop() {
| |
− | // print out the value you read:
| |
− | // Serial.print("t0:");
| |
− | // Serial.print(digitalRead(A0) * 2000);
| |
− | long p0 = getTime0();
| |
− | long p1 = getTime1(p0);
| |
− | long p2 = pulse(p1);
| |
− | if (p0) {
| |
− | Serial.print(millis() / 1000);
| |
− | Serial.print(",");
| |
− | Serial.print(p0);
| |
− | Serial.print(",");
| |
− | Serial.print(p1);
| |
− | Serial.print(",");
| |
− | Serial.print(p2);
| |
− | Serial.println();
| |
− | }
| |
− | // delay(3); // delay in between reads for stability
| |
− | }
| |
− | </source>
| |
− | *在Arduino IDE的工具(Tools)→端口(Serial Port)里面选择正确的端口号。 | |
− | [[file:upload.JPG|600px|center]]
| |
− | *编译完成后直接下载程序。
| |
− | *下载完毕你可以打开串口监视器,显示的提示即反应了当前传感器检测的状态。
| |
− | *结果
| |
− | 心率传感器会检测到由于心脏的跳动而引起指尖的血液变化情况,将一些不稳定的情况通过算法滤掉,从而得到一个较准确的值。
| |
− | | |
− | ===程序调试===
| |
| | | |
| + | *心率传感器会检测到由于心脏的跳动而引起指尖的血液变化情况,将一些不稳定的情况通过算法滤掉,从而得到一个较准确的值。 |
| | | |
| ==应用== | | ==应用== |
第200行: |
第74行: |
| | | |
| ===项目=== | | ===项目=== |
− | | + | [https://forum.microduino.cn/topic/259/microduino%E5%BF%83%E8%B7%B3%E6%A8%A1%E5%9D%97%E4%B8%AD%E6%96%AD%E6%B3%95%E6%B5%8B%E9%87%8F%E4%B8%A4%E5%88%99%E7%AE%80%E4%BB%8B 心跳模块中断法测量] |
| | | |
| | | |