nicho 发表于 2016-12-7 21:28:44

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

本帖最后由 nicho 于 2016-12-8 11:01 编辑



实现的效果如上图.....
{:5_174:}
@DFRobot @luna
需要的东东
----------------------------
Arduino UNO*1
DF心率传感器*1
RBGLED模块*1
LC12S无线模块*1


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


1.首先,我们需要一个奥特曼外壳根据RGBLED大小来设计

大概的外形就是这样了


开打




然后用热熔胶固定一下LED模块就可以了


刷程序进去看看效果


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



下面的代码是常规写法的DIGITAL_MODE
{:5_199:}
#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){
                return3;            
      }
      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"))
}
}














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

:lol

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

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


安卓机器人 发表于 2016-12-8 10:35:19

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

源代码 发表于 2016-12-8 11:22:55

{:5_161:}酷!酷!!

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

真好!能帮忙做一个关键时刻可救人一命的可穿戴臂环式水上智能自救机器人(可提供项目方案、CAD模型、电路图、编程等资料)。
页: [1]
查看完整版本: 【心率传感器试用】+奥特曼心率灯