郭占苗
(西安航空职业技术学院 电子工程学院, 西安 710089)
智能家居是在现代时尚家居的基础上,将组合智能、电子智能、机械智能和物联智能巧妙的融入家居产品当中,使家居更加智能化、国际化、时尚化,是未来国际家居发展的潮流和趋势。智能窗帘是智能家居的一个重要组成部分,设计一款人性化、智能化、便捷化和多样化的智能窗帘不仅可以改变人们的生活方式,还能提高生活质量。经过实践验证,基于STC12C5A60S2 单片机系统的智能窗帘可以很好地完成窗帘的智能控制,较传统靠人为去拉开和关闭窗帘的方式更方便,且不易损坏,具有广阔的应用前景。
智能窗帘系统设计由达林顿管电路构成的ULN2003芯片驱动步进电机28BYJ控制窗帘的开启和闭合状态,用霍尔传感器控制窗帘开启和关闭的最大位移。利用光敏电阻采集外界光的强度,利用温度传感器采集环境温度,结合I2C协议和1-wire总线编程,经PCF8591AD转换器输入单片机进行控制,由单片机输出控制电机的正反转,并将窗帘状态、温度和光照度参数结果显示在LCD12864液晶上[1],同时,可通过按键模块调整时间,也可设定窗帘自动开关的时间,时钟显示模块能够准确显示实时时间,在时钟模块安装纽扣电池可实现掉电后数据不丢失功能。智能窗帘具体原理框图,如图1所示。
图1 智能窗帘系统框图
main函数里主要调用“BS18B20.h”温度采集头文件函数、“LCD12864.h”液晶显示、“DS1302.h”时钟函数和“PCF8591.h”模数转换函数,在液晶第一行显示“智能窗帘控制系统”,第二行上显示出“窗帘状态”是“打开”或者“关闭”,第三行显示当前时间,第四行显示温度和光照度。液晶时间显示主要代码如下:
void sfm_show() //时间显示行
{ convert();
temp1=time0/10%10;
temp2=time0%10;
temp3=time1/10%10;
temp4=time1%10;
temp5=time2/10%10;
temp6=time2%10;
lcd_pos(3,1);
write_com(0x06);
write_data(ASII[temp1]);
write_data(ASII[temp2]);
chinese(s); //显示汉字“时”
write_data(ASII[temp3]);
write_data(ASII[temp4]);
chinese(f); //显示汉字“分”
write_data(ASII[temp5]);
write_data(ASII[temp6]);
chinese(m); //显示汉字“秒” }
将“时分秒”的个位和十位分别取出来从液晶的第三行第一列开始一次显示,并利用chinese( )汉字转化函数,显示出相应汉字[2],其它状态显示函数与此类同,不再赘述。通过编写按键函数,实现时间调整、光照度的阈值设定和窗帘开关的定时。
通过DS18B20可以实时采集室内温度,并将结果显示在液晶上。该温度采集模块主要包括DS18B20初始化、写字节操作、读字节和温度采集等子函数。DS18B20的读写字节和初始化程序按照器件手册1-wire工作协议时序编写即可,初始化程序检测1-wire总线是否存在DS18B20器件,读写时序要注意采样时间[3]。温度采集程序设计主要包括DS18B20的初始化,启动温度转换和读取寄存器的程序设计,读取时先读取低字节再读取高字节,最后返回温度值,主要用语句“temp = high<<4; temp |= (low>>4); return temp;”实现该功能。
DS1302时钟模块主要实现实时显示当前时间和定时窗帘开启与关闭时间的功能,按照DS1302时序编写字节读函数,字节写函数,“unsigned char read_1302(unsigned char add)”地址读函数,即将寄存器地址的数据读出来,以及地址写函数等。DS1302的6脚双向通信引脚I/O接单片机的P0^1,7脚通信时钟信号引脚SCLK接单片机P0^2,5脚使能引脚CE接P0^0,在写时钟程序时先进行声明[4]。时钟模块芯片初始化函数,主要根据DS1302的时钟寄存器功能表编写,向DS1302内写秒寄存器80H写入初始秒数据,向写分寄存器82H写入初始分数据,向DS1302内写小时寄存器84H写入初始小时数据,根据实际时间分别写入初始“时分秒”的数据,最后再调用BCD码转换十进制函数,BCD码转化十进制子函数由“unsigned char BCD_Decimal(unsigned char bcd)”BCD码转十进制函数实现,主要语句有{unsigned char Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F)); },实现第一次开启时将写入设置的初始时间显示在LCD12864上的功能。
注意,为了使断电再开机后时间不初始化成程序设置的初始时间,所以在DS1302初始化程序使进行写保护,并用了备用电池。
PCF8591 具有 4 个模拟输入、1 个模拟输出和 1个串行 I2C 总线接口。其中PCF8591的第4引脚AIN3,即模拟输入接口3连接光敏电阻,可采集环境光强精确数值。在 PCF8591 器件上输入输出的地址、控制和数据信号都是通过双线双向 I2C 总线以串行的方式进行传输[5]。I2C模块化头文件函数程序主要包括I2C起始信号程序,即在SCL高电平期间,SDA产生一个由高到低的下降沿;数据传输函数,I2C协议的数据传输是按照高位在前低位在后的顺序传输;以及停止信号,即SCL在高电平期间,SDA由低电平向高电平变化产生一个上升沿。PCF8591将光敏电阻值读出来转换成数字量,将光照度显示在液晶上,转换代码函数主要调用“i2c_start();” I2C初始化、“i2c_sendbyte(0x91);”寻址PCF8591和“temp = i2c_receivebyte();”读取转换数值函数,最后通过语句“return temp;”返回要显示的温度值。
因为电机功耗比较大,所以用驱动芯片为电机提供较大电流,步进电机的A、B、C、D四相通过驱动ULN2003分别与单片机的P1^0、P1^1、P1^2和P1^3依次相连,并采用双四拍模式工作。当窗帘闭合时,步进电机的AB、BC、CD、DA相依次导通,达到霍尔传感器控制下限位移时电机停转;当窗帘开启时,步进电机的DA、CD、BC、AB相依次导通,达到霍尔传感器控制上限位移时,电机停转。可见,通过控制电机正反转动来控制窗帘开启与闭合状态,并由霍尔传感器限定窗帘位移的极限[6]。主要在“void T0_time() interrupt 1”定时器T0中断函数里实现该功能。
窗帘状态和相关参数用LCD12864液晶显示,液晶显示模块主要包括写指令、写数据和初始化子函数。以时间显示为例,时间显示在液晶的第三行第一列,主要包括写指令和写数据代码,读写指令时,发送数据分高四位、第四位两次发送,通过语句“send_byte(0xf0&com);”(高四位)、“send_byte(0xf0&com<<4);”(第四位)实现。
编程实现第一行汉字显示从0X80地址开始,第二行从0X90,第三行从0X88,第四行从0X98地址开始,声明时依次定义汉字位置地址,当显示汉字不再变化时,定义时加关键字“code”,存储在flash里。液晶的5脚读/写位接单片机P2^0引脚,3脚在模块上接电位器调整背光,6脚E使能引脚接P2^1引脚,因为采用串口方式编写程序[7],所以15脚PSB接地,19脚背光源正端接智能窗帘系统电源VCC,20脚背光源负端接地GND。
PCF8591的14脚接智能窗帘系统5V电源,电路扩展时,可以给PCF8591的AIN0,AIN1,AIN2分别接入湿度传感器、烟雾传感器和气敏传感器等传感器,输入的模拟量通过PCF8951AD采集转换送给单片机,设定阈值,超过阈值时,窗帘“开启”或“闭合”,设计思路与光敏电阻采集光照度类似[8],A/D转换电路图,如图2所示。
图2 PCF8591A/D转换模块电路图
步进电机控制窗帘原理图如图3所示。
图3 步进电机控制窗帘原理图
步进电机的四相“ABCD”分别于单片机的“P1^0、P1^1、P1^2和P1^3”端口依次相连,通过电机的转反转编程实现窗帘的开启与闭合,上限位霍尔传感器和下限位霍尔传感器分别与单片机的“P0^5”和“P0^4”相连接,编程实现当窗帘打开时,设置霍尔传感器上限开关阈值,电机正转窗帘开启;当窗帘闭合时,设置下限开关阈值,电机反转窗帘关闭;除开启和闭合以外,则电机停转维持原状态不变,多次用“if…else”语句来编写判断电机转动程序。
实物制作如图4所示。
图4 智能窗帘实物制作
系统电源采用手机充电器数据线接入USB端口供电,同时在电路板背面装配电池盒,以备在不插电时由电池供电保证智能窗帘的正常运行;DS1302时钟芯片的2脚和3脚接32.768KHz的晶振,给DS1302提供一个时间基准;PCF8591AD模块通过跳线帽给电路扩展预留了端口;4个按键开关从左到右依次是菜单键、菜单功能键、减一键和加一键,菜单键里可以选择“窗帘打开时间”、“窗帘关闭时间”、“光线设定”、“窗帘状态”和“时间调整”,然后按菜单功能键,结合加减键,选择调时间阈值和光照度的阈值,采集到的值和阈值进行比较[9],达到条件时,由电机带动窗帘进行动作并在液晶上显示状态,由于液晶采自带字库,所以编程时直接将要显示的汉字直接赋给数组的地址即可显示相应的汉字和字符。
基于STC12C5A60S2单片机的智能窗帘系统设计,通过电机正反转来控制窗帘的升降,霍尔传感器控制窗帘的行程,可以手动设置光照度阈值和定时时间,利用PCF8591AD转换器采集模拟量送给单片机自动控制窗帘的开启和闭合模式[10]。该系统可移植性强、易于扩展、实施方便,具有较高的商业推广和实际应用价值。