2016-12-7 21:28:44 [显示全部楼层]
18106浏览
查看: 18106|回复: 15

【心率传感器试用】+奥特曼心率灯

[复制链接]
本帖最后由 nicho 于 2016-12-8 11:01 编辑

【心率传感器试用】+奥特曼心率灯图1

实现的效果如上图.....

@DFRobot @luna
需要的东东
----------------------------
Arduino UNO*1
DF心率传感器*1
RBGLED模块*1
LC12S无线模块*1
【心率传感器试用】+奥特曼心率灯图8

本来打算使用DF的Bluno来实现心率同步的效果的,但困于ble的开发...
于是想到了之前用过的一款性价比极高的无线模块,LC12s某宝有卖
可以实现在同一频道下串口数据透传,那么为什么需要这么一个模块呢
这个项目除了心率的显示之外,还有一个遇到相同心率的人的时候爆闪的功能
Arduino在读取了心率的数据之后,同时会通过LC12s无线模块广播自身的心率值
同时也会接受频道内其他的心率值,遇到数值相同的时候,爆闪,好像挺酷的



1.首先,我们需要一个奥特曼外壳根据RGBLED大小来设计
【心率传感器试用】+奥特曼心率灯图3
大概的外形就是这样了

【心率传感器试用】+奥特曼心率灯图2

开打
【心率传感器试用】+奥特曼心率灯图4

【心率传感器试用】+奥特曼心率灯图5

然后用热熔胶固定一下LED模块就可以了
【心率传感器试用】+奥特曼心率灯图6

刷程序进去看看效果
【心率传感器试用】+奥特曼心率灯图7

视频演示效果(好像看视频没什么特别的饿...呃...紧张的那部分因为没有去跑步,改了一点数值来拍视频的....)
心率传感器的库里面的关于无效数值的这部分有时候会奇怪,而且模块要放在手上一段时间才会出数据,并且剧烈抖动的时候会比较不准
实际使用的时候,驱动可以自己写,或者直接读取模拟量,至于数值误差这部分,可以根据项目的需要进行过滤


【心率传感器试用】+奥特曼心率灯图9
【心率传感器试用】+奥特曼心率灯图10

下面的代码是常规写法的DIGITAL_MODE

[mw_shl_code=c,true]#define heartratePin A1
#define        LED_R        9
#define        LED_G        10
#define        LED_B        11
#define        LC12s_init_pin        5
#include "DFRobot_Heartrate.h"

DFRobot_Heartrate heartrate(DIGITAL_MODE); ///< ANALOG_MODE or DIGITAL_MODE
char inputString;         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete

void setup() {
        pinMode(LED_R, OUTPUT);
        pinMode(LED_G, OUTPUT);
        pinMode(LED_B, OUTPUT);
        pinMode(LC12s_init_pin, OUTPUT);
        digitalWrite(LED_G, LOW);               
        digitalWrite(LED_R, LOW);
        digitalWrite(LED_B, LOW);
        digitalWrite(LC12s_init_pin, HIGH);
    Serial.begin(9600);
    // reserve 200 bytes for the inputString:
    //inputString.reserve(200);
    delay(500);
    LC12s();//无线模块初始化

}

void loop() {
  
  uint8_t rateValue;
  heartrate.getValue(heartratePin); ///< A1 foot sampled values
  rateValue = heartrate.getRate(); ///< Get heart rate value
  if(rateValue)  {
    Serial.println(rateValue);
    //rateValue分级
    LEDMode(rateJudge(rateValue));
    delay(20);
  }

  if (inputString==rateValue)
  {//遇到相同频率的心跳信号的时候执行
          LEDMode(5);
  }
  

}

int LC12s()
{//初始化LC12s模块
        char initCode[] = {0xAA,0X5A,0X22,0X33,0X11,0X21,0X00,0X00,0X00,0X04,0X00,0X64,0X00,0X00,0X00,0X12,0X00,0X05};
        digitalWrite(LC12s_init_pin, LOW);//拉低set引脚进行组网操作
        delay(100);
        for(int i=0; i<17; i++){
            Serial.print(initCode);
        }
        delay(100);
        digitalWrite(LC12s_init_pin, HIGH);
        delay(500);
}



void LEDMode(int rateLevel)
{
        switch (rateLevel) {
            case 0:
              // do something        
                  digitalWrite(LED_R, LOW);
                  digitalWrite(LED_B, LOW);
              digitalWrite(LED_G, HIGH);//green
              break;
            case 1:
              // do something
              digitalWrite(LED_G, LOW);               
              digitalWrite(LED_R, LOW);
              for(int i=0;i<5;i++)
              {
              for(int i=0;i<255;i++)
                  {
                     analogWrite(LED_B, i);
                     delay(10);
                  }
                  for(int i=255;i>0;i--)
                  {
                     analogWrite(LED_B, i);
                     delay(10);
                  }}
              break;
            case 2:
              // do something               
                  digitalWrite(LED_R, LOW);
              //digitalWrite(LED_B, HIGH);
              //digitalWrite(LED_G, HIGH);//bule&green
              for(int i=0;i<5;i++)
              {
              for(int i=0;i<255;i++)
                  {
                     analogWrite(LED_B, i);
                     analogWrite(LED_G, i);
                     delay(3);
                  }
                  for(int i=255;i>0;i--)
                  {
                     analogWrite(LED_B, i);
                     analogWrite(LED_G, i);
                     delay(3);
                  }}
              break;
            case 3:
              // do something
              digitalWrite(LED_G, LOW);               
                  digitalWrite(LED_B, LOW);
              //digitalWrite(LED_R, HIGH);//red
              for(int i=0;i<5;i++)
              {
              for(int i=0;i<255;i++)
                  {
                     analogWrite(LED_R, i);
                     delay(1);
                  }
                  for(int i=255;i>0;i--)
                  {
                     analogWrite(LED_R, i);
                     delay(1);
                  }}
              break;
            case 4:
              // do something
              break;
            case 5:
              //当遇到心跳频率一样的信号的时候执行
              for(int i=0; i<5 ; i++){
                      for(int i=0;i<255;i++)
                          {
                             analogWrite(LED_R, i);
                             analogWrite(LED_G, i);
                             delay(1);
                          }
                          for(int i=255;i>0;i--)
                          {
                             analogWrite(LED_R, i);
                             analogWrite(LED_G, i);
                             delay(1);
                          }
                        }
              break;
            default:
              // do something
              break;
        }
        
}

int rateJudge(int rateVal)
{//心跳频率分级
        if(rateVal<=30){
                return        0;
        }
        if(rateVal>30&&rateVal<60){
            return        1;
        }
        if(rateVal>=60&&rateVal<=80){
                return        2;            
        }
        if(rateVal>80&&rateVal<=110){
                return  3;            
        }
        if(rateVal>110&&rateVal<=130){
            return        4;
        }
        else
        {
                return -1;
        }
}

/*
  SerialEvent occurs whenever a new data comes in the
hardware serial RX.  This routine is run between each
time loop() runs, so using delay inside loop can delay
response.  Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
    //the data was save at (inputstring(included "\n"))
  }
}


[/mw_shl_code]
下载附件DFRobot_Heartrate-master.zip
下载附件DFRobot_Heartrate-master.zip
下载附件一个简单的模型.rar








hnyzcj  版主

发表于 2016-12-7 21:34:39

:lol
回复

使用道具 举报

luna  初级技神

发表于 2016-12-8 10:08:18

脑补了一下你穿着奥特曼的战衣出来的画面哈哈哈~~

【心率传感器试用】+奥特曼心率灯图1
回复

使用道具 举报

安卓机器人  中级技神

发表于 2016-12-8 10:35:19

电子感应~~~很有启发~~~
回复

使用道具 举报

源代码  中级技匠

发表于 2016-12-8 11:22:55

酷!酷!!
回复

使用道具 举报

dsweiliang  初级技神

发表于 2016-12-8 16:36:00

奥特曼没电了
回复

使用道具 举报

Grey  中级技匠

发表于 2016-12-21 10:30:49

这个有点惊喜的!
回复

使用道具 举报

gray6666  初级技神

发表于 2016-12-24 20:31:54

孩子看了很兴奋
回复

使用道具 举报

Xpimach  见习技师

发表于 2017-1-5 14:27:22

哈哈,挺有趣的
回复

使用道具 举报

Xpimach  见习技师

发表于 2017-1-5 14:27:35

赞几个
回复

使用道具 举报

Xpimach  见习技师

发表于 2017-1-5 14:27:50

再顶一个
回复

使用道具 举报

砖头墙  初级技师

发表于 2017-1-6 21:17:35

叼                       牛                       厉害
回复

使用道具 举报

凌风清羽  中级技匠

发表于 2017-1-27 14:24:42

距离上次试用好遥远了,找时间在申请一把试用,哈哈~~~~~~~
回复

使用道具 举报

随便看看  学徒

发表于 2017-3-12 11:15:54

大神一般的大人
回复

使用道具 举报

面包板  初级技匠

发表于 2017-3-29 22:41:37

会3D打印真好
回复

使用道具 举报

大海986  初级技师

发表于 2023-11-2 13:51:16

真好!能帮忙做一个[url=https://mc.dfrobot.com.cn/thread-317177-1-1.html][color=Green]关键时刻可救人一命的可穿戴臂环式水上智能自救机器人(可提供项目方案、CAD模型、电路图、编程等资料)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail