郝沛,黄鲁
(中国科学技术大学 信息科学技术学院,安徽 合肥 230026)
摘要:传统市电开关需要人为干预,在某些重复定时开关场景下使用不方便,且需要人为判断通断的条件。设计了一种智能开关,可以实现设置时间段内开关的自动通断,并且能够借助传感器数据辅助判断通断条件。实测结果表明,该系统工作稳定,控制界面简洁友好。
0引言
随着家用电器的普及,传统的手动开关已经无法满足日益复杂的应用场景。比如定时照明系统,人为地去控制照明开关,不但不方便,而且很难精确掌控开启与停止时间。如果在市电与照明系统之间增加一级控制系统,在设定好开关时间后,由系统执行开关操作,并且可以根据环境光照度来选择是否照明,则会带来极大的方便[1]。推而广之,定时抽水系统、定时充电系统、定时加热系统都可以采用此种控制方案,从而给市电应用场景带来极大便利。
1系统简介
本系统设计的核心思路是“以弱控强,用户定制;控时为主,传感为辅”。硬件上,系统需要实现对传感器以及外围模块的驱动;软件上,系统需要实现人机交互界面的绘制、时间检测以及传感器数据的处理。
1.1系统功能框图
如图1所示,系统输入为220 V的市电,通过继电器后,输出到被控电器,从而控制被控电器的开关。继电器的作用为隔离强弱电,同时控制市电的通断,其控制信号由控制系统提供。控制系统输入电压为9 V,由电源适配器提供。传感器提供判断通断的辅助信号,如光照度、水位、温湿度等[2]。
1.2系统主要模块
1.2.1主控制器STM32
STM32是基于ARM Cortex-M3内核的32位微处理器,主频最高为72 MHz。它包含丰富的接口,且其内部时钟频率可由用户自主定制,能够方便地开发出PWM输出、频率捕获、脉宽捕获等功能[3]。其GPIO口可自由配置为输入/输出模式、中断模式、复用模式[4]。
1.2.2定时器DS1302
DS1302是DALLAS公司设计的一款低功耗时钟芯片,具有涓流充电、闰年补偿功能。芯片采用32.768 kHz晶振,且内部集成了31 B的用于临时数据存放的RAM寄存器。其采用3线I/O口与控制器通信:SCLK时钟引脚,由主控芯片提供,用以实现数据的同步交互;I/O数据输入/输出引脚,用以串行数据传输;RST复位引脚,需在数据传输时强制拉高,在数据传输结束后强制拉低。
1.2.3液晶显示模块LPH7366
LPH7366是一款分辨率为84×48的单色液晶显示模块,具有功耗低、操作简便等优点,广泛应用于手机显示屏、便携式设备中,如NOKIA5110的液晶屏。
LPH7366模块采用四线I/O口与主机通信:CE使能引脚,低有效;SCK时钟引脚;DATA串行数据传输引脚; CD命令/数据选择引脚(低电平代表传输命令,高电平代表传输数据)。
由于LPH7366没有集成字库,所以需要把ASICII字库嵌入到代码中去。
2系统硬件
根据硬件功能,系统被划分为以下几个子系统:电源系统、STM32主控系统、人机交互系统、时钟系统、继电器系统。各系统功能如下:
(1)电源系统:为整个定时开关系统提供工作电平。系统工作电平有两种:9 V和3.3 V;
(2)主控系统:完成对整个系统的控制以及数据的采集处理;
(3)人机交互系统:提供人机交互接口,实现数据的反馈以及控制参数的配置;
(4)时钟系统:提供实时时钟数据,供主控系统使用;
(5)继电器系统:隔离强弱电系统,并实现3.3 V电平对9 V电平的驱动。
2.1系统硬件框图
系统硬件框图如图2所示。
2.2系统电路图
2.2.1STM32最小系统电路
STM32能够工作的最小系统电路包含电源输入、复位电路、晶振电路。如图3所示。
2.2.2外围设备电路
外设电路包括电源电路、液晶+按键电路、实时时钟电路和继电器驱动电路。
(1)电源电路,如图4所示。
其输出电压由以下公式得到:
VOUT=1.221×R1-R2R2(1)
当R1=10 kΩ,R2 =2.7 kΩ时,VOUT=3.301 V。
(2)时钟电路
时钟电路采用DS1302方案。芯片有两组供电电源Vcc1和Vcc2。Vcc2为主电源,Vcc1为备用电源。芯片会以电平较高的一端作为电源输入,所以,为确保在系统掉电时时钟芯片能够正常工作,需要在Vcc1引脚处外加3 V蓄电池。
(3)液晶驱动电路
由于LPH7366液晶模块的逻辑驱动电平为3 V,所以可直接将其引脚连接到STM32上。按键系统采用自弹式轻触按键,连接到STM32的GPIO上,以中断方式输入。
(4)继电器驱动电路
由于继电器线圈的工作电平为9 V,而STM32的逻辑电平为3.3 V,所以需要驱动电路才能够用STM32的驱动电平来控制继电器。此处使用晶体管SS8050作为驱动电路,且将其设定为工作在饱和区内。如图5所示,假设晶体管BJT1的β=100,Vbe=0.7 V;继电器线圈电阻Rk=70 Ω,继电器工作电压VIN=9 V。设STM32的PB.9脚输出到R4上的电压为Vin,三极管基极电流为Ib,集电极电流为Ic。假设三极管工作在临界饱和区,则:
Ic=VIN/(R3+Rk)(2)
Ib=Ic/β(3)
Vin=Ib×R4+Vbe(4)
可以得到三极管达到饱和状态的最小输入电压Vin=0.75 V。即输入电平超过0.75 V,三极管便会导通,从而继电器吸合。由于在默认条件下继电器应处于断开状态,所以在三极管输入端增加下拉电阻R5=10 kΩ。
3系统软件
3.1程序流程图
主程序的思路是,实时读取时钟芯片DS1302的时间,并显示在液晶显示屏上;同时检测当前时间是否进入了用户设定的继电器吸合时间。如果进入了设定时间,则吸合继电器;如果在设定时间外,则断开继电器。主程序流程图如图6。
本系统中,按键的检测是在中断程序中实现的。由于在处理某一个中断函数时,其他同级或者更低级的中断是被屏蔽的,所以中断函数应尽可能简短。本系统的按键中断函数仅实现检测哪个按键被按下,而按键消息处理函数是在中断函数外实现的。按键中断处理程序流程图如图7。
3.2人机交互界面设计
人机交互界面是本系统软件的主要构成部分。其完成的功能有:显示当前时间与定时时间段,绘制菜单以配合按键进行设置,响应按键信号并完成对应功能。
3.2.1菜单的绘制
本系统菜单共有两级,采用链表结构设计,其结构如图8所示。
链表中,每个节点的结构如下:
typedef struct
{
intLocation_Level[3];
char*Item_Name;
Menu_Item* Next;
} Menu_Item;
其中,Location_Level[3]表示当前节点的位置。Location_Level[0]的值代表此节点在主菜单的第几项;Location_Level[1]的值代表此节点在二级子菜单的第几项;Location_Level[2]代表此节点在三级子菜单的第几项。
Item_Name表示当前节点名称。在显示时会根据对应节点打印出此字符串。
Next指向下一节点的指针。
比如,图8中的二级子菜单中的项目“年设置”,其Location_Level[0]=1,代表其隶属于主菜单的“设定时间”项;Location_Level[1]=1,代表其隶属于二级菜单的“年设置”项;Location_Level[2]=0,代表其止于二级菜单,没有进入三级菜单。其Item_Name=“年设置”;Next指向“年设置”节点的下一个节点。
用链表设计菜单的优点在于,无论在菜单的什么位置添加项,都可以直接添加在链表的尾部。因为定位当前节点位置靠的是当前节点的Location_Level[3]中的3个变量,在菜单级数较少时,靠链表遍历就足够了。
3.2.2按键的响应
按键的检测是在中断函数中完成的。中断处理函数仅完成按键序号的确认,而按键处理函数是在中断外实现的。本系统的按键有4个,分别为“向前”,“向后”,“确认”,“返回”,对应标识号依次为1、2、3、4。
按键处理的思路是:中断检测出当前按下的是哪个按键,然后根据当前指针指向的节点来确定要完成的动作。如图9所示。
假设当前指针指向菜单项“设定时间”,则Location_Level[3]={1,0,0},说明当前节点处于主菜单的第一项。如果此时“确认”按键被按下,那么按键处理函数从表中找到此时位置对应动作。假设此动作为“进入二级菜单”,则指针会跳转到Location_Level[3]={1,1,0}的位置,同时在屏幕上刷新出二级菜单。其他3个按键的响应与此类似。
3.3定时时间的设定
定时时间设定是在按键响应函数中实现的。程序流程图如图10所示。
1.2.2节介绍过,DS1302时钟芯片内部有31 B的RAM寄存器,可用于存放临时数据。由于市电定时开关系统需要保证在系统掉电后,配置数据不会丢失,从而在再次上电时依旧可用。所以,本系统使用了DS1302的临时数据寄存器作为配置数据的保存位置。由于DS1302有备用电源,配置数据不会因掉电而丢失。
3.4传感器的数据处理
考虑到应用场景的不同,系统给出了8位GPIO扩展接口,可用于各种数字传感器的扩展,如温湿度传感器、液位图11传感器数据处理流程图传感器、光强传感器等。传感器数据处理流程图如图11所示。
以光强传感器为例。设光照强度标志为Light_Flag,定时器的标志为Time_Flag,则传感器与定时时间标志变量关系表如表1。 表1传感器与定时时间标志变量表 01Light_Flag环境光照度低于某阈值环境光照度高于某阈值Time_Flag当前时间处于设定时间内当前时间处于设定时间外
如果被控电器为照明电路,要求“在设定时间段内,当光照度低于某阈值时,照明电路被开启”,则伪代码如下:
if((Light_Flag&& Time_Flag)==1)
{打开继电器;}
else
{关闭继电器;}
同理,液位传感器、温度传感器等的数据都可以采用这种处理思路。
4测试效果
测试中使用了3个定时时间段,并观察继电器的通断状态。
如图12中主菜单界面所示,共有3个选项,可通过屏幕下方的按键实现光标的上下移动以及选择、取消等功能;右图为实时时钟设置界面,通过按键实现从年到秒的选择。
图13左为定时时间设置界面。共有四个时间段可以配置。当配置完毕后,回到主菜单,进入“TIME DISPLAY”子菜单,便可看到右图的效果。可以看到,时间显示界面除了显示当前时间外,还用不同的箭头表示出了定时时间段。举例来说,对于定时时间1(7:40~9:00),对应右图的纯黑色箭头(黑框之内)所指时间段,可以从时间轴上非常清晰地显示出来。
当前时间如果落在任何一段设定时间内,则继电器吸合,其指示灯亮起。
5结束语
本系统界面简洁,操作方便,可适用于大多数家用电器。经实际测试,系统用于定时照明场景,持续工作两周未出现异常。
参考文献
[1] 陈致远,朱叶承,周卓泉,等.一种基于STM32的智能家居控制系统[J].电子技术应用,2012,38(9):138140.[2] 张逢雪,王香婷,王通生,等.基于STM32单片机的无线智能家居控制系统[J].自动化技术与应用,2011,30(8):98101.
[3] 徐端全.嵌入式系统原理与设计[M].北京: 北京航空航天大学出版社,2009.
[4] 李宁.基于MDK的STM32处理器开发应用[M].北京: 北京航空航天大学出版社,2008.