這個項目是為了監控用戶安全,傳感器集群收集并繪制盲點障礙物、輪椅速度和傾斜度的數據。
故事
許多醫院尤其是在當前面臨的挑戰是人手不足,無法同時持續監測每位患者。因此,我們著手開發一個系統,該系統可以通過使用三個傳感器和三個氬氣監測輪椅的動作來提醒醫院工作人員坐在輪椅上的病人可能有問題。在目前的狀態下,該系統僅限于測量輪椅相對于地面的角度、輪椅的行駛速度以及它是否離物體太近。這些非常簡單的讀數仍然會有很大幫助,因為醫院工作人員可以根據需要將智能輪椅上的任何人所需的工作人員放松,并僅在輪椅本身向他們傳達患者需要幫助時才發送幫助。
硬件部件:
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);
}
評論
查看更多