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

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

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

一、概述

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

應用場景

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

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

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

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

 (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

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平臺,實現了一款智慧井蓋系統。該系統通過多種感測器實現了井蓋狀態的實時監測和資料上傳,在應用上具有重要的應用場景和實際應用價值。整體介紹了系統硬體和軟體設計的各個環節,對相關產品的開發提供了一定的參考價值和設計思路。

 

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