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

疾病預防控制中心建議保持社交距離,這是一種人們分開 6 英尺的程序,除非他們是同一個家庭的成員。那么,作為一個社區,我們如何使用技術來執行這個程序呢?這就是這個項目的動機。
成本
為了讓每個人都可以使用這個項目,我們希望確保成本盡可能低。
一臺設備的成本:
- 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 模式。在這里,我們可以執行 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());}
}
從本質上講,這會將您在串行監視器中鍵入的任何內容打印到 HC05,等待消息并打印該消息。
運行代碼。
運行代碼:
打開串行監視器。
當“Enter AT commands:”出現時,輸入“AT”并按下回車鍵。您應該會收到一條消息說“OK”
鍵入“AT+NAME”并顯示名稱。

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

請注意,當我們執行 AT+INQ 命令時,它會顯示 +INQ,后跟地址、類別,然后是 RSSI 值。RSSI 值是最后 4 個字符。請注意,這是十六進制;要將其轉換為十進制,我們需要使用帶符號的二進制補碼格式。
如果得到的 RSSI 值為 7FFF,請嘗試再次執行上述命令。
如果 rssi 值以 F 開頭,那么你很好。
第 2 步:轉換 Rssi 值
要轉換 rssi 值,我們需要創建一個新函數來執行此操作。
將此代碼復制并粘貼到 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 循環,它正在檢測單獨的行并刪除已經檢測到的行。RSSI 值是倒數第六到第三個(包括 \r\n),因此是 substring(slashn-5, slashn-1); 我們稱結尾為“斜線 n”,因為那是結尾,斜線 n。
當你運行這個程序時,你應該在+INQ....之后得到一個十進制的RSSI值。這應該是一個負數。數字越大,兩個設備越接近。
在下一步中,我們將向您展示如何將此數據報告給 LCD。我們還將了解如何檢測家庭成員
第三步:檢測家庭成員
通過設備的地址可以檢測到家庭成員。地址從第 5 個索引開始,到第 13 個結束,即 substring(5, slashn-11)。
有了這個,我們還可以統計局外人和家庭成員的數量。
對于外人,可以測量距離,看是否為 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 英尺,我們使用有源蜂鳴器發出警報。只有當任何一個人與另一個人的距離超過 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 英尺,設備會發出嗡嗡聲,超過 6 英尺時設備會正常運行。
第 6 步:設備獨立性(無計算機)
如果在現實世界中實現,該設備必須在沒有計算機的情況下運行并發送命令。
話雖如此,9V 電池必須提供必要的電壓。
請注意,可能需要一點透明膠帶將電池粘貼到面包板的背面。這使設備更易于握持。

1 / 2
。
?
- PLC程序執行過程
- 自動社交距離執行器開源案例
- 單片機C程序編譯、執行過程資料下載
- Visual C++和MFC創建的應用程序基礎知識 0次下載
- 在Linux系統下執行MySQL的SQL文件程序免費下載 4次下載
- 單片機的程序在內存和FLASH中應該如何進行空間分配
- 使用51單片機設計超聲波測速然后通過串口發送距離的程序免費下載
- 51單片機的程序存儲器和數據存儲器的詳細資料說明
- 使用51單片機設計警報裝置的程序免費下載
- 如何使用MM7150-PICtail和Explorer 16開發板執行演示程序詳細概述
- 基于符號執行技術實現的驅動程序的漏洞檢測 0次下載
- ARM應用程序構架_順序執行模板 6次下載
- 基于程序執行軌跡的SoC硬件加速模塊提取方法
- 新型智能閥門電動執行裝置的硬件設計和實現
- 15路遠距離遙控報警裝置電路圖
- 淺談PLC程序執行的過程 3047次閱讀
- 使用STM32定時器測量程序執行時間的方法詳解 8518次閱讀
- 執行的單片機程序怎么寫? 1832次閱讀
- 淺談RAM 執行應用程序 3264次閱讀
- PLC的用戶程序執行過程 4399次閱讀
- 單片機的主程序是如何執行的 1w次閱讀
- 51單片機是如何執行程序運行的 8349次閱讀
- 電熱執行器是什么_電熱執行器工作原理 1.9w次閱讀
- 單片機執行編制程序的全過程解析 2342次閱讀
- 單片機執行程序的全過程介紹 1.4w次閱讀
- 淺析MCU的內存分配與代碼執行 4517次閱讀
- 一文看懂python程序的執行過程 1.7w次閱讀
- ARM程序的執行過程詳解 7241次閱讀
- java程序的執行過程詳解 1.7w次閱讀
- mfc程序執行流程小結,MFC程序的執行順序 9579次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論