作為一名教師,傳統上的出勤(點名)是一項耗時的任務,如果自動化,教師可以專注于其他教學活動。在本項目中,RFID閱讀器模塊和RFID卡將用于實現自動考勤系統。
課程在密閉空間內進行,如果環境太熱或太冷,很難聽課。為了實現有效的學習,應保持教室內正確的物理環境。該項目將使用相對濕度和溫度傳感器(DHT11)來監控溫度和濕度,并在值超出范圍時發出通知。
庫和定義
在開始代碼之前,需要將庫包含在程序中。定義了物理連接到Arduino板的引腳號。創建將用于數據采集的RFID接收器(mfrc522)和DHT傳感器(dht)的實例。創建了一個名為student的變量,它是一個二維字符串數組,用于存儲學生姓名和相關的RFID標簽ID。
設置
setup()函數僅在板子上電或按下復位按鈕時執行一次。串行連接以9600的波特率初始化。DHT傳感器采集調用函數begin()開始采集。
調用一些ArduinoIoTCloud函數來初始化屬性、開始連接、設置調試消息級別并打印任何調試信息。
主要功能-循??環
Arduino中的loop()函數包括SPI通信的開始和mfrc522的初始化。起初,這兩個初始化是在設置階段完成的,但由于ArduinoCloud更新時的錯誤而被移到循環中。它將引腳10更改為輸入,中斷SPI通信。解決方案是在每個循環上初始化SPI通信,以將引腳10重置為輸出模式。
void loop() {
SPI.begin();
mfrc522.PCD_Init();
if ( mfrc522.PICC_IsNewCardPresent()) {
if (mfrc522.PICC_ReadCardSerial()) {
String content = "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
//Serial.println(content.substring(1));
content.toUpperCase();
for (int i = 0; i < 6; i++) {
if (content.substring(1) == student[i][0])
{
msg_Attendance = "Attendance Recorded for Student: " + student[i][1] ;
}
}
Serial.println(msg_Attendance);
}
}
dht_sensor_getdata();
delay(500);
ArduinoCloud.update();
}
mfrc522初始化后,調用PICC_IsNewCardPresent()函數。如果檢測到新卡,PICC_ReadCardSerial()函數會從 RFID 卡中讀取 ID 信息。ID 是一個字符串類型的變量,稱為內容。它被轉換為大寫,以便與存儲在程序定義部分中的學生ID 數組進行比較。當從卡中讀取的 ID 與記錄中的學生匹配時,會記錄出勤情況并將其存儲在變量msg_Attendance 中。
dht_sensor_getdata ()函數被調用,更多詳細信息在下一節中。在調用ArduinoCloud.update()函數之前引入了 500 毫秒的短暫延遲。此函數將所有四個變量發送到云端:溫度、濕度、msg_Attendance和msgTempHum 。
DHT傳感器功能
創建函數dht_sensor_getdata()是為了從 DHT11 傳感器讀取濕度和溫度數據。dht.h 庫導入函數 readHumidity() 和 readTemperature()。
if-else 條件檢查低溫 (20oC) 和高溫 (27oC) 的閾值,然后向儀表板發送消息。這可以通過執行器(打開或關閉空調)或真實教室中的警報來實現。
void dht_sensor_getdata()
{
float hm = dht.readHumidity();
Serial.print(F("Humidity "));
Serial.println(hm);
float temp = dht.readTemperature();
Serial.print(F("Temperature "));
Serial.println(temp);
humidity = hm;
temperature = temp;
if (temp > 27) {
msgTempHum = "Temperature = " + String (temperature) + " Humidity = " + String(humidity) + " -> High ";
}
else if (temp < 20) {
msgTempHum = "Temperature = " + String (temperature) + " Humidity = " + String(humidity) + " -> Low ";
}
else {
msgTempHum = "Temperature = " + String (temperature) + " Humidity = " + String(humidity) + " -> All ok ";
}
}
準備工作-設置云
要連接到ArduinoIoTCloud,首先我們需要創建一個帳戶或登錄。
要使用已經安裝了所有核心和庫的基于Web的編輯器,我們需要安裝CreateAgentPlugin。該代理將識別通過USB連接到計算機的板。
進入網頁編輯器頁面后,我們可以看到板已連接/斷開,編輯我們的代碼并在完成后上傳。
但是,還有其他兩個選項可用:
經典離線ArduinoIDE1.8.13(集成開發環境)作為–用于本地傳感器故障排除。
新的ArduinoIDE2.0-具有調試、代碼突出顯示和自動完成等新功能,目前處于beta階段(準備此項目時)。
要選擇IoTCloud菜單或Web編輯器,我們可以單擊個人資料圖片附近的右上角按鈕。
一旦我們選擇了物聯網云菜單,就會有一些選項可用,但在這個項目中,我們將專注于創建事物、關聯設備和準備儀表板。
單擊上圖所示的“創建事物”后。我們遵循了這個項目中的步驟:
第1步-設備-將設備與我們的事物相關聯
第2步-添加變量
第3步-更改網絡設置
第4步-編輯草圖,連接到串行監視器
第5步-準備儀表板
第6步-從發送到云端的板上獲取數據并導出
第1步-設備
第一步是單擊并選擇設備。
可以關聯以前在IoT云中使用的任何設備,也可以設置新設備。
對于這個項目,我們將設備ArduinoMKRGSM1400與Thing相關聯,但可以使用任何其他板,例如ArduinoMKRWiFI1010或NodeMCU。
第2步-變量
第二步是添加變量:
單擊添加變量后,您需要選擇變量名稱、類型、權限、更新策略和閾值。在這個項目中,創建了5個變量:
濕度——在儀表板上存儲和顯示相對濕度值
溫度-在儀表板上存儲和顯示室溫
msg_Attendance–顯示學生出勤、姓名和時間
msgTempHum–顯示溫度和濕度以及任何警告
led-此LED用于快速故障排除以檢查板/云連接
變量權限可以是:
讀寫——變量既可以作為輸入也可以作為輸出,數據可以從設備發送到云端,反之亦然
只讀——變量只能作為輸出,數據只能從設備發送到云端
變量更新策略可以是:
OnChange:只要值的變化大于或等于設置的閾值,變量就會更新到云端
定期:每次經過設置的秒數時,變量將更新到云端
該項目中使用的基本變量類型是:
布爾值-真或假(LED)
浮點數-帶小數的數字(溫度和濕度)
字符串-單詞和句子(msg_Attendance和msgTempHum)
第3步-網絡
設置好所有變量后,第三步是在configureNetwork中添加網絡憑據
在這個項目中,我們使用了具有如下憑據的ArduinoSIM卡:
如果您使用的是Wi-Fi設備,網絡配置會有所不同。本地Wi-Fi名稱不得包含空格。
第4步-草圖
一小部分代碼由ArduinoIoTCloud根據前三個步驟中添加的信息自動更新。您可以編輯草圖,完整代碼顯示在本頁底部。
檢查串行監視器選項卡以排除連接故障。如果未連接到云端,我建議使用計算機中的本地ArduinoIDE并查看串行監視器上的消息。
第5步-儀表板
儀表板是物聯網云設置的最后一部分,我們可以單擊在儀表板選項卡中構建儀表板:
要填充我們的儀表板,我們需要添加小部件。
然后我們將一個變量鏈接到設置中的小部件。在這個項目中,我們添加了七個小部件,LED按鈕、濕度和溫度計、濕度和溫度圖表、溫度和濕度消息以及考勤消息。
執行上述步驟的另一種方法是添加一個東西(這個項目的東西叫做SIM):
然后從Thing中選擇變量:
有兩種類型的儀表板視圖:移動視圖
和桌面視圖:
第6步-下載歷史數據
可以使用儀表板(i)上的“下載歷史數據”選項從云中導出數據。
下載歷史數據可以選擇我們要下載的變量和時間段。
您可以查看通過電子郵件接收并下載為CSV文件的考勤數據示例。
readme.txt文件包含變量名稱、請求的時間段和希望我們“玩得開心!”的消息:
-
RFID
+關注
關注
388文章
6143瀏覽量
237760 -
考勤系統
+關注
關注
0文章
40瀏覽量
11210
發布評論請先 登錄
相關推薦
評論