用STM32F103和继电器DIY智能家居低成本改造台灯/风扇的保姆级教程智能家居的概念早已不再遥不可及借助STM32F103这样的低成本微控制器和简单的继电器模块任何人都能将普通家电升级为智能设备。本文将手把手教你如何将一个普通台灯或风扇改造成可以通过手机或语音控制的智能设备整个过程成本不超过100元适合创客爱好者、电子专业学生或任何对智能硬件感兴趣的DIY玩家。1. 项目规划与元器件选型在开始动手之前我们需要明确项目目标和选择合适的硬件组件。智能家居改造的核心在于实现远程控制而STM32F103作为一款性价比极高的ARM Cortex-M3内核微控制器完全能够胜任这一任务。关键元器件清单元器件规格要求数量参考价格STM32F103C8T6开发板最小系统板115-25元5V继电器模块单路带光耦隔离15-10元5V电源适配器给继电器供电110-15元杜邦线公对公/母对母若干5元台灯/风扇普通家用型1自备提示选择继电器模块时务必确认其工作电压与STM32的GPIO输出兼容。虽然STM32F103的GPIO输出为3.3V但大多数5V继电器模块仍能被可靠驱动。继电器的工作原理其实很简单它相当于一个电子开关通过小电流控制大电流电路的通断。在智能家居改造中我们正是利用这一特性让STM32通过GPIO控制继电器再由继电器控制家电的电源。2. 电路设计与安全注意事项安全是智能家居改造中最重要的一环特别是当涉及到交流电操作时。以下是完整的电路连接方案STM32与继电器的连接VCC → 5V电源正极GND → 与STM32共地IN → STM32任意GPIO引脚(如PA0)继电器与家电的连接COM → 家电电源线切断的一端NO → 家电电源线切断的另一端NC → 本项目不使用电源连接STM32通过USB供电继电器单独使用5V电源(可与STM32共用电源但需确保电流足够)// 简单的GPIO控制代码示例 #include stm32f10x.h #include Delay.h #define RELAY_PIN GPIO_Pin_0 #define RELAY_PORT GPIOA void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin RELAY_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; GPIO_Init(RELAY_PORT, GPIO_InitStructure); } int main(void) { GPIO_Configuration(); while(1) { GPIO_SetBits(RELAY_PORT, RELAY_PIN); // 继电器闭合设备开启 Delay_ms(5000); // 保持开启5秒 GPIO_ResetBits(RELAY_PORT, RELAY_PIN); // 继电器断开设备关闭 Delay_ms(5000); // 保持关闭5秒 } }重要安全提示操作交流电部分时务必确保设备已断电。如果不熟悉强电操作建议先在不带电状态下完成所有接线再由专业人士检查确认。3. 进阶功能实现基础的通断控制只是智能家居的第一步我们可以为项目添加更多实用功能3.1 手机远程控制通过蓝牙或WiFi模块可以实现手机APP控制。HC-05蓝牙模块是最经济的选择将HC-05与STM32的USART接口连接修改代码添加蓝牙通信功能开发简单的手机APP或使用现有蓝牙串口APP// 蓝牙控制代码片段 void USART_Configuration(void) { USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置USART1 Tx (PA9) 和 Rx (PA10) GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); USART_InitStructure.USART_BaudRate 9600; USART_InitStructure.USART_WordLength USART_WordLength_8b; USART_InitStructure.USART_StopBits USART_StopBits_1; USART_InitStructure.USART_Parity USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, USART_InitStructure); USART_Cmd(USART1, ENABLE); } void ProcessCommand(uint8_t cmd) { switch(cmd) { case 1: GPIO_SetBits(RELAY_PORT, RELAY_PIN); // 开 break; case 0: GPIO_ResetBits(RELAY_PORT, RELAY_PIN); // 关 break; } }3.2 定时与自动化控制添加RTC(实时时钟)功能可以实现定时开关#include stm32f10x_rtc.h #include stm32f10x_pwr.h #include stm32f10x_bkp.h void RTC_Configuration(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); if(BKP_ReadBackupRegister(BKP_DR1) ! 0xA5A5) { RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_SetPrescaler(32767); // RTC周期1秒 RTC_WaitForLastTask(); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); } RTC_WaitForSynchro(); }3.3 语音控制集成借助LD3320等语音识别模块可以实现简单的语音控制将语音模块与STM32的SPI或UART接口连接训练几个简单的语音指令(如开灯、关灯)在代码中根据识别结果控制继电器4. 项目优化与扩展思路完成基础功能后可以考虑以下优化方向性能优化添加状态指示灯(LED)实现软启动避免继电器频繁开关加入过流保护电路功能扩展多路控制(同时改造多个家电)环境感应(根据光线自动控制台灯)能耗统计OTA无线升级外观设计3D打印定制外壳隐藏布线设计墙面安装方案实际项目中我发现最实用的功能组合是定时手机控制。比如设置台灯在晚上7点自动开启但也可以通过手机提前开启或关闭。这种灵活的控制方式真正体现了智能家居的价值。继电器模块的NO/NC选择也有讲究对于台灯通常使用NO(常开)接法默认状态为关闭而对于风扇可能更倾向于NC(常闭)接法确保断电时风扇能够停止避免安全隐患。