智能窗帘/风扇DIY实战:用STM32和TB6612打造你的第一个智能家居执行单元
智能窗帘与风扇DIY实战基于STM32和TB6612的智能家居执行单元开发指南清晨的阳光透过窗帘缝隙洒进房间你希望窗帘能自动拉开迎接新的一天炎热的午后你渴望风扇能根据室温自动调节风速——这些场景如今可以通过DIY实现。本文将带你从零开始构建一个智能家居执行单元核心是STM32微控制器和TB6612电机驱动模块实现窗帘或风扇的自动化控制。1. 项目规划与硬件选型在开始焊接和编程之前合理的项目规划至关重要。我们需要明确目标功能、选择合适的硬件组件并设计整体系统架构。1.1 功能需求分析智能家居执行单元的核心功能需求包括基础控制功能能够可靠地启动、停止电机并控制转向环境感知能力通过传感器获取环境数据光线、温度等逻辑判断基于预设条件和传感器数据自动做出控制决策用户交互提供手动控制接口和状态反馈对于窗帘控制重点考虑光敏传感器和定时功能而风扇控制则更关注温湿度传感器和风速调节。1.2 硬件组件选型核心组件对比表组件类型窗帘控制推荐方案风扇控制推荐方案备注主控芯片STM32F103C8T6STM32F103C8T6性价比高资源丰富电机驱动TB6612FNGTB6612FNG双路驱动支持PWM调速电机类型12V减速电机12V直流风扇电机需考虑扭矩需求环境传感器光敏电阻ADCDHT11温湿度传感器根据功能选择电源方案12V/2A适配器12V/2A适配器需满足峰值电流提示TB6612相比L298N具有更高效率和更小发热量是智能家居项目的理想选择。2. 硬件电路设计与搭建正确的硬件连接是项目成功的基础。本节将详细介绍各模块的电路设计和实际搭建要点。2.1 STM32最小系统STM32最小系统包含以下必要部分电源电路3.3V稳压建议使用AMS1117复位电路10kΩ上拉电阻0.1μF电容时钟电路8MHz晶振两个22pF负载电容启动配置BOOT0通过10kΩ电阻接地调试接口SWD接口SWDIOSWCLK// 示例STM32 GPIO初始化代码 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置PB0为PWM输出(TIM3_CH3) GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); // 配置PB3,PB7为普通输出(控制方向) GPIO_InitStructure.GPIO_Pin GPIO_Pin_3 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GPIOB, GPIO_InitStructure); }2.2 TB6612电机驱动连接TB6612与STM32的连接需要特别注意电源隔离和信号匹配控制信号连接PWMA → STM32 PWM输出如PB0AIN1/AIN2 → STM32 GPIO如PB7/PB3STBY → 直接接高电平使能电源连接VM → 电机电源12VVCC → 逻辑电源5VGND → 共地连接电机接口AO1/AO2 → 电机两端注意电机电源与逻辑电源必须共地但电压要严格隔离避免反向电流损坏芯片。3. 软件设计与实现软件部分是整个系统的大脑负责传感器数据采集、逻辑判断和电机控制。3.1 PWM电机控制PWM脉宽调制是控制电机速度的有效方式。STM32的定时器可以方便地生成PWM信号。// TIM3 PWM初始化 void TIM3_PWM_Init(u16 arr, u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 时基配置 TIM_TimeBaseStructure.TIM_Period arr; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler psc; // 预分频值 TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); // PWM模式配置 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC3Init(TIM3, TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3, ENABLE); }PWM参数设置建议应用场景频率范围占空比范围备注窗帘控制1-5kHz30-100%低速需要更大扭矩风扇控制10-20kHz20-100%高频减少可闻噪声3.2 传感器数据采集根据不同的应用场景我们需要采集相应的环境数据。光敏传感器读取ADC方式// 光敏传感器ADC读取 u16 GetLightSensorValue(void) { ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); }DHT11温湿度传感器读取// DHT11数据读取 u8 DHT11_ReadData(u8 *temp, u8 *humi) { u8 buf[5] {0}; u8 i; DHT11_Start(); if(!DHT11_Check()) return 1; for(i0; i5; i) buf[i] DHT11_ReadByte(); if(buf[0]buf[1]buf[2]buf[3] ! buf[4]) return 2; *humi buf[0]; *temp buf[2]; return 0; }4. 系统集成与调试将各个模块整合并调试是项目成功的关键步骤也是问题最容易出现的阶段。4.1 控制逻辑实现智能窗帘控制逻辑示例读取光敏传感器值与预设阈值比较根据比较结果控制电机转向通过限位开关检测窗帘位置到达极限位置自动停止void AutoCurtainControl(void) { static u8 last_state 0; u16 light GetLightSensorValue(); if(light LIGHT_THRESHOLD last_state ! 1) { // 光线强关闭窗帘 Motor_Close(); last_state 1; } else if(light LIGHT_THRESHOLD last_state ! 2) { // 光线弱打开窗帘 Motor_Open(); last_state 2; } // 检查限位开关 if(CheckLimitSwitch()) { Motor_Stop(); } }智能风扇控制逻辑特点温度分段控制多级风速湿度考虑防止结露人体感应无人时自动关闭定时功能预防着凉4.2 常见问题排查电机不转排查步骤检查所有电源连接5V、12V、3.3V确认STM32程序正常运行LED闪烁测试测量PWM信号是否输出示波器或LED指示检查TB6612的STBY引脚是否为高电平单独测试电机是否正常工作直接接电源调试技巧使用串口打印调试信息逐步增加功能复杂度重要变量实时监测利用LED指示关键状态5. 项目优化与扩展基础功能实现后可以考虑进一步优化和扩展系统功能。5.1 性能优化方向低功耗设计合理配置STM32睡眠模式传感器轮询间隔优化电机驱动电路功耗优化控制算法改进加入PID控制实现平滑调速环境参数变化率考虑防抖动学习用户习惯的自适应控制5.2 功能扩展可能硬件扩展增加无线模块WiFi/蓝牙添加触摸屏人机界面集成更多传感器PM2.5、CO2等软件扩展开发手机APP远程控制接入智能家居平台实现场景联动如影院模式// 示例通过串口接收控制命令 void USART_CommandHandler(u8 cmd) { switch(cmd) { case 0: Motor_Stop(); break; case 1: Motor_Open(); break; case 2: Motor_Close(); break; case S: // 设置光阈值 LIGHT_THRESHOLD USART_ReceiveData(); break; default: break; } }在实际项目中我发现电机的机械部分往往比电路更易出问题。特别是窗帘轨道需要保持清洁顺滑否则可能导致电机过载。另外给TB6612加上适当的散热片可以显著提高系统稳定性尤其是在长时间工作时。