系列文章目录
文章目录
- 系列文章目录
- 前言
- 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),通信速度快,常用于连接外部存储器、传感器等高速设备。
I²C:2 个集成电路总线(I²C),可用于连接多个具有 I²C 接口的设备,如 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 输出,用于电机调速或灯光控制。
I²C/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仿真)