摘要:當前基于STM32和華為云,設計了一種智慧煙感系統,該系統可以檢測煙霧,同時將檢測到的資料上傳到云端進行處理和分析,
本文分享自華為云社區《基于STM32+華為云設計的智慧煙感系統》,作者:DS小龍哥 ,
一、概述
當前基于STM32和華為云,設計了一種智慧煙感系統,該系統可以檢測煙霧,同時將檢測到的資料上傳到云端進行處理和分析,系統可用于家庭、辦公室等需要安裝煙霧報警器場所,
二、系統設計
2.1 系統硬體設計
【1】硬體平臺
該系統主要使用STM32F103ZET6微控制器作為核心控制器,并搭配數碼顯示幕、蜂鳴器、MQ4煙霧傳感器、WiFi模塊等作為輔助組件,
【2】系統連接
STM32F103ZET6微控制器通過GPIO連接數碼顯示幕、蜂鳴器、MQ4煙霧傳感器等外設,通過UART連接WiFi模塊,將讀取到的資料上傳到云端,
【3】系統作業流程
系統在啟動時,首先進行硬體初始化和WiFi連接操作,之后,通過煙霧傳感器實時檢測室內環境中的煙霧濃度,當煙霧濃度超出一定閾值時,蜂鳴器會發出警報,同時將警報資訊上傳到云端,在云端,系統可以對上傳的資料進行處理和分析,如通過分析歷史資料預測煙霧濃度的變化趨勢等,
2.2 系統軟體設計
【1】軟體平臺
系統的軟體平臺主要由STM32的HAL庫和華為云平臺的API組成,
【2】軟體流程
系統在啟動時,首先進行硬體初始化和WiFi連接操作,之后,通過HAL庫讀取MQ4煙霧傳感器的資料,并根據資料判斷是否觸發煙霧警報,如果觸發了煙霧警報,則蜂鳴器發出警報,并通過WiFi模塊將警報資訊上傳到云端,在云端,系統通過華為云平臺的API介面獲取上傳的資料,并進行處理和分析,
三、華為云IOT平臺開發
在華為云IOT平臺上,需要進行設備接入、資料模型定義、規則引擎配置和應用開發等四個核心模塊的開發,其中,設備接入模塊包括設備注冊、獲取設備證書、建立連接等步驟,以保障設備與云平臺之間的安全通信;資料模型定義模塊需要根據實際需求定義相應的資料模型,包括上傳資料格式、設備屬性和服務等,規則引擎配置模塊需要完成實時訊息推送、遠程控制和告警等功能,應用開發模塊則是將完整的智能井蓋系統進行打包,為用戶提供統一的操作介面,
華為云官網: https://www.huaweicloud.com/
打開官網,搜索物聯網,就能快速找到 設備接入IoTDA,
3.1 物聯網平臺介紹
華為云物聯網平臺(IoT 設備接入云服務)提供海量設備的接入和管理能力,將物理設備聯接到云,支撐設備資料采集上云和云端下發命令給設備進行遠程控制,配合華為云其他產品,幫助我們快速構筑物聯網解決方案,
使用物聯網平臺構建一個完整的物聯網解決方案主要包括3部分:物聯網平臺、業務應用和設備,
物聯網平臺作為連接業務應用和設備的中間層,屏蔽了各種復雜的設備介面,實作設備的快速接入;同時提供強大的開放能力,支撐行業用戶構建各種物聯網解決方案,
設備可以通過固網、2G/3G/4G/5G、NB-IoT、Wifi等多種網路接入物聯網平臺,并使用LWM2M/CoAP、MQTT、HTTPS協議將業務資料上報到平臺,平臺也可以將控制命令下發給設備,
業務應用通過呼叫物聯網平臺提供的API,實作設備資料采集、命令下發、設備管理等業務場景,
3.2 開通物聯網服務
地址: https://www.huaweicloud.com/product/iothub.html
開通標準版免費單元,

開通之后,點擊總覽,查看接入資訊, 我們當前設備準備采用MQTT協議接入華為云平臺,這里可以看到MQTT協議的地址和埠號等資訊,
總結:
埠號: 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=31 ? 121.36.42.100 的 Ping 統計資訊: 資料包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失), 往返行程的估計時間(以毫秒為單位): 最短 = 36ms,最長 = 37ms,平均 = 36ms ? C:\Users\11266>
MQTT協議接入埠號有兩個,1883是非加密埠,8883是證書加密埠,單片機無法加載證書,所以使用1883埠比較合適, 接下來的ESP8266就采用1883埠連接華為云物聯網平臺,
3.3 創建產品
(1)創建產品
點擊右上角創建產品,
(2)填寫產品資訊
根據自己產品名字填寫,設備型別選擇自定義型別,
(3)添加自定義模型
產品創建完成之后,點擊進入產品詳情頁面,翻到最下面可以看到模型定義,
模型簡單來說: 就是存放設備上傳到云平臺的資料,比如:環境溫度、環境濕度、環境煙霧濃度、火焰檢測狀態圖等等,這些我們都可以單獨創建一個模型保存,
3.4 添加設備
產品是屬于上層的抽象模型,接下來在產品模型下添加實際的設備,添加的設備最終需要與真實的設備關聯在一起,完成資料互動,
(1)注冊設備
點擊右上角注冊設備,
(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
業務流程:
(2)華為云平臺MQTT協議使用限制
(3)主題訂閱格式
幫助檔案地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
對于設備而言,一般會訂閱平臺下發訊息給設備 這個主題,
設備想接收平臺下發的訊息,就需要訂閱平臺下發訊息給設備 的主題,訂閱后,平臺下發訊息給設備,設備就會收到訊息,
(4)主題發布格式
對于設備來說,主題發布表示向云平臺上傳資料,將最新的傳感器資料,設備狀態上傳到云平臺,
這個操作稱為:屬性上報,
幫助檔案地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
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
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的登錄資訊了,
下面是打開的頁面:
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 =https://www.cnblogs.com/huaweiyun/archive/2023/06/02/ get_mq4_value(); ? printf("MQ4傳感器值:%.2f PPM\r\n", mq4_value); ? while (1); }
在該示例代碼中,我們用到了ADC1和ADC2來分別讀取MQ4傳感器的資料引腳和校準電壓,函式get_mq4_value()中使用了MQ4傳感器的電路計算公式,將讀取的傳感器資料轉化成對應的PPM值,
五、系統優化設計
為了提高系統的準確性和實用性,采取以下優化方案:
【1】使用多個傳感器
在實際應用中,可以通過使用多個煙霧傳感器來提高系統的準確性,安裝多個傳感器,可以檢測到更多的區域,從而更準確地判斷室內是否有煙霧濃度超標的情況,
【2】使用專業的云平臺
為了更好地管理和分析資料,可以選擇一個專業的云平臺,如華為云,使用云平臺,可以更方便地對資料進行分析和處理,并實作更多的智能化管理功能,
【3】提高警報效果
為了更好地提高警報效果,除了使用蜂鳴器外,還可以考慮使用其他型別的報警器,如閃光燈、震動器等,這些報警器可以在不同場合下提供更好的報警效果,
【4】引入云服務
將資料上傳到云端,不僅可以對資料進行分析和處理,還可以通過云平臺提供的服務,如語音警報、郵件通知等方式及時向用戶通報警情,讓用戶第一時間采取措施,
【5】實作遠程控制
若在系統中加入控制模塊,用戶就可以在遠程控制平臺上通過云端控制系統,如關閉報警器、打開風扇等,對于需要海量資料處理和智能控制的復雜系統,基于云服務的遠程控制就顯得尤為重要,
六、總結
本文基于STM32和華為云平臺,設計了一種智慧煙感系統,該系統可以檢測煙霧濃度并上傳資料到云端,通過云端進行分析和處理,實作報警和遠程控制功能,通過不斷地優化系統,可以不斷提高系統的準確性和實用性,將其應用到更廣泛的領域中,
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/554171.html
標籤:其他
上一篇:BFF層聚合查詢服務異步改造及治理實踐 | 京東云技術團隊
下一篇:返回列表
