資料介紹
描述
我們要解決什么問(wèn)題?
如果 COVID 下降,公司將開(kāi)始返回辦公室。
他們需要保持環(huán)境清潔和員工安全。他們還需要遵守有時(shí)復(fù)雜的當(dāng)?shù)胤ㄒ?guī),并證明他們符合規(guī)則。有時(shí),如果他們忘記保持地方清潔,他們甚至需要支付巨額罰款(因?yàn)樗麄兠爸约簡(jiǎn)T工健康的風(fēng)險(xiǎn))。
目標(biāo)將是定期保持辦公室清潔,不會(huì)錯(cuò)過(guò)及時(shí)清潔的房間,收集合規(guī)報(bào)告的數(shù)據(jù)。
另一個(gè)目標(biāo)是易于安裝。如果一家公司想回到 Office,物理部件應(yīng)該能夠非常快速輕松地安裝。
“房間”可以是辦公室內(nèi)的任何地方,如廁所、食堂、走廊、會(huì)議室、辦公空間、接待處等,甚至是大樓外的地方。
目前的解決方案
我們?cè)诖蠖鄶?shù)地方(尤其是公共廁所)看到的是一張紙,如果房間被打掃過(guò),清潔人員會(huì)在上面手寫。然后這些文件 - 再次 - 手動(dòng)收集一天結(jié)束并輸入報(bào)告。當(dāng)前解決方案的問(wèn)題是很容易忘記打掃房間,而且收集所有報(bào)告并檢查一切是否合規(guī)是一項(xiàng)艱巨的任務(wù)。

建議的解決方案
將一個(gè) AWS IoT EduKit 放入每個(gè)房間。把它們貼在墻上。一旦他們連接到公司 WiFi 并注冊(cè)自己,他們就可以測(cè)量清潔周期(例如 1 小時(shí))。每次清潔人員打掃房間時(shí),她/他都會(huì)按下 IoT Thing 上的按鈕,說(shuō)明房間已準(zhǔn)備就緒。然后 IoT Thing 將此事件發(fā)送到 AWS,并使用顯示屏和 LED 指示燈開(kāi)始倒計(jì)時(shí)到下一次清潔。AWS lambda 將 AWS IoT Core 與 AWS Honeycode 連接起來(lái),狀態(tài)數(shù)據(jù)存儲(chǔ)在 AWS Honeycode 表中。
- 綠色 - 房間還可以
- 黃色 - 距離下一次清潔還有 15 分鐘或更短的時(shí)間
- 紅色 - 現(xiàn)在應(yīng)該打掃房間
不錯(cuò)過(guò)要及時(shí)打掃的房間
如上所述,如果是清潔時(shí)間,LED 會(huì)在本地顯示。但有時(shí)保潔人員并不親近。因此,清潔人員有一個(gè)移動(dòng)應(yīng)用程序,她/他可以在其中查看分配的房間和每個(gè)房間的剩余時(shí)間(也有顏色編碼),因此她/他知道接下來(lái)要去哪里清潔。
也可以點(diǎn)擊移動(dòng)應(yīng)用程序上的“完成”按鈕,但前提是目標(biāo) Room 尚未安裝 IoT Thing。安裝后,手機(jī)上的按鈕將被禁用,清潔時(shí)需要在房間內(nèi)。

合規(guī)報(bào)告
還有一個(gè)適用于經(jīng)理和監(jiān)管者的應(yīng)用程序。這顯示了來(lái)自 AWS Honeycode 清理日志表的清理日志。這里的顏色指示器還顯示我們是否合規(guī)。

概括
該解決方案也可用于任何其他公共場(chǎng)所,例如酒店和會(huì)議廳。不僅適用于辦公室。
實(shí)施解決方案的技術(shù)細(xì)節(jié)和步驟

對(duì)于下面的步驟,我們?cè)诩軜?gòu)之上構(gòu)建,從底層構(gòu)建到頂層。
第 0 步是準(zhǔn)備項(xiàng)目所需的所有工具和配置。
步驟 1 - 4 描述路徑:
- 數(shù)據(jù)庫(kù) <=> GUI <=> 移動(dòng)應(yīng)用
步驟 5 - 9 描述路徑:
- 數(shù)據(jù)庫(kù) <= Lambda <= IoT Rule <= IoT Shadow <= IoT Thing
步驟 0:準(zhǔn)備開(kāi)發(fā)環(huán)境并向 AWS 注冊(cè) IoT
瀏覽 AWS IoT EduKit 教程的入門、云連接 Blinky 和智能恒溫器章節(jié)
這將準(zhǔn)備:
- 具有 Visual Studio Code 和 PlatformIO 擴(kuò)展的開(kāi)發(fā)環(huán)境
- Silicon Labs USB 到 UART 橋接器,用于將 IoT Thing 連接到主機(jī)
- AWS 賬戶和為其配置的 AWS CLI
- 檢索設(shè)備證書并注冊(cè) AWS IoT Thing
- ESP32 固件的配置,將值設(shè)置到 sdkconfig 文件中,例如:AWS IoT 端點(diǎn)主機(jī)名、Wifi SSID 和密碼
- IoT 事物和 AWS IoT Core 之間的 AWS IoT Core 影子連接
- 響應(yīng)影子更新的示例 AWS IoT Core 規(guī)則
第 1 步:AWS Honeycode 表
AWS Honeycode 是一種基于表的無(wú)代碼應(yīng)用程序構(gòu)建器工具。因此,我們需要通過(guò)屏幕截圖來(lái)了解應(yīng)用程序是如何構(gòu)建的。所有重要配置都會(huì)有一個(gè)屏幕截圖。
首先讓我們導(dǎo)入現(xiàn)場(chǎng)服務(wù)代理模板,這是一個(gè)好的開(kāi)始,它將在接下來(lái)的步驟中進(jìn)行修改。
將應(yīng)用程序重命名為 IoT Rooms。
然后編輯A_WorkOrders表,如下面的屏幕截圖所示:
- 將您的房間添加到標(biāo)題列
- 您可以添加注釋
- 在狀態(tài)列中將所有狀態(tài)設(shè)置為打開(kāi)
- 將清潔人員添加到 Agent 列(您可能需要先邀請(qǐng)您的團(tuán)隊(duì)成員加入 Honeycode)
- 在“到期”列中添加任何日期(這表示該清理房間的時(shí)間)
- 將您的所有 AWS IoT Things 客戶端 ID 添加到 IoT 列,添加到您安裝它們的房間(在屏幕截圖中用紅線標(biāo)記)。clientId 可以在 Smart Thermostat 教程的控制臺(tái)日志中看到,如下所示:
?[0;32mI (3425) MAIN: Device client Id: >> 0123456789abcdef01 <[0m

M_Status表應(yīng)如下所示:

創(chuàng)建一個(gè)名為L_Log的新表,如下所示:
- 添加 Title、Notes、Agent、Due 和 Created 列
- 暫時(shí)不要添加任何數(shù)據(jù),它將由我們?cè)谙乱徊街袆?chuàng)建的 Honeycode 事件自動(dòng)添加。

?
第 2 步:AWS Honeycode 事件
在 AWS Honeycode 中,可以定義各種事件,用于自動(dòng)執(zhí)行某些操作。
首先讓我們創(chuàng)建一個(gè)名為ExtendRoomIfCleaned的事件。如果清潔人員將狀態(tài)設(shè)置為已清潔,這會(huì)將A_WorkOrders表中的清潔到期日期延長(zhǎng)1 小時(shí)。
請(qǐng)參閱下面的屏幕截圖如何設(shè)置:



然后讓我們創(chuàng)建UpdateLogTable事件,如果到期日期被更改(例如通過(guò)ExtendRoomIfCleaned事件) ,它將在L_Log表中創(chuàng)建一行。這將用于生成報(bào)告數(shù)據(jù)。

新行的列填充如下:
- 從:=[Title] 獲取數(shù)據(jù)并寫入:=[Title]
- 從:=[Notes] 獲取數(shù)據(jù)并寫入:=[Notes]
- 從:=[Agent] 獲取數(shù)據(jù)并寫入:=[Agent]
- 從:=[$PREVIOUS] 獲取數(shù)據(jù)并寫入:=[Due] ——我們保存之前的 Due 值,即 Due to clean 的時(shí)間
- 從:=NOW() 獲取數(shù)據(jù)并寫入:=[Cleaned] - 我們保存當(dāng)前時(shí)間,因此我們可以將其與報(bào)告中的到期時(shí)間進(jìn)行比較

測(cè)試
導(dǎo)航到 A_WorkOrders 表,并將其中一個(gè)房間的狀態(tài)更改為已清潔。
- 從現(xiàn)在起應(yīng)將到期時(shí)間更改為 1 小時(shí)
- 狀態(tài)應(yīng)該變回打開(kāi)
- 應(yīng)該在 L_Log 表中創(chuàng)建一個(gè)新的日志行
第 3 步:適用于清潔人員的 AWS Honeycode 應(yīng)用程序
在下一步中,我們根據(jù)我們的目標(biāo)修改 Field Service Agent 應(yīng)用程序。
有一個(gè)名為 WorkOrdersList 的控件,其來(lái)源應(yīng)為:=Filter(A_WorkOrders, "ORDER BY A_WorkOrders[Due]")。這將按截止時(shí)間顯示和排序A_WorkOrders表中的工作訂單。
如果“代理”被添加到個(gè)性化,這意味著只有登錄用戶的房間會(huì)顯示在應(yīng)用程序上。

可以為Segment1設(shè)置彩色背景。遵循以下條件格式規(guī)則:
- 紅色:=60*HOUR(MAX(0, [Due]-$[LocalNow]))+MINUTE(MAX(0, [Due]-$[LocalNow]))=0
- 黃色:=60*HOUR(MAX(0, [Due]-$[LocalNow]))+MINUTE(MAX(0, [Due]-$[LocalNow]))<=15
- 綠色:=60*HOUR(MAX(0, [Due]-$[LocalNow]))+MINUTE(MAX(0, [Due]-$[LocalNow]))>15

設(shè)置截止時(shí)間,以便清潔人員可以看到:

設(shè)置剩余時(shí)間以快速瀏覽任務(wù):

如果我們?yōu)樵摲块g安裝了 IoT Thing,則應(yīng)該隱藏完成按鈕。

配置完成按鈕的操作以將房間狀態(tài)設(shè)置為已清潔:

測(cè)試
應(yīng)用程序應(yīng)該在您的手機(jī)上運(yùn)行,??并且應(yīng)該顯示房間,如果單擊完成按鈕,應(yīng)該很快更新屏幕,將該房間設(shè)置為綠色,并將其放在列表的末尾:
第 4 步:適用于 Manager 的 AWS Honeycode 應(yīng)用程序
您可以為經(jīng)理創(chuàng)建一個(gè)新的應(yīng)用程序,該應(yīng)用程序在日志中顯示事件,以查看它們是否合規(guī)。(您可以復(fù)制清潔人員工具,并刪除不需要的控件。)
將 WorkOrdersList 的數(shù)據(jù)源設(shè)置為 =FILTER( L_Log , "ORDER BY L_Log[Due] DESC"),這將顯示L_Log表中的項(xiàng)目:

您可以為經(jīng)理 UI 添加過(guò)濾器,例如房間名稱或清潔人員姓名,這將使經(jīng)理能夠過(guò)濾 App 中的結(jié)果列表:

然后添加顏色編碼:
- 紅色:=([到期]-[已清理])<0
- 綠色:=([到期]-[已清理])>=0

測(cè)試
應(yīng)用程序應(yīng)在您的手機(jī)上運(yùn)行,??并應(yīng)將房間和代理以及符合顏色編碼的清潔顯示為綠色,將不合規(guī)的清潔顯示為紅色:
第 5 步:連接 AWS 賬戶和 Honeycode 賬戶
由于我們的數(shù)據(jù)存儲(chǔ)在 AWS Honeycode 中,我們需要使用本頁(yè)描述的步驟將 AWS 賬戶連接到它:將 Honeycode 連接到 AWS 賬戶
測(cè)試
以下 AWS CLI 命令應(yīng)列出 Honeycode 工作簿的表:
aws honeycode list-tables --workbook-id=ecf97bf3-57d1-48c2-a1e4-2886fe4df3ff
當(dāng)您在 Honeycode 中編輯工作簿中的一個(gè)表時(shí),工作簿 ID 是 url 的 %3A 和 %2F 之間的指導(dǎo):

?
第 6 步:創(chuàng)建 Lambda 函數(shù)
從 GitHub 克隆代碼(鏈接在底部)。在 Lambda 文件夾中有一個(gè) python 代碼,如果 IoT Shadow 發(fā)生變化(當(dāng)清潔人員單擊 IoT Thing 上的 Cleaned 按鈕時(shí)),IoT Rule 將執(zhí)行該代碼
因此,在us-west-2(俄勒岡)AWS 區(qū)域中創(chuàng)建一個(gè)新的 lambda 函數(shù),稱為clean-tracker-lambda和Python運(yùn)行時(shí)。使用俄勒岡州,因?yàn)?Honeycode 和 IoT Core 在該地區(qū)都可用。將 lambda 代碼粘貼到編輯器中。此代碼將處理稍后將由 IoT 規(guī)則發(fā)送的消息,然后從中提取 IoT clientId,使用該 Id 過(guò)濾 WorkOrders 表,然后將該行的 Status 列更新為“Cleaned”。

它在代碼中定義了 3 個(gè)變量,這些變量應(yīng)根據(jù)您的 AWS Honeycode Id 預(yù)先填充:
workbookId = 'ecf97bf3-57d1-48c2-a1e4-2886fe4df3ff' # NOTE: Your Workbook Id in Honeycode
tableId = '654cf941-7739-40fc-a43e-c8609132c9c5' # NOTE: Your WorkOrders Table Id within the Workbook
columnId = 'b983ffd4-61a7-4f89-944b-13916cb13803' # NOTE: The Status column within the WorkOrders table
workbookId與上面第 5 步中的相同。
tableId可以通過(guò)運(yùn)行 AWS CLI 命令來(lái)確定,該命令將列出您的 tableIds 以及 tableNames。您將需要 WorkOrders 表:
aws honeycode list-tables --workbook-id=ecf97bf3-57d1-48c2-a1e4-2886fe4df3ff
---
{
"tables": [
{
"tableId": "654cf941-7739-40fc-a43e-c8609132c9c5",
"tableName": "A_WorkOrders"
},
{
"tableId": "36135fdc-27ed-436a-9237-21c35def5f20",
"tableName": "D_Customers"
},
{
"tableId": "112369af-6ac1-446f-8fd1-0118f8120c74",
"tableName": "D_Properties"
},
{
"tableId": "d25fb00c-3ef9-4f88-9a72-54d962b7c66f",
"tableName": "L_Log"
},
{
"tableId": "070cde25-b179-4462-ab8a-18bed5fc91dd",
"tableName": "M_Status"
},
{
"tableId": "19f86da4-6232-43b2-ab23-9d67be644fb4",
"tableName": "Z_Icons"
}
],
"workbookCursor": 618391759
}
columnId可以通過(guò)以下命令確定,該命令顯示 1 行數(shù)據(jù)以及響應(yīng)開(kāi)頭的 columnId,如下所示。您將需要 Status columnId:
aws honeycode list-table-rows --workbook-id=ecf97bf3-57d1-48c2-a1e4-2886fe4df3ff --table-id=654cf941-7739-40fc-a43e-c8609132c9c5 --max-results=1
---
{
"columnIds": [
"9083184e-02d3-4bcb-b957-d139792451f5",
"f8526acf-bc65-4d2c-ab39-755f520fff56",
"b983ffd4-61a7-4f89-944b-13916cb13803",
"d372ed0a-cb8b-4960-8175-505b736c334c",
"bf1404fa-54af-49d2-86ac-ea1d53dd127e",
"ab0a2808-e5e7-4380-9e1d-ed3b6ba92b69",
"2a1106c5-a7de-41cc-92ce-5dfcef59be69",
"1322a4a4-c465-4973-9a52-361a8078068a"
],
...
修改變量后,您可以單擊 Deploy 按鈕,lambda 代碼已準(zhǔn)備就緒。
仍然需要授予 Lambda 角色訪問(wèn)權(quán)限才能讀取和寫入 Honeycode 表,所以讓我們:
- 導(dǎo)航到配置/權(quán)限
- 點(diǎn)擊cleaning-tracker-lambda-role
- 在 IAM 管理控制臺(tái)上,單擊附加策略按鈕
- 搜索 AmazonHoneycodeWorkbookFullAccess 策略,并勾選旁邊的框
- 單擊附加策略按鈕


測(cè)試
如果您配置新的測(cè)試事件并將以下 JSON 作為內(nèi)容粘貼,則可以在 AWS 上測(cè)試 Lambda。確保將 clientidStatus 替換為 IoT clientid。
{
"state": {
"reported": {
"timestampStatus": "2021-08-15 09:38:42",
"clientidStatus": "0123456789abcdef",
"cleaningStatus": "CLEANED"
}
},
"metadata": {
"reported": {
"timestampStatus": {
"timestamp": 1629020386
},
"clientidStatus": {
"timestamp": 1629020386
},
"cleaningStatus": {
"timestamp": 1629020386
}
}
},
"version": 7348,
"timestamp": 1629020386,
"clientToken": "0123456789abcdef-4"
}
您應(yīng)該獲得 200 成功。這也應(yīng)該在 WorkOrders 表中將相應(yīng)行的狀態(tài)更新為已清理。當(dāng)然,我們的 Honeycode 事件會(huì)將其設(shè)置回 Opened,但您仍然可以在 Due 列中看到更改。
?
第 7 步:設(shè)置 IoT 規(guī)則以調(diào)用 Lambda 函數(shù)
AWS IoT Shadow 是 MQTT 消息之上的一層。它在 AWS 和 IoT Thing 端都有 JSON 格式的狀態(tài)。無(wú)論哪個(gè)更新其中的任何值,都會(huì)將其發(fā)送給對(duì)方,以便他們做出反應(yīng)。
在這里,如果 IoT Thing 更新了 Shadow,我們想調(diào)用我們的 Lambda 函數(shù)。
導(dǎo)航到 AWS IoT > Act > Rules 并創(chuàng)建一個(gè)新規(guī)則:
- 名稱:cleaning_tracker_rule
- 帶有 IoT 客戶端 ID 的查詢語(yǔ)句:SELECT * FROM '$aws/things/ 0123456789abcdef /shadow/update/accepted'
- 添加操作:向 Lambda 函數(shù)發(fā)送消息
- 選擇cleaning-tracker-lambda
規(guī)則將連接到 Lambda 并在某些時(shí)候啟用。此規(guī)則將對(duì)物聯(lián)網(wǎng)事物狀態(tài)變化做出反應(yīng),并使用消息詳細(xì)信息調(diào)用我們的 lambda。

?
第 8 步:將代碼實(shí)現(xiàn)到 IoT Thing
最后,我們?yōu)樽钪匾牟糠譁?zhǔn)備了一切,即 IoT Thing 的代碼。從 GitHub 克隆代碼(鏈接在底部)。在 IoT 文件夾中有用 C 編寫的代碼,這是需要的。
這是根據(jù)智能恒溫器示例構(gòu)建的,因此您將在此處找到實(shí)施的內(nèi)容、方式和原因。閱讀 git 提交也可以跟蹤我們的更改。
首先,將您預(yù)先配置的sdkconfig文件從 Smart Thermostat 文件夾復(fù)制到 IoT 文件夾。此文件不是我們的 repo (by.gitignore) 的一部分,因?yàn)樗?WiFi SSID 和密碼以及您的 IoT 事物的 MQTT 隊(duì)列的唯一 AWS url。
清理
刪除了一些不需要的文件和模塊,例如 FFT.c,因?yàn)槲覀儾惶幚碚Z(yǔ)音。
ui.c
創(chuàng)建了以下 UI 方法:
// sets wifi label text and state
void ui_wifi_label_update(bool state, char *ssid);
// sets date label based on date value
void ui_date_label_update(rtc_date_t date);
// queries whether the Cleaned button is already clicked & resets its state to false
bool is_cleaned_button_clicked();
// sets the value of the due bar ( 0 .. 100 )
void ui_set_due_bar(int16_t value);
// sets the color of the leds ( example: 0x00FF00 )
void ui_set_led_color(uint32_t color);
按鈕點(diǎn)擊事件設(shè)置了一個(gè)全局變量,后面可以查詢:
// called if the user clicks the Cleaned button
static void cleaned_button_event_handler(lv_obj_t * obj, lv_event_t event)
{
if(event == LV_EVENT_CLICKED) {
cleaned_button_clicked = true; // store that the button was clicked
ESP_LOGI(TAG, "Done button clicked");
}
}
// queries whether the Cleaned button is already clicked & resets its state to false
bool is_cleaned_button_clicked() {
bool ret = cleaned_button_clicked; // return state
cleaned_button_clicked = false; // set back to current state to false
return ret;
}
cleaned_button = lv_btn_create(lv_scr_act(), NULL);
lv_obj_add_style(cleaned_button, LV_BTN_PART_MAIN, &cleaned_button_style);
lv_obj_set_event_cb(cleaned_button, cleaned_button_event_handler); // handler
lv_obj_set_width(cleaned_button, 200);
lv_obj_align(cleaned_button, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
在這里,我們也使用樣式,例如:
static lv_style_t cleaned_button_style;
lv_style_set_border_color(&cleaned_button_style, LV_STATE_DEFAULT, LV_COLOR_GREEN);
lv_style_set_border_color(&cleaned_button_style, LV_STATE_FOCUSED, LV_COLOR_GREEN);
static lv_style_t title_style; // create title style (big font)
lv_style_init(&title_style);
lv_style_set_text_font(&title_style, LV_STATE_DEFAULT, LV_THEME_DEFAULT_FONT_TITLE);
lv_style_set_text_color(&title_style, LV_STATE_DEFAULT, LV_COLOR_BLACK);
static lv_style_t subtitle_style; // create title style (medium size font)
lv_style_init(&subtitle_style);
lv_style_set_text_font(&subtitle_style, LV_STATE_DEFAULT, LV_THEME_DEFAULT_FONT_SUBTITLE);
lv_style_set_text_color(&subtitle_style, LV_STATE_DEFAULT, LV_COLOR_BLACK);
重要提示:我們還修改了樣式的字體大小,這可以在sdkconfig文件中完成,如下所示:
CONFIG_LV_FONT_MONTSERRAT_32=y
CONFIG_LV_FONT_MONTSERRAT_48=y
# CONFIG_LV_FONT_DEFAULT_SUBTITLE_MONTSERRAT_16 is not set
CONFIG_LV_FONT_DEFAULT_SUBTITLE_MONTSERRAT_32=y
# CONFIG_LV_FONT_DEFAULT_TITLE_MONTSERRAT_16 is not set
CONFIG_LV_FONT_DEFAULT_TITLE_MONTSERRAT_48=y
以下部分顯示了如何打印 WiFi 符號(hào)以及如何更改同一文本中的文本顏色:
// sets wifi label text and state
void ui_wifi_label_update(bool state, char *ssid){
xSemaphoreTake(xGuiSemaphore, portMAX_DELAY);
if (state == false) { // if there is no wifi signal
lv_label_set_text(wifi_label, LV_SYMBOL_WIFI); // black wifi symbol
}
else{
char buffer[100];
sprintf (buffer, "#0000ff %s # %s", LV_SYMBOL_WIFI, ssid);
lv_label_set_text(wifi_label, buffer);
}
xSemaphoreGive(xGuiSemaphore);
LVGL UI 文檔可以在這里找到。這顯示了所有可用的控件、樣式和屬性設(shè)置,例如對(duì)齊方式。
LED的設(shè)置如下:
// sets the color of the leds ( example: 0x00FF00 )
void ui_set_led_color(uint32_t color) {
Core2ForAWS_Sk6812_SetSideColor(SK6812_SIDE_LEFT, color);
Core2ForAWS_Sk6812_SetSideColor(SK6812_SIDE_RIGHT, color);
Core2ForAWS_Sk6812_Show();
}
?
主程序
IoT 項(xiàng)目的主文件也進(jìn)行了清理,并添加了我們的邏輯。此外,許多地方都添加了日志記錄,并將日志記錄到控制臺(tái)輸出而不是 UI。
所做的更改之一是,如果 IoT Thing 無(wú)法連接到影子,我們不會(huì)重新啟動(dòng)。有時(shí)我們會(huì)遇到超時(shí)問(wèn)題,并且 Thing 重啟需要很長(zhǎng)時(shí)間。
// Connect to shadow in infinite loop until connected successfully
while(true) {
ESP_LOGI(TAG, "Shadow Connect");
rc = aws_iot_shadow_connect(&iotCoreClient, &scp);
if(SUCCESS != rc) {
ESP_LOGE(TAG, "aws_iot_shadow_connect returned error %d, retrying...", rc);
} else {
ESP_LOGI(TAG, "Connected to AWS IoT Device Shadow service");
break; // exit from the loop
}
}
當(dāng) Thing 連接到 WiFi 和 IoT Shadow 時(shí),我們也在 Thing 上設(shè)置當(dāng)前時(shí)間 + 1 小時(shí)的到期時(shí)間:
// initialize cleaning due date to current time + 1 hour
BM8563_GetTime(&dueDate);
dueDate.hour+=1;
然后我們開(kāi)始一個(gè)無(wú)限循環(huán),它獲取時(shí)間并在 UI 上顯示時(shí)間,計(jì)算剩余時(shí)間,根據(jù)差異設(shè)置 LED,并設(shè)置進(jìn)度條(不會(huì)低于零):
// START get sensor readings + update UI
BM8563_GetTime(&date); // get current date time
ui_date_label_update(date); // show time on UI
// minutes between now and cleaning due time
int timediff = (dueDate.hour * 60 + dueDate.minute) - (date.hour * 60 + date.minute); ESP_LOGI(TAG, "timediff: %d", timediff);
if (timediff < 0)
ui_set_led_color(0xFF0000); // set LED strips to RED if no time left
else if (timediff < 15)
ui_set_led_color(0xFFFF00); // set LED strips to YELLOW if 15 or less mins left
else
ui_set_led_color(0x00FF00); // set LED strips to GREEN otherwise
if (timediff < 0)
timediff = 0;
ui_set_due_bar(timediff * 100 / 60); // show remaining time on the progressbar as well
// END get sensor readings
我們檢查按鈕是否在此期間被點(diǎn)擊,如果是,那么我們將到期時(shí)間增加到 +1 小時(shí)。還應(yīng)構(gòu)建 JSON 消息,并更新 IoT Shadow。為了節(jié)省成本,我們僅在真正需要時(shí)才更新 IoT Shadow(當(dāng)單擊“已清理”按鈕時(shí)):
// if room is cleaned
if (is_cleaned_button_clicked()) { // send message only if Cleaned
BM8563_GetTime(&dueDate);
dueDate.hour+=1; // update cleaning due date to current time + 1 hour
// set values for shadow document
sprintf(timestampStatus, "%d-%02d-%02d %02d:%02d:%02d", date.year, date.month, date.day, date.hour, date.minute, date.second); // date time stamp
sprintf(clientidStatus, "%s", client_id); // IoT id
sprintf(cleaningStatus, "CLEANED"); // Cleaning status
// log
ESP_LOGI(TAG, "****************************************************************");
ESP_LOGI(TAG, "On Device: timestampStatus %s", timestampStatus);
ESP_LOGI(TAG, "On Device: clientidStatus %s", clientidStatus);
ESP_LOGI(TAG, "On Device: cleaningStatus %s", cleaningStatus);
// compose and update shadow document with: timestamp + clientid + cleaningstatus
rc = aws_iot_shadow_init_json_document(JsonDocumentBuffer,
sizeOfJsonDocumentBuffer);
if(SUCCESS == rc) {
rc = aws_iot_shadow_add_reported(JsonDocumentBuffer,
sizeOfJsonDocumentBuffer, 3,
×tampStatusActuator,
&clientidStatusActuator,
&cleaningStatusActuator);
if(SUCCESS == rc) {
rc = aws_iot_finalize_json_document(JsonDocumentBuffer,
sizeOfJsonDocumentBuffer);
if(SUCCESS == rc) {
ESP_LOGI(TAG, "Update Shadow: %s", JsonDocumentBuffer);
rc = aws_iot_shadow_update(&iotCoreClient, client_id,
JsonDocumentBuffer, ShadowUpdateStatusCallback, NULL, 4, true);
shadowUpdateInProgress = true;
}
}
}
ESP_LOGI(TAG, "****************************************************************");
}
然后我們等待 1 秒,無(wú)限循環(huán)繼續(xù)。
vTaskDelay(pdMS_TO_TICKS(1000)); // wait 1 sec, then loop
就是這樣!
備注:cleaningStatus_Callback方法當(dāng)前為空。在以后的增強(qiáng)中,它可用于例如從 AWS 更新到期日期,因?yàn)橹灰?AWS 端的 IoT Shadow 發(fā)生更改,就會(huì)調(diào)用此日期。
測(cè)試
讓我們?cè)?PlatformIO 終端中發(fā)出以下命令:
pio run --environment core2foraws --target upload --target monitor
它將編譯項(xiàng)目、創(chuàng)建固件并將其上傳到 IoT Thing。Thing 將重新啟動(dòng)并執(zhí)行代碼,而您可以在 PlatformIO 終端中看到它的控制臺(tái)日志。
日志中的一些重要里程碑是:
客戶編號(hào):
?[0;32mI (3425) MAIN: Device client Id: >> 0123456789abcde01 <[0m
無(wú)線網(wǎng)絡(luò)連接:
?[0;32mI (3235) WIFI: Setting Wi-Fi configuration to SSID: ultrix?[0m
?[0;32mI (9135) WIFI: Wi-Fi connected. Device IP address: 192.168.0.213?[0m
連接到 AWS IoT Shadow:
?[0;32mI (9135) MAIN: Shadow Init?[0m
?[0;32mI (9135) MAIN: Shadow Connect?[0m
?[0;32mI (16265) MAIN: Connected to AWS IoT Device Shadow service?[0m
循環(huán)顯示剩余時(shí)間:
?[0;32mI (16765) MAIN: timediff: 60?[0m
:
:
?[0;32mI (16765) MAIN: timediff: 59?[0m
單擊“已清除”按鈕后,將顯示以下日志:
?[0;32mI (31945) UI: Done button clicked?[0m
?[0;32mI (32365) MAIN: *****************************************************************************************?[0m
?[0;32mI (32365) MAIN: On Device: timestampStatus 2021-09-15 17:24:56?[0m
?[0;32mI (32375) MAIN: On Device: clientidStatus 0123456789abcde01 ?[0m
?[0;32mI (32385) MAIN: On Device: cleaningStatus CLEANED?[0m
?[0;32mI (32385) MAIN: Update Shadow: {"state":{"reported":{"timestampStatus":"2021-09-15 17:24:56","clientidStatus":"0123456789abcde01 ","cleaningStatus":"CLEANED"}}, "clientToken":"0123456789abcde01 -0"}?[0m
?[0;32mI (35065) MAIN: *****************************************************************************************?[0m
?[0;32mI (35065) MAIN: Stack remaining for task 'aws_iot_task' is 2044 bytes?[0m
?[0;32mI (36095) MAIN: Update accepted?[0m
AWS 控制臺(tái)上也可以看到相同的 JSON:

?
第 9 步:測(cè)試物聯(lián)網(wǎng)
啟動(dòng)后,IoT Thing 上的 LED 將呈藍(lán)色。很快它將連接到 WiFi,其 SSID 將顯示在左上角。一段時(shí)間后,它將連接到 AWS IoT Shadow,并開(kāi)始循環(huán),因此:將顯示當(dāng)前時(shí)間,LED 將變?yōu)榫G色,進(jìn)度條將顯示從 1 小時(shí)開(kāi)始的剩余時(shí)間百分比。如果只剩下 15 分鐘,LED 將呈黃色。如果剩余時(shí)間,LED 將變?yōu)榧t色。每當(dāng)您按下“已清除”按鈕時(shí),1 小時(shí)倒計(jì)時(shí)再次開(kāi)始,進(jìn)度條應(yīng)重置為 100%,LED 應(yīng)再次變?yōu)榫G色,并且還會(huì)通過(guò) AWS IoT Shadow 發(fā)送一條消息,這將觸發(fā) IoT 規(guī)則,等等上。
未來(lái)的可能性
為合規(guī)報(bào)告匯總數(shù)據(jù)。
將系統(tǒng)連接到公司 AD,因此:
- IoT Thing 可以在其 UI 上顯示下一次會(huì)議名稱和開(kāi)始時(shí)間
- 系統(tǒng)可以在房間沒(méi)有會(huì)議時(shí)計(jì)劃清潔周期
- 使用PYNQ和Vitis AI的智能辦公室熱辦公桌
- 自動(dòng)家庭辦公室
- 物聯(lián)網(wǎng)Arduino球跟蹤
- 控制家庭或辦公室照明的創(chuàng)新系統(tǒng)開(kāi)源分享
- Arduino在辦公室地圖上繪制汽車路線
- 適用于智能辦公室和建筑的終極物聯(lián)網(wǎng)傳感器盒
- 辦公室數(shù)字化的實(shí)現(xiàn) 0次下載
- 線性技術(shù)公司收到美國(guó)檢察官辦公室的傳票,要求提供有關(guān)公司股票期權(quán)做法的文件
- 物聯(lián)網(wǎng)實(shí)驗(yàn)室管理系統(tǒng)的設(shè)計(jì)方案 17次下載
- 物聯(lián)網(wǎng)中的多協(xié)議連接 0次下載
- 如何為物聯(lián)網(wǎng)構(gòu)建低功耗傳感器接口 6次下載
- 物聯(lián)網(wǎng)和比肯應(yīng)用的快速跟蹤設(shè)計(jì) 3次下載
- 基于工業(yè)物聯(lián)網(wǎng)的鋼管跟蹤及質(zhì)量監(jiān)測(cè)系統(tǒng) 2次下載
- 基于物聯(lián)網(wǎng)的智能計(jì)算機(jī)實(shí)驗(yàn)室管理系統(tǒng) 15次下載
- 辦公室綜合布線系統(tǒng)解決方案
- 分享一個(gè)觸摸激活辦公室呼叫鈴電路 867次閱讀
- 為您的物聯(lián)網(wǎng)跟蹤器選擇合適的降壓升壓 1011次閱讀
- 基于電子標(biāo)簽和物聯(lián)網(wǎng)實(shí)現(xiàn)工業(yè)企業(yè)物聯(lián)網(wǎng)系統(tǒng)的設(shè)計(jì) 3827次閱讀
- 物聯(lián)網(wǎng)系統(tǒng)評(píng)價(jià)的模型如何去構(gòu)建實(shí)現(xiàn) 1570次閱讀
- 清潔機(jī)器人是怎樣工作的 2000次閱讀
- 物聯(lián)網(wǎng)實(shí)驗(yàn)室該怎樣去建設(shè) 1271次閱讀
- 物聯(lián)網(wǎng)市場(chǎng)引發(fā)智能傳感技術(shù)新需求 697次閱讀
- 你知道水泵物聯(lián)網(wǎng)監(jiān)控系統(tǒng)嗎 2186次閱讀
- 盤點(diǎn)7個(gè)有效的物聯(lián)網(wǎng)應(yīng)用案例 1.1w次閱讀
- 機(jī)房電源管理采用物聯(lián)網(wǎng)技術(shù)必不可少 1289次閱讀
- 物聯(lián)網(wǎng)十大經(jīng)典開(kāi)源操作系統(tǒng) 1w次閱讀
- 物聯(lián)網(wǎng)有哪些操作系統(tǒng)?物聯(lián)網(wǎng)操作系統(tǒng)匯總 5.5w次閱讀
- 細(xì)菌供電的紙電池如何驅(qū)動(dòng)物聯(lián)網(wǎng)? 2781次閱讀
- 采用物聯(lián)網(wǎng)技術(shù),對(duì)藥品進(jìn)行有效的跟蹤識(shí)別 1765次閱讀
- 優(yōu)化現(xiàn)有移動(dòng)設(shè)備中天線的性能來(lái)推出下一代移動(dòng)技術(shù):物聯(lián)網(wǎng)和 5G 5239次閱讀
下載排行
本周
- 1涂鴉各WiFi模塊原理圖加PCB封裝
- 11.75 MB | 76次下載 | 1 積分
- 2錦銳科技CA51F2 SDK開(kāi)發(fā)包
- 24.06 MB | 29次下載 | 1 積分
- 3錦銳CA51F005 SDK開(kāi)發(fā)包
- 19.47 MB | 3次下載 | 1 積分
- 4蘋果iphone 11電路原理圖
- 4.98 MB | 3次下載 | 2 積分
- 5基礎(chǔ)模擬電子電路
- 3.80 MB | 3次下載 | 1 積分
- 6RA-Eco-RA6M4-100PIN-V1.0開(kāi)發(fā)板資料
- 34.89 MB | 1次下載 | 免費(fèi)
- 7STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4編程手冊(cè)
- 3.32 MB | 1次下載 | 免費(fèi)
- 8聯(lián)想A820t手機(jī)維修圖紙包括主板原理圖 尾板原理圖 點(diǎn)位圖
- 0.62 MB | 次下載 | 5 積分
本月
- 1AI智能眼鏡產(chǎn)業(yè)鏈分析
- 4.43 MB | 383次下載 | 免費(fèi)
- 2蘇泊爾電磁爐線路的電路原理圖資料合集
- 2.02 MB | 296次下載 | 5 積分
- 3貼片三極管上的印字與真實(shí)名稱的對(duì)照表詳細(xì)說(shuō)明
- 0.50 MB | 94次下載 | 1 積分
- 4長(zhǎng)虹液晶電視R-HS310B-5HF01的電源板電路原理圖
- 0.46 MB | 91次下載 | 5 積分
- 5涂鴉各WiFi模塊原理圖加PCB封裝
- 11.75 MB | 76次下載 | 1 積分
- 6錦銳科技CA51F2 SDK開(kāi)發(fā)包
- 24.06 MB | 29次下載 | 1 積分
- 7AO4803A雙P通道增強(qiáng)型場(chǎng)效應(yīng)晶體管的數(shù)據(jù)手冊(cè)
- 0.11 MB | 28次下載 | 2 積分
- 8長(zhǎng)虹液晶彩電LS29機(jī)芯的技術(shù)資料說(shuō)明
- 3.42 MB | 16次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191388次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183342次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81588次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評(píng)論