電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
創(chuàng)作
電子發(fā)燒友網>電子資料下載>電子資料>物聯(lián)網辦公室清潔跟蹤系統(tǒng)

物聯(lián)網辦公室清潔跟蹤系統(tǒng)

2022-11-03 | zip | 1.06 MB | 次下載 | 2積分

資料介紹

描述

我們要解決什么問題?

如果 COVID 下降,公司將開始返回辦公室。

他們需要保持環(huán)境清潔和員工安全。他們還需要遵守有時復雜的當?shù)胤ㄒ?guī),并證明他們符合規(guī)則。有時,如果他們忘記保持地方清潔,他們甚至需要支付巨額罰款(因為他們冒著自己員工健康的風險)。

目標將是定期保持辦公室清潔,不會錯過及時清潔的房間,收集合規(guī)報告的數(shù)據(jù)。

另一個目標是易于安裝。如果一家公司想回到 Office,物理部件應該能夠非??焖佥p松地安裝。

“房間”可以是辦公室內的任何地方,如廁所、食堂、走廊、會議室、辦公空間、接待處等,甚至是大樓外的地方。

目前的解決方案

我們在大多數(shù)地方(尤其是公共廁所)看到的是一張紙,如果房間被打掃過,清潔人員會在上面手寫。然后這些文件 - 再次 - 手動收集一天結束并輸入報告。當前解決方案的問題是很容易忘記打掃房間,而且收集所有報告并檢查一切是否合規(guī)是一項艱巨的任務。

poYBAGNiMVmASIUvAAA409tGOyE591.png
樣品廁所檢查表
?

建議的解決方案

將一個 AWS IoT EduKit 放入每個房間。把它們貼在墻上。一旦他們連接到公司 WiFi 并注冊自己,他們就可以測量清潔周期(例如 1 小時)。每次清潔人員打掃房間時,她/他都會按下 IoT Thing 上的按鈕,說明房間已準備就緒。然后 IoT Thing 將此事件發(fā)送到 AWS,并使用顯示屏和 LED 指示燈開始倒計時到下一次清潔。AWS lambda 將 AWS IoT Core 與 AWS Honeycode 連接起來,狀態(tài)數(shù)據(jù)存儲在 AWS Honeycode 表中。

  • 綠色 - 房間還可以
  • 黃色 - 距離下一次清潔還有 15 分鐘或更短的時間
  • 紅色 - 現(xiàn)在應該打掃房間
?

不錯過要及時打掃的房間

如上所述,如果是清潔時間,LED 會在本地顯示。但有時保潔人員并不親近。因此,清潔人員有一個移動應用程序,她/他可以在其中查看分配的房間和每個房間的剩余時間(也有顏色編碼),因此她/他知道接下來要去哪里清潔。

也可以點擊移動應用程序上的“完成”按鈕,但前提是目標 Room 尚未安裝 IoT Thing。安裝后,手機上的按鈕將被禁用,清潔時需要在房間內。

pYYBAGNiMVyAflhdAAFw0ARp0cM292.png
清潔人員應用程序(參見第 3 步末尾的視頻
?

合規(guī)報告

還有一個適用于經理和監(jiān)管者的應用程序。這顯示了來自 AWS Honeycode 清理日志表的清理日志。這里的顏色指示器還顯示我們是否合規(guī)。

poYBAGNiMV-AXcBZAAF0evfJbw0468.png
經理應用程序(參見第 4 步末尾的視頻)
?

概括

該解決方案也可用于任何其他公共場所,例如酒店和會議廳。不僅適用于辦公室。

實施解決方案的技術細節(jié)和步驟

pYYBAGNiMWWAP4evAAMRViDZkRI131.png
架構圖(也以高分辨率添加到項目附件中)
?

對于下面的步驟,我們在架構之上構建,從底層構建到頂層。

第 0 步是準備項目所需的所有工具和配置。

步驟 1 - 4 描述路徑:

  • 數(shù)據(jù)庫 <=> GUI <=> 移動應用

步驟 5 - 9 描述路徑:

  • 數(shù)據(jù)庫 <= Lambda <= IoT Rule <= IoT Shadow <= IoT Thing

步驟 0:準備開發(fā)環(huán)境并向 AWS 注冊 IoT

瀏覽 AWS IoT EduKit 教程的入門、云連接 Blinky 和智能恒溫器章節(jié)

這將準備:

  • 具有 Visual Studio Code 和 PlatformIO 擴展的開發(fā)環(huán)境
  • Silicon Labs USBUART 橋接器,用于將 IoT Thing 連接到主機
  • AWS 賬戶和為其配置的 AWS CLI
  • 檢索設備證書并注冊 AWS IoT Thing
  • ESP32 固件的配置,將值設置到 sdkconfig 文件中,例如:AWS IoT 端點主機名、Wifi SSID 和密碼
  • IoT 事物和 AWS IoT Core 之間的 AWS IoT Core 影子連接
  • 響應影子更新的示例 AWS IoT Core 規(guī)則

第 1 步:AWS Honeycode 表

AWS Honeycode 是一種基于表的無代碼應用程序構建器工具。因此,我們需要通過屏幕截圖來了解應用程序是如何構建的。所有重要配置都會有一個屏幕截圖。

首先讓我們導入現(xiàn)場服務代理模板,這是一個好的開始,它將在接下來的步驟中進行修改。

將應用程序重命名為 IoT Rooms。

然后編輯A_WorkOrders表,如下面的屏幕截圖所示:

  • 將您的房間添加到標題列
  • 您可以添加注釋
  • 在狀態(tài)列中將所有狀態(tài)設置為打開
  • 將清潔人員添加到 Agent 列(您可能需要先邀請您的團隊成員加入 Honeycode)
  • 在“到期”列中添加任何日期(這表示該清理房間的時間)
  • 將您的所有 AWS IoT Things 客戶端 ID 添加到 IoT 列,添加到您安裝它們的房間(在屏幕截圖中用紅線標記)。clientId 可以在 Smart Thermostat 教程的控制臺日志中看到,如下所示:
?[0;32mI (3425) MAIN: Device client Id: >> 0123456789abcdef01 <
pYYBAGNiMWiAJ39xAABpK91pHJY868.png
A_WorkOrders 表
?

M_Status表應如下所示:

poYBAGNiMWqAYa4xAAAsV6BSOrs093.png
M_狀態(tài)表
?

創(chuàng)建一個名為L_Log的新表,如下所示:

  • 添加 Title、Notes、Agent、Due 和 Created 列
  • 暫時不要添加任何數(shù)據(jù),它將由我們在下一步中創(chuàng)建的 Honeycode 事件自動添加。
pYYBAGNiMW2ACFM7AABADOHIVbs205.png
L-Log 表
?

?

第 2 步:AWS Honeycode 事件

在 AWS Honeycode 中,可以定義各種事件,用于自動執(zhí)行某些操作。

首先讓我們創(chuàng)建一個名為ExtendRoomIfCleaned的事件。如果清潔人員將狀態(tài)設置為已清潔,這會將A_WorkOrders表中的清潔到期日期延長1 小時。

請參閱下面的屏幕截圖如何設置:

poYBAGNiMXyAUJAzAABQGl7mil4713.png
ExtendRoomIfCleaned 觸發(fā)器:如果狀態(tài)變?yōu)橐亚謇?/font>
?
poYBAGNiMYGAXQNCAABEMplLenE337.png
ExtendRoomIfCleaned 操作:將到期時間設置為 +1 小時后
?
poYBAGNiMYOAfMDLAABDGghHF1E085.png
ExtendRoomIfCleaned 操作:將狀態(tài)設置回打開
?

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

poYBAGNiMYWAUpJ6AABHDOTF8nU946.png
UpdateLogTable 觸發(fā)器:如果到期已更改
?

新行的列填充如下:

  • 從:=[Title] 獲取數(shù)據(jù)并寫入:=[Title]
  • 從:=[Notes] 獲取數(shù)據(jù)并寫入:=[Notes]
  • 從:=[Agent] 獲取數(shù)據(jù)并寫入:=[Agent]
  • 從:=[$PREVIOUS] 獲取數(shù)據(jù)并寫入:=[Due] ——我們保存之前的 Due 值,即 Due to clean 的時間
  • 從:=NOW() 獲取數(shù)據(jù)并寫入:=[Cleaned] - 我們保存當前時間,因此我們可以將其與報告中的到期時間進行比較
pYYBAGNiMYiAF_aaAABNWx-gvCs980.png
UpdateLogTable 操作:將數(shù)據(jù)復制到 L_Log 表
?

測試

導航到 A_WorkOrders 表,并將其中一個房間的狀態(tài)更改為已清潔。

  • 從現(xiàn)在起應將到期時間更改為 1 小時
  • 狀態(tài)應該變回打開
  • 應該在 L_Log 表中創(chuàng)建一個新的日志行

第 3 步:適用于清潔人員的 AWS Honeycode 應用程序

在下一步中,我們根據(jù)我們的目標修改 Field Service Agent 應用程序。

有一個名為 WorkOrdersList 的控件,其來源應為:=Filter(A_WorkOrders, "ORDER BY A_WorkOrders[Due]")。這將按截止時間顯示和排序A_WorkOrders表中的工作訂單。

如果“代理”被添加到個性化,這意味著只有登錄用戶的房間會顯示在應用程序上。

poYBAGNiMYqADdhnAACDK0I_Eu4402.png
清潔人員工具 - WorkOrdersList - 數(shù)據(jù)源
?

可以為Segment1設置彩色背景遵循以下條件格式規(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
pYYBAGNiMY6AfeojAACAPHhp_tY607.png
清潔人員工具 - Segment1 - 顏色編碼
?

設置截止時間,以便清潔人員可以看到:

poYBAGNiMZCAAfu5AAB51dTEHPI789.png
清潔人員工具 - 設置截止時間
?

設置剩余時間以快速瀏覽任務:

pYYBAGNiMZOAYYkMAAB9rPFkXxs175.png
清潔人員工具 - 設置剩余時間
?

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

pYYBAGNiMZaACvVwAAB8MEcSsTw088.png
清潔人員工具 - 設置完成按鈕可見性
?

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

poYBAGNiMZuAbLbrAAB4CBklgDY462.png
清潔人員工具 - 設置完成按鈕操作
?

測試

應用程序應該在您的手機上運行,??并且應該顯示房間,如果單擊完成按鈕,應該很快更新屏幕,將該房間設置為綠色,并將其放在列表的末尾:

?

第 4 步:適用于 Manager 的 AWS Honeycode 應用程序

您可以為經理創(chuàng)建一個新的應用程序,該應用程序在日志中顯示事件,以查看它們是否合規(guī)。(您可以復制清潔人員工具,并刪除不需要的控件。)

將 WorkOrdersList 的數(shù)據(jù)源設置為 =FILTER( L_Log , "ORDER BY L_Log[Due] DESC"),這將顯示L_Log表中的項目:

pYYBAGNiMZ2AEcr1AABmLo-4qtE868.png
管理工具 - WorkOrdersList - 數(shù)據(jù)源
?

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

poYBAGNiMaGAENzqAABuCXSy_Jw564.png
管理器工具 - 啟用過濾
?

然后添加顏色編碼:

  • 紅色:=([到期]-[已清理])<0
  • 綠色:=([到期]-[已清理])>=0
pYYBAGNiMaOANY54AABe6uNA5qo479.png
管理器工具 - 顏色編碼
?

測試

應用程序應在您的手機上運行,??并應將房間和代理以及符合顏色編碼的清潔顯示為綠色,將不合規(guī)的清潔顯示為紅色:

?

第 5 步:連接 AWS 賬戶和 Honeycode 賬戶

由于我們的數(shù)據(jù)存儲在 AWS Honeycode 中,我們需要使用本頁描述的步驟將 AWS 賬戶連接到它:將 Honeycode 連接到 AWS 賬戶

測試

以下 AWS CLI 命令應列出 Honeycode 工作簿的表:

aws honeycode list-tables --workbook-id=ecf97bf3-57d1-48c2-a1e4-2886fe4df3ff

當您在 Honeycode 中編輯工作簿中的一個表時,工作簿 ID 是 url 的 %3A 和 %2F 之間的指導:

poYBAGNiMaiAV6ApAABDcOND1HU798.png
從 Honeycode url 獲取工作簿 ID
?

?

第 6 步:創(chuàng)建 Lambda 函數(shù)

從 GitHub 克隆代碼(鏈接在底部)。在 Lambda 文件夾中有一個 python 代碼,如果 IoT Shadow 發(fā)生變化(當清潔人員單擊 IoT Thing 上的 Cleaned 按鈕時),IoT Rule 將執(zhí)行該代碼

因此,在us-west-2(俄勒岡)AWS 區(qū)域中創(chuàng)建一個新的 lambda 函數(shù),稱為clean-tracker-lambdaPython運行時。使用俄勒岡州,因為 Honeycode 和 IoT Core 在該地區(qū)都可用。將 lambda 代碼粘貼到編輯器中。此代碼將處理稍后將由 IoT 規(guī)則發(fā)送的消息,然后從中提取 IoT clientId,使用該 Id 過濾 WorkOrders 表,然后將該行的 Status 列更新為“Cleaned”。

poYBAGNiMaqAG_EGAACAxAun91Q902.png
?

它在代碼中定義了 3 個變量,這些變量應根據(jù)您的 AWS Honeycode Id 預先填充:

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可以通過運行 AWS CLI 命令來確定,該命令將列出您的 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可以通過以下命令確定,該命令顯示 1 行數(shù)據(jù)以及響應開頭的 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 代碼已準備就緒。

仍然需要授予 Lambda 角色訪問權限才能讀取和寫入 Honeycode 表,所以讓我們:

  • 導航到配置/權限
  • 點擊cleaning-tracker-lambda-role
  • 在 IAM 管理控制臺上,單擊附加策略按鈕
  • 搜索 AmazonHoneycodeWorkbookFullAccess 策略,并勾選旁邊的框
  • 單擊附加策略按鈕
pYYBAGNiMa6AIFa6AADKPYkI2s0408.png
?
poYBAGNiMbCAKScIAAC_bT5jBas745.png
?

測試

如果您配置新的測試事件并將以下 JSON 作為內容粘貼,則可以在 AWS 上測試 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"
}

您應該獲得 200 成功。這也應該在 WorkOrders 表中將相應行的狀態(tài)更新為已清理。當然,我們的 Honeycode 事件會將其設置回 Opened,但您仍然可以在 Due 列中看到更改。

?

第 7 步:設置 IoT 規(guī)則以調用 Lambda 函數(shù)

AWS IoT Shadow 是 MQTT 消息之上的一層。它在 AWS 和 IoT Thing 端都有 JSON 格式的狀態(tài)。無論哪個更新其中的任何值,都會將其發(fā)送給對方,以便他們做出反應。

在這里,如果 IoT Thing 更新了 Shadow,我們想調用我們的 Lambda 函數(shù)。

導航到 AWS IoT > Act > Rules 并創(chuàng)建一個新規(guī)則:

  • 名稱:cleaning_tracker_rule
  • 帶有 IoT 客戶端 ID 的查詢語句:SELECT * FROM '$aws/things/ 0123456789abcdef /shadow/update/accepted'
  • 添加操作:向 Lambda 函數(shù)發(fā)送消息
  • 選擇cleaning-tracker-lambda

規(guī)則將連接到 Lambda 并在某些時候啟用。此規(guī)則將對物聯(lián)網事物狀態(tài)變化做出反應,并使用消息詳細信息調用我們的 lambda。

pYYBAGNiMbaAE8c-AAD-7vdrjd4744.png
?

?

第 8 步:將代碼實現(xiàn)到 IoT Thing

最后,我們?yōu)樽钪匾牟糠譁蕚淞艘磺?,?IoT Thing 的代碼。從 GitHub 克隆代碼(鏈接在底部)。在 IoT 文件夾中有用 C 編寫的代碼,這是需要的。

這是根據(jù)智能恒溫器示例構建的,因此您將在此處找到實施的內容、方式和原因。閱讀 git 提交也可以跟蹤我們的更改。

首先,您預先配置的sdkconfig文件從 Smart Thermostat 文件夾復制到 IoT 文件夾。此文件不是我們的 repo (by.gitignore) 的一部分,因為它包含 WiFi SSID 和密碼以及您的 IoT 事物的 MQTT 隊列的唯一 AWS url。

清理

刪除了一些不需要的文件和模塊,例如 FFT.c,因為我們不處理語音。

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);

按鈕點擊事件設置了一個全局變量,后面可以查詢:

// 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 符號以及如何更改同一文本中的文本顏色:

// 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 文檔可以在這里找到這顯示了所有可用的控件、樣式和屬性設置,例如對齊方式。

LED的設置如下:

// 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 項目的主文件也進行了清理,并添加了我們的邏輯。此外,許多地方都添加了日志記錄,并將日志記錄到控制臺輸出而不是 UI。

所做的更改之一是,如果 IoT Thing 無法連接到影子,我們不會重新啟動。有時我們會遇到超時問題,并且 Thing 重啟需要很長時間。

// 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
    }
}

當 Thing 連接到 WiFi 和 IoT Shadow 時,我們也在 Thing 上設置當前時間 + 1 小時的到期時間:

// initialize cleaning due date to current time + 1 hour
BM8563_GetTime(&dueDate);
dueDate.hour+=1;

然后我們開始一個無限循環(huán),它獲取時間并在 UI 上顯示時間,計算剩余時間,根據(jù)差異設置 LED,并設置進度條(不會低于零):

// 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

我們檢查按鈕是否在此期間被點擊,如果是,那么我們將到期時間增加到 +1 小時。還應構建 JSON 消息,并更新 IoT Shadow。為了節(jié)省成本,我們僅在真正需要時才更新 IoT Shadow(當單擊“已清理”按鈕時):

// 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 秒,無限循環(huán)繼續(xù)。

vTaskDelay(pdMS_TO_TICKS(1000));    // wait 1 sec, then loop

就是這樣!

備注:cleaningStatus_Callback方法當前為空。在以后的增強中,它可用于例如從 AWS 更新到期日期,因為只要 AWS 端的 IoT Shadow 發(fā)生更改,就會調用此日期。

測試

讓我們在 PlatformIO 終端中發(fā)出以下命令:

pio run --environment core2foraws --target upload --target monitor

它將編譯項目、創(chuàng)建固件并將其上傳到 IoT Thing。Thing 將重新啟動并執(zhí)行代碼,而您可以在 PlatformIO 終端中看到它的控制臺日志。

日志中的一些重要里程碑是:

客戶編號:

?[0;32mI (3425) MAIN: Device client Id: >> 0123456789abcde01 <

無線網絡連接:

?[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)顯示剩余時間:

?[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 控制臺上也可以看到相同的 JSON:

pYYBAGNiMb2ACag2AAFGHtVe9as369.png
?

?

第 9 步:測試物聯(lián)網

啟動后,IoT Thing 上的 LED 將呈藍色。很快它將連接到 WiFi,其 SSID 將顯示在左上角。一段時間后,它將連接到 AWS IoT Shadow,并開始循環(huán),因此:將顯示當前時間,LED 將變?yōu)榫G色,進度條將顯示從 1 小時開始的剩余時間百分比。如果只剩下 15 分鐘,LED 將呈黃色。如果剩余時間,LED 將變?yōu)榧t色。每當您按下“已清除”按鈕時,1 小時倒計時再次開始,進度條應重置為 100%,LED 應再次變?yōu)榫G色,并且還會通過 AWS IoT Shadow 發(fā)送一條消息,這將觸發(fā) IoT 規(guī)則,等等上。

?

未來的可能性

為合規(guī)報告匯總數(shù)據(jù)。

將系統(tǒng)連接到公司 AD,因此:

  • IoT Thing 可以在其 UI 上顯示下一次會議名稱和開始時間
  • 系統(tǒng)可以在房間沒有會議時計劃清潔周期

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費