系列文章目錄
文章目錄
- 系列文章目錄
- 前言
- 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
-
核心檢測氣體
液化氣(LPG)、丙烷、氫氣、煙霧(如廚房油煙、火災煙霧),對高濃度可燃氣體和煙霧的響應速度快(≤10 秒),但對酒精、一氧化碳等氣體也有交叉敏感。 -
典型場景
家庭安全: 家庭廚房安裝 MQ-2,可同時監測液化氣泄漏和烹飪煙霧。
工業監測:工廠車間丙烷泄漏監測、火災煙霧排放監控。
消費電子:便攜式燃氣檢測儀、智能家居環境監測(如空氣凈化器聯動)。
特殊場景:森林火災初期煙霧預警。 -
MQ-2的工作原理
MQ-2型煙霧傳感器屬于二氧化錫半導體氣敏材料,屬于表面離子式N型半導體。處于200~300攝氏度時,二氧化錫吸附空氣中的氧,形成氧的負離子吸附,使半導體中的電子密度減少,從而使其電阻值增加。當與煙霧接觸時,如果晶粒間界處的勢壘收到煙霧的調至而變化,就會引起表面導電率的變化。利用這一點就可以獲得這種煙霧存在的信息,煙霧的濃度越大,導電率越大,輸出電阻越低,則輸出的模擬信號就越大。
3.6 火焰傳感器
-
特點
可以檢測火焰或者波長在760納米~1100納米范圍內的光源,打火機測試火焰距離為80mm,對火焰越大,測試距離越遠。
探測角度60度左右,對火焰光譜特別靈敏。
靈敏度可調(電位器調節)
比較器輸出,信號干凈,波形好,驅動能力強,超過15MA.
工作電壓3.3V~5V
輸出形式:
DO數字量開關輸出(0/1)
AO:模擬量開關輸出 -
接線說明
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仿真)