这个项目是为了监控用户安全,传感器集群收集并绘制盲点障碍物、轮椅速度和倾斜度的数据。
故事
许多医院尤其是在当前面临的挑战是人手不足,无法同时持续监测每位患者。因此,我们着手开发一个系统,该系统可以通过使用三个传感器和三个氩气监测轮椅的动作来提醒医院工作人员坐在轮椅上的病人可能有问题。在目前的状态下,该系统仅限于测量轮椅相对于地面的角度、轮椅的行驶速度以及它是否离物体太近。这些非常简单的读数仍然会有很大帮助,因为医院工作人员可以根据需要将智能轮椅上的任何人所需的工作人员放松,并仅在轮椅本身向他们传达患者需要帮助时才发送帮助。
硬件部件:
Particle Argon
Elegoo回避传感器
Elegoo倾斜传感器
惯性测量单元(IMU)(6个自由度)
5毫米LED:黄色
面包板
跳线
传感器设置
作为 3 名团队成员,这款轮椅需要 3 个氩气和 3 个传感器。由于该轮椅的设计目的是监测轮椅本身的状态,因此不需要生物识别传感器,因为在该项目中没有对患者进行测量。取而代之的是,加速度计用于测量轮椅速度,倾斜传感器用于测量轮椅的角度,并且接近传感器用于在轮椅即将与物体碰撞时发出警报。所有 3 个传感器和氩气都被塞进一个盒子里,在实际操作中,盒子会固定在轮椅后部的车把下方,但这次演示由轮椅的骑手拿着。这个盒子如下图所示,因为它看起来附在轮椅的靠背上。
实时数据
这个项目的一个重要特点是电路被设置为自己实时绘制数据。在测试日之前,代码似乎正在运行,并准备好在电路激活后推出数据。这将由一个 LED 表示,但在测试当天,灯只闪烁一次,传感器从未产生实时数据。由于这是唯一可以拍摄视频的日子,因此必须丢弃实时数据部分,但可以在此处找到预先设置以接收数据的代码和图表。
代码一、数据收集/绘图和通讯
// 此#include语句是由粒子IDE自动添加的
#include
#include
TCPClient client;
unsigned int myChannelNumber = 1358740; //话语信息
const char * myWriteAPIKey = "Y0D0V28Q7URAHLPY"; // ThingSpeak信息
int ObjectYes = 1;
int ObjectNo = 0;
int SpeedYes = 1;
int SpeedNo = 0;
int TiltYes = 1;
int TiltNo = 0;
void setup() {
Serial.begin(9600);
Particle.publish("PowerOn", PRIVATE);
Particle.publish("CheckConnection", PRIVATE);
Particle.subscribe("ObjectY", WC1OY, MY_DEVICES);
Particle.subscribe("ObjectN", WC2ON, MY_DEVICES);
Particle.subscribe("SpeedY", WC3SY, MY_DEVICES);
Particle.subscribe("SpeedN", WC4SN, MY_DEVICES);
Particle.subscribe("TiltY", WC5TY, MY_DEVICES);
Particle.subscribe("TiltN", WC6TN, MY_DEVICES);
ThingSpeak.begin(client);
}
void loop() {
Particle.subscribe("ObjectY", WC1OY, MY_DEVICES);
Particle.subscribe("ObjectN", WC2ON, MY_DEVICES);
Particle.subscribe("SpeedY", WC3SY, MY_DEVICES);
Particle.subscribe("SpeedN", WC4SN, MY_DEVICES);
Particle.subscribe("TiltY", WC5TY, MY_DEVICES);
Particle.subscribe("TiltN", WC6TN, MY_DEVICES);
delay(500); // 数据收集缓冲区
}
void WC1OY(const char *event, const char *data) {
ThingSpeak.setField(1, ObjectYes); // 写入图形数据
ThingSpeak.writeFields(myChannelNumber, 1, myWriteAPIKey);
delay(16000);
}
void WC2ON(const char *event, const char *data) {
ThingSpeak.setField(1, ObjectNo); // 写入图形数据
ThingSpeak.writeFields(myChannelNumber, 0, myWriteAPIKey);
delay(16000);
}
void WC3SY(const char *event, const char *data) {
ThingSpeak.setField(2, SpeedYes);
ThingSpeak.writeFields(myChannelNumber, 1, myWriteAPIKey);
delay(16000);
}
void WC4SN(const char *event, const char *data) {
ThingSpeak.setField(2, SpeedNo);
ThingSpeak.writeFields(myChannelNumber, 0, myWriteAPIKey);
delay(16000);
}
void WC5TY(const char *event, const char *data) {
ThingSpeak.setField(3, TiltYes);
ThingSpeak.writeFields(myChannelNumber, 1, myWriteAPIKey);
delay(16000);
}
void WC6TN(const char *event, const char *data) {
ThingSpeak.setField(3, TiltNo);
ThingSpeak.writeFields(myChannelNumber, 0, myWriteAPIKey);
delay(16000);
}
代码二、带启用功能的Argon 2回避传感器
int Detection = D6; // 回避传感器
int Enable = D7; // 避开传感器的开/关引脚
int Obj = HIGH; // 没有障碍
int NoObj = LOW; //障碍
int val;
void setup() {
pinMode(Detection, INPUT);
pinMode(Enable, OUTPUT);
digitalWrite(Enable, LOW);
Particle.subscribe("PowerOn", start, MY_DEVICES);
Serial.begin(9600);
}
void loop() {
val = digitalRead(Detection);
if (val == Obj) { // 没有障碍
delay(50); //缓冲时间
Particle.publish("ObjectN", PRIVATE);
delay(50); // 传感器休息时间
}
if (val == NoObj) {
delay(50); //缓冲时间
Particle.publish("ObjectY", PRIVATE);
delay(50); // 传感器休息时间
}
}
void start(const char *event, const char *data) {
digitalWrite(Enable, HIGH);
}
代码三、带有Comms Check LED的Argon 3加速度计和倾斜传感器
// 此#include语句是由粒子IDE自动添加的
#include
#include
#define MPU 0x68 // 加速度计
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
int Tilt = D2; // 倾斜销
int LED = D3; //连接指示
int val; // 倾斜变量
int VcX; //速度
int VcY; // 速度
int VcZ; // 速度
int DeltaTime;
int OldTime = 0;
int NewTime = 60000;
void setup() {
Serial.begin(9600);
Particle.subscribe("CheckConnection", test, MY_DEVICES);
pinMode(Tilt, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
Wire.begin(); // 加速度计设置
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
DeltaTime = NewTime - OldTime; // 一分钟的间隔,每60秒发送一次数据
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU,12,true);
AcX=Wire.read()<<8|Wire.read();
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();
GyZ=Wire.read()<<8|Wire.read();
delay(500);
VcX = AcX*(DeltaTime/1000);
VcY = AcY*(DeltaTime/1000);
VcZ = AcZ*(DeltaTime/1000);
if (VcX > 2) {
Particle.publish("SpeedY", PRIVATE);
}
if (VcY > 2) {
Particle.publish("SpeedY", PRIVATE);
}
if (VcZ > 2) {
Particle.publish("SpeedY", PRIVATE);
}
if (VcX < 2) {
Particle.publish("SpeedN", PRIVATE);
}
if (VcY < 2) {
Particle.publish("SpeedN", PRIVATE);
}
if (VcZ < 2) {
Particle.publish("SpeedN", PRIVATE);
}
val = digitalRead(Tilt);
if (val == HIGH) // 倾斜传感器倾斜,也就是轮椅被撞倒了
{
Particle.publish("TiltY", PRIVATE);
}
if (val == LOW)
{
Particle.publish("TiltN", PRIVATE);
}
}
void test(const char *event, const char *data) {
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
评论
查看更多