
#第十届立创电赛#用电器开关定时器
简介
基于立创STM32F103C8T6开发板制作的用电器开关定时器,具备 一键启动、一键关闭、定时关闭、定时开启、间断开启关闭 五种运行模式,支持通过蓝牙模块发送数据至手机,方便用户掌握机器运行状态。
简介:基于立创STM32F103C8T6开发板制作的用电器开关定时器,具备 一键启动、一键关闭、定时关闭、定时开启、间断开启关闭 五种运行模式,支持通过蓝牙模块发送数据至手机,方便用户掌握机器运行状态。开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
* 1、项目功能介绍
天气入秋之际,白天和黑夜的温度往往相差较大,具体来说,晚上睡觉时若不开风扇,室内温度会影响睡眠;但开着风扇睡觉,由于这类风扇只有单纯的需要人为去开启和关闭的功能,到了半夜气温下降后,持续的风吹会让人感觉不适,此时必须起身手动关闭,影响了睡眠连续性。针对这个问题,我想到一个解决方案:在风扇与220V电源插座之间,加装一个具备定时关闭功能的设备,通过预设时间让风扇自动停止运行,从而避免夜间频繁起身操作。但是目前的方案只针对“风扇定时关闭”这个问题,功能单一,局限性太多,于是我在“定时关闭”的基础功能上进行了扩展,让设备从“单一风扇控制器”升级为“用电器开关定时器”,具体介绍如下:
1) 核心功能与模式:新增4种运行模式覆盖多场景需求
基础控制:支持一键启动、一键关闭,实现用电器的即时操作;
定时功能:保留定时关闭,并新增定时开启,可预设时间让用电器自动启停(如睡前预设“2小时后关闭”,或预设“3小时后开启”);
间歇控制:增加间断开启关闭模式,适合需要周期性运行的场景(如间歇性通风)。
2)交互与显示:清晰掌握设备状态
操作方式:通过实体按键直接设置运行模式、调整倒计时时长;
状态指示:用LED指示灯快速提示当前运行模式;
详细显示:搭配0.91寸OLED屏,实时显示倒计时、RTC实时时间及当前具体运行状态,信息一目了然。
3)控制与联动:稳定且便捷
硬件控制:通过继电器的吸合与断开,控制用电器的电源通断,适配风扇、灯等多种家用设备;
远程联动:内置蓝牙模块,可将设备运行数据实时发送至手机,信息了如指掌。
*2、项目属性
项目是否首次公开:是。
项目是否为原创:是。
项目是否曾经在其他比赛中获奖:否。
项目是否在学校参加过答辩:否。
*3、开源协议
本项目使用GPL3.0开源协议。
*4、硬件部分
硬件框图

原理图设计
AC-DC 电源模块




继电器控制电路
利用 NPN 三极管控制继电器线圈的通断,进而通过线圈通断控制继电器触点的吸合与断开,实现对 220V 交流电通断的控制。D1为续流二极管,用于吸收继电器线圈断电时的反向电动势,保护三极管。R2为下拉电阻,用于防止系统上电初期因电路状态不稳定,导致继电器出现误动作。







在本项目中使用该显示模块显示RTC时间、选择的模式、倒计时等信息。





PCB设计
电路布局布线比较简单,需要注意的是:
1.PCB 分为弱电和强电部分,在弱电和强电之间挖槽用于增加爬电距离,减少强电对弱电的干扰,提高电路的安全性和可靠性,经实际测试,电路可稳定运行。
2.强电部分的线路需铺铜以通过大电流,必要时做开窗处理。本项目双面铺铜,能够满足通过较大电流的需求。



实物展示
在家匆匆忙忙之下把贴片NPN型三极管当成PNP型三极管焊接,导致继电器异常工作,而焊接工具又不在身边,就买了插件NPN型三极管和电阻暂时缠绕使用(已确认接触牢固,无松动),程序里已更改相应的控制引脚。





3D外壳结构
结构组成
上下盖设计:采用“上盖+下盖”的分体式结构,放置螺丝孔,便于通过螺丝将上盖、下盖、电路板三者精准地固定在一起。
下盖:放置多个圆柱状支撑柱,用于固定电线,防止大力拉扯损坏电线,在侧面挖槽方便电线引出。
上盖:先放置实体,后挖槽,满足LED和OLED显示和其他需求,在侧面挖槽便于按键操作。


*5、软件部分
部分关键程序实现(附件含完整源码)
主函数部分
{
RCC_Configuration();
SysTick_Config(SystemCoreClock / 1000);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //优先级处理
Delay_ms(100);
Blue_LED_Init();
Status_LED_Init();
Relay_Init();
Receive_Input_Init();
OLED_Init();
OLED_Clear();
Serial_Init(); //蓝牙串口初始化
RTC_Init(); //RTC初始化
while (1)
{
switch(Operate_Mode)
{
case 0: Standby_mode();break;
case 1: Contin_Operate();break;
case 2: Auto_Shutdown();break;
case 3: Scheduled_Start();break;
case 4: Intermit_opening_closing();break;
}
}
}
在主函数中首先对外设初始化,然后进入while(1)循环,根据Operate_Mode执行相应的模式。
模式说明:
Standby_mode():待机/关闭模式,系统上电后默认为此模式;
Contin_Operate():持续运行模式;
Auto_Shutdown():定时关闭模式;
Scheduled_Start():定时启动模式;
Intermit_opening_closing():间歇开关模式。
蓝牙串口指令宏定义与功能描述
在main.c中定义如下串口指令,且需要在手机端蓝牙助手设置对应按钮的名称和内容(详见附件视频):
#define Check_status 'C'//查询状态
#define Cancel 'Q'//取消
#define Confirm 'R'//确认
#define Increase 'I'//增加
#define Discrease 'D'//减少
| 宏 | 字符 | 功能 |
|---|---|---|
Check_status |
'C' | 查询当前状态 |
Cancel |
'Q' | 取消操作,返回待机 |
Confirm |
'R' | 确认选择或启动模式 |
Increase |
'I' | 增加参数(如定时时间) |
Decrease |
'D' | 减少参数 |
按键检测部分
#define KEY1 GPIO_Pin_8
#define KEY2 GPIO_Pin_9
#define KEY3 GPIO_Pin_11
#define KEY4 GPIO_Pin_8
#define KEY1_2_PORT GPIOB
#define KEY3_4_PORT GPIOA
//按键松手检测
uint8_t Get_Key(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==RESET)
{
Delay_ms(100);
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==RESET)
{
while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==RESET)
;
return SET;
}
}
else if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==SET)
return RESET;
return RESET;
}
//按键无松手检测
uint8_t Get_Key_Not_while(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==RESET)
{
Delay_ms(100);
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==RESET)
{
Delay_ms(400);
return SET;
}
}
else if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==SET)
return RESET;
return RESET;
}
| 特性 | Get_Key(松手检测) |
Get_Key_Not_while(无松手检测) |
|---|---|---|
| 触发条件 | 按键按下并完全松开后才返回有效 | 按键按下且稳定后返回有效(无需松手) |
| 等待逻辑 | 包含while循环等待松手 |
无等待松手逻辑,仅延时后直接返回 |
| 适用场景 | 单次触发操作(如确认、切换模式) | 长按检测、连续触发场景(如调节参数) |
| 对主程序阻塞影响 | 按键未松手时会阻塞主循环(while等待) |
仅延时影响,无长时间阻塞 |
串口发送接收部分
void Serial_Printf(char *format, ...)
{
char String[100];
va_list arg;
va_start(arg, format);
vsprintf(String, format, arg);
va_end(arg);
Serial_SendString(String);
}
Serial_Printf 函数是嵌入式系统中常用的串口格式化输出函数,作用是将可变参数的格式化字符串通过串口发送出去,实现类似标准库 printf 的功能(但输出目标是串口而非控制台)。
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
Serial_RxData=USART_ReceiveData(USART1);
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
该串口中断函数用于读取接收数据:USART_ReceiveData 函数从 USART1 的接收数据寄存器中读取一个字节的数据,将读取到的数据存入全局变量 Serial_RxData供其他函数处理,如(解析指令、改变参数等)。
软件流程图

软件执行流程说明
1)启动与初始化阶段:系统上电后,先完成基础配置(时钟、中断优先级),再初始化所有外设(LED、继电器、按键、OLED 屏、串口、RTC 时钟),为后续功能运行做准备。
2)主循环与模式分支:初始化完成后进入主循环,根据Operate_Mode(模式)执行对应功能,各核心模式流程如下:
- 待机模式(Mode 0):默认模式,继电器和 LED 均关闭,OLED 显示实时时间;可按 KEY4 或串口发送
R进入模式选择,发送C查询当前状态。 - 持续运行(Mode 1):直接开启继电器和 LED4(运行指示灯);需关闭时,按 KEY1 或串口发送
Q即可返回待机模式。 - 定时关闭(Mode 2):先通过按键 / 串口设置倒计时(按键每按一次则加或减 5 分钟,可长按提高设置时长的速度),确认后开启设备;倒计时结束自动关闭设备,回归待机模式。
- 定时启动(Mode 3):先设置倒计时(与定时关闭相同),确认后进入倒计时;倒计时结束自动开启设备,并切换到持续运行模式。
- 间歇开关(Mode 4):先设置设备 “开启时间”“关闭时间” 和 “循环次数”,确认后按设定循环:开设备(到时间关)→关设备(到时间开);循环结束后返回待机模式。
3)流程闭环:所有模式执行中,均可通过串口发送C查询状态;除持续运行、定时启动外,其他模式结束后均自动回归待机模式,等待下一次的启动。
*6、大赛LOGO验证
*7、注意事项
- 调试时,请拔下蓝牙模块再接上Type-C插头供电(因为两者有干涉),同时不要接入220V交流电源,接着验证继电器能够按照设定程序和时间正常吸合与断开再进行下一步操作;
- 接下来撤走Type-C插头,装上外壳再接入220V交流电源(为了避免不经意间触碰到接线端子金属部分而触电),此时可插上蓝牙模块进行下一步调试;
- 使用时,请务必装上外壳,用M2螺丝固定好,同时两端电源插头务必完全插入家用220V交流电源插座和用电器插座(一公一母),不可裸露金属部分。
*8、演示您的项目并录制成视频上传
附件中有两个演示视频:功能演示、蓝牙助手按钮设置。
功能演示部分花费较长时间演示,因此不是重点介绍的地方做了倍速处理。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程工程成员
知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。




评论