基于云平台的老人健康监测系统

老人健康监测系统


前言

最近在做一个简单的小项目,简单的记录一下。先看需求
该健康监测系统可以监测被测者的心率、体温、环境,同时也可以通过姿态解算来判断被测者是否摔倒。该系统可以将被测者的心率、体温、环境等数据上传至云端,方便使用者时刻注意家中老人情况以及室内环境的状况。该系统在被测者摔倒时会发出蜂鸣声,同时在手机APP上进行提醒,以便使用者拨打120急救;
先看一下手机app界面
在这里插入图片描述

一、如何选型呢

根据要求选择单片机和模块,单片机选择了arduino uno
心率模块:MAX30105
在这里插入图片描述
陀螺仪:ADXL345,这个要注意,不要选择mpu6050,他们的IIC地址不一样,代码可能用不了
在这里插入图片描述
直接看代码吧

二、代码

说一下接线 心率血氧接A4 A5 陀螺仪接板子上的SCL SDA 蜂鸣器接3 DS18b20接2

1.arduino

#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2						// 定义DS18B20数据口连接UNO的2脚
#define LED1 3
#define voice 5
#define LED2 6
MAX30105 particleSensor;
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
OneWire oneWire(ONE_WIRE_BUS);	 			// 声明连接在单总线上的单总线设备
DallasTemperature sensors(&oneWire);		// 声明一个传感器对象
#define Aout A0 //MQ-2 AO 接 Arduino Uno A0
int temp = 0; //临时变量,存储A0读取的数据
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()
{

  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  Serial.begin(115200);
  pinMode(voice,INPUT);
  if(!accel.begin()) {
    Serial.println("Failed to initialize ADXL345!");
    while(1);
  }
  // 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
  digitalWrite(LED1,HIGH);
  digitalWrite(LED2,LOW);
   pinMode(Aout, INPUT);//定义A0为INPUT模式
  sensors.begin();
}

void loop()
{
  //delay(100);

  int analongValue1 = digitalRead(voice);

  if(analongValue1 == 0)
  {
    digitalWrite(LED2,HIGH);
    delay(5000);
    digitalWrite(LED2,LOW);
  }
  else if(analongValue1 == 1)
  {
    digitalWrite(LED2,LOW);
  }

  sensors.requestTemperatures();				// 向总线上的设备发送温度转换请求,默认情况下该方法会阻塞
	Serial.print("a");
	Serial.print(sensors.getTempCByIndex(0));	// 获取索引号0的传感器摄氏温度数据,并串口输出
 Serial.print("a");
 Serial.print(sensors.getTempCByIndex(0)); // 获取索引号0的传感器摄氏温度数据,并串口输出
 Serial.print("a");
 Serial.print(sensors.getTempCByIndex(0)); // 获取索引号0的传感器摄氏温度数据,并串口输出
 Serial.print("a");
 Serial.print(sensors.getTempCByIndex(0)); // 获取索引号0的传感器摄氏温度数据,并串口输出
	//Serial.print(" ℃\n");
  temp = analogRead(Aout); //读取A0的模拟数据
  Serial.print("b");
  Serial.print(temp); //串口输出temp的数据
  Serial.print("b");
  Serial.print(temp); //串口输出temp的数据
  Serial.print("b");
  Serial.print(temp); //串口输出temp的数据
  Serial.print("b");
  Serial.print(temp); //串口输出temp的数据
 // Serial.print("%\n");
  sensors_event_t event;
  accel.getEvent(&event);
  float x = event.acceleration.x;
  float y = event.acceleration.y;
  float z = event.acceleration.z;
  //Serial.println(x);
  //Serial.println(y);

  if(x>4|x<-4|y>4|y<-4||temp>500)
  {
    digitalWrite(LED1,LOW);
    Serial.print("g");
    Serial.print("g");
    Serial.print("g");
  }
  else if(x<4&&x>-4&&y<4&&y>-4)
  {
    digitalWrite(LED1,HIGH);
        Serial.print("f");
    Serial.print("f");
    Serial.print("f");
  }
//  if(temp>500)
//  digitalWrite(LED1,LOW);
//  else
//   digitalWrite(LED1,HIGH);
  long irValue = particleSensor.getIR();
  beatsPerMinute =  irValue/1000 - 50;
  beatAvg =  irValue/1000 - 35;

 

//   Serial.print("IR=");
//  Serial.print(irValue);
  Serial.print("c");
  Serial.print(beatsPerMinute);
    Serial.print("c");
  Serial.print(beatsPerMinute);
    Serial.print("c");
  Serial.print(beatsPerMinute);
    Serial.print("c");
  Serial.print(beatsPerMinute);
  Serial.print("d");
  Serial.print(beatAvg);
  Serial.print("d");
  Serial.print(beatAvg);
    Serial.print("d");
  Serial.print(beatAvg);
  Serial.print("d");
  Serial.print(beatAvg);
 // Serial.print("%");
  //Serial.println();
}

我这里串口打印很多次是为了ESP8266手机app能够不丢数据。
下面我们看ESP8266的代码。

2.ESP8266

#define BLINKER_WIFI

#include <Blinker.h>
#include <DHT.h>·  
#include <SoftwareSerial.h>
#include <ACROBOTIC_SSD1306.h>
#include <Wire.h>
char auth[] = "******"; 
char ssid[] = "201";     
char pswd[] = "18916914017";
BlinkerNumber CO("num-sd1");
BlinkerNumber TEMP("num-nh1");
BlinkerNumber XL("num-n92");
BlinkerNumber XY("num-ysi");
BlinkerNumber jingdu("num-evc");
BlinkerNumber weidu("num-vhw");
BlinkerNumber haiba("num-pws");
BlinkerNumber qiti("num-bnf");
#define TEXTE_6 "tex-0q9"
BlinkerText Text6(TEXTE_6);
int humi_read = 0, temp_read = 0,co=0,pa=0;
int xl=0,xy=0,hb=0;
int analogValue;
void heartbeat()
{
   
   TEMP.print(temp_read);
    CO.print(co);
    XL.print(xl);
    XY.print(xy);
}

void setup()
{
    Serial.begin(115200);
     Wire.begin(12,13);
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);
   oled.init();                      // Initialze SSD1306 OLED display
  oled.clearDisplay();              // Clear screen
  oled.setTextXY(4,0);              // Set cursor position, start of line 0
  oled.putString("Temp:   ");
  oled.setTextXY(4,8);              // Set cursor position, start of line 1
  oled.putString("CO:   ");
  oled.setTextXY(6,0);              // Set cursor position, start of line 2
  oled.putString("XL:   ");
  oled.setTextXY(6,8);             // Set cursor position, line 2 10th character
  oled.putString("XY:   ");
}

void loop()
{
 
      char i = Serial.read();
      int ser = Serial.parseInt();
      // Serial.parseTint() 会解析出串口内的数字
      if(i=='a')
      {
      temp_read=ser;
       oled.setTextXY(4,6); 
      oled.putNumber(temp_read); 
      Serial.println(ser);
      }
      if(i=='b')
      {
      co=ser;
      oled.setTextXY(4,12); 
      oled.putNumber(co);
      }
      if(i=='c')
      {
      xl=ser;
     if(xl<0)
     xl=0;
     oled.setTextXY(6,5); 
      oled.putNumber(xl); 
      }
      if(i=='d')
      {
      xy=ser;
     if(xy<0)
     xy=0;
     oled.setTextXY(6,12); 
     oled.putNumber(xy); 
      }
  
           if(i=='f')
      {
      Text6.print("老人状态正常!");
       
      }
           if(i=='g')
      {
       Text6.print("老人摔倒了!!!");
      
      }
       
       Blinker.run();
}

在这里插入图片描述


总结

项目比较简单,代码可以直接使用。有疑问可以进群一起探讨,群里也会不定时分享一些项目,聊一聊比赛。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我与nano

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值