一、系统架构与核心硬件选型
主控芯片:STM32F103C8T6Q
性能分析
ARM Cortex-M3内核,72MHz主频,64KB Flash,20KB RAM,满足基础功能需求,但需优化代码以避免内存溢出(如动态内存分配限制、模块化编程)。
资源瓶颈:若需扩展更多功能(如WiFi通信、复杂语音指令),建议升级至STM32F4系列(如F407VET6,192KB RAM)。
外设分配
I2C接口:连接OLED屏幕、EEPROM存储器(AT24C02)。
UART接口:与ASRPRO语音模块通信。
GPIO:控制按键、继电器、LED灯、步进电机驱动信号。
PWM输出:TIM2/TIM3通道控制风扇转速、LED亮度。
ADC输入:采集光敏电阻信号(若未用数字传感器)。
传感器选型与优化
温湿度传感器
DHT22(精度±2%RH/±0.5℃)优于DHT11,但需注意单总线通信时序(建议使用HAL库的DHT驱动库)。
烟雾传感器
MQ-2需预热10分钟以上,且对酒精等气体敏感,建议增加滤波算法(如移动平均)降低误报。
光照传感器
BH1750(I2C接口,精度±20%)优于光敏电阻,但成本较高;若用光敏电阻,需分压电路+ADC采样,并通过软件校准(如建立光照强度-ADC值映射表)。
二、功能模块深度扩展
1. 检测功能:多传感器融合与数据预处理
数据采集策略:
分时轮询:
温湿度:每5秒采集一次(DHT22响应时间约2秒)。
烟雾浓度:每10秒采集一次(MQ-2响应较慢)。
光照强度:每1秒采集一次(实时性要求高)。
异常处理:
传感器故障检测(如DHT22通信超时,触发OLED报警提示)。
数据滤波(如卡尔曼滤波或滑动平均)消除噪声。
环境联动逻辑:
温湿度联动:
温度>30℃且湿度<40% → 风扇全速+加湿器开启。
温度<20℃ → 关闭风扇,LED调至暖光(PWM模拟)。
烟雾安全策略:
烟雾浓度>阈值 → 关闭所有电器(风扇、窗帘),触发蜂鸣器报警,OLED显示“烟雾超标!”。
光照智能调节:
光照强度<50lux → LED亮度自动调至80%(PWM占空比80%)。
光照强度>1000lux → 关闭LED,窗帘自动闭合(步进电机控制)。
2. 显示功能:OLED交互界面设计
界面布局:
主界面:
顶部:实时时间(通过RTC模块实现)。
中部:温湿度、烟雾浓度、光照强度(图标+数值)。
底部:设备状态(灯/风扇/窗帘/加湿器图标,开关状态颜色区分)。
设置界面:
阈值调节(按键/语音控制,数值滚动显示)。
模式切换(手动/自动,图标高亮提示)。
动态刷新优化:
仅更新变化的数据(如温湿度),减少OLED刷新频率(延长寿命)。
使用u8g2库的u8g2_FirstPage()和u8g2_NextPage()实现双缓冲,避免闪烁。
3. 手动模式:按键与语音双控设计
按键控制:
硬件设计:
4个独立按键(上/下/左/右)+ 1个确认键(减少GPIO占用)。
功能映射:
上/下键:调节LED亮度或风扇转速(PWM占空比±10%)。
左/右键:切换设备(灯/风扇/窗帘/加湿器)。
确认键:开关当前设备。
语音控制:
ASRPRO模块集成:
通过串口接收语音指令(如“打开窗帘”“调亮灯光”)。
支持唤醒词(如“小智”)避免误触发。
指令解析:
简单指令:直接映射到GPIO或PWM控制(如“开灯”→GPIO置高)。
复杂指令:解析参数(如“调光到50%”→设置PWM占空比50%)。
4. 自动模式:智能场景联动
场景预设:
睡眠模式:
22:00后自动关闭所有电器,窗帘闭合,LED调至暗光(PWM占空比10%)。
离家模式:
通过按键或语音触发,关闭所有设备,启动烟雾监测(超标时发送报警信号至手机,需扩展WiFi模块)。
阈值自适应:
根据季节调整阈值(如夏季湿度阈值降低10%,冬季温度阈值提高5℃)。
5. PWM调光/速:精细化控制
LED调光:
冷暖双色LED控制:通过PWM分别调节冷光(TIM3_CH1)和暖光(TIM3_CH2)的占空比,实现色温调节。
风扇调速:
无级调速:PWM频率20kHz(避免人耳可听噪音),占空比0-100%对应转速0-3000RPM。
6. 阈值调节:用户自定义与存储
调节方式:
按键调节:
长按确认键3秒进入设置模式,通过上下键调整阈值,确认键保存。
语音调节:
支持指令如“设置温度阈值为28度”“将湿度下限调至30%”。
数据存储:
使用AT24C02 EEPROM保存阈值(I2C通信,写入前需检查设备地址)。
上电时自动读取EEPROM值,避免每次重启需重新设置。
三、系统优化与可靠性设计
低功耗优化:
传感器休眠:
温湿度传感器在非采集周期进入低功耗模式(DHT22无此功能,可改用SHT30)。
光照传感器在夜间降低采样频率(如每5秒一次)。
主控休眠:
空闲时进入Stop模式(电流<2μA),通过RTC或外部中断唤醒。
代码架构优化:
状态机设计:
定义enum状态(如MANUAL_MODE、AUTO_MODE、SETTING_MODE),通过switch-case处理逻辑。
模块化封装:
将传感器驱动、OLED显示、PWM控制等封装为独立.c/.h文件,便于维护。
异常处理:
看门狗保护:
启用独立看门狗(IWDG),防止程序卡死。
通信容错:
语音模块通信超时重试3次,失败后切换至手动模式。
四、扩展功能与未来升级
无线通信扩展:
添加ESP8266模块,通过MQTT协议将数据上传至云平台(如阿里云IoT),实现远程控制。
AI语音交互:
升级至离线语音识别芯片(如LD3320),支持自然语言指令(如“把灯光调成阅读模式”)。
多设备联动:
通过ZigBee或蓝牙Mesh扩展更多智能家居设备(如智能插座、空气净化器)。
五、总结
该系统通过STM32F103C8T6Q实现了低成本、高集成度的智能家居控制,核心优势在于:
多传感器融合:实时感知环境并智能联动。
双控模式:按键+语音满足不同场景需求。
可扩展性:预留接口支持未来功能升级。
改进方向:
优化代码结构以应对资源瓶颈。增加传感器冗余设计(如双温湿度传感器互校验)。引入OTA升级功能,便于远程维护。
原理图
系统总体框架
程序:
#include <stdint.h>
#include <stdlib.h>
// 假设的驱动初始化函数声明
void PlatformDrvInit(void);
void DelayInit(void);
void Usb2ComDrvInit(void);
void STEP_MOTOR_Init(void);
void led_init(void);
void KeyDrvInit(void);
void BH1750_Init(void);
void fan_init(void);
void OLED_Init(void);
void OLED_ColorTurn(uint8_t color);
void OLED_DisplayTurn(uint8_t display);
// 假设的任务函数声明
void HmiTask(void);
void DisplayTask(void);
void Intelligent_Voice_Task(void);
// 假设的定时器回调注册函数声明
void TaskScheduleCbReg(void (*cb)(void));
// 传感器数据结构体
typedef struct {
uint8_t temp_threshold;
uint8_t light_threshold;
} SensorData_t;
SensorData_t g_sensor_data;
typedef struct{
uint8_t run; // 调度标志,1:调度,0:挂起
uint16_t timCount; // 时间片计数值
uint16_t timRload; // 时间片重载值
void (*pTaskFuncCb)(void); // 函数指针变量,用来保存业务功能模块函数地址
} TaskComps_t;
static TaskComps_t g_taskComps[] =
{
{0, 10, 10, HmiTask},
{0, 500, 500, DisplayTask},
{0, 100, 100, Intelligent_Voice_Task},
/* 添加业务功能模块 */
};
#define TASK_NUM_MAX (sizeof(g_taskComps) / sizeof(g_taskComps[0]))
static void TaskHandler(void)
{
for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
{
if (g_taskComps[i].run) // 判断时间片标志
{
g_taskComps[i].run = 0; // 标志清零
if (g_taskComps[i].pTaskFuncCb == NULL)
{
continue;
}
g_taskComps[i].pTaskFuncCb(); // 执行调度业务功能模块
}
}
}
/**************************************************************
@brief 在定时器中断服务函数中被间接调用,设置时间片标记,
需要定时器1ms产生1次中断
@param*
@return
************************************************************/
static void TaskScheduleCb(void)
{
for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
{
if (g_taskComps[i].timCount)
{
g_taskComps[i].timCount--;
if (g_taskComps[i].timCount == 0)
{
g_taskComps[i].run = 1;
g_taskComps[i].timCount = g_taskComps[i].timRload;
}
}
}
}
static void DrvInit(void)
{
PlatformDrvInit();
DelayInit();
Usb2ComDrvInit();
STEP_MOTOR_Init();
led_init();
KeyDrvInit();
BH1750_Init();
fan_init();
OLED_Init();
OLED_ColorTurn(0);
OLED_DisplayTurn(0);
}
static void AppInit(void)
{
TaskScheduleCbReg(TaskScheduleCb);
}
// 假设的任务函数实现
void HmiTask(void) {
// 实现HMI任务逻辑
}
void DisplayTask(void) {
// 实现显示任务逻辑
}
void Intelligent_Voice_Task(void) {
// 实现智能语音任务逻辑
}
int main(void)
{
DrvInit();
AppInit();
g_sensor_data.temp_threshold = 33;
g_sensor_data.light_threshold = 50;
while (1)
{
TaskHandler();
}
}
通过以上设计,该系统可广泛应用于家庭、办公室等场景,实现真正的智能化环境管理。