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),通信速度快,常用于连接外部存储器、传感器等高速设备。
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

在这里插入图片描述

  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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;为各类工业…