資料介紹
描述
為什么需要保持社交距離?這個項目的動機是什么?
COVID-19(也稱為新型冠狀病毒)是一種致命疾病,已感染超過 2400 萬人并導致超過 80 萬人死亡。
僅在美國,就有600 萬例病例。據Worldometers.info 稱,最近 COVID-19 病例一直在增加。

疾病預防控制中心建議保持社交距離,這是一種人們分開 6 英尺的程序,除非他們是同一個家庭的成員。那么,作為一個社區(qū),我們如何使用技術來執(zhí)行這個程序呢?這就是這個項目的動機。
成本
為了讓每個人都可以使用這個項目,我們希望確保成本盡可能低。
一臺設備的成本:
- Arduino Nano--10 售價 36.49 美元,因此每個售價 3.65 美元
- HC-05--2 為 12.5 美元,因此每個為6.25 美元
- LCD--2 售價 6.49 美元,因此每個售價 3.25 美元
- 有源蜂鳴器——20 個,9.59 美元,所以每個是0.48 美元
- 10K 歐姆電位器——20 個,6.39 美元,所以每個0.32 美元
- 220 歐姆電阻器 - 100 個 5.69 美元,因此每個0.06 美元
- 9V 電池——8 塊10.99 美元,所以每塊 1.37 美元
- 9V 電池連接器面包板--40 個,售價 6.48 美元,因此每個售價 0.16 美元
總計高達15.54 美元。這是非常令人印象深刻的,因為這可以挽救無數生命。
準備步驟:安裝庫
第一步是安裝 LCD 庫,您將需要這兩個庫。這可能預裝在 Arduino IDE 上,但可能不在某些版本上。
轉到工具>管理庫。在這里,搜索“液晶”。
我們要查找的庫是列表中的第一個。如果您還沒有安裝它。
還使用了 SoftwareSerial 庫,但它已經預先安裝。
第 1 步:將 HC-05 配置為 AT 模式
第一步是將 HC-05 配置為 AT 模式。在這里,我們可以執(zhí)行 AT+INQ 命令來掃描其他設備。
需要兩個或更多設備才能相互掃描。在所需的部分中描述了一種“設備”。
對于此步驟,設備應按如下方式接線:

有兩種 HC-05 設備:一種帶有“KEY”引腳不帶按鈕,一種帶有“EN”引腳帶按鈕
AT模式HC-05無按鍵:
如果 KEY 引腳連接到 +5V DC,它應該自動處于 AT 模式。
AT 模式 HC-05 帶按鈕
在這種情況下,EN 引腳應連接到 +5V DC。插入 Arduino Nano 時,按下按鈕,插入設備,然后松開。這應該激活 AT 模式。
將此代碼復制并粘貼到 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());}
}
從本質上講,這會將您在串行監(jiān)視器中鍵入的任何內容打印到 HC05,等待消息并打印該消息。
運行代碼。
運行代碼:
打開串行監(jiān)視器。
當“Enter AT commands:”出現時,輸入“AT”并按下回車鍵。您應該會收到一條消息說“OK”
鍵入“AT+NAME”并顯示名稱。

值
為了獲得設備之間的距離,我們需要 rssi 值。要獲取 rssi 值,我們需要執(zhí)行 AT+INQ 命令。但是,在此之前還有一些命令要執(zhí)行,一一執(zhí)行:
- AT+復位
- AT+初始化
- AT+IAC=9e8b33
- AT+CLASS=0
- AT+INQM=1, 9, 48
- AT+INQ
這是執(zhí)行完所有 6 個命令后串行監(jiān)視器的外觀。(一步步)

請注意,當我們執(zhí)行 AT+INQ 命令時,它會顯示 +INQ,后跟地址、類別,然后是 RSSI 值。RSSI 值是最后 4 個字符。請注意,這是十六進制;要將其轉換為十進制,我們需要使用帶符號的二進制補碼格式。
如果得到的 RSSI 值為 7FFF,請嘗試再次執(zhí)行上述命令。
如果 rssi 值以 F 開頭,那么你很好。
第 2 步:轉換 Rssi 值
要轉換 rssi 值,我們需要創(chuàng)建一個新函數來執(zhí)行此操作。
將此代碼復制并粘貼到 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());
}
}}
這個程序是如何工作的
首先,它檢測數據是否可用。然后,它將數據復制到一個字符串 (X) 并檢測 INQ 行的結尾(注意所有 INQ 數據都是一個字符串,這需要為單行 INQ 數據分成不同的字符串)。
請注意一行是 +INQ:ADDR, CLASS, RSSI\r\n
通過 for 循環(huán),它正在檢測單獨的行并刪除已經檢測到的行。RSSI 值是倒數第六到第三個(包括 \r\n),因此是 substring(slashn-5, slashn-1); 我們稱結尾為“斜線 n”,因為那是結尾,斜線 n。
當你運行這個程序時,你應該在+INQ....之后得到一個十進制的RSSI值。這應該是一個負數。數字越大,兩個設備越接近。
在下一步中,我們將向您展示如何將此數據報告給 LCD。我們還將了解如何檢測家庭成員
第三步:檢測家庭成員
通過設備的地址可以檢測到家庭成員。地址從第 5 個索引開始,到第 13 個結束,即 substring(5, slashn-11)。
有了這個,我們還可以統(tǒng)計局外人和家庭成員的數量。
對于外人,可以測量距離,看是否為 6 英尺。通過將設備放在 6 英尺處進行一系列試驗后,我們確定為 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 是家庭成員的數量,counto 是外來者的數量,countd 是小于 6 英尺的危險外來者的數量。
將 FAMILYADDR 替換為您嘗試掃描的“家庭”設備。任何外部設備都將自動計為外部設備。對于多個設備,使用 || 列出多個設備的操作。
運行此程序時,您將看到列出的設備地址以及轉換后的 RSSI。掃描完所有內容后,它將顯示家庭、局外人和危險計數。
第 4 步:向 LCD 報告
當該設備在現實世界中實施時,設備持有者必須有辦法知道 rssi 值以及他們是否有感染 COVID-19 的危險。
如圖所示為 LCD 接線:

接下來,將此代碼復制并粘貼到 Arduino IDE 中。運行。
#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 個值低于 76.91;否則它會說“危險”。<>

第 5 步:蜂鳴器
在過馬路等場景中看設備是很危險的。如果距離小于 6 英尺,我們使用有源蜂鳴器發(fā)出警報。只有當任何一個人與另一個人的距離超過 6 英尺時才會關閉。將蜂鳴器連接到 D13,如圖所示:

1 / 2
復制并粘貼代碼,如圖
#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);
})>
運行代碼時,如果距離小于 6 英尺,設備會發(fā)出嗡嗡聲,超過 6 英尺時設備會正常運行。
第 6 步:設備獨立性(無計算機)
如果在現實世界中實現,該設備必須在沒有計算機的情況下運行并發(fā)送命令。
話雖如此,9V 電池必須提供必要的電壓。
請注意,可能需要一點透明膠帶將電池粘貼到面包板的背面。這使設備更易于握持。

1 / 2
。
?
- PLC程序執(zhí)行過程
- 自動社交距離執(zhí)行器開源案例
- 單片機C程序編譯、執(zhí)行過程資料下載
- Visual C++和MFC創(chuàng)建的應用程序基礎知識 0次下載
- 在Linux系統(tǒng)下執(zhí)行MySQL的SQL文件程序免費下載 4次下載
- 單片機的程序在內存和FLASH中應該如何進行空間分配
- 使用51單片機設計超聲波測速然后通過串口發(fā)送距離的程序免費下載
- 51單片機的程序存儲器和數據存儲器的詳細資料說明
- 使用51單片機設計警報裝置的程序免費下載
- 如何使用MM7150-PICtail和Explorer 16開發(fā)板執(zhí)行演示程序詳細概述
- 基于符號執(zhí)行技術實現的驅動程序的漏洞檢測 0次下載
- ARM應用程序構架_順序執(zhí)行模板 6次下載
- 基于程序執(zhí)行軌跡的SoC硬件加速模塊提取方法
- 新型智能閥門電動執(zhí)行裝置的硬件設計和實現
- 15路遠距離遙控報警裝置電路圖
- 淺談PLC程序執(zhí)行的過程 3047次閱讀
- 使用STM32定時器測量程序執(zhí)行時間的方法詳解 8518次閱讀
- 執(zhí)行的單片機程序怎么寫? 1832次閱讀
- 淺談RAM 執(zhí)行應用程序 3264次閱讀
- PLC的用戶程序執(zhí)行過程 4399次閱讀
- 單片機的主程序是如何執(zhí)行的 1w次閱讀
- 51單片機是如何執(zhí)行程序運行的 8349次閱讀
- 電熱執(zhí)行器是什么_電熱執(zhí)行器工作原理 1.9w次閱讀
- 單片機執(zhí)行編制程序的全過程解析 2342次閱讀
- 單片機執(zhí)行程序的全過程介紹 1.4w次閱讀
- 淺析MCU的內存分配與代碼執(zhí)行 4517次閱讀
- 一文看懂python程序的執(zhí)行過程 1.7w次閱讀
- ARM程序的執(zhí)行過程詳解 7241次閱讀
- java程序的執(zhí)行過程詳解 1.7w次閱讀
- mfc程序執(zhí)行流程小結,MFC程序的執(zhí)行順序 9579次閱讀
下載排行
本周
- 1人形機器人電機驅動和傳感報告
- 4.27 MB | 9次下載 | 免費
- 2Altium Designer元件庫
- 17.11 MB | 6次下載 | 免費
- 324V2A開關電源PCB資料分享
- 0.23 MB | 4次下載 | 1 積分
- 4GD100PIX120C6SNA規(guī)格書
- 0.98 MB | 3次下載 | 免費
- 5Multisim模擬電路仿真教程
- 1.93 MB | 1次下載 | 3 積分
- 6BK7258英文規(guī)格書
- 1.67 MB | 1次下載 | 免費
- 7RA4L1硬件手冊
- 21.89 MB | 1次下載 | 免費
- 8RA4L1_SENSOR-V1原理圖
- 754.36 KB | 1次下載 | 免費
本月
- 1晶體三極管的電流放大作用詳細說明
- 0.77 MB | 32次下載 | 2 積分
- 2雙極型三極管放大電路的三種基本組態(tài)的學習課件免費下載
- 4.03 MB | 25次下載 | 1 積分
- 3AIWA HS-J303 MKⅡ維修手冊
- 22.47 MB | 24次下載 | 10 積分
- 4九陽豆?jié){機高清原理圖
- 2.47 MB | 23次下載 | 1 積分
- 5多級放大電路的學習課件免費下載
- 1.81 MB | 21次下載 | 2 積分
- 6AIWA HS-J202/HS-J202M/HS-J800維修手冊
- 13.60 MB | 16次下載 | 10 積分
- 7東芝彩色電視機29SF6C維修說明書
- 4.86 MB | 9次下載 | 1 積分
- 8人形機器人電機驅動和傳感報告
- 4.27 MB | 9次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191382次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183338次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81586次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73814次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論