高手在民间!小伙做了一个自动调火开关,这结构,居然很实用

嘉丽科技讨论 2024-06-22 08:46:54

事情是这样的。

家里老人做饭容易忘了关火,太危险了,所以就想做一个这样的定时开关。预计实现两个功能:

1.可定时关火;

2.可定时关小火。

同时,不影响手动功能!效果如下图所示:

小编看完只想表示:居然真的完全不影响手动啊?!这,具体咋设计的啊?

一、硬件设计部分

原理图

PCB图

1.工作原理

根据位置传感器,确定燃气开关位置;根据定时器设定时间和燃气开关位置控制电机转动,并在指定位置停止;关闭状态会开启单片机低功耗模式。

2.选型方案

主控芯片:PY32f002a时间显示:TM1650+0.28寸三位共阴极数码管电机控制:YX-1818AM时间设定:EC11编码器位置传感器:CC6207霍尔传感器

以上芯片元件的原理这里就不在赘述了,大家可以网上查阅手册。

3.单片机控制的管脚

总共需要引脚12个:

W_1,W_2,W_3位置传感器3个,分别对应点火开关的关闭,小火以及电机初始位置TM1650控制信号2个:模拟SCL、SDAEC11输出管脚3个 :KEY_A,KEY_B,KEY_CYX-1818AM控制信号2个:MOTOR_1A,MOTOR_1BMOS关电源控制(配合低功耗模式降低外围电路功耗)1个:PA3信号LED管脚1个:PA4

二、软件设计部分

本章节将说明——3个设计思路+主程序分享(附注释)。

1.如何实现定时功能呢?

我采用的通用定时器16,把它设定为1分钟中断一次,然后找两个变量,TIMER1控制关火时间,TIMER2控制调小火时间,中断发生就 TIMER1--;TIMER2--;这样就可以根据设定的TIMER1,TIMER2大小来调整两个时间的长短。

关小火是可以选择的功能,所以为了省事,这里把TIMER2变量初始化为999了,如果有需要再调小TIMER2即可。

2.显示倒计时的逻辑是什么?

因为有两个时间可设定,所以用EC11的按键功能进行切换,并用led的亮灭来指示目前显示的是什么时间。

默认启动显示为TIMER1,默认值30分钟,显示TIMER1的时候,指示灯熄灭状态,按以下EC11,显示TIMER2,同时指示灯亮起。

另外为了监视电量,需要启用单片机的内部电源监控通道。由于我使用的是1s锂电,当电压低于3v时,每秒显示一次blo

3.关于位置监控

我设置了三个位置传感器。其中:

W1是控制芯片的低功耗模式启动关闭,同时控制mos管启动关闭外围电路W2是关小火的位置指示W3是电机初始位置传感器,不论是关小火还是关闭燃气开关,操作完成后电机都要回到初始位置。

这三个传感器的输入引脚都要设定为外部触发中断模式。

4.主程序&注释

下面是主程序,其余的代码就不贴了,有兴趣的直接去看附件的源码吧,编程水平有限,轻拍。下面的代码我让kimi帮我整理了一下,顺便写了下注释:

int main(void){ /* 初始化EC11计数值 */ EC11_COUNT = 0; /* 初始化HAL库 */ HAL_Init(); /* 配置ADC */ APP_ADCConfig(); /* 配置系统时钟 */ APP_SystemClockConfig(); /* 使能GPIOA、B、F的时钟 */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); /* 初始化EC11引脚 */ EC11_PIN_INIT(); /* 初始化TIM16 */ TIM16Config(); /* 初始化LED */ MYLED_Init(); /* 初始化I2C引脚 */ I2C_PIN_INIT(); /* 配置外部中断 */ Configure_EXTI(); /* 初始化W1和W3的外部中断 */ W1_W3_EXTIConfig(); /* 初始化CC6207相关的GPIO */ GPIO_CC6207_INIT(); /* 初始化电机控制相关的GPIO */ MOTOR_GPIO_INIT(); /* 初始化TM1650显示驱动 */ TM1650_INIT(); /* 设置TM1650进入睡眠模式 */ TM1650_SET(SYS_ADD, SYS_SLEEP); /* 主循环 */ while (1) { /* 获取当前时间 */ TIME = HAL_GetTick(); /* 重新初始化TM1650 */ TM1650_INIT(); /* 启动ADC转换 */ HAL_ADC_Start(&hadc); /* 等待ADC转换完成 */ HAL_ADC_PollForConversion(&hadc, 1000000); /* 获取ADC值 */ adc_value = HAL_ADC_GetValue(&hadc); /* 计算VCC电压 */ T_VCC = (4095 * 1.2) / adc_value; /* 如果电池电压低于3V,显示电池电量低的提示 */ if (T_VCC < 3) { /* 每秒钟切换显示电池电量低的提示和当前计时 */ if ((TIME % 2000) < 1000) { TIM1650_DIS(ADD1, 10); // 显示'B' TIM1650_DIS(ADD2, 11); // 显示'L' TIM1650_DIS(ADD3, 12); // 显示'O' } else { /* 根据DSP_FLAG显示TIMER1或TIMER2的值 */ if (DSP_FLAG) { TIM1650_DIS(ADD1, TIMER1 / 100); TIM1650_DIS(ADD2, (TIMER1 / 10) % 10); TIM1650_DIS(ADD3, TIMER1 % 10); } else { TIM1650_DIS(ADD1, TIMER2 / 100); TIM1650_DIS(ADD2, (TIMER2 / 10) % 10); TIM1650_DIS(ADD3, TIMER2 % 10); } } } else { /* 如果电池电压正常,显示正常计时 */ if (DSP_FLAG) { TIM1650_DIS(ADD1, TIMER1 / 100); TIM1650_DIS(ADD2, (TIMER1 / 10) % 10); TIM1650_DIS(ADD3, TIMER1 % 10); } else { TIM1650_DIS(ADD1, TIMER2 / 100); TIM1650_DIS(ADD2, (TIMER2 / 10) % 10); TIM1650_DIS(ADD3, TIMER2 % 10); } } /* 如果W1为高电平,且TIMER1为0,则启动电机向前运行 */ if (W1 == 1 && TIMER1 <= 0) { MOTOR_FORWARD(); } /* 如果W1为低电平,W3为高电平,则使电机向后运行 */ if (W1 == 0 && W3 == 1) { for (int i = 0; i < 60000; i++); // 延时 不知道啥原因使用hal_delay就会影响进入低功耗,所以用了个空循环代替。这个延时主要是为了给马达一个缓冲时间,不要马上反转 MOTOR_BACKWARD(); } /* 如果W1和W3都为低电平,则停止电机并进入低功耗模式 */ if (W1 == 0 && W3 == 0) { MOTOR_STOP(); TM1650_SET(SYS_ADD, SYS_SLEEP); TIMER1 = 30; // 关闭TM1650、W2、W3的电源 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_All, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_All, GPIO_PIN_RESET); PWR_STOP_MODE(); // 进入低功耗模式 } /* 如果TIMER2为0且TIMER1大于0,则执行特殊操作 */ if (TIMER2 <= 0 && TIMER1 > 0) { TIMER2 = 0; while (TIMER2_FLAG == 0) { MOTOR_BACKWARD(); // 电机向后运行 } if (TIMER2_FLAG == 1) { while (W3 == 1) { MOTOR_FORWARD(); // 电机向前运行 } MOTOR_STOP(); // 停止电机 TIMER2 = 999; // 重置TIMER2 } } }}

三、外壳及机械设计

设置了自动控制,却想不影响手动功能?

机械设计就是关键!

这是我想了很久,突然灵光一闪的方案——我将传动改为了上下传动。并用FreeCAD设计了一下机械结构,下面同通过截图简单说明一下:

图里最大的两个是外壳和上盖,下面还有个方形的,是外挂的电池盒。电池盒自己用砖头在两侧开个螺丝孔,用螺丝拧在外壳上就行。

那,外壳里的零件起到什么作用呢?有啥设计巧思?

右边翠绿色的是一个N20的减速电机,选3v的,减速比越大越好,我这个每分钟大概是40转的。

左边的是上下两层设计的主齿轮和负责带动主轴转动的从动轮。从动轮的中间有个3mm的圆孔,内嵌一个3mm直径的钕磁铁。主齿轮上有个凸台,凸台的侧面也内嵌一个3MM直径的钕磁铁。中心轴是用来联接灶台旋转轴和原旋转按钮的,外径为六边形设计,从而可以被主轴带动。主齿轮中孔是圆形的,所以不会影响主齿轮的运转,从而手动控制不会受到影响。

目前图上还可以看到从动轮凸起指向的方向就是W1传感器安装的地方,下面外壳上的两个方形柱子是W2,W3传感器安装的位置。我是直接用胶把这三个传感器粘在外壳上的。

放在燃气灶上,隔热问题怎么考虑?

因为我是3d打印的,所以外壳前面设计成了双层,主要为了增加个空气隔热仿制内层变形,同时最外层也可以贴一层锡箔纸或者防火胶带来进一步隔热。

下面就是安装好后内部的样子:

低功耗时的待机电流:

【正文完】

关注我,看一手优质开源项目

0 阅读:0

嘉丽科技讨论

简介:感谢大家的关注