資料介紹
描述
為什么需要保持社交距離?這個(gè)項(xiàng)目的動(dòng)機(jī)是什么?
COVID-19(也稱為新型冠狀病毒)是一種致命疾病,已感染超過 2400 萬人并導(dǎo)致超過 80 萬人死亡。
僅在美國,就有600 萬例病例。據(jù)Worldometers.info 稱,最近 COVID-19 病例一直在增加。
疾病預(yù)防控制中心建議保持社交距離,這是一種人們分開 6 英尺的程序,除非他們是同一個(gè)家庭的成員。那么,作為一個(gè)社區(qū),我們?nèi)绾问褂眉夹g(shù)來執(zhí)行這個(gè)程序呢?這就是這個(gè)項(xiàng)目的動(dòng)機(jī)。
成本
為了讓每個(gè)人都可以使用這個(gè)項(xiàng)目,我們希望確保成本盡可能低。
一臺設(shè)備的成本:
- Arduino Nano--10 售價(jià) 36.49 美元,因此每個(gè)售價(jià) 3.65 美元
- HC-05--2 為 12.5 美元,因此每個(gè)為6.25 美元
- LCD--2 售價(jià) 6.49 美元,因此每個(gè)售價(jià) 3.25 美元
- 有源蜂鳴器——20 個(gè),9.59 美元,所以每個(gè)是0.48 美元
- 10K 歐姆電位器——20 個(gè),6.39 美元,所以每個(gè)0.32 美元
- 220 歐姆電阻器 - 100 個(gè) 5.69 美元,因此每個(gè)0.06 美元
- 9V 電池——8 塊10.99 美元,所以每塊 1.37 美元
- 9V 電池連接器面包板--40 個(gè),售價(jià) 6.48 美元,因此每個(gè)售價(jià) 0.16 美元
總計(jì)高達(dá)15.54 美元。這是非常令人印象深刻的,因?yàn)檫@可以挽救無數(shù)生命。
準(zhǔn)備步驟:安裝庫
第一步是安裝 LCD 庫,您將需要這兩個(gè)庫。這可能預(yù)裝在 Arduino IDE 上,但可能不在某些版本上。
轉(zhuǎn)到工具>管理庫。在這里,搜索“液晶”。
我們要查找的庫是列表中的第一個(gè)。如果您還沒有安裝它。
還使用了 SoftwareSerial 庫,但它已經(jīng)預(yù)先安裝。
第 1 步:將 HC-05 配置為 AT 模式
第一步是將 HC-05 配置為 AT 模式。在這里,我們可以執(zhí)行 AT+INQ 命令來掃描其他設(shè)備。
需要兩個(gè)或更多設(shè)備才能相互掃描。在所需的部分中描述了一種“設(shè)備”。
對于此步驟,設(shè)備應(yīng)按如下方式接線:
有兩種 HC-05 設(shè)備:一種帶有“KEY”引腳不帶按鈕,一種帶有“EN”引腳帶按鈕
AT模式HC-05無按鍵:
如果 KEY 引腳連接到 +5V DC,它應(yīng)該自動(dòng)處于 AT 模式。
AT 模式 HC-05 帶按鈕
在這種情況下,EN 引腳應(yīng)連接到 +5V DC。插入 Arduino Nano 時(shí),按下按鈕,插入設(shè)備,然后松開。這應(yīng)該激活 AT 模式。
將此代碼復(fù)制并粘貼到 Arduino IDE 中。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11);
void setup()
{
Serial.begin(9600);
mySerial.begin(38400);
Serial.println("Enter AT commands:");
delay(2000);
}
void loop()
{
// Keep reading from HC-05 and send to Arduino Serial Monitor
if (mySerial.available()){
Serial.write(mySerial.read());}
// Keep reading from Arduino Serial Monitor and send to HC-05
if (Serial.available()){
mySerial.write(Serial.read());}
}
從本質(zhì)上講,這會將您在串行監(jiān)視器中鍵入的任何內(nèi)容打印到 HC05,等待消息并打印該消息。
運(yùn)行代碼。
運(yùn)行代碼:
打開串行監(jiān)視器。
當(dāng)“Enter AT commands:”出現(xiàn)時(shí),輸入“AT”并按下回車鍵。您應(yīng)該會收到一條消息說“OK”
鍵入“AT+NAME”并顯示名稱。
值
為了獲得設(shè)備之間的距離,我們需要 rssi 值。要獲取 rssi 值,我們需要執(zhí)行 AT+INQ 命令。但是,在此之前還有一些命令要執(zhí)行,一一執(zhí)行:
- AT+復(fù)位
- AT+初始化
- AT+IAC=9e8b33
- AT+CLASS=0
- AT+INQM=1, 9, 48
- AT+INQ
這是執(zhí)行完所有 6 個(gè)命令后串行監(jiān)視器的外觀。(一步步)
請注意,當(dāng)我們執(zhí)行 AT+INQ 命令時(shí),它會顯示 +INQ,后跟地址、類別,然后是 RSSI 值。RSSI 值是最后 4 個(gè)字符。請注意,這是十六進(jìn)制;要將其轉(zhuǎn)換為十進(jìn)制,我們需要使用帶符號的二進(jìn)制補(bǔ)碼格式。
如果得到的 RSSI 值為 7FFF,請嘗試再次執(zhí)行上述命令。
如果 rssi 值以 F 開頭,那么你很好。
第 2 步:轉(zhuǎn)換 Rssi 值
要轉(zhuǎn)換 rssi 值,我們需要?jiǎng)?chuàng)建一個(gè)新函數(shù)來執(zhí)行此操作。
將此代碼復(fù)制并粘貼到 Arduino IDE
#include
SoftwareSerial mySerial(10,11);
void setup()
{
Serial.begin(9600);
mySerial.begin(38400);
Serial.println("Enter AT commands:");
delay(2000);
}
unsigned int hexToDec(String hexString) {
unsigned int decValue = 0;
int nextInt;
for (int i = 0; i < hexString.length(); i++) {
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
void loop()
{
// Keep reading from HC-05 and send to Arduino Serial Monitor
if (mySerial.available()){
String x = String(mySerial.readString());
int slashn = x.indexOf("\n");
Serial.println(slashn);
int xlen = x.length()/(slashn+1);
if (x.endsWith("OK\r\n")) {
x = x.substring(0, x.length() - 4);
}
for (int i = 0; i < xlen; i++) {
if (i != 0) {
x = x.substring(slashn+1);
}
slashn = x.indexOf("\n");
String rssi = x.substring(slashn-5, slashn-1);
int decNO = hexToDec(rssi);
Serial.println(decNO);
}
// Keep reading from Arduino Serial Monitor and send to HC-05
if (Serial.available()){
mySerial.write(Serial.read());
}
}}
這個(gè)程序是如何工作的
首先,它檢測數(shù)據(jù)是否可用。然后,它將數(shù)據(jù)復(fù)制到一個(gè)字符串 (X) 并檢測 INQ 行的結(jié)尾(注意所有 INQ 數(shù)據(jù)都是一個(gè)字符串,這需要為單行 INQ 數(shù)據(jù)分成不同的字符串)。
請注意一行是 +INQ:ADDR, CLASS, RSSI\r\n
通過 for 循環(huán),它正在檢測單獨(dú)的行并刪除已經(jīng)檢測到的行。RSSI 值是倒數(shù)第六到第三個(gè)(包括 \r\n),因此是 substring(slashn-5, slashn-1); 我們稱結(jié)尾為“斜線 n”,因?yàn)槟鞘墙Y(jié)尾,斜線 n。
當(dāng)你運(yùn)行這個(gè)程序時(shí),你應(yīng)該在+INQ....之后得到一個(gè)十進(jìn)制的RSSI值。這應(yīng)該是一個(gè)負(fù)數(shù)。數(shù)字越大,兩個(gè)設(shè)備越接近。
在下一步中,我們將向您展示如何將此數(shù)據(jù)報(bào)告給 LCD。我們還將了解如何檢測家庭成員
第三步:檢測家庭成員
通過設(shè)備的地址可以檢測到家庭成員。地址從第 5 個(gè)索引開始,到第 13 個(gè)結(jié)束,即 substring(5, slashn-11)。
有了這個(gè),我們還可以統(tǒng)計(jì)局外人和家庭成員的數(shù)量。
對于外人,可以測量距離,看是否為 6 英尺。通過將設(shè)備放在 6 英尺處進(jìn)行一系列試驗(yàn)后,我們確定為 76.91。
這是代碼。
#include
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
Serial.begin(9600);
Serial.println("Enter AT commands:");
mySerial.begin(38400);
}
unsigned int hexToDec(String hexString) {
unsigned int decValue = 0;
int nextInt;
for (int i = 0; i < hexString.length(); i++) {
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
void loop()
{
while (!mySerial.available()) {}
while (mySerial.available()) {
String x = String(mySerial.readString());
int slashn = x.indexOf("\n");
Serial.println(slashn);
int nod = 0;
int countf = 0;
int counto = 0;
int countd = 0;
int xlen = x.length()/(slashn+1);
if (x.endsWith("OK\r\n")) {
x = x.substring(0, x.length() - 4);
}
for (int i = 0; i < xlen; i++) {
if (i != 0) {
x = x.substring(slashn+1);
}
slashn = x.indexOf("\n");
String rssi = x.substring(slashn-5, slashn-1);
int decNO = hexToDec(rssi);
Serial.println(x.substring(5,slashn-11));
if (x.substring(5, slashn-11) == "FAMILYADDR") {
countf++;
}
else {
counto++;
if (decNO > -76.91) {
countd++;
}
}
if (decNO > -76.91) {
Serial.println("near");
}
else {
Serial.println("far");
}
Serial.println(decNO);
}
Serial.println("Family: " + String(countf) + " Outsider: " + String(counto) + " Danger: " + String(countd));
}
delay(100);
}
countf 是家庭成員的數(shù)量,counto 是外來者的數(shù)量,countd 是小于 6 英尺的危險(xiǎn)外來者的數(shù)量。
將 FAMILYADDR 替換為您嘗試掃描的“家庭”設(shè)備。任何外部設(shè)備都將自動(dòng)計(jì)為外部設(shè)備。對于多個(gè)設(shè)備,使用 || 列出多個(gè)設(shè)備的操作。
運(yùn)行此程序時(shí),您將看到列出的設(shè)備地址以及轉(zhuǎn)換后的 RSSI。掃描完所有內(nèi)容后,它將顯示家庭、局外人和危險(xiǎn)計(jì)數(shù)。
第 4 步:向 LCD 報(bào)告
當(dāng)該設(shè)備在現(xiàn)實(shí)世界中實(shí)施時(shí),設(shè)備持有者必須有辦法知道 rssi 值以及他們是否有感染 COVID-19 的危險(xiǎn)。
如圖所示為 LCD 接線:
接下來,將此代碼復(fù)制并粘貼到 Arduino IDE 中。運(yùn)行。
#include
SoftwareSerial mySerial(10, 11); // RX, TX
#include
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int buttonstate = 0;
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
Serial.println("Enter AT commands:");
}
unsigned int hexToDec(String hexString) {
unsigned int decValue = 0;
int nextInt;
for (int i = 0; i < hexString.length(); i++) {
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
void loop()
{
while (!mySerial.available()) {}
while (mySerial.available()) {
String x = String(mySerial.readString());
int slashn = x.indexOf("\n");
Serial.println(slashn);
int nod = 0;
int countf = 0;
int counto = 0;
int countd = 0;
int xlen = x.length()/(slashn+1);
if (x.endsWith("OK\r\n")) {
x = x.substring(0, x.length() - 4);
}
for (int i = 0; i < xlen; i++) {
if (i != 0) {
x = x.substring(slashn+1);
}
slashn = x.indexOf("\n");
String rssi = x.substring(slashn-5, slashn-1);
int decNO = hexToDec(rssi);
lcd.setCursor(0, 1);
lcd.print("RSSI:" + String(decNO));
Serial.println(x.substring(5,slashn-11));
if (x.substring(5, slashn-11) == "20:2:2011FB") {
countf++;
}
else {
counto++;
if (decNO > -76.91) {
countd++;
}
}
if (decNO > -76.91) {
Serial.println("near");
}
else {
Serial.println("far");
}
Serial.println(decNO);
}
Serial.println("Family: " + String(countf) + " Outsider: " + String(counto) + " Danger: " + String(countd));
if (counto/2 lcd.setCursor(10, 1);
lcd.print("DANGER");
Serial.println("DANGER");
}
else {
lcd.setCursor(10, 1);
lcd.print(" ");
Serial.println("Fine");
}
}
delay(100);
})>
我們覺得我們需要解釋背后的邏輯counto/2。請注意,76.91 是平均 rssi 值,這意味著一半的值超過,一半低于。這確保了不超過 5 個(gè)值低于 76.91;否則它會說“危險(xiǎn)”。<>
第 5 步:蜂鳴器
在過馬路等場景中看設(shè)備是很危險(xiǎn)的。如果距離小于 6 英尺,我們使用有源蜂鳴器發(fā)出警報(bào)。只有當(dāng)任何一個(gè)人與另一個(gè)人的距離超過 6 英尺時(shí)才會關(guān)閉。將蜂鳴器連接到 D13,如圖所示:
1 / 2
復(fù)制并粘貼代碼,如圖
#include
SoftwareSerial mySerial(10, 11); // RX, TX
#include
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int buttonstate = 0;
void setup() {
pinMode(13,OUTPUT);
lcd.begin(16, 2);
Serial.begin(9600);
Serial.println("Enter AT commands:");
mySerial.begin(38400);
}
unsigned int hexToDec(String hexString) {
unsigned int decValue = 0;
int nextInt;
for (int i = 0; i < hexString.length(); i++) {
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
void loop()
{
while (!mySerial.available()) {}
while (mySerial.available()) {
String x = String(mySerial.readString());
int slashn = x.indexOf("\n");
Serial.println(slashn);
int nod = 0;
int countf = 0;
int counto = 0;
int countd = 0;
int xlen = x.length()/(slashn+1);
if (x.endsWith("OK\r\n")) {
x = x.substring(0, x.length() - 4);
OK = 1;
}
for (int i = 0; i < xlen; i++) {
if (i != 0) {
x = x.substring(slashn+1);
}
slashn = x.indexOf("\n");
String rssi = x.substring(slashn-5, slashn-1);
int decNO = hexToDec(rssi);
lcd.setCursor(0, 1);
lcd.print("RSSI:" + String(decNO));
Serial.println(x.substring(5,slashn-11));
if (x.substring(5, slashn-11) == "20:2:2011FB") {
countf++;
}
else {
counto++;
if (decNO > -76.91) {
countd++;
}
}
if (decNO > -76.91) {
Serial.println("near");
}
else {
Serial.println("far");
}
Serial.println(decNO);
}
Serial.println("Family: " + String(countf) + " Outsider: " + String(counto) + " Danger: " + String(countd));
if (counto/2 lcd.setCursor(10, 1);
lcd.print("DANGER");
Serial.println("DANGER");
digitalWrite(13,HIGH);
}
else {
lcd.setCursor(10, 1);
lcd.print(" ");
Serial.println("Fine");
digitalWrite(13,LOW);
}
}
delay(100);
})>
運(yùn)行代碼時(shí),如果距離小于 6 英尺,設(shè)備會發(fā)出嗡嗡聲,超過 6 英尺時(shí)設(shè)備會正常運(yùn)行。
第 6 步:設(shè)備獨(dú)立性(無計(jì)算機(jī))
如果在現(xiàn)實(shí)世界中實(shí)現(xiàn),該設(shè)備必須在沒有計(jì)算機(jī)的情況下運(yùn)行并發(fā)送命令。
話雖如此,9V 電池必須提供必要的電壓。
請注意,可能需要一點(diǎn)透明膠帶將電池粘貼到面包板的背面。這使設(shè)備更易于握持。
1 / 2
。
?
- PLC程序執(zhí)行過程
- 自動(dòng)社交距離執(zhí)行器開源案例
- 單片機(jī)C程序編譯、執(zhí)行過程資料下載
- Visual C++和MFC創(chuàng)建的應(yīng)用程序基礎(chǔ)知識 0次下載
- 在Linux系統(tǒng)下執(zhí)行MySQL的SQL文件程序免費(fèi)下載 4次下載
- 單片機(jī)的程序在內(nèi)存和FLASH中應(yīng)該如何進(jìn)行空間分配
- 使用51單片機(jī)設(shè)計(jì)超聲波測速然后通過串口發(fā)送距離的程序免費(fèi)下載
- 51單片機(jī)的程序存儲器和數(shù)據(jù)存儲器的詳細(xì)資料說明
- 使用51單片機(jī)設(shè)計(jì)警報(bào)裝置的程序免費(fèi)下載
- 如何使用MM7150-PICtail和Explorer 16開發(fā)板執(zhí)行演示程序詳細(xì)概述
- 基于符號執(zhí)行技術(shù)實(shí)現(xiàn)的驅(qū)動(dòng)程序的漏洞檢測 0次下載
- ARM應(yīng)用程序構(gòu)架_順序執(zhí)行模板 6次下載
- 基于程序執(zhí)行軌跡的SoC硬件加速模塊提取方法
- 新型智能閥門電動(dòng)執(zhí)行裝置的硬件設(shè)計(jì)和實(shí)現(xiàn)
- 15路遠(yuǎn)距離遙控報(bào)警裝置電路圖
- 淺談PLC程序執(zhí)行的過程 1890次閱讀
- 使用STM32定時(shí)器測量程序執(zhí)行時(shí)間的方法詳解 7753次閱讀
- 執(zhí)行的單片機(jī)程序怎么寫? 1539次閱讀
- 淺談RAM 執(zhí)行應(yīng)用程序 3061次閱讀
- PLC的用戶程序執(zhí)行過程 4093次閱讀
- 單片機(jī)的主程序是如何執(zhí)行的 1w次閱讀
- 51單片機(jī)是如何執(zhí)行程序運(yùn)行的 8203次閱讀
- 電熱執(zhí)行器是什么_電熱執(zhí)行器工作原理 1.8w次閱讀
- 單片機(jī)執(zhí)行編制程序的全過程解析 2215次閱讀
- 單片機(jī)執(zhí)行程序的全過程介紹 1.4w次閱讀
- 淺析MCU的內(nèi)存分配與代碼執(zhí)行 4419次閱讀
- 一文看懂python程序的執(zhí)行過程 1.7w次閱讀
- ARM程序的執(zhí)行過程詳解 7123次閱讀
- java程序的執(zhí)行過程詳解 1.7w次閱讀
- mfc程序執(zhí)行流程小結(jié),MFC程序的執(zhí)行順序 9403次閱讀
下載排行
本周
- 1使用單片機(jī)實(shí)現(xiàn)七人表決器的程序和仿真資料免費(fèi)下載
- 2.96 MB | 44次下載 | 免費(fèi)
- 2聯(lián)想E46L DAOLL6筆記本電腦圖紙
- 1.10 MB | 2次下載 | 5 積分
- 3MATLAB繪圖合集
- 27.12 MB | 2次下載 | 5 積分
- 4PR735,使用UCC28060的600W交錯(cuò)式PFC轉(zhuǎn)換器
- 540.03KB | 1次下載 | 免費(fèi)
- 5UCC38C42 30W同步降壓轉(zhuǎn)換器參考設(shè)計(jì)
- 428.07KB | 1次下載 | 免費(fèi)
- 6DV2004S1/ES1/HS1快速充電開發(fā)系統(tǒng)
- 2.08MB | 1次下載 | 免費(fèi)
- 7模態(tài)分解合集matlab代碼
- 3.03 MB | 1次下載 | 2 積分
- 8美的電磁爐維修手冊大全
- 1.56 MB | 1次下載 | 5 積分
本月
- 1使用單片機(jī)實(shí)現(xiàn)七人表決器的程序和仿真資料免費(fèi)下載
- 2.96 MB | 44次下載 | 免費(fèi)
- 2UC3842/3/4/5電源管理芯片中文手冊
- 1.75 MB | 15次下載 | 免費(fèi)
- 3DMT0660數(shù)字萬用表產(chǎn)品說明書
- 0.70 MB | 13次下載 | 免費(fèi)
- 4TPS54202H降壓轉(zhuǎn)換器評估模塊用戶指南
- 1.02MB | 8次下載 | 免費(fèi)
- 5STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 6HY12P65/HY12P66數(shù)字萬用表芯片規(guī)格書
- 0.69 MB | 6次下載 | 免費(fèi)
- 7華瑞昇CR216芯片數(shù)字萬用表規(guī)格書附原理圖及校正流程方法
- 0.74 MB | 6次下載 | 3 積分
- 8華瑞昇CR215芯片數(shù)字萬用表原理圖
- 0.21 MB | 5次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191367次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多