手把手實踐丨基於STM32+NBIOT+華為雲IOT設計智能井蓋

来源:https://www.cnblogs.com/huaweiyun/archive/2023/06/05/17457758.html
-Advertisement-
Play Games

摘要:本文介紹基於STM32微控制器、BC26 NBIOT模組和華為雲IOT平臺,實現了一款智能井蓋系統。 本文分享自華為雲社區《基於STM32+NBIOT+華為雲IOT設計的智能井蓋》,作者:DS小龍哥 。 一、概述 智能井蓋是一種通過物聯網技術實現對井蓋狀態監測和管理的設備。當前介紹基於STM3 ...


摘要:本文介紹基於STM32微控制器、BC26 NBIOT模組和華為雲IOT平臺,實現了一款智能井蓋系統。

本文分享自華為雲社區《基於STM32+NBIOT+華為雲IOT設計的智能井蓋》,作者:DS小龍哥 。

一、概述

智能井蓋是一種通過物聯網技術實現對井蓋狀態監測和管理的設備。當前介紹基於STM32微控制器,BC26 NBIOT模組以及華為雲IOT平臺設計一款智能井蓋系統。該系統通過光線感測器、霍爾感測器、溫濕度感測器等設備實現井蓋狀態的實時監測,通過NBIOT網路將數據上傳到華為雲IOT平臺,再通過雲平臺下發控制指令實現遠程管理。

應用場景

智能井蓋系統可以廣泛應用於城市管理、交通建設等領域,其中具體應用場景包括:

(1)實時監測井蓋狀態,及時發現井蓋開放或異常情況,提高城市管理的效率和安全性;

(2)提供實時環境監測數據,幫助提升城市環境監測能力;

(3)利用NBIOT網路和華為雲平臺的遠程式控制制功能,可以實現智能井蓋的開關控制和監管,避免人工操作不便和監管不到位引起的危險。

image-20230426095637493

image-20230426095643915

二、硬體設計

本系統的硬體設計主要包括感測器模塊和控制模塊兩部分,其中感測器模塊主要負責採集井蓋狀態信息,控制模塊則負責數據處理和通信。

【1】感測器模塊

(1)光線感測器:光線感測器用於感知井蓋上方光線強度,判斷井蓋是否露出地面。當井蓋被遮住時,光線感測器輸出低電平;當井蓋暴露在外時,光線感測器輸出高電平。

(2)霍爾感測器:霍爾感測器用於感知井蓋狀態(開/關),當井蓋開啟時,霍爾感測器輸出高電平;當井蓋關閉時,霍爾感測器輸出低電平。

(3)溫度感測器和濕度感測器:溫度感測器和濕度感測器用於感知井蓋下方的環境溫濕度,實時反饋給系統,便於監測井蓋下方環境狀況。

【2】控制模塊

(1)STM32微控制器:使用STM32F103C8T6微控制器,主要負責感測器數據採集、處理和控制模塊與NBIOT模組之間的通信。

(2)BC26 NBIOT模組:使用BC26 NBIOT模組,通過NBIOT網路將採集到的井蓋狀態數據上傳到華為雲IOT平臺,同時支持遠程式控制制井蓋開關。

(3)LED指示燈:採用不同顏色的LED指示燈,將井蓋狀態(開/關、異常、低電量)實時反饋給用戶。

軟體設計 軟體設計主要包括STM32微控制器程式設計和華為雲IOT平臺開發兩部分。

STM32微控制器程式設計: 主要包括三個模塊:感測器採集模塊、數據處理模塊和通信模塊。其中感測器採集模塊負責採集感測器數據併進行處理;數據處理模塊根據採集的數據進行邏輯處理,判斷井蓋狀態;通信模塊負責與NBIOT模組之間的通信,將處理後的數據上傳至華為雲IOT平臺。

三、華為雲IOT平臺開發

在華為雲IOT平臺上,需要進行設備接入、數據模型定義、規則引擎配置和應用開發等四個核心模塊的開發。其中,設備接入模塊包括設備註冊、獲取設備證書、建立連接等步驟,以保障設備與雲平臺之間的安全通信;數據模型定義模塊需要根據實際需求定義相應的數據模型,包括上傳數據格式、設備屬性和服務等。規則引擎配置模塊需要完成實時消息推送、遠程式控制制和告警等功能。應用開發模塊則是將完整的智能井蓋系統進行打包,為用戶提供統一的操作介面。

華為雲官網: https://www.huaweicloud.com/

打開官網,搜索物聯網,就能快速找到 設備接入IoTDA

image-20221204193824815

3.1 物聯網平臺介紹

華為雲物聯網平臺(IoT 設備接入雲服務)提供海量設備的接入和管理能力,將物理設備聯接到雲,支撐設備數據採集上雲和雲端下發命令給設備進行遠程式控制制,配合華為雲其他產品,幫助我們快速構築物聯網解決方案。

使用物聯網平臺構建一個完整的物聯網解決方案主要包括3部分:物聯網平臺、業務應用和設備。

物聯網平臺作為連接業務應用和設備的中間層,屏蔽了各種複雜的設備介面,實現設備的快速接入;同時提供強大的開放能力,支撐行業用戶構建各種物聯網解決方案。

設備可以通過固網、2G/3G/4G/5G、NB-IoT、Wifi等多種網路接入物聯網平臺,並使用LWM2M/CoAP、MQTT、HTTPS協議將業務數據上報到平臺,平臺也可以將控制命令下發給設備。

業務應用通過調用物聯網平臺提供的API,實現設備數據採集、命令下發、設備管理等業務場景。

img

3.2 開通物聯網服務

地址: https://www.huaweicloud.com/product/iothub.html

image-20221204194233414

開通標準版免費單元。

image-20230420181306316

image-20230420181322092

開通之後,點擊總覽,查看接入信息。 我們當前設備準備採用MQTT協議接入華為雲平臺,這裡可以看到MQTT協議的地址和埠號等信息。

image-20230423111235524

總結:

 埠號:   MQTT (1883)| MQTTS (8883)    
 接入地址: a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com

根據功能變數名稱地址得到IP地址信息:

 Microsoft Windows [版本 10.0.19044.2846]
 (c) Microsoft Corporation。保留所有權利。
 ​
 C:\Users\11266>ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com
 ​
 正在 Ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 位元組的數據:
 來自 121.36.42.100 的回覆: 位元組=32 時間=37ms TTL=31
 來自 121.36.42.100 的回覆: 位元組=32 時間=37ms TTL=31
 來自 121.36.42.100 的回覆: 位元組=32 時間=36ms TTL=31
 來自 121.36.42.100 的回覆: 位元組=32 時間=37ms TTL=31121.36.42.100 的 Ping 統計信息:
     數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
 往返行程的估計時間(以毫秒為單位):
     最短 = 36ms,最長 = 37ms,平均 = 36ms
 ​
 C:\Users\11266>

image-20230423111213624

MQTT協議接入埠號有兩個,1883是非加密埠,8883是證書加密埠,單片機無法載入證書,所以使用1883埠比較合適。 接下來的ESP8266就採用1883埠連接華為雲物聯網平臺。

3.3 創建產品

(1)創建產品

點擊右上角創建產品。

image-20230420181503524

(2)填寫產品信息

根據自己產品名字填寫,設備類型選擇自定義類型。

(3)添加自定義模型

產品創建完成之後,點擊進入產品詳情頁面,翻到最下麵可以看到模型定義。

image-20230420181615129

模型簡單來說: 就是存放設備上傳到雲平臺的數據。比如:環境溫度、環境濕度、環境煙霧濃度、火焰檢測狀態圖等等,這些我們都可以單獨創建一個模型保存。

3.4 添加設備

產品是屬於上層的抽象模型,接下來在產品模型下添加實際的設備。添加的設備最終需要與真實的設備關聯在一起,完成數據交互。

(1)註冊設備

點擊右上角註冊設備。

image-20230421091842025

(2)根據自己的設備填寫

在彈出的對話框里填寫自己設備的信息。根據自己設備詳細情況填寫。

(3)保存設備信息

創建完畢之後,點擊保存並關閉,得到創建的設備密匙信息。該信息在後續生成MQTT三元組的時候需要使用。

3.5 MQTT協議主題訂閱與發佈

(1)MQTT協議介紹

當前的設備是採用MQTT協議與華為雲平臺進行通信。

MQTT是一個物聯網傳輸協議,它被設計用於輕量級的發佈/訂閱式消息傳輸,旨在為低帶寬和不穩定的網路環境中的物聯網設備提供可靠的網路服務。MQTT是專門針對物聯網開發的輕量級傳輸協議。MQTT協議針對低帶寬網路,低計算能力的設備,做了特殊的優化,使得其能適應各種物聯網應用場景。目前MQTT擁有各種平臺和設備上的客戶端,已經形成了初步的生態系統。

MQTT是一種消息隊列協議,使用發佈/訂閱消息模式,提供一對多的消息發佈,解除應用程式耦合,相對於其他協議,開發更簡單;MQTT協議是工作在TCP/IP協議上;由TCP/IP協議提供穩定的網路連接;所以,只要具備TCP協議棧的網路設備都可以使用MQTT協議。 本次設備採用的ESP8266就具備TCP協議棧,能夠建立TCP連接,所以,配合STM32代碼里封裝的MQTT協議,就可以與華為雲平臺完成通信。

華為雲的MQTT協議接入幫助文檔在這裡: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

img

業務流程:

img

(2)華為雲平臺MQTT協議使用限制

 (3)主題訂閱格式

幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

image-20221207153310037

對於設備而言,一般會訂閱平臺下發消息給設備 這個主題。

設備想接收平臺下發的消息,就需要訂閱平臺下發消息給設備 的主題,訂閱後,平臺下發消息給設備,設備就會收到消息。

(4)主題發佈格式

對於設備來說,主題發佈表示向雲平臺上傳數據,將最新的感測器數據,設備狀態上傳到雲平臺。

這個操作稱為:屬性上報。

幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

image-20221207153637391

3.6 MQTT三元組

MQTT協議登錄需要填用戶ID,設備ID,設備密碼等信息,就像我們平時登錄QQ,微信一樣要輸入賬號密碼才能登錄。MQTT協議登錄的這3個參數,一般稱為MQTT三元組。

接下來介紹,華為雲平臺的MQTT三元組參數如何得到。

(1)MQTT伺服器地址

要登錄MQTT伺服器,首先記得先知道伺服器的地址是多少,埠是多少。

幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home

image-20230411141412090

MQTT協議的埠支持1883和8883,它們的區別是:8883 是加密埠更加安全。但是單片機上使用比較困難,所以當前的設備是採用1883埠進連接的。

根據上面的功能變數名稱和埠號,得到下麵的IP地址和埠號信息: 如果設備支持填寫功能變數名稱可以直接填功能變數名稱,不支持就直接填寫IP地址。 (IP地址就是功能變數名稱解析得到的)

 華為雲的MQTT伺服器地址:121.36.42.100
 華為雲的MQTT埠號:1883

(2)生成MQTT三元組

華為雲提供了一個線上工具,用來生成MQTT鑒權三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打開這個工具,填入設備的信息(也就是剛纔創建完設備之後保存的信息),點擊生成,就可以得到MQTT的登錄信息了。

下麵是打開的頁面:

image-20221207154917230

3.7 參考案例

華為雲平臺部署開發也可以參考這裡:

https://bbs.huaweicloud.com/blogs/381072

【基於華為雲IOT平臺實現多節點溫度採集(STM32+NBIOT)】

四、讀取煙霧氣體濃度

【1】MQ2感測器

以下是一個讀取MQ2感測器數據,並轉換為煙霧濃度的示例代碼,

 #include "stm32f10x.h"
 #include <stdio.h>int main(void)
 {
     // 初始化ADC
     ADC_InitTypeDef ADC_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
     ADC_InitStructure.ADC_ScanConvMode = DISABLE;
     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
     ADC_InitStructure.ADC_NbrOfChannel = 1;
     ADC_Init(ADC1, &ADC_InitStructure);
 ​
     // 配置ADC通道1的GPIO引腳
     GPIO_InitTypeDef GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
 ​
     // 啟動ADC校準
     ADC_Cmd(ADC1, ENABLE);
     ADC_ResetCalibration(ADC1);
     while (ADC_GetResetCalibrationStatus(ADC1));
     ADC_StartCalibration(ADC1);
     while (ADC_GetCalibrationStatus(ADC1));
 ​
     // 讀取ADC值
     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5);
     ADC_SoftwareStartConvCmd(ADC1, ENABLE);
     while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
     uint16_t adc_value = ADC_GetConversionValue(ADC1);
 ​
     // 計算煙霧濃度
     float voltage = (float)adc_value / 4096.0f * 3.3f;
     float density = (voltage - 0.4f) / 0.4f * 10000.0f;
 ​
     // 列印出煙霧濃度
     printf("MQ2 Smoke Density: %.2f ppm\n", density);
 }
 ​
 ​
 ​
 ​
 float adc_average() 
 {
     const int num_discarded = 3;  // 剔除的最大/最小值數量
     float samples[20];   // 存儲採樣結果的數組
     
     // 採集數據
     for (int i = 0; i < num_samples; i++) {
         samples[i] = ADC_GET();
     }
     
     // 對採樣結果進行排序(升序)
     for (int i = 0; i < num_samples - 1; i++) {
         for (int j = i + 1; j < num_samples; j++) {
             if (samples[i] > samples[j]) {
                 float temp = samples[i];
                 samples[i] = samples[j];
                 samples[j] = temp;
             }
         }
     }
     
     // 計算剩下的平均值
     float sum = 0;
     for (int i = num_discarded; i < num_samples - num_discarded; i++) {
         sum += samples[i];
     }
     return sum / (num_samples - 2 * num_discarded);  // 返回計算結果
 }

【2】MQ4感測器

以下是基於HAL庫的STM32F103ZET6讀取MQ4煙霧感測器的代碼:

 #include "gpio.h"/* MQ4感測器的引腳定義 */
 #define MQ4_PORT        GPIOA
 #define MQ4_PIN         GPIO_PIN_0/* MQ4感測器的校準電壓 */
 #define MQ4_RL_VALUE    10      // RL值為10kΩ
 #define MQ4_CALCULATE_RO_CLEAN(adcValue)     ((float)(RL_VALUE*(4096-adcValue)/adcValue))/* 獲取MQ4感測器的數據 */
 float get_mq4_value()
 {
     uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
     float ro = MQ4_CALCULATE_RO_CLEAN(adc_value);
     float sensor_volt = HAL_ADC_GetValue(&hadc2) * (3.3 /4096.0);
     float sensor_rsr = (3.3 - sensor_volt) / sensor_volt * ro;
     float mq4_ppm = pow(10, ((log10(sensor_rsr / 2.5) - 0.3420) / (-0.6162)));
     return mq4_ppm;
 }
 ​
 /* 主函數 */
 int main()
 {
     HAL_Init();
     MX_GPIO_Init();
     MX_ADC1_Init();
     MX_ADC2_Init();
   
     /* 讀取MQ4感測器數據 */
     float mq4_value = get_mq4_value();
 ​
     printf("MQ4感測器值:%.2f PPM\r\n", mq4_value);
 ​
     while (1);
 }

在該示例代碼中,我們用到了ADC1和ADC2來分別讀取MQ4感測器的數據引腳和校準電壓。函數get_mq4_value()中使用了MQ4感測器的電路計算公式,將讀取的感測器數據轉化成對應的PPM值。

五、總結

當前文章介紹基於STM32微控制器、BC26 NBIOT模組和華為雲IOT平臺,實現了一款智能井蓋系統。該系統通過多種感測器實現了井蓋狀態的實時監測和數據上傳,在應用上具有重要的應用場景和實際應用價值。整體介紹了系統硬體和軟體設計的各個環節,對相關產品的開發提供了一定的參考價值和設計思路。

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • groovy 3.0.7 ### DES加密簡介 加密分為對稱加密和非對稱加密。非對稱加密,加解密使用不同的密鑰,如RSA;對稱加密,加解密使用相同的密鑰,如DES(Data Encryption Standard,即數據加密標準)。相對而言,非對稱加密安全性更高,但是計算過程複雜耗時,一般只應用於 ...
  • # 1.列表切片 前面學習的是如何處理列表的所有數據元素。python還可以處理列表的部分元素,python稱之為切片。 ## 1.1創建切片 創建切片,可指定要使用的第一個數據元素的索引和最後一個數據元素的索引。與range函數一樣,python在到達指定的第二個索引前面的數據元素後停止。比如要輸 ...
  • 本文作者從評判標準、功能評測、性能評測等多方面剖析三方庫哪些家強,並給出了比較務實的建議。 引言 為了小伙伴理解,彙總了一下文章中會提及的術語名詞解釋,請放心品讀,歡迎一起討論交流! 你真的瞭解 Go 標準庫嗎? 問題一:標準庫可以反序列化普通的字元串嗎?執行下麵的代碼會報錯嗎? var s str ...
  • 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,... ...
  • 摘要:基於.NET Core 7.0WebApi後端架構實戰【2-介入IOC控制反轉】 2023/04/09, ASP.NET Core 7.0, VS2022 引言 Inversion of Control,簡稱IOC,即控制反轉。記得當初剛實習的時候公司的帶我的人和我提到過IOC這個概念,當初完 ...
  • # 圖片介面JWT鑒權實現 # 前言 之前做了個返回圖片鏈接的介面,然後沒做授權,然後今天鍵盤到了,也是用JWT來做介面的許可權控制。 然後JTW網上已經有很多文章來說怎麼用了,這裡就不做多的解釋了,如果不懂的可以參考下列鏈接的 文章。 圖片介面文章:[還在愁個人博客沒有圖片放?](https://w ...
  • 網上很多方法都試過,什麼“修複”,關掉進程,重啟都試過了,但是想保留數據所以不想重置 **最後發現打不開的原因:C盤空間滿了** 但是我在安裝的時候明明設置在別的盤 ![image](https://img2023.cnblogs.com/blog/2580807/202306/2580807-20 ...
  • 大家好,我是god23bin。歡迎來到《一分鐘學一個 Linux 命令》系列,今天需要你花兩分鐘時間來學習下,因為今天要講的是兩個命令,mkdir 和 touch 命令。前一個命令是操作目錄的,後一個命令是操作文件的。 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...