Files
iot-bedroom-environment-con…/相关资料/系统设计.md
2026-02-07 23:14:57 +08:00

196 lines
11 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 智能家居监测系统
## 原始需求
硬件部分ESP32 开发板、温湿度传感器 DHT22、光敏电阻、舵机、蜂鸣器、OLED 显示器、LED 灯、空气质量传感器
软件部分使用微信小程序平台对智能卧室环境监测系统进行应用开发构建用户交互界面UI提供与硬件通信的 APIESP32 设备端通过 WiFi 连接到云平台,手机端 APP 直接与云平台通信,查询设备状态和发送指令,实现远程监控和智能联动。
功能设计:
当用户回家,连接上家里 WiFi 后,系统触发“到家状态”;当监测不到用户连接到 WiFi 时,暂停当前模式的继续运行,进入“待机状态”。
ESP32 在传感器数据发生 变化时 达到阈值时 主动上报数据到云平台,获取当前环境监测数据,执行对应的模式。当该系统正在运行的模式与当前监测环境相符时,不会中断模式继续运行,直到接收到下一信号。
每次手机端 APP 发送指令后APP 应等待 ESP32 通过云平台返回的“执行成功”确认消息,再更新 UI 状态,避免误操作。
到家状态:激活“到家状态”会进行 5000ms 的入户等待时间,然后在进行模式判断。
待机状态:每经过 500ms 会监测用户是否通过手机控制端进行远程操控。
1. 起床模式:用户可以在移动控制端设置起床时间,舵机会在用户预设时间的前 3 分钟打开窗帘,到了起床时间蜂鸣器会发出声音提醒用户起床。初始值设置在早上 8 点。
2. 白天模式:在早上六点到晚上六点之间,光敏电阻获取当前光照强度判断是否关闭窗帘和是否打开 LED 灯。用户可以在手机控制端进行时间设置。
3. 夜间模式:在晚上六点到早上六点之间,舵机控制窗帘关闭,并且打开 LED 灯进行照明。用户可以在手机控制端进行时间设置。
4. 降温模式:用户可以设置预期的开启降温模式的温度,通过温湿度传感器获取当前环境温度,读取到的当前温度与用户设定的目标温度进行比较,当温度不在预期范围内,自动打开风扇进行降温。如果当前温度高于 目标温度ESP32 会发送开启降温指令给风扇,风扇开启吹风模式进行物理降温。
5. 高温提醒模式:当温湿度传感器监测到室内温度高于 35°C 时,手机端 APP 弹出室内高温警告,并且蜂鸣器发出提示音。
6. 显示屏常亮模式:当在“回家状态”时打开显示屏,在“待机模式”时关闭显示屏。屏幕里实时显示温度、湿度、空气质量和当地时间。触发某种模式的时候,屏幕出现三秒钟模式名称。
7. 自动通风控制模式模块:空气质量检测 CO2>1000ppm 时ESP32 上报事件,触发自动通风控制模式,打开风扇转动进行空气流通,蜂鸣器发出轻微提示音,小程序发送通知告诉用户卧室需要通风。
手机控制端:实时显示卧室参数,如温度、湿度、光照强度、空气质量等,用户可以对不同的模式进行私人设置。手机端 APP 小程序可以远程操控窗帘开关、灯光开关和亮度百分比(小程序用滑块)、风扇开关、蜂鸣器闹钟开关和可设置蜂鸣器闹钟时间。功能模块的都有开关按钮和可以设置时间。
物理端:需要按钮对硬件控制器进行物理开关。
OLED 显示器:屏幕里实时显示温度、湿度和当地时间。触发某种模式的时候,屏幕出现三秒钟模式名称。
网络断开时ESP32 应能依靠本地传感器继续执行部分核心自动化,按钮开关。
每种模式都互不冲突。
判断窗帘当前状态:每次舵机运行前进行读取控制角度判断窗帘开关状态。
## 硬件需求
| 组件名称 | 数量 | ESP32 连接引脚 | 通信协议/类型 | 电源需求 | 备注 |
| ---------------------------- | ---- | -------------------------------------- | ------------- | -------- | ---------------------------- |
| **ESP32 开发板** | 1 | - | - | 5V/1A | 主控制器 |
| **DHT22 温湿度传感器** | 1 | **GPIO 4** | 单总线 | 3.3V | 需 4.7KΩ 上拉电阻 |
| **光敏电阻** | 1 | **GPIO 34** | ADC 输入 | 3.3V | ADC1_CH6配合 10KΩ 分压电阻 |
| **舵机(窗帘控制)** | 1 | **GPIO 13** | PWM | 5V | 频率 50Hz需外部供电 |
| **蜂鸣器(有源)** | 1 | **GPIO 12** | 数字输出 | 3.3V | 高电平触发 |
| **OLED 显示屏** | 1 | **GPIO 21 (SDA)**<br>**GPIO 22 (SCL)** | I2C | 3.3V | 地址 0x3CSSD1306 |
| **LED 灯PWM 调光)** | 1 | **GPIO 14** | PWM | 3.3V | 频率 1000Hz串联 220Ω 电阻 |
| **空气质量传感器MQ-135** | 1 | **GPIO 32** | ADC 输入 | 5V | ADC1_CH4需加热电压 |
| **物理按钮 1窗帘控制** | 1 | **GPIO 25** | 数字输入 | 3.3V | 内部上拉,按下接地 |
| **物理按钮 2灯光控制** | 1 | **GPIO 26** | 数字输入 | 3.3V | 内部上拉,按下接地 |
| **物理按钮 3风扇控制** | 1 | **GPIO 27** | 数字输入 | 3.3V | 内部上拉,按下接地 |
- 测量时 I2C 频率在 10K~400KHz 之间,不宜过高,且采集数据周期应大于 1 秒/1 次
- 1要接外部 32.768khz 晶振,否则系统不会进入 stop 状态,省电效果不大
- 2在 config 中,要把 freertos 的时基调整到 1000开启 rtos 还要开启 32.768khz
## 软件架构设计
### 整体架构
┌─────────────────────┐
│ 第一层:微信小程序 │
│ (用户交互层) │
│ 功能:控制/展示 │
└──────────┬──────────┘
│ MQTT/HTTP
┌──────────▼──────────┐
│ 第二层:物联网云平台 │
│ (核心中转层) │
│ 功能:转发/存储 │
└──────────┬──────────┘
│ MQTT
┌──────────▼──────────┐
│ 第三层ESP32 设备 │
│ (感知执行层) │
│ 功能:采集/执行 │
└─────────────────────┘
### 通信协议设计
1. MQTT 主题设计
home/bedroom/state # 设备状态上报
home/bedroom/command # 设备指令下发
home/bedroom/sensor # 传感器数据
home/bedroom/response # 执行响应
2. JSON 消息格式
```json
// 传感器数据上报
{
"device_id": "bedroom_001",
"timestamp": 1640995200,
"temperature": 25.5,
"humidity": 60,
"light": 300,
"air_quality": 800,
"curtain_position": 90
}
// 指令下发
{
"cmd_id": "CMD_001",
"command": "set_mode",
"mode": "daytime",
"params": {
"curtain_auto": true,
"light_threshold": 200
}
}
```
## ESP32 固件设计
1. 程序结构
1. WiFi 管理模块
2. MQTT 通信模块
3. 传感器读取模块
4. 执行器控制模块
5. 状态机管理模块
6. OLED 显示模块
7. 本地存储模块
2. 核心状态机设计
```C
enum SystemState {
STATE_HOME, // 到家状态
STATE_STANDBY, // 待机状态
STATE_MORNING, // 起床模式
STATE_DAYTIME, // 白天模式
STATE_NIGHT, // 夜间模式
STATE_COOLING, // 降温模式
STATE_VENT // 通风模式
};
enum DeviceState {
CURTAIN_OPEN,
CURTAIN_CLOSED,
LIGHT_ON,
LIGHT_OFF,
FAN_ON,
FAN_OFF
};
```
## 微信小程序设计
### 界面布局
首页(仪表盘):
├── 顶部:房间名称、网络状态
├── 中部:环境数据卡片(温度、湿度、光照、空气质量)
├── 底部:模式切换卡片
└── 浮动按钮:设备控制面板
控制面板:
├── 窗帘控制:开关、百分比滑块
├── 灯光控制:开关、亮度滑块、色温选择
├── 风扇控制:开关、风速档位
├── 蜂鸣器:开关、闹钟设置
└── 模式设置:各模式的参数配置
设置页面:
├── WiFi 配置
├── 设备管理
├── 时间设置
└── 阈值配置
## 配网
1. ESP32 上电 → 自动开启【WiFi 热点】(名称如:卧室智能设备\_配网)
2. 手机/电脑 连接这个 WiFi 热点(无密码)
3. 打开手机/电脑浏览器 → 输入地址192.168.4.1 → 弹出配置网页
4. 网页填写WiFi 名称、WiFi 密码、MQTT 服务器地址、MQTT 端口
5. 点击【保存配置】,配置自动写入 ESP32 闪存,永久保存
6. ESP32 自动重启 → 读取配置 → 自动连接家里的 WiFi → 自动接入填写的 MQTT 服务器
7. 完成!后续上电全自动化运行,想换参数/服务器,重复 1-5 步即可
- 大概界面
┌────────────────────────────────────────┐
│ ESP32 智能卧室 配置页面 │
│ (无需登录,连接热点即可访问 192.168.4.1)│
├────────────────────────────────────────┤
│ WiFi 配置: │
│ WiFi 名称(SSID) :□**\*\*\*\***\_\_\_\_**\*\*\*\*** │
│ WiFi 密码(PWD) :□**\*\*\*\***\_\_\_\_**\*\*\*\*** │
├────────────────────────────────────────┤
│ MQTT 服务器配置:(自由填写任意服务器) │
│ 服务器地址 :□**\*\*\*\***\_\_\_\_**\*\*\*\*** │
│ 服务器端口 :□ 1883 │
│ 用户名 :□**\*\*\*\***\_\_\_\_**\*\*\*\*** │
│ 密码 :□**\*\*\*\***\_\_\_\_**\*\*\*\*** │
├────────────────────────────────────────┤
│ [保存配置] [重启设备] │
└────────────────────────────────────────┘