老人健康监测系统
前言
最近在做一个简单的小项目,简单的记录一下。先看需求
该健康监测系统可以监测被测者的心率、体温、环境,同时也可以通过姿态解算来判断被测者是否摔倒。该系统可以将被测者的心率、体温、环境等数据上传至云端,方便使用者时刻注意家中老人情况以及室内环境的状况。该系统在被测者摔倒时会发出蜂鸣声,同时在手机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();
}
总结
项目比较简单,代码可以直接使用。有疑问可以进群一起探讨,群里也会不定时分享一些项目,聊一聊比赛。