6 STM32單片機的智能家居安防系統設計(STM32代碼+手機APP設計+PCB設計+Proteus仿真)

系列文章目錄


文章目錄

  • 系列文章目錄
  • 前言
  • 1 資料獲取與演示視頻
    • 1.1 資料介紹
    • 1.2 資料獲取
    • 1.3 演示視頻
  • 2 系統框架
  • 3 硬件
    • 3.1 主控制器
    • 3.2 顯示屏
    • 3.3 WIFI模塊
    • 3.4 DHT11溫濕度傳感器
    • 3.5 煙霧/燃氣傳感器模塊:MQ-2
    • 3.6 火焰傳感器
    • 3.7 門磁模塊MC-38
  • 4 設計PCB
    • 4.1 安裝下載立創EDA專業版
    • 4.2 畫原理圖
    • 4.3 擺放元器件,設計規則,淚滴,鋪銅。
    • 4.4 使用嘉立創下單助手進行下單,打板。
    • 4.5 實物圖
  • 5 軟件設計
    • 5.1 編寫STM32單片機代碼
    • 5.2 設計手機APP
  • 6 proteus仿真
  • 7 實驗測試
    • 7.1 準備
    • 7.2 燒錄軟件
    • 7.3 實驗驗證
  • 總結


前言

本文設計出一款基于STM32單片機的智能家居安防系統。
主要功能如下:

1、實時顯示當前時間,和網絡時間同步。

2、DHT11溫濕度傳感器采集溫濕度

3、MQ-2監控煙霧/可燃氣體

4、火焰傳感器監控明火

5、門磁模塊監控闖入報警

6、OLED實時顯示當前系統信息

7、閾值可調,超出閾值蜂鳴器報警。

8、通過ESP8266連接OneNET云平臺,實現單片機-OneNET云平臺-手機APP三方交互。


1 資料獲取與演示視頻

1.1 資料介紹

在這里插入圖片描述

1.2 資料獲取

咸魚:【勝磊電子】基于STM32單片機的智能家居系統設計(STM32代碼編寫+手機APP設計+PCB設計+Proteus仿真)

淘寶:【勝磊電子】基于STM32單片機的智能家居系統設計(STM32代碼編寫+手機APP設計+PCB設計+Proteus仿真)

1.3 演示視頻

嗶哩嗶哩:【勝磊電子】基于STM32單片機的智能家居系統設計(STM32代碼編寫+手機APP設計+PCB設計+Proteus仿真)


2 系統框架

系統框架如圖所示:
在這里插入圖片描述

單片機整體框圖:
在這里插入圖片描述


3 硬件

3.1 主控制器

主控制器選擇STM32F103RCT6,在淘寶上買的,如下圖所示:
在這里插入圖片描述
STM32F103RCT6 是意法半導體(STMicroelectronics)推出的一款基于 ARM Cortex-M3 內核的 32 位微控制器,在工業控制、消費電子等領域應用廣泛。

內核與性能
內核:采用 ARM Cortex - M3 內核,具備高效的哈佛結構和 Thumb - 2 指令集,可實現較高的代碼密度和處理性能。
工作頻率:最高工作頻率達 72MHz,能快速處理各種復雜任務。
運算能力:支持單周期乘法和硬件除法,提升了數據處理速度。
存儲器
閃存(Flash):擁有 256KB 的閃存,可用于存儲程序代碼。其可擦寫次數多,數據保存時間長,適合存儲一些需要長期保存的程序和數據。
隨機存取存儲器(SRAM):具備 48KB 的 SRAM,能為程序運行提供臨時數據存儲和堆棧空間。
外設接口
通用輸入輸出端口(GPIO):多達 72 個 GPIO 引腳,可靈活配置為輸入或輸出模式。這些引腳可用于連接外部設備,如按鍵、LED、傳感器等。
串行通信接口:
UART:3 個通用異步收發傳輸器(UART),可實現全雙工通信,用于與其他設備進行異步串行通信,如連接 PC、藍牙模塊等。
SPI:2 個串行外設接口(SPI),通信速度快,常用于連接外部存儲器、傳感器等高速設備。
I2C:2 個集成電路總線(I2C),可用于連接多個具有 I2C 接口的設備,如 EEPROM、傳感器等,實現數據的傳輸和設備的控制。
USB 接口:支持 USB 2.0 全速設備模式,可方便地與計算機或其他 USB 設備進行通信。
CAN 接口:具備 1 個控制器局域網(CAN)接口,適用于汽車電子、工業自動化等領域的分布式控制系統,實現節點間的可靠通信。
SDIO 接口:支持安全數字輸入輸出(SDIO)接口,可用于連接 SD 卡、MMC 卡等大容量存儲設備,方便數據的存儲和讀取。
定時器
高級定時器:1 個高級定時器,可用于電機控制、PWM 生成等高精度應用場景。
通用定時器:4 個通用定時器,具備多種功能,如定時、計數、PWM 輸出等,可滿足不同的應用需求。
基本定時器:2 個基本定時器,主要用于簡單的定時和計數任務。
模擬外設
模數轉換器(ADC):擁有 2 個 12 位的 ADC,最多支持 16 個外部通道。可將模擬信號轉換為數字信號,用于采集傳感器的模擬輸出,如溫度、壓力等。
數模轉換器(DAC):1 個 12 位數模轉換器,可將數字信號轉換為模擬信號,用于產生模擬電壓或電流信號。
其他特性
低功耗模式:支持多種低功耗模式,如睡眠模式、停止模式和待機模式,可有效降低系統功耗,延長電池續航時間。
復位和時鐘管理:具備完善的復位和時鐘管理系統,可確保系統在各種情況下穩定運行。同時,支持外部晶振和內部 RC 振蕩器,方便用戶根據實際需求選擇合適的時鐘源。

3.2 顯示屏

使用1.8寸顯示屏,分辨率128*160。如圖,
在這里插入圖片描述
1.8寸彩屏,支持16BIT RGB 65K彩色顯示,顯示色彩豐富
128X160分辨率,顯示清晰
采用SPI串行總線,只需幾個IO即可點亮顯示
帶SD卡槽方便功能擴展
軍工級工藝標準,長期穩定工作

3.3 WIFI模塊

WIFI模塊使用ESP8266,如圖,
在這里插入圖片描述
ESP01S 是一款基于樂鑫 ESP8266EX 芯片的低成本、低功耗 Wi-Fi 模塊,專為物聯網(IoT)和嵌入式系統設計。
以下是其詳細介紹:

核心架構與性能
處理器:采用 32 位 Tensilica L106 RISC 處理器,主頻支持 80MHz 或 160MHz,集成 TCP/IP 協議棧,可直接運行用戶程序。
內存配置:
閃存(Flash):提供 1MB 或 4MB 兩種版本(具體型號差異),用于存儲固件和用戶代碼。
RAM:64KB,支持程序運行和數據緩存。
通信協議:支持 802.11b/g/n 標準,數據傳輸速率最高 4Mbps,覆蓋 2.4GHz 頻段,支持 STA、AP、STA+AP 三種工作模式。

硬件資源與接口
引腳定義:
供電:3.0V~3.6V(推薦 3.3V),傳輸電流 170mA,接收電流 56mA。
通信:UART 接口(TXD/RXD),支持 AT 指令交互,波特率默認 115200bps。
GPIO:提供 2 個可編程引腳(GPIO0、GPIO2),可用于控制外設(如 LED、繼電器)或傳感器輸入。
其他:CH_PD(使能引腳,高電平有效)、RST(復位引腳)。
擴展能力:
PWM:部分引腳支持 PWM 輸出,用于電機調速或燈光控制。
I2C/SPI:需通過外部擴展芯片(如 PCF8574、MCP23017)實現。

低功耗特性
工作模式:
活躍模式:傳輸時電流約 170mA,接收時 56mA。
睡眠模式:
輕睡眠:電流約 10mA,保留網絡連接。
深度睡眠:電流低至 20μA,適用于電池供電設備。
喚醒方式:支持定時喚醒、GPIO 觸發喚醒或 UART 數據喚醒。

應用場景
智能家居:通過 Wi-Fi 連接控制燈光、空調、門鎖等設備。
環境監測:采集溫濕度、空氣質量等數據并上傳至云端。
工業自動化:遠程監控設備狀態,實現無線數據傳輸。
智能農業:監測土壤濕度、光照等參數,優化種植管理。

3.4 DHT11溫濕度傳感器

在這里插入圖片描述
使用DHT11模塊檢測環境的溫度和濕度。

DHT11 是一款濕溫度一體化的數字傳感器。該傳感器包括一個電阻式測濕元件和一個 NTC測溫元件,并與一個高性能 8 位單片機相連接。通過單片機等微處理器簡單的電路連接就能夠實時的采集本地濕度和溫度。DHT11 與單片機之間能采用簡單的單總線進行通信,僅僅需要一個 I/O 口。傳感器內部濕度和溫度數據 40Bit 的數據一次性傳給單片機,數據采用校驗和方式進行校驗,有效的保證數據傳輸的準確性。DHT11 功耗很低,5V 電源電壓下,工作平均最大電流 0.5mA。
DHT11 的技術參數如下:
? 工作電壓范圍:3.3V-5.5V
? 工作電流 :平均 0.5mA
? 輸出:單總線數字信號
? 測量范圍:濕度 20~90%RH,溫度 0~50℃
? 精度 :濕度±5%,溫度±2℃
? 分辨率 :濕度 1%,溫度 1℃

DHT11 數字濕溫度傳感器采用單總線數據格式。即,單個數據引腳端口完成輸入輸出雙向傳輸。其數據包由 5Byte(40Bit)組成。數據分小數部分和整數部分,一次完整的數據傳輸為40bit,高位先出。DHT11 的數據格式為:8bit 濕度整數數據+8bit 濕度小數數據+8bit 溫度整數
數據+8bit 溫度小數數據+8bit 校驗和。其中校驗和數據為前四個字節相加。
傳感器數據輸出的是未編碼的二進制數據。數據(濕度、溫度、整數、小數)之間應該分開處理。例如,某次從 DHT11 讀到的數據如圖所示:
在這里插入圖片描述
由以上數據就可得到濕度和溫度的值,計算方法:
濕度= byte4 . byte3=45.0 (%RH)
溫度= byte2 . byte1=28.0 ( ℃)
校驗= byte4+ byte3+ byte2+ byte1=73(=濕度+溫度)(校驗正確)
可以看出,DHT11 的數據格式是十分簡單的,DHT11 和 MCU 的一次通信最大為 3ms 左右,
建議主機連續讀取時間間隔不要小于 100ms。
下面,我們介紹一下 DHT11 的傳輸時序。DHT11 的數據發送流程如圖所示:
在這里插入圖片描述
首先主機發送開始信號,即:拉低數據線,保持 t1(至少 18ms)時間,然后拉高數據線 t2(20~40us)時間,然后讀取 DHT11 的響應,正常的話,DHT11 會拉低數據線,保持 t3(40~50us)時間,作為響應信號,然后 DHT11 拉高數據線,保持 t4(40~50us)時間后,開始輸出數據。
DHT11 輸出數字‘0’的時序如圖所示:
在這里插入圖片描述
DHT11 輸出數字‘1’的時序如圖所示:
在這里插入圖片描述
通過以上了解,我們就可以通過 STM32 來實現對 DHT11 的讀取了。

3.5 煙霧/燃氣傳感器模塊:MQ-2

在這里插入圖片描述

  1. 核心檢測氣體
    液化氣(LPG)、丙烷、氫氣、煙霧(如廚房油煙、火災煙霧),對高濃度可燃氣體和煙霧的響應速度快(≤10 秒),但對酒精、一氧化碳等氣體也有交叉敏感。

  2. 典型場景
    家庭安全: 家庭廚房安裝 MQ-2,可同時監測液化氣泄漏和烹飪煙霧。
    工業監測:工廠車間丙烷泄漏監測、火災煙霧排放監控。
    消費電子:便攜式燃氣檢測儀、智能家居環境監測(如空氣凈化器聯動)。
    特殊場景:森林火災初期煙霧預警。

  3. MQ-2的工作原理
    MQ-2型煙霧傳感器屬于二氧化錫半導體氣敏材料,屬于表面離子式N型半導體。處于200~300攝氏度時,二氧化錫吸附空氣中的氧,形成氧的負離子吸附,使半導體中的電子密度減少,從而使其電阻值增加。當與煙霧接觸時,如果晶粒間界處的勢壘收到煙霧的調至而變化,就會引起表面導電率的變化。利用這一點就可以獲得這種煙霧存在的信息,煙霧的濃度越大,導電率越大,輸出電阻越低,則輸出的模擬信號就越大。

3.6 火焰傳感器

在這里插入圖片描述

  1. 特點
    可以檢測火焰或者波長在760納米~1100納米范圍內的光源,打火機測試火焰距離為80mm,對火焰越大,測試距離越遠。
    探測角度60度左右,對火焰光譜特別靈敏。
    靈敏度可調(電位器調節)
    比較器輸出,信號干凈,波形好,驅動能力強,超過15MA.
    工作電壓3.3V~5V
    輸出形式:
    DO數字量開關輸出(0/1)
    AO:模擬量開關輸出

  2. 接線說明
    VCC:接電源正極(3.3-5V)
    GND:接電源負極
    DO:TTL數字信號輸出
    AO:模擬信號輸出

3.7 門磁模塊MC-38

在這里插入圖片描述


4 設計PCB

直接使用上述模塊,線路非常雜亂,因此,我們需要自己設計一塊PCB底板。開發工具使用立創EDA。

相關資料已經放在本文第一節。

4.1 安裝下載立創EDA專業版

4.2 畫原理圖

4.3 擺放元器件,設計規則,淚滴,鋪銅。

在這里插入圖片描述

4.4 使用嘉立創下單助手進行下單,打板。

4.5 實物圖

實物如圖:
在這里插入圖片描述


5 軟件設計

5.1 編寫STM32單片機代碼

工程目錄如圖所示:
在這里插入圖片描述
main.c

#include "board_config.h"#include "module_config.h"#include "net_config.h"#include "lcd_app.h"#include "sensor_app.h"/************************************************串口驅動實驗現象:。淘寶店鋪:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3咸魚店鋪:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014嗶哩嗶哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click作者:勝磊電子
************************************************//************************************* 宏定義 *******************************************************//*********************************** 局部函數 *******************************************************//*
************************************************************
*	函數名稱:	main
*
*	函數功能:	
*
*	入口參數:	無
*
*	返回參數:	0
*
*	說明:
************************************************************
*/
int main(void)
{unsigned short timeCount = 0;	//發送間隔變量unsigned char *dataPtr = NULL;// 初始化所有外設BOARD_InitAll();// 初始化模塊MODULE_InitAll();// 初始化網絡NET_InitAll();// 初始化時間Sensor_SetTime();/* 1、顯示不變量 */LCD_Display_Init();while (1) {
/* 2、系統輪詢 */			LCD_StatusPOLL();#if 1// MQTT 數據發送if(++timeCount >= 200)									//發送間隔5s{
/* 3、得到傳感器數據 */	Sensor_GetValueAll();OneNet_SendData();									//發送數據timeCount = 0;ESP8266_Clear();LED_Toggle(&BOARD_LED2);}// MQTT 數據接收dataPtr = ESP8266_GetIPD(0);if(dataPtr != NULL)OneNet_RevPro(dataPtr);/* 4、更新傳感器數據 */			LCD_Refresh_Data();/* 5、報警檢測 */Sensor_AlarmDetection();DelayMs(10);#endif}
}

board_config.c

/*** @file board_config.c* @brief 開發板配置的實現文件* @details 實現了開發板各個模塊的初始化功能,包括 LED、蜂鳴器、延時、USART、按鍵、SPI 和 RTC 等*/#include "board_config.h"/************************************************淘寶店鋪:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3咸魚店鋪:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014嗶哩嗶哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click作者:勝磊電子
************************************************//** * @brief 開發板 LED 定義* @details 定義了開發板上的 LED 控制結構體*/
LED_TypeDef BOARD_LED1; /**< 開發板 LED1 對象 (PB0) */
LED_TypeDef BOARD_LED2; /**< 開發板 LED2 對象 (PB1) *//** * @brief 開發板蜂鳴器定義* @details 定義了開發板上的蜂鳴器控制結構體*/
Beep_TypeDef BOARD_BEEP; /**< 開發板蜂鳴器對象 (PB8) *//** * @brief SPI2 接口配置結構體* @details 配置了 SPI2 接口的相關參數,包括 GPIO 引腳、通信模式、時鐘分頻等*/
SPI_ConfigTypeDef BOARD_SPI2 = {// 選擇 SPI 接口.SPIx = SPI2,                 /**< SPI 選擇,SPI2 */.GPIOx = GPIOB,               /**< SPI2 使用的 GPIO 端口,GPIOB */.SCK_Pin = GPIO_Pin_13,       /**< SCK 引腳,PB13 */.MISO_Pin = GPIO_Pin_14,      /**< MISO 引腳,PB14 */.MOSI_Pin = GPIO_Pin_15,      /**< MOSI 引腳,PB15 */.RCC_APBxPeriph_SPI = RCC_APB1Periph_SPI2,  /**< SPI2 時鐘使能,APB1 總線 */.RCC_APBxPeriph_GPIO = RCC_APB2Periph_GPIOB, /**< GPIO 時鐘使能,APB2 總線 */// 配置 SPI 初始化結構體.SPI_InitStruct = {.SPI_Direction = SPI_Direction_2Lines_FullDuplex, /**< 雙向全雙工模式 */.SPI_Mode = SPI_Mode_Master,                      /**< 主模式 */.SPI_DataSize = SPI_DataSize_8b,                  /**< 8 位數據格式 */.SPI_CPOL = SPI_CPOL_Low,                         /**< 時鐘極性,空閑低電平 */.SPI_CPHA = SPI_CPHA_1Edge,                       /**< 時鐘相位,第一個邊沿采樣 */.SPI_NSS = SPI_NSS_Soft,                          /**< 軟件片選 */.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2, /**< 波特率預分頻,2 分頻 */.SPI_FirstBit = SPI_FirstBit_MSB,                 /**< 高位先行 */.SPI_CRCPolynomial = 7                            /**< CRC 多項式,7 */}
};/** * @brief 開發板按鍵配置數組* @details 定義了開發板上 4 個按鍵的配置信息,包括 GPIO 時鐘使能、端口、引腳、中斷線等*/
Key_InitTypeDef BOARD_KEYS[] = {{RCC_APB2Periph_GPIOA,     /**< GPIO 時鐘使能,GPIOA */GPIOA,                    /**< GPIO 端口,GPIOA */GPIO_Pin_0,               /**< 引腳,PA0 */GPIO_PortSourceGPIOA,     /**< 端口源,GPIOA */GPIO_PinSource0,          /**< 引腳源,Pin0 */EXTI_Line0,               /**< 外部中斷線,Line0 */EXTI0_IRQn,               /**< 中斷號,EXTI0_IRQn */2,                        /**< 搶占優先級,2 */1,                        /**< 子優先級,1 */EXTI_Trigger_Rising,      /**< 觸發方式,上升沿觸發 */GPIO_Mode_IPD             /**< GPIO 模式,下拉輸入 */},{RCC_APB2Periph_GPIOC,     /**< GPIO 時鐘使能,GPIOC */GPIOC,                    /**< GPIO 端口,GPIOC */GPIO_Pin_5,               /**< 引腳,PC5 */GPIO_PortSourceGPIOC,     /**< 端口源,GPIOC */GPIO_PinSource5,          /**< 引腳源,Pin5 */EXTI_Line5,               /**< 外部中斷線,Line5 */EXTI9_5_IRQn,             /**< 中斷號,EXTI9_5_IRQn */2,                        /**< 搶占優先級,2 */2,                        /**< 子優先級,2 */EXTI_Trigger_Falling,     /**< 觸發方式,下降沿觸發 */GPIO_Mode_IPU             /**< GPIO 模式,上拉輸入 */},{RCC_APB2Periph_GPIOC,     /**< GPIO 時鐘使能,GPIOC */GPIOC,                    /**< GPIO 端口,GPIOC */GPIO_Pin_6,               /**< 引腳,PC6 */GPIO_PortSourceGPIOC,     /**< 端口源,GPIOC */GPIO_PinSource6,          /**< 引腳源,Pin6 */EXTI_Line6,               /**< 外部中斷線,Line6 */EXTI9_5_IRQn,             /**< 中斷號,EXTI9_5_IRQn */2,                        /**< 搶占優先級,2 */2,                        /**< 子優先級,2 */EXTI_Trigger_Falling,     /**< 觸發方式,下降沿觸發 */GPIO_Mode_IPU             /**< GPIO 模式,上拉輸入 */},{RCC_APB2Periph_GPIOC,     /**< GPIO 時鐘使能,GPIOC */GPIOC,                    /**< GPIO 端口,GPIOC */GPIO_Pin_7,               /**< 引腳,PC7 */GPIO_PortSourceGPIOC,     /**< 端口源,GPIOC */GPIO_PinSource7,          /**< 引腳源,Pin7 */EXTI_Line7,               /**< 外部中斷線,Line7 */EXTI9_5_IRQn,             /**< 中斷號,EXTI9_5_IRQn */2,                        /**< 搶占優先級,2 */2,                        /**< 子優先級,2 */EXTI_Trigger_Falling,     /**< 觸發方式,下降沿觸發 */GPIO_Mode_IPU             /**< GPIO 模式,上拉輸入 */}
};/** * @brief 開發板按鍵數量* @details 計算并存儲開發板上按鍵的數量*/
const uint8_t BOARD_KEYS_NUM = sizeof(BOARD_KEYS) / sizeof(BOARD_KEYS[0]);/** * @brief 存儲當前時間的結構體* @details 用于存儲從 RTC 中獲取的當前時間*/
Time_t currentTime;/************************************* 局部初始化函數 *******************************************************//*** @brief 初始化開發板 LED* @details 初始化開發板上的 LED 引腳,使其能夠正常工作* @return 無*/
static void BOARD_InitLEDs(void) {// 初始化 LED1 (PB0)LED_Init(&BOARD_LED1, GPIOB, GPIO_Pin_0);// 初始化 LED2 (PB1)LED_Init(&BOARD_LED2, GPIOB, GPIO_Pin_1);
}/*** @brief 初始化開發板蜂鳴器* @details 初始化開發板上的蜂鳴器引腳,使其能夠正常工作* @return 無*/
static void BOARD_InitBeep(void) {// 初始化蜂鳴器 (PB8)Beep_Init(&BOARD_BEEP, GPIOB, GPIO_Pin_8);
}/*** @brief 初始化延時模塊* @details 配置系統時鐘,選擇指定的定時器作為延時基準* @param timer 選擇的定時器編號 (如 1 表示 TIM2)* @return 無*/
static void BOARD_InitDelay(uint8_t timer) {// 初始化延時模塊,選擇 TIM2 作為延時定時器Delay_Init(timer);
}/*** @brief 初始化開發板 USART* @details 初始化開發板上的 USART1 和 USART2 串口,配置波特率、引腳等參數* @return 無*/
static void BOARD_InitUSART(void) {// 配置 USART1 初始化參數USART_InitParams usart1_params = {.USARTx = USART1,                          /**< USART 編號,USART1 */.RCC_APBxPeriph_USART = RCC_APB2Periph_USART1, /**< USART1 時鐘使能,APB2 總線 */.RCC_APBxPeriph_GPIO = RCC_APB2Periph_GPIOA,  /**< GPIO 時鐘使能,APB2 總線 */.GPIO_Pin_Tx = GPIO_Pin_9,                 /**< TX 引腳,PA9 */.GPIO_Pin_Rx = GPIO_Pin_10,                /**< RX 引腳,PA10 */.NVIC_IRQChannel = USART1_IRQn,            /**< 中斷號,USART1_IRQn */.NVIC_IRQChannelPreemptionPriority = 0,    /**< 搶占優先級,0 */.NVIC_IRQChannelSubPriority = 2            /**< 子優先級,2 */};// 配置 USART2 初始化參數USART_InitParams usart2_params = {.USARTx = USART2,                          /**< USART 編號,USART2 */.RCC_APBxPeriph_USART = RCC_APB1Periph_USART2, /**< USART2 時鐘使能,APB1 總線 */.RCC_APBxPeriph_GPIO = RCC_APB2Periph_GPIOA,  /**< GPIO 時鐘使能,APB2 總線 */.GPIO_Pin_Tx = GPIO_Pin_2,                 /**< TX 引腳,PA2 */.GPIO_Pin_Rx = GPIO_Pin_3,                 /**< RX 引腳,PA3 */.NVIC_IRQChannel = USART2_IRQn,            /**< 中斷號,USART2_IRQn */.NVIC_IRQChannelPreemptionPriority = 0,    /**< 搶占優先級,0 */.NVIC_IRQChannelSubPriority = 0            /**< 子優先級,0 */};// 初始化 USART1,波特率為 115200Usart_Init(&usart1_params, 115200);// 初始化 USART2,波特率為 115200Usart_Init(&usart2_params, 115200);
}/*** @brief 初始化開發板按鍵* @details 初始化開發板上的按鍵 GPIO 引腳和中斷配置,使其能夠正常觸發中斷* @return 無*/
static void BOARD_InitKeys(void) {Key_Init(BOARD_KEYS, BOARD_KEYS_NUM);
}/*** @brief 初始化開發板 SPI* @details 初始化開發板上的 SPI2 接口,使用當前的配置結構體* @return 無*/
static void BOARD_InitSPI(void) {// 初始化 SPI2SPI_Generic_Init(&BOARD_SPI2);
}/*** @brief 初始化 RTC* @details 初始化 RTC 模塊,使其能夠正常工作* @return 無*/
static void BOARD_InitRTC(void) {// 初始化 RTCRTC_Init();
}/************************************* 全局初始化函數 *******************************************************//*** @brief 初始化開發板所有模塊* @details 調用各個模塊的初始化函數,完成開發板的整體初始化* @return 無*/
void BOARD_InitAll(void) {// 配置中斷優先級分組為 2 (2 位搶占優先級和 2 位子優先級)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	// 初始化 LEDBOARD_InitLEDs();				// 初始化蜂鳴器BOARD_InitBeep();				// 使用 TIM2 作為延時定時器BOARD_InitDelay(1);				// 初始化 USARTBOARD_InitUSART();				// 初始化按鍵BOARD_InitKeys();  				// 初始化 SPIBOARD_InitSPI();// 初始化 RTCBOARD_InitRTC();}

board_config.h

#ifndef BOARD_CONFIG_H
#define BOARD_CONFIG_H#include "led.h"
#include "beep.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include "spi.h"
#include "rtc.h"/************************************************淘寶店鋪:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3咸魚店鋪:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014嗶哩嗶哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click作者:勝磊電子
************************************************/#define USART_DEBUG		USART1		//調試打印所使用的串口組// 按鍵中斷處理函數聲明
#define    KEYUP_IRQHandler    		EXTI0_IRQHandler
#define    KEY012_IRQHandler   		EXTI9_5_IRQHandler// 導出LED對象供外部使用
extern LED_TypeDef BOARD_LED1;
extern LED_TypeDef BOARD_LED2;
extern LED_TypeDef BOARD_LED3;// 導出蜂鳴器對象供外部使用
extern Beep_TypeDef BOARD_BEEP;// 按鍵配置 - 可在board_config.c中修改
extern Key_InitTypeDef BOARD_KEYS[];
extern const uint8_t BOARD_KEYS_NUM;extern Time_t currentTime;// 板子初始化函數
void BOARD_InitAll(void);#endif /* BOARD_CONFIG_H */

5.2 設計手機APP

在這里插入圖片描述
index.vue部分代碼

<template><view class="container"><!-- 頂部導航欄 --><view class="header"><view class="logo"><i class="fas fa-tachometer-alt"></i> 智能監控系統</view><view class="user-info"><i class="fas fa-user-circle"></i> 管理員</view></view><!-- 主要內容區 --><view class="main-content"><!-- 數據監控區域 --><view class="section data-section"><view class="section-header"><i class="fas fa-chart-line"></i> 數據監控</view><!-- 報警提示 --><view class="alert" v-if="beep"><i class="fas fa-exclamation-triangle"></i> 報警中:數據異常</view><!-- 數據監控卡片 --><view class="card-container"><!-- 溫度卡片 --><view class="card"><view class="card-header"><i class="fas fa-thermometer-half"></i> 溫度</view><view class="card-body"><view class="data-value-container"><view class="data-value">{{temp}} ℃</view><view class="status-indicator" :class="temp > tempThread ? 'status-warning' : 'status-normal'"></view></view><view class="threshold-container"><view class="threshold-label"><i class="fa fa-sliders"></i> 閾值設置</view><view class="threshold-controls"><button class="threshold-btn" @click="decreaseThreshold('temp')"><i class="fa fa-minus"></i></button><input type="number" class="threshold-input" v-model="tempThreadInput"@change="validateThreshold('temp')" @blur="validateThreshold('temp'); setEditing('temp', false)"@focus="setEditing('temp', true)" /><button class="threshold-btn" @click="increaseThreshold('temp')"><i class="fa fa-plus"></i></button></view><button class="submit-btn" @click="submitThreshold('temp')"><i class="fa fa-check"></i> 設置閾值</button></view></view></view><!-- 濕度卡片 --><view class="card"><view class="card-header"><i class="fas fa-tint"></i> 濕度</view><view class="card-body"><view class="data-value-container"><view class="data-value">{{humi}} %</view><view class="status-indicator" :class="humi > humiThread ? 'status-warning' : 'status-normal'"></view></view><view class="threshold-container"><view class="threshold-label"><i class="fa fa-sliders"></i> 閾值設置</view><view class="threshold-controls"><button class="threshold-btn" @click="decreaseThreshold('humi')"><i class="fa fa-minus"></i></button><input type="number" class="threshold-input" v-model="humiThreadInput"@change="validateThreshold('humi')" @blur="validateThreshold('humi'); setEditing('humi', false)"@focus="setEditing('humi', true)" /><button class="threshold-btn" @click="increaseThreshold('humi')"><i class="fa fa-plus"></i></button></view><button class="submit-btn" @click="submitThreshold('humi')"><i class="fa fa-check"></i> 設置閾值</button></view></view></view><!-- 電阻值卡片 --><view class="card"><view class="card-header"><i class="fas fa-bolt"></i> 電阻值</view><view class="card-body"><view class="data-value-container"><view class="data-value">{{res}} 千歐姆/KΩ</view><view class="status-indicator" :class="res > resThread ? 'status-warning' : 'status-normal'"></view></view><view class="threshold-container"><view class="threshold-label"><i class="fa fa-sliders"></i> 閾值設置</view><view class="threshold-controls"><button class="threshold-btn" @click="decreaseThreshold('res')"><i class="fa fa-minus"></i></button><input type="number" class="threshold-input" v-model="resThreadInput"@change="validateThreshold('res')" @blur="validateThreshold('res'); setEditing('res', false)"@focus="setEditing('res', true)" /><button class="threshold-btn" @click="increaseThreshold('res')"><i class="fa fa-plus"></i></button></view><button class="submit-btn" @click="submitThreshold('res')"><i class="fa fa-check"></i> 設置閾值</button></view></view></view></view></view><!-- 設備控制區域 --><view class="section device-section"><view class="section-header"><i class="fas fa-cogs"></i> 設備控制</view><view class="device-grid"><view class="device-card" :class="led ? 'device-active' : ''"><view class="device-icon-container"><i :class="['fa', 'fa-lightbulb', 'device-icon', 'led-icon', led ? 'led-on' : 'led-off']"></i></view><view class="device-info"><view class="device-name">LED燈</view><view class="device-status">{{ led ? '開啟中' : '已關閉' }}</view></view><button class="device-toggle" :class="led ? 'toggle-on' : 'toggle-off'"@click="toggleDevice('led')"><i class="fa fa-power-off"></i> {{ led ? '關閉' : '開啟' }}</button></view><view class="device-card" :class="fan ? 'device-active' : ''"><view class="device-icon-container"><i :class="['fa', 'fa-fan', 'device-icon', 'fan-icon', fan ? 'fan-on' : 'fan-off']"></i></view><view class="device-info"><view class="device-name">風扇</view><view class="device-status">{{ fan ? '開啟中' : '已關閉' }}</view></view><button class="device-toggle" :class="fan ? 'toggle-on' : 'toggle-off'"@click="toggleDevice('fan')"><i class="fa fa-power-off"></i> {{ fan ? '關閉' : '開啟' }}</button></view></view></view></view><!-- 底部信息 --><view class="footer"><view class="update-time"><i class="fas fa-clock"></i> 最后更新: {{ lastUpdateTime }}</view><view class="system-info"><i class="fas fa-info-circle"></i> 系統狀態: 正常</view></view></view>
</template>

手機APP設計完成如下:
在這里插入圖片描述


6 proteus仿真

本系統使用proteus8.17進行仿真測試。
在這里插入圖片描述

完整視頻請看本文1.3 演示視頻


7 實驗測試

7.1 準備

1、準備好硬件實物,接好傳感器和其他外設。

2、將TFT LCD插在底板響應位置。

3、ESP8266插在相應位置。

4、在手機端安裝APP。

5、上電

7.2 燒錄軟件

下載代碼需要提前安裝好MDK環境,準備好SWD下載器,在MDK中進行“LOAD”下載。

7.3 實驗驗證

1、 proteus仿真測試

2、溫濕度傳感器測試

3、煙霧/燃氣測試

4、火焰傳感器測試

5、門磁模塊測試

6、閾值調節,報警測試

7、單片機-OneNET云平臺-手機APP三方交互測試

演示視頻:

STM32單片機的智能家居系統設計(包含stm32代碼編寫+手機APP設計+PCB設計+proteus仿真)


總結

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89771.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DevOps落地的終極實踐:8大關鍵路徑揭秘!

本文來自騰訊藍鯨智云社區用戶: CanWay當前&#xff0c;DevOps因其能夠降低IT運營成本、提高軟件質量并加快上市時間的能力而在全球范圍內引起廣泛關注。它打破了傳統軟件開發與運營的界限&#xff0c;消除了新功能發布延遲和軟件質量下降的障礙。DevOps通過實施持續集成、持續…

react - 根據路由生成菜單

后端返回菜單的格式menuList:[{index: true,name: "",component: "../views/Home",meta: { title: "首頁", requiresAuth: true,roles:[user]},},{path: "/admin",name: "admin",meta: { title: "管理頁", roles:…

Window延遲更新10000天配置方案

1.點擊"開始"菜單&#xff0c;搜索"注冊表編輯器"&#xff0c;點擊"打開"。2.找到"\HKEY LOCAL MACHINE\SOFTWARE\Microsoft\WindowsUpdate\Ux\Settings"路徑。3.右面空白處右鍵新建一個32位值&#xff0c;命名為FlightSettingsMaxPau…

【OD機試】人民幣轉換

題目描述 將阿拉伯數字金額轉換為中文大寫金額格式,需遵循以下規則: 1、 前綴要求:中文大寫金額前必須標明“人民幣”字樣。 2、 用字規范:使用壹、貳、叁、肆、伍、陸、柒、捌、玖、拾、佰、仟、萬、億、元、角、分、零、整等字樣。 3、 “整”字規則: 金額到“元”為止…

在ajax中什么時候需要將返回值類型做轉換

$.ajax({url: TMSPROC0050/deleteData?accidentIds accidentIds.join(,),type: DELETE,dataType: json,success: function(result) {$(#accidentGrid).datagrid(reload);$.messager.show({title: 成功,msg: result.message})},error: function(result) {$.messager.alert({ti…

Helm常用命令大全(2025最新版)

文章目錄Helm常用命令大全&#xff08;2025最新版&#xff09;一、基礎命令與環境配置版本與幫助信息安裝與升級HelmLinux系統安裝版本升級注意事項二、倉庫管理命令倉庫基礎操作OCI倉庫支持&#xff08;v3.8新特性&#xff09;三、Chart操作命令Chart創建與打包Chart搜索與下載…

gitlab+jenkins

文章目錄架構gitlab和jenkins安裝jenkins配置gitlab配置jenkins與gitlab聯動參考架構 gitlab和jenkins安裝 部署docker 部署jenkins 啟動jenkins 用戶&#xff1a;admin&#xff0c;對應的密碼如下 點擊安裝自定義推薦的插件 安裝gitlab插件 jenkins配置 配置pipline…

Redis字符串操作指南:從入門到實戰應用

Redis作為一款高性能的鍵值存儲數據庫&#xff0c;其字符串&#xff08;String&#xff09;類型是最基礎也最常用的數據類型。它不僅能存儲簡單的文本信息&#xff0c;還能應對數字計算、二進制數據等多種場景&#xff0c;靈活且高效。接下來&#xff0c;我們就全方位剖析Redis…

SQLite 數據庫字段類型-詳細說明,數據類型詳細說明。

SQLite 數據類型 SQLite字段類型詳細說明&#xff0c;包含存儲類、親和類型、布爾類型、日期時間類型的存儲方式、取值范圍及核心特性。 創建 SQLite3 表時可使用的各種數據類型名稱&#xff0c;同時也介紹了相應的親和類型。 一、核心存儲類&#xff08;Storage Classes&am…

Node.js特訓專欄-實戰進階:17.會話管理與安全存儲

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 會話管理與安全存儲:從原理到實戰的Web安全實踐 在Web應用中,會話(Session)是維持用戶狀態的核心機制—…

【橘子分布式】gRPC(編程篇-中)

一、簡介 我們之前已經完成了對于api模塊的開發&#xff0c;也就是已經生成了基礎的類和對應的接口&#xff0c;現在我們需要完成的是client和server端的開發。其實如同thrift一樣&#xff0c;現在要做的就是實現我們之前定義的service里面的hello方法&#xff0c;里面寫我們的…

Spring Boot 項目中數據同步之binlog和MQ

在 Spring Boot 項目中&#xff0c;“監聽 binlog” 和 “業務代碼中集成 MQ” 是實現數據同步、事件驅動的兩種主流方法。 簡單來說&#xff0c;這個選擇可以概括為&#xff1a; 監聽 Binlog (如使用 Canal)&#xff1a;像一個數據庫的貼身秘書&#xff0c;它忠實地記錄數據庫…

MySQL 寫入性能優化全攻略(附 GitHub 面試題項目鏈接)

面試中你可能會遇到這樣的問題&#xff1a; &#x1f4ac; “假設你的接口一天收到百萬級請求&#xff0c;MySQL 撐得住嗎&#xff1f;你會怎么優化寫入性能&#xff1f;” 剛開始我也懵過&#xff0c;后來不斷復盤與總結&#xff0c;現在我可以用結構化方式給出一個相對完整的…

用Dynamic chunk去干掉tokenizer?

一般你們下AR模型的時候&#xff0c;都有這個&#xff0c;也就是tokenzier&#xff0c;tokenizer是干啥的&#xff0c;其實就是你的分詞字典不光有specal的token對應的還有實際的對應的分詞對應的代碼&#xff0c;比如&#xff1a;也有tokenzier沒顯示的&#xff0c;比如&#…

Linux系統日志管理入門:journalctl命令完全指南

Linux系統日志管理入門&#xff1a;journalctl命令完全指南前言一、journalctl介紹二、基礎使用&#xff1a;快速上手1. 查看全部日志2. 查看本次啟動的日志3. 按時間篩選日志4. 按服務&#xff08;單元&#xff09;過濾日志三、常用參數與場景四、實戰案例&#xff1a;解決實際…

神經網絡的基本骨架——nn.Module的使用(torch.nn庫)

在 PyTorch 中&#xff0c;nn.Module 是所有神經網絡模塊的基類&#xff0c;用于構建和組織深度學習模型。它提供了一系列工具和功能&#xff0c;使模型的定義、訓練和部署更加高效和靈活。nn Neural Network&#xff08;神經網絡&#xff09;核心作用&#xff1a;模塊化設計&…

靜態住宅IP和節點有什么區別?哪種更適合你的需求?

在跨境電商、社媒運營等業務中&#xff0c;“靜態住宅IP”和“節點”常被混淆使用&#xff0c;但兩者代表網絡架構中不同層級的資源。選錯可能導致賬號風控、業務效率低下。IPdodo將在本篇文章中&#xff0c;從本質、業務場景到選擇策略&#xff0c;為您一文道清兩者之間的區別…

AI編程工具對比:Cursor、GitHub Copilot與Claude Code

文章目錄AI編程工具對比&#xff1a;Cursor、GitHub Copilot與Claude Code一、產品定位與核心架構1.1 Cursor&#xff1a;AI原生IDE的代表1.2 GitHub Copilot&#xff1a;代碼補全的行業標桿1.3 Claude Code&#xff1a;終端Agent的革新者二、核心功能深度對比2.1 代碼生成與理…

車載傳統ECU---MCU軟件架構設計指南

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

SCSAI工業智能體的核心特征

一個覆蓋工業全場景、由多個垂直領域智能體構成的開放生態平臺。每個智能體都是具備獨立能力的 “數字單元”&#xff0c;同時又能通過平臺實現互聯、協作與進化。一、工業智能體平臺的核心定位本質&#xff1a;工業領域的 “智能體操作系統 應用市場”&#xff0c;為各類工業…