這個項目是為了監(jiān)控用戶安全,傳感器集群收集并繪制盲點障礙物、輪椅速度和傾斜度的數(shù)據(jù)。
故事
許多醫(yī)院尤其是在當前面臨的挑戰(zhàn)是人手不足,無法同時持續(xù)監(jiān)測每位患者。因此,我們著手開發(fā)一個系統(tǒng),該系統(tǒng)可以通過使用三個傳感器和三個氬氣監(jiān)測輪椅的動作來提醒醫(yī)院工作人員坐在輪椅上的病人可能有問題。在目前的狀態(tài)下,該系統(tǒng)僅限于測量輪椅相對于地面的角度、輪椅的行駛速度以及它是否離物體太近。這些非常簡單的讀數(shù)仍然會有很大幫助,因為醫(yī)院工作人員可以根據(jù)需要將智能輪椅上的任何人所需的工作人員放松,并僅在輪椅本身向他們傳達患者需要幫助時才發(fā)送幫助。
硬件部件:
Particle Argon
Elegoo回避傳感器
Elegoo傾斜傳感器
慣性測量單元(IMU)(6個自由度)
5毫米LED:黃色
面包板
跳線
傳感器設置
作為 3 名團隊成員,這款輪椅需要 3 個氬氣和 3 個傳感器。由于該輪椅的設計目的是監(jiān)測輪椅本身的狀態(tài),因此不需要生物識別傳感器,因為在該項目中沒有對患者進行測量。取而代之的是,加速度計用于測量輪椅速度,傾斜傳感器用于測量輪椅的角度,并且接近傳感器用于在輪椅即將與物體碰撞時發(fā)出警報。所有 3 個傳感器和氬氣都被塞進一個盒子里,在實際操作中,盒子會固定在輪椅后部的車把下方,但這次演示由輪椅的騎手拿著。這個盒子如下圖所示,因為它看起來附在輪椅的靠背上。
實時數(shù)據(jù)
這個項目的一個重要特點是電路被設置為自己實時繪制數(shù)據(jù)。在測試日之前,代碼似乎正在運行,并準備好在電路激活后推出數(shù)據(jù)。這將由一個 LED 表示,但在測試當天,燈只閃爍一次,傳感器從未產(chǎn)生實時數(shù)據(jù)。由于這是唯一可以拍攝視頻的日子,因此必須丟棄實時數(shù)據(jù)部分,但可以在此處找到預先設置以接收數(shù)據(jù)的代碼和圖表。
代碼一、數(shù)據(jù)收集/繪圖和通訊
// 此#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); // 數(shù)據(jù)收集緩沖區(qū)
}
void WC1OY(const char *event, const char *data) {
ThingSpeak.setField(1, ObjectYes); // 寫入圖形數(shù)據(jù)
ThingSpeak.writeFields(myChannelNumber, 1, myWriteAPIKey);
delay(16000);
}?
void WC2ON(const char *event, const char *data) {
ThingSpeak.setField(1, ObjectNo); // 寫入圖形數(shù)據(jù)
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秒發(fā)送一次數(shù)據(jù)
}
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);
}
評論
查看更多