当前位置: 首页 > article >正文

STM32 设计的较为复杂的物联网项目,包括智能家居控制系统,涵盖了硬件和软件的详细设计。

使用 STM32 设计的较为复杂的物联网项目,包括智能家居控制系统,涵盖了硬件和软件的详细设计。

一、硬件设计

微控制器:选择 STM32F4 系列微控制器,如 STM32F407ZGT6,具有高性能和丰富的外设资源。

传感器模块:

温度和湿度传感器(如 DHT22 ):用于监测室内环境温湿度。

光照传感器(如 BH1750 ):检测环境光照强度。

人体红外传感器(如 HC-SR501 ):感知人体活动。

烟雾传感器(如 MQ-2 ):监测烟雾浓度,预防火灾。

门窗磁传感器:检测门窗开关状态。

通信模块:

Wi-Fi 模块(如 ESP8266 ):实现与云服务器的无线通信,上传传感器数据和接收控制指令。

蓝牙模块(如 HC-05 ):用于本地设备与手机等终端的短距离通信。

执行器模块:

继电器:控制灯光、插座等设备的开关。

电机驱动模块:控制窗帘电机、风扇等设备。

显示模块:

TFT 彩色液晶显示屏:实时显示系统状态和传感器数据。

存储模块:

EEPROM 芯片(如 AT24C02 ):存储系统配置和一些关键数据。

电源管理模块:

采用高效率的降压稳压芯片(如 LM2596 ),将输入电源转换为适合各个模块的工作电压。

配备电池管理电路,支持备用电池供电,确保系统在市电断电时仍能正常工作一段时间。

二、软件设计

系统初始化:

初始化 STM32 时钟、GPIO 、ADC 、SPI 、I2C 等外设。

初始化 Wi-Fi 模块和蓝牙模块,连接到预设的网络和配对设备。

初始化传感器和执行器的相关引脚。

传感器数据采集:

定期读取温度、湿度、光照、人体红外、烟雾等传感器的数据,并进行数据校准和滤波处理。

通过 ADC 采集模拟量传感器的数据,如烟雾浓度。

数据处理与决策:

根据传感器数据判断环境状态,如是否有人、温度是否过高、烟雾是否超标等。

基于预设的规则和逻辑,决定执行相应的控制动作,如打开灯光、启动风扇、发送报警信息等。

通信协议实现:

使用 TCP/IP 协议与云服务器进行通信,上传传感器数据,并接收服务器下发的控制指令。

通过蓝牙协议与本地手机等设备进行通信,实现近场控制和数据查看。

用户界面设计:

在 TFT 显示屏上设计友好的用户界面,实时显示传感器数据、系统状态和操作提示。

处理触摸屏输入,实现用户交互操作。

存储管理:

将系统配置信息(如 Wi-Fi 密码、设备 ID 等)存储在 EEPROM 中,确保断电不丢失。

记录关键的操作日志和传感器数据历史,以便后续查询和分析。

异常处理与系统自恢复:

监测系统运行状态,如电源电压、程序运行状态等。

当出现异常情况(如传感器故障、通信中断、内存溢出等)时,采取相应的处理措施,如重启相关模块、发送故障报警等,并尝试自动恢复系统正常运行。

#include "stm32f4xx.h"

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

#include "math.h"

// Wi-Fi 相关

#include "wifi.h"

// 传感器相关

#include "dht22.h"

#include "bh1750.h"

#include "hc_sr501.h"

#include "mq2.h"

#include "door_window_sensor.h"

// 显示相关

#include "tft_display.h"

// 存储相关

#include "eeprom.h"

// 传感器引脚定义

#define DHT22_DATA_PIN GPIO_Pin_0

#define DHT22_PORT GPIOA

#define BH1750_SDA_PIN GPIO_Pin_1

#define BH1750_SCL_PIN GPIO_Pin_2

#define BH1750_PORT GPIOA

#define HC_SR501_PIN GPIO_Pin_3

#define HC_SR501_PORT GPIOB

#define MQ2_PIN GPIO_Pin_4

#define MQ2_PORT GPIOC

#define DOOR_WINDOW_SENSOR_PIN GPIO_Pin_5

#define DOOR_WINDOW_SENSOR_PORT GPIOD

// 执行器引脚定义

#define RELAY_PIN GPIO_Pin_6

#define RELAY_PORT GPIOE

// 通信引脚定义(假设用于与 Wi-Fi 模块通信的 UART)

#define USART_TX_PIN GPIO_Pin_9

#define USART_TX_PORT GPIOA

#define USART_RX_PIN GPIO_Pin_10

#define USART_RX_PORT GPIOA

// 显示引脚定义(假设用于 TFT 显示屏的 SPI 接口)

#define TFT_SCK_PIN GPIO_Pin_13

#define TFT_SCK_PORT GPIOB

#define TFT_MISO_PIN GPIO_Pin_14

#define TFT_MISO_PORT GPIOB

#define TFT_MOSI_PIN GPIO_Pin_15

#define TFT_MOSI_PORT GPIOB

#define TFT_CS_PIN GPIO_Pin_12

#define TFT_CS_PORT GPIOB

#define TFT_RST_PIN GPIO_Pin_11

#define TFT_RST_PORT GPIOB

// 初始化所有 GPIO 引脚

void GPIO_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE);

    // DHT22 数据引脚配置

    GPIO_InitStruct.GPIO_Pin = DHT22_DATA_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(DHT22_PORT, &GPIO_InitStruct);

    // BH1750 I2C 引脚配置

    GPIO_InitStruct.GPIO_Pin = BH1750_SDA_PIN | BH1750_SCL_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(BH1750_PORT, &GPIO_InitStruct);

    // HC-SR501 引脚配置

    GPIO_InitStruct.GPIO_Pin = HC_SR501_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(HC_SR501_PORT, &GPIO_InitStruct);

    // MQ-2 引脚配置

    GPIO_InitStruct.GPIO_Pin = MQ2_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;

    GPIO_Init(MQ2_PORT, &GPIO_InitStruct);

    // 门窗磁传感器引脚配置

    GPIO_InitStruct.GPIO_Pin = DOOR_WINDOW_SENSOR_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(DOOR_WINDOW_SENSOR_PORT, &GPIO_InitStruct);

    // 继电器引脚配置

    GPIO_InitStruct.GPIO_Pin = RELAY_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;

    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_Init(RELAY_PORT, &GPIO_InitStruct);

    // USART 引脚配置

    GPIO_InitStruct.GPIO_Pin = USART_TX_PIN | USART_RX_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(USART_TX_PORT, &GPIO_InitStruct);

    // TFT 显示屏引脚配置

    GPIO_InitStruct.GPIO_Pin = TFT_SCK_PIN | TFT_MISO_PIN | TFT_MOSI_PIN | TFT_CS_PIN | TFT_RST_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(TFT_SCK_PORT, &GPIO_InitStruct);

}

// 初始化 USART 用于与 Wi-Fi 模块通信

void USART_Init(void)

{

    USART_InitTypeDef USART_InitStruct;

    GPIO_InitTypeDef GPIO_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    GPIO_InitStruct.GPIO_Pin = USART_TX_PIN | USART_RX_PIN;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(USART_TX_PORT, &GPIO_InitStruct);

    USART_InitStruct.USART_BaudRate = 115200;

    USART_InitStruct.USART_WordLength = USART_WordLength_8b;

    USART_InitStruct.USART_StopBits = USART_StopBits_1;

    USART_InitStruct.USART_Parity = USART_Parity_No;

    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

    USART_Init(USART1, &USART_InitStruct);

    USART_Cmd(USART1, ENABLE);

}

// 初始化系统

void System_Init(void)

{

    GPIO_Init();

    USART_Init();

    // 初始化其他硬件模块

    DHT22_Init();

    BH1750_Init();

    HC_SR501_Init();

    MQ2_Init();

    DoorWindowSensor_Init();

    TFT_Init();

    EEPROM_Init();

    // 连接 Wi-Fi 网络

    WiFi_Connect(WIFI_SSID, WIFI_PASSWORD);

}

// 读取 DHT22 传感器数据

void ReadDHT22(float *temperature, float *humidity)

{

    DHT22_ReadData(temperature, humidity);

}

// 读取 BH1750 光照传感器数据

float ReadBH1750(void)

{

    return BH1750_ReadLightIntensity();

}

// 读取 HC-SR501 人体红外传感器数据

uint8_t ReadHC_SR501(void)

{

    return HC_SR501_ReadState();

}

// 读取 MQ-2 烟雾传感器数据

float ReadMQ2(void)

{

    return MQ2_ReadSmokeConcentration();

}

// 读取门窗磁传感器数据

uint8_t ReadDoorWindowSensor(void)

{

    return DoorWindowSensor_ReadState();

}

// 控制继电器

void ControlRelay(uint8_t state)

{

    if (state)

    {

        GPIO_SetBits(RELAY_PORT, RELAY_PIN);

    }

    else

    {

        GPIO_ResetBits(RELAY_PORT, RELAY_PIN);

    }

}

// 上传数据到云服务器

void UploadDataToCloud(float temperature, float humidity, float lightIntensity, uint8_t isPersonDetected, float smokeConcentration, uint8_t isDoorOpen)

{

    char dataBuffer[256];

    sprintf(dataBuffer, "{"

                        "\"temperature\": %.2f,"

                        "\"humidity\": %.2f,"

                        "\"light_intensity\": %.2f,"

                        "\"is_person_detected\": %d,"

                        "\"smoke_concentration\": %.2f,"

                        "\"is_door_open\": %d"

                        "}",

            temperature, humidity, lightIntensity, isPersonDetected, smokeConcentration, isDoorOpen);

    WiFi_SendData(dataBuffer);

}

// 主函数

int main(void)

{

    float temperature, humidity;

    float lightIntensity;

    uint8_t isPersonDetected;

    float smokeConcentration;

    uint8_t isDoorOpen;

    System_Init();

    while (1)

    {

        ReadDHT22(&temperature, &humidity);

        lightIntensity = ReadBH1750();

        isPersonDetected = ReadHC_SR501();

        smokeConcentration = ReadMQ2();

        isDoorOpen = ReadDoorWindowSensor();

        // 在 TFT 显示屏上显示数据

        TFT_DisplayData(temperature, humidity, lightIntensity, isPersonDetected, smokeConcentration, isDoorOpen);

        // 控制继电器

        if (isPersonDetected)

        {

            ControlRelay(1);

        }

        else

        {

            ControlRelay(0);

        }

        // 上传数据到云服务器

        UploadDataToCloud(temperature, humidity, lightIntensity, isPersonDetected, smokeConcentration, isDoorOpen);

        // 延迟一段时间

        HAL_Delay(5000);

    }

}


http://www.kler.cn/a/391156.html

相关文章:

  • 移动端【01】面试系统的MVVM重构实践
  • 常用的Anaconda Prompt命令行指令
  • Chrome使用IE内核
  • 如何为电子课程创造创意
  • Stable Diffusion:照片转视频插件
  • Spark 的容错机制:保障数据处理的稳定性与高效性
  • 屏幕解析工具——OmniParser
  • vue内置方法总结
  • Qt中MainWindow的isVisible和isActiveWindow有什么区别
  • 基本和引用数据类型以及对象字面量(day14)
  • ubuntu24.04播放语音视频
  • 启动本地开发环境(自带热启动)yarn serve
  • Pytorch学习--神经网络--完整的模型验证套路
  • MacOS编译hello_xr——记一次CMake搜索路径限制导致的ANDROID_NATIVE_APP_GLUE not found
  • 网络安全-Linux基础(2)
  • 电子应用产品设计方案-5:多功能恒温控制器设计
  • 【主机游戏】正当防卫3游戏介绍
  • uniapp和uview-plus组件在项目中向后端发起请求的封装
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
  • 用轻量云服务器搭建一个开源的商城系统,含小程序和pc端
  • Java中的不可变集合:性能与安全并重的最佳实践
  • 力扣 LeetCode 977. 有序数组的平方(Day1:数组)
  • qt ui设计案例--登录界面
  • 【AI日记】24.11.08 Knowledge Graphs for RAG (知识图谱,Neo4j,Cypher)
  • Go/Golang语言各种数据类型内存字节占用大小和最小值最大值
  • NVR批量管理软件/平台EasyNVR多个NVR同时管理基于端-边-云架构的智能视频融合云平台