基于Arduino单片机的可穿戴监护通讯设备-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9591|回复: 4

[项目] 基于Arduino单片机的可穿戴监护通讯设备

[复制链接]
发表于 2017-10-1 16:00 | 显示全部楼层 |阅读模式
本帖最后由 molu 于 2017-10-1 16:12 编辑

这个项目是我参加青少年科技创新大赛的设计作品,
Github :https://github.com/lollipopi/Wearable-smart-hat/
论文如下:
基于Arduino单片机的可穿戴监护通讯设备

摘要:该项目以Arduino单片机为主控芯片,通过传感器进行数据采集传至单片机处理并通过LCD显示;GSM芯片实现通话,短信,蓝牙,GPRS等通讯功能;各类传感器采集各种环境或人体数据;并有一键紧急求救功能。最终搭建语音报警,通讯,监护一体设备。
所有模块将组建为一个功能完善,扩展性高的全方位可穿戴监护通讯系统。具有使用方便,实用性高,获取信息多等优点。未来将实现远程数据获取功能。
关键词:Arduino;可穿戴;监护;通讯;传感器;

1 引言
  中国现处于快速老龄化阶段,意味着中国即将步入老龄社会。预计到2050年左右,老年人口将达到全国人口的三分之一。老人在外因突发疾病无及时急救未能挽回生命的案例经常发生。这背后反映了中国的相关产业未能跟进式发展,仍存在短板,缺少相关配套的解决方案。老年人在外安全已成为严峻问题
随着信息化时代的到来,可穿戴设备和物联网技术目前已成为当今发展的主流方向。万物互联改变人类生活方式,物联网设备也逐步走向轻量化,自动化和智能化。

2 项目概况
2.1 总体结构
主控端为2层,上接传感器扩展板,将各模块连接至扩展板引脚。GSM通讯模块接至TX,RX引脚,插入Micro-SIM卡,用来实现通讯功能。电容式开关实现一键报警功能,即轻触LCD旁开关即可触发。单片机将拨打应急电话和发送应急短信,并伴有警报声。耳机用来播放普通话女声提示(TTS)及通话;蜂鸣器用于各类应急报警提示;继电器用于GSM模块与开发板间,保证GSM模块未开机时与单片机独立;配有舵机可实现180°云台,用于火焰传感器监测;手指或耳垂接触心率传感器即可进行心率数据采集并绘制心率动态曲线;DHT11将采集温湿度数据;超声波传感器用于测量距前方物体距离;红外传感器用于监测体温;可燃气体传感器用于报警功能。
部分元件采用独立稳压电源模块供电,移动电源输入。避免电压过低影响元件性能,同时使用电压表头测量电源模块输入电压避免过压或低压保护设备。

2.2 作品功能

1.
1) 温度实时测定;
2) 湿度实时测定;
3) 人体脉搏实时测定;
4) 人体心率波动曲线;
5) 传感器数据LCD实时显示;

2.
1) 一键紧急求救(电话&短信&报警音)
2) 可燃气体监测语音报警;
3) 火焰300°监测语音报警
(火焰传感器数据待调试);
4) 体温过高语音报警;

3.
项   

1) 与紧急联系人紧急通话;
2) 对紧急联系人发送求救短信(内容:SOS);
3) 蓝牙(已实现配对功能,待开发);
4) GPRS传感器数据实时上传&云端查看数据
(已完成测试,但未启用,详见代码);
4. 其
1) TTS语音(“让设备能够说话”);              
2) 电源输入电压显示;
3) 超声波测距;
4) 180°云台(舵机)。


2.3 产品电路结构设计
原理图: 原理图.png
注:该项目PCB&原理图已上传至GitHub托管
下载地址:
1.1 物料清单

器件
个数
01. Arduino UNO R3
02. 传感器扩展板;
03. 稳压电源模块;
04. SIM800C GSM模块;
05. LCD128*64显示模块;
06. 红外非接触温度传感器;
07. 超声波模块;
08. 火焰传感器;
09. 脉搏传感器;
10. DHT11温湿度传感器;
11. 蜂鸣器模块;
12. 甲烷液化气可燃气体传感器;
13. 电容式开关;
14. 舵机;
15. 继电器;
16. 电压表头;
17. 遮阳帽;
18. 耳机;
19. 线材,自紧扎丝;
20. 其他;
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
x1
xn

1 软件设计
1.1 环境搭建(Linux)
(1) sudo apt-get install gcc-avr avr-libc
安装1.png
(2) sudo apt-get install openjdk-7-jre
安装2.png
1.2 Arduino IDE安装
(1) sudo apt-get install Arduino
安装3.png
1.3 嵌入式系统开发
1.3.1 Github新建托管项目
图片1.png
1.3.2 编写代码(源代码见附录
IDE.png

注:该项目源代码&相关库已上传至Github托管
下载地址:


1.4 测试&优化代码
1.4.1 代码经编译器翻译成二进制形式的“目标程序”上传至单片机。
1.4.2 通过串口返回数据,反复调试各类Sensor,模块功能
图片2.png
1.4.3 优化代码算法。(反复以上操作)
1.4.4 确定最终代码上传至单片机并交至Github托管。

2 完善该项目的设想
2.1 GPRS上传数据,云端查看(已实现,但仍在实验阶段)
思路:使用SIM800CGPRS功能,将该产品(物联网设备)传感器数据实时上传至“物联网云平台”(Machtalk),用户可随时随地通过网络在线查看穿戴者体征等数据。(详见实验源代码)

实验阶段数据上传链接:

实验截图:
GPRS实验性功能.jpg
1.1 OLED屏幕
1. 预期更换128*64LED,实现彩色显示,增加蓝牙信号,通讯信号等显示。
2. 屏幕汉字显示,界面更友好。
3. 通过屏幕对该设备参数进行更改,增强用户体验。

1.2 增加摄像头
1. 目前受限于Arduino Uno R3单片机的处理器性能,无法处理视频信息。
2. 增加摄像头(后置;前置):后置摄像头可实时屏幕显示,显示后方画面。 前置摄像头可类比“执法记录仪”储存至储存设备或上传至服务器。

1.3 定位功能
1. 实现GPS/北斗/基站定位,轨迹远端可见。
2. 接收到指定短信内容,自动发送当前经纬度坐标。

1.4 通讯
1. 发送电子邮件,微博,微信等。
2. 拨打指定电话号码,发送任意内容短信。

1.5 蓝牙功能开发(目前仅实现配对功能)
1. 当智能手机作为蓝牙配对方时,实现蓝牙耳机,拨号,挂机,接听,播放音乐等功能。
2. 蓝牙串口传输传感器信息,反编译“蓝牙串口助手”APP,实现智能手机实时监测该设备的状态即传感器数据。

    图片1.png        图片2.png

2 作品图片展示
2.1 整体
    IMG_20161004_151811_HDR.jpg

    IMG_20161004_152645_HDR.jpg

    IMG_20161004_152657_HDR.jpg

2.2 Arduino开发板&传感器扩展板

IMG_20161004_151945_HDR.jpg
2.3 电源模块
IMG_20161004_152003_HDR.jpg

2.4 GSM模块

IMG_20161004_151925_HDR.jpg

2.5 LCD数据采集

IMG_20161004_155222_HDR.jpg

2.6 继电器&DHT11&心率传感器

IMG_20161004_152031_HDR.jpg

2.7 一键报警(电容式开关)

IMG_20161004_152233_HDR.jpg

2.8 可燃气体传感器

IMG_20161004_192532_HDR.jpg

2.9 火焰传感器&舵机

IMG_20161004_192508_HDR.jpg

2.10 超声波传感器

IMG_20161004_192600_HDR.jpg

2.11 蜂鸣器

IMG_20161004_192544_HDR.jpg

3 结束语
随着科学技术水平的不断发展,可穿戴设备已成为当今研究的热门话题,但是相关的医疗设备却少之又少。在中国老龄化进程加快的今天,可穿戴的智能监护设备一定是未来发展的主流方向。省去数据采集繁琐的步骤,使之更能进入普通家庭中。该作品将通信,报警,监护功能整合为一,将老年人群的风险最小化。

[kenrobot_code]/**********************************************************************************   
*     工程名   :基于Arduino单片机的可穿戴监护通讯设备
*     硬件平台 :Arduino Uno R3
*     软件平台 :Arduino IDE 1.6
*     系统平台 :Linux version 4.4.0-31-generic
*     功能描述 :* 监护功能项:1.温度实时测定;
*                              2.湿度实时测定;
*                              3.人体脉搏实时测定;                           
*                              4.人体心率波动曲线;
*                              5.传感器数据LCD实时显示;
*                              
*                * 监护报警项:1.一键紧急求救(电话&短信&报警音)
*                              2.可燃气体监测语音报警;
*                              3.火焰300°监测语音报警(火焰传感器数据待调试);
*                              4.体温过高语音报警;
*                              
*                * 通讯项    :1.与紧急联系人紧急通话;
*                              2.发送求救短信;
*                              3.蓝牙(已实现配对功能,待开发);
*                              4.GPRS传感器数据实时上传&云端查看数据
*                              (已完成测试,但未启用,详见代码);
*                              
*                * 其他功能项:1.TTS语音(“让设备能够说话”);              
*                              2.电源输入电压显示;
*                              3.超声波测距;
*                              4.180°云台(舵机).
*                              
*     库文件   :详见 Github
*     修改日期 :Tue, 04 Oct 2016 11:03:31 GMT
*     版本     :Final
*     
*     作者     :molu
*     邮箱     :molu@li.cm
*     硬件连接 :详见Github原理图
*     Github   :https://github.com/lollipopi/Wearable-smart-hat/
**********************************************************************************/
                           
#include <U8glib.h>                  
#include <i2cmaster.h>
#include <DHT.h>
#include <Servo.h>

U8GLIB_ST7920_128X64_1X u8g(3, 9, 8);  //定义128*64LCD引脚
/*************  常量声明  **************/
#define DHTPIN 4   
#define DHTTYPE DHT11
DHT dht (DHTPIN, DHTTYPE);
Servo myservo;
/*************  变量声明  **************/
int inputPin = 6 ;  //定义超声波信号接收接口
int outputPin = 7 ; //定义超声波信号触发接口
int x, y;           //绘点坐标
int Buffer[128] ;   //缓存值储存数组
int tonepin = 10 ;  //蜂鸣器
int distance ;      //超声波
int pos = 0 ;       //用于存储舵机位置的变量
int val ;           //可燃气体
int k ;             //触控开关
int fire ;          //火焰传感器
int h ;             //心率传感器
float hum ;         //湿度
float tem ;         //温度
int blue =  1;      //限制蓝牙扫描次数
float celcius ;     //红外传感器

/**********************************************************************************   
*     GPRS上传至Machtalk服务器功能待调试 详见申请书。
**********************************************************************************/
#define APIKEY "727d97154da4407fbbe62651aa9dd162"      //APIKEY
#define device_id "d5ebd1ba83f444f88a46a56840ae43c5"   //设备ID

/**********************************************************************************   
*     函数名 :sample
*     描述   :心率曲线绘制
*     注意   :
**********************************************************************************/
void sample( )
{
  //心率曲线
  for (x = 0; x < 128; x++)
    Buffer[x] = analogRead(A0);        //信号采样
  for (x = 0; x < 128; x++)
    Buffer[x] = 95 - (Buffer[x] >> 4); //计算纵坐标值
}

/**********************************************************************************   
*     函数名 :draw
*     描述   :128*64LCD显示
*     注意   :
**********************************************************************************/
void draw(void)
{
  u8g.setFont(u8g_font_tpss);                     //字体设置
  u8g.drawStr( 0, 10, "Wearable User Interface"); //交互
  u8g.drawStr( 0, 20, "Tem:");
  u8g.drawStr( 68, 20, "Hum:");
  u8g.drawStr( 0, 30, "Body T:");
  u8g.drawStr( 78, 30, "Dis:");
  u8g.drawStr( 114, 30, "cm");
  u8g.drawStr( 68, 30, "C");
  u8g.drawStr( 77, 60, ":");
  u8g.drawStr( 107, 60, "bpm");
  u8g.drawStr( 2, 43, "ECG");

  //心率曲线
  for (x = 0; x < 127; x++)
  u8g.drawLine(x, Buffer[x], x, Buffer[x + 1]); //画相邻两点连线
  u8g.drawFrame(0, 32, 128, 32);                //画边框

  //传感器数据
  u8g.setPrintPos(28, 20);
  u8g.print(tem);
  u8g.setPrintPos(57, 20);
  u8g.print("C");

  u8g.setPrintPos(94, 20);
  u8g.print(hum);
  u8g.setPrintPos(120, 20);
  u8g.print("%");

  u8g.setPrintPos(96, 30);
  u8g.print(distance);

  u8g.setPrintPos(90, 60);
  u8g.print(h);

  u8g.setPrintPos(40, 30);
  u8g.print(celcius);
}

/**********************************************************************************   
*     函数名 :sensor
*     描述   :获取传感器数据
*     注意   :
**********************************************************************************/
void sensor()
{
  //温湿度
  hum = dht.readHumidity();
  tem = dht.readTemperature();

  //超声波
  digitalWrite(outputPin, LOW);        // 使发出发出超声波信号接口低电平2μs
  delayMicroseconds(2);
  digitalWrite(outputPin, HIGH);       // 使发出发出超声波信号接口高电平10μs
  delayMicroseconds(10);
  digitalWrite(outputPin, LOW);        // 保持发出超声波信号接口低电平
  distance = pulseIn(inputPin, HIGH);  // 读出脉冲时间
  distance = distance / 58;            // 将脉冲时间转化为距离(单位:厘米)
  
  //心率信号采样
  h = (analogRead(A0) / 10 );
  
  //红外温度
  int dev = 0x5A << 1;
  int data_low = 0;
  int data_high = 0;
  int pec = 0;

  i2c_start_wait(dev + I2C_WRITE);
  i2c_write(0x07);

  // read
  i2c_rep_start(dev + I2C_READ);
  data_low = i2c_readAck(); //Read 1 byte and then send ack
  data_high = i2c_readAck(); //Read 1 byte and then send ack
  pec = i2c_readNak();
  i2c_stop();

  //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
  double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614)
  double tempData = 0x0000; // zero out the data
  int frac; // data past the decimal point

  // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
  tempData = (double)(((data_high & 0x007F) << 8) + data_low);
  tempData = (tempData * tempFactor) - 0.01;

  celcius = tempData - 273.15;
}

/**********************************************************************************   
*     函数名 :alert
*     描述   :报警响应
*     注意   :
**********************************************************************************/
void alert()
{
  //可燃气体报警
  val = analogRead(3);
  delay(100);

  if (val > 60)
  {
    tone(10, 80);
    Serial.println("AT+CTTS=1,6CE8610F51FA73B053EF71C36C144F53");  //"注意出现可燃气体" TTS
    delay(5000);
  }
  else
  {
    pinMode(tonepin, INPUT);
  }

  //触控开关报警(紧急求救)电话&短信(10086测试)
  k = digitalRead(11);
  if (k == HIGH)
  {
    tone(10, 20);
    Serial.println("AT+CTTS=1,5DF262E862537D27602575358BDDFF0C8BF77B495F85655163F4");  //"已拨打紧急电话,请等待救援" TTS
    Serial.print("AT+CMGF=1\r\n");//设置短信模式为TEXT
    delay(1000);
    Serial.print("AT+CMGS=\"10086\"\r\n"); //紧急联系人;短信接收方   
    delay(1000);
    Serial.print("SOS"); //求救短信内容
    delay(1000);
    Serial.write(0x1A);
    delay(2000);      
    Serial.print("AT+COLP=1\r\n");
    delay(1000);
    Serial.print("ATD10086;\r\n"); //紧急电话目标电话号码
    delay(10000);
  }
  else
  {
    pinMode(tonepin, INPUT);
  }

  //火焰报警
  fire = analogRead(2);
  delay(100);

  if (fire >= 10000)   /*火焰传感器数据待调试*/
  {
    tone(10, 80);
    Serial.println("AT+CTTS=1,6CE8610F706B7130");  //"注意火焰" TTS
    delay(5000);
  }
  else
  {
    pinMode(tonepin, INPUT);
  }

  //高体温报警  (38°C报警)
  if ((int)celcius > 38)
  {
    tone(10, 80);
    Serial.println("AT+CTTS=1,4F536E298FC79AD862A58B66");  //"体温过高报警" TTS
    delay(5000);
  }
  else
  {
    pinMode(tonepin, INPUT);
  }
  
  //debug
  /*Serial.println(fire,DEC);
  Serial.println(val,DEC);*/
}

/**********************************************************************************   
*     函数名 :tower
*     描述   :控制舵机
*     注意   :
**********************************************************************************/
void tower()
{
  //舵机
  for (pos = 0; pos < 180; pos += 1)  // 从0度-180度
  {                                   // 步进角度1度
    myservo.write(pos);               // 输入对应的角度值,舵机会转到此位置
    delay(30);                        // 15ms后进入下一个位置
  }
  for (pos = 180; pos >= 1; pos -= 1) // 从180度-0度
  {
    myservo.write(pos);               // 输入对应的角度值,舵机会转到此位置
    delay(30);                        // 15ms后进入下一个位置
  }  
}

/**********************************************************************************   
*     函数名 :bluetooth
*     描述   :蓝牙相关功能实现
*     注意   :该项目仍处于调试状态,目前仅支持蓝牙配对。 功能待开发,详见申请书
**********************************************************************************/
void bluetooth ()
{
  if (blue <= 15)                   // 限制蓝牙扫描次数
  {
  Serial.println("AT+BTPAIR=1,1"); // 配对
  delay(50);
  Serial.println("AT+BTACPT=1");
  blue++;
  }
}

/**********************************************************************************   
*     函数名:gprs
*     描述  :通过GPRS上传传感器数据至服务器,用户可从云端直接获取传感器数据。
*     注意  :*若启用该功能,则会导致循环过长,导致屏幕内容刷新周期过高。
               *预期解决方案:①增加单片机物理并行,执行两个主循环。
                              ②使用定时器,增加中断机制。
               *实验性功能,未正式启用。 详情见申请书。
               *测试数据上传链接:
     http://dev.machtalk.net/device/d ... 4f88a46a56840ae43c5
**********************************************************************************/
void gprs()
{
/******  体温  ******/
  Serial.println("AT+CIPSTART=\"TCP\",\"devapi.machtalk.net\",12086");
  delay(1500);
  Serial.println("AT+CIPSEND");
  delay(1000);
  String cmd;  
  cmd = "OST /v1.0/device/";
  cmd += String(device_id);
  cmd += "/1/1";
  cmd += "/datapoints/add";
  cmd += " HTTP/1.1\r\n";
  cmd += "Host: devapi.machtalk.net\r\n";
  cmd += "APIKey: ";
  cmd += APIKEY;
  cmd += "\r\n";
  cmd += "Accept: *";
  cmd += "/";
  cmd += "*\r\n";
  cmd += "Content-Length:22 ";
  cmd += "\r\n";
  cmd += "Content-Type: application/x-www-form-urlencoded\r\n";
  cmd += "Connection: close\r\n";
  cmd += "\r\n";
  cmd += "params={\"value\":";
  cmd += celcius;
  cmd += "}\r\n";
  Serial.print(cmd);
  delay(1000);
  Serial.write(26);
  delay(1500);
  Serial.println("AT+CIPCLOSE");
  delay(1000);

/******  心率  ******/
  Serial.println("AT+CIPSTART=\"TCP\",\"devapi.machtalk.net\",12086");
  delay(1500);
  Serial.println("AT+CIPSEND");
  delay(1000);
  cmd = "OST /v1.0/device/";
  cmd += String(device_id);
  cmd += "/2/1";
  cmd += "/datapoints/add";
  cmd += " HTTP/1.1\r\n";
  cmd += "Host: devapi.machtalk.net\r\n";
  cmd += "APIKey: ";
  cmd += APIKEY;
  cmd += "\r\n";
  cmd += "Accept: *";
  cmd += "/";
  cmd += "*\r\n";
  cmd += "Content-Length:22 ";
  cmd += "\r\n";
  cmd += "Content-Type: application/x-www-form-urlencoded\r\n";
  cmd += "Connection: close\r\n";
  cmd += "\r\n";
  cmd += "params={\"value\":";
  cmd += h;
  cmd += "}\r\n";
  Serial.print(cmd);
  delay(1000);
  Serial.write(26);
  delay(1500);
  Serial.println("AT+CIPCLOSE");
  delay(1000);
}

/**********************************************************************************   
*     函数名 :setup
*     描述   :初始化函数
*     注意   :
**********************************************************************************/
void setup()
{
  Serial.begin(9600);                   // 设置通讯的波特率为9600
  i2c_init();                            // 红外温度
  PORTC = (1 << PORTC4) | (1 << PORTC5); // enable pullups
  pinMode(inputPin, INPUT);              // 超声波
  pinMode(outputPin, OUTPUT);
  pinMode(11, INPUT);                    // 触控传感器
  myservo.attach(5);                     // 舵机控制信号引脚
  dht.begin();
  Serial.println("AT+CTTS=1,6B228FCE4F7F75288BE553EF7A7F623476D162A4901A8BAF8BBE5907FF0C8BE54EA754C14E3A79D16280521B65B059278D5B4F5C54C1");
                                         // "欢迎使用该可穿戴监护通讯设备,该产品为科技创新大赛作品"TTS
  Serial.println("AT+BTPOWER=1");       // 开启蓝牙电源
  delay(200);
  Serial.println("AT+BTHOST=Wearable"); // 修改蓝牙设备名
}

/**********************************************************************************   
*     函数名 :loop
*     描述   :主循环
*     注意   :GPRS项目仅为测试功能,未正式启用。详见申请书。
**********************************************************************************/
void loop(void)
{   
  alert ();     // 报警
  tower ();     // 舵机
  //gprs ();    // GPRS数据上传  /* 实验性功能 */
  sensor ();    // 传感器采集数据
  bluetooth (); // 蓝牙模块
  sample();     // 绘图采样
  
  u8g.firstPage();
  do {
    draw();
  } while ( u8g.nextPage() );
}
[/kenrobot_code]


视频(DEMO): 链接: https://pan.baidu.com/s/1i5mXSaT 密码: qdf8

end~  不对的地方望指正,感谢!




IMG_20161004_192612_HDR.jpg
IMG_20161004_151839_HDR.jpg
发表于 2017-10-1 20:30 | 显示全部楼层
用的什么心跳传感器啊?
 楼主| 发表于 2017-10-2 07:43 | 显示全部楼层
Zoologist 发表于 2017-10-1 20:30
用的什么心跳传感器啊?

图2.6最右边发绿光的,,放手指上测
发表于 2017-10-22 22:06 | 显示全部楼层
1.感谢对社区比赛的支持,演示视频请上传到优酷等在线视频网站,视频开头比赛海报展示5秒,请补充完整。具体要求请参考:
http://www.arduino.cn/thread-47517-1-1.html
2.开发者积分和贡献值已发放,请点击以下链接领取纪念衫并参与抽奖~
http://www.arduino.cn/thread-48132-1-1.html
3.比赛结果会在11.15号前公布,请耐心等待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-9-20 22:29 , Processed in 0.117745 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表