基于51单片机的蓝牙智能光控窗帘.docx
《基于51单片机的蓝牙智能光控窗帘.docx》由会员分享,可在线阅读,更多相关《基于51单片机的蓝牙智能光控窗帘.docx(26页珍藏版)》请在冰豆网上搜索。
![基于51单片机的蓝牙智能光控窗帘.docx](https://file1.bdocx.com/fileroot1/2022-11/19/65ed245c-575d-4b69-b7b5-b85651dfe625/65ed245c-575d-4b69-b7b5-b85651dfe6251.gif)
基于51单片机的蓝牙智能光控窗帘
基于51单片机的蓝牙智能光控窗帘
一、设计思路
系统选用STC12C5A60S2作为主控芯片,用以完成对系统执行机构的控制、信息处理和液晶显示。
单片机控制直流减速电机实现窗帘、窗户的控制。
光照强度、温湿度信号均通过无线蓝牙模块传输至单片机,经处理后实现电机对窗户、窗帘的自动控制。
根据设计方案和要求,可将电路分为5部分,分别为无线蓝牙遥控,传感器数据采集,电机驱动控制,单片机主控和电源部分。
二、
系统结构
此方案控制采用51单片机的最小系统来驱动步进电动机控制窗户和窗帘的拉开和关闭。
家居推拉窗及窗帘控制系统可以利用蓝牙无线模块根据室外环境亮度实现环境亮度光控。
以及光控状态下环境亮度的控制参数的调整等等。
该控制设计可谓是一款多功能的推拉窗及窗帘控制系统设计方案。
系统软件设计框图如下:
1.光强度传感器BH1750FVI
不区分光源数字型环境光强度传感器BH1750FVI是日本RHOM株式会社近些年推出的一种两线式串行总线接口的集成电路,可以根据收集的光线强度数据来进行环境监测,其具有1~65535x的高分辨率,可支持较大范围的光照强度变化。
BH1750FVI结构框图如图1所示。
图1BH1750FVI结构框图
从结构框图可容易看出,外部光照被接近人眼反应的高精度光敏二极管PD探测到后,通过集成运算放大器将PD电流转换为PD电压,由模数转换器获取16位数字数据,然后被逻辑和IC界面进行数据处理与存储。
OSC为内部的振荡器提供内部逻辑时钟,通过相应的指令操作即可读取出内部存储的光照数据。
数据传输使用标准的I2C总线,按照时序要求操作起来也非常方便。
2.温湿传感器:
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个DHT11传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最正确选则。
产品为4针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
3.电机驱动
L298N的说明及应用
恒压恒流桥式2A驱动芯片L298NL298是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部同样包含4通道逻辑驱动电路。
可以方便的驱动两个直
流电机,或一个两相步进电机。
L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用
单片机的IO口提供信号;而且电路简单,使用比较方便。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。
4脚VS接电源电压,VS电压范围VIH为+2.5~46V。
输出电流可达2A,可驱动电感性负载。
1脚和15脚下管的发射极分别单独引出以
便接入电流采样电阻,形成电流传感信号。
L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。
5,7,10,12脚接输入控制电平,控制电机的正反转。
EnA,EnB接控制使能端,控制电机的停转。
表1是L298N功能逻辑图。
L298N驱动模块的应用In3,In4的逻辑图与表1相同。
由表1可知EnA为低电平时,输入电平对电机控制起作用,当EnA为高电平,输入电平为一高一低,电机
正或反转。
同为低电平电机停止,同为高电平电机刹停。
L298N控制器原理如下:
三、控制软件流程图〔多个〕
1.传感器控制程序
但凡利用一定的物性(物理、化学、生物)法则、定理、定律、效应等进行能量转换与信息转换,并且输出与输入严格一一对应的器件和装置均可称为传感器;传感器又被称为变换器、转换器、检测器、敏感元件、换能器和一次仪表等。
传感器一般由敏感元件、转换元件和测量电路三部分组成,有时还加上辅助电源。
系统中的传感器是感受被测量的大小并输出相对应的可用输出信号的器件或装置。
数据传输环节用来传输数据。
当检测系统的几个功能环节独立地分隔开的时候,则必须由一个地方向另一个地方传输数据,数据传输环节就是完成这种传输功能。
2.中断控制程序
当传感器模块传来的数据并判断正确时,则中断程序对T1口进行初始化,进而接收来自两个模块的新数据,比较判断后传到命令地址进而对电机进行驱动和通过显示器显示出来。
中断控制程序
3.电机驱动程序
步进电机执行来自控制器的命令,判断其命令是否正确,假设不正确则返回,假设正确则继续执行命令,比较做出相应的动作,当窗帘及推拉窗到达指定的位置时停止,器流程图如下。
四、主要程序的指令:
附录一:
蓝牙无线模块
附录二:
DHT11数字温湿度传感器
附录三:
光强度传感器BH1750
附录一:
蓝牙无线模块:
修改at:
#include//引用程式庫
SoftwareSerialBT(8,9);//接收腳,傳送腳
charval;//儲存接收資料的變數
voidsetup(){
Serial.begin(9600);//與電腦序列埠連線
Serial.println("BTisready!
");
//設定藍牙模組的連線速率
BT.begin(9600);
}
voidloop(){
//假设收到「序列埠監控視窗」的資料,則送到藍牙模組
if(Serial.available()){
val=Serial.read();
BT.print(val);
}
//假设收到藍牙模組的資料,則送到「序列埠監控視窗」
if(BT.available()){
val=BT.read();
Serial.print(val);
}
}
从机:
voidsetup()
{
Serial.begin(9600);
}
voidloop()
{
while(Serial.available())
{
charc=Serial.read();
if(c=='A')
{
Serial.println("HelloIamamarino");
}
}
}
主机:
voidsetup(){
Serial.begin(9600);
}
voidloop(){
Serial.println('A');//发送A
while
(1);
}
附录二:
DHT11数字温湿度传感器:
U8codetable2[]="wendushidu";
U8codetable3[]="..";
sbitRS=P2^6;
sbitRW=P2^5;
sbitE=P2^7;
voidwrite_com(U8com)
{
E=0;
RS=0;
RW=0;
Delay(5);
E=1;
P0=com;
E=0;
}
voidwrite_date(U8date)
{
E=0;
RS=1;
RW=0;
Delay(5);
E=1;
P0=date;
E=0;
P0=0;
}
voidinit()
{
U8num;
Delay(15);
write_com(0x38);
write_com(0x38);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
for(num=0;num<15;num++)
{
write_date(table2[num]);
Delay
(1);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table3[num]);
Delay
(1);
}
}
voidwrite_dht11(U8add,U8date)
{
U8shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
/***********************dht11.h***************************/
typedefunsignedcharU8;
typedefunsignedintU16;
sbitP1_0=P2^0;
U8U8FLAG,k;
U8U8temp;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8U8comdata;
voidDelay(U16z)
{
U8x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelay_10us()
{
U8i;
i--;
i--;
i--;
i--;
i--;
i--;
}
voidCOM(void)//数据01确认
{
U8i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!
P1_0)&&U8FLAG++);//1bit是否结束
delay_10us();
delay_10us();
delay_10us();
U8temp=0;//26us~28us表示为0
if(P1_0)U8temp=1;//超过28us依然为高电平表示为1
U8FLAG=2;
while((P1_0)&&U8FLAG++);
if(U8FLAG==1)break;//U8FLAG溢出超时则跳出for循环
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
U8comdata<<=1;
U8comdata|=U8temp;
}
}
voidRH(void)//-----湿温度读取子程序------------
{
P1_0=0;
Delay(34);//主机拉低高于18ms
P1_0=1;
//总线由上拉电阻拉高主机延时20us
delay_10us();
delay_10us();
delay_10us();
delay_10us();
P1_0=1;//主机设为输入判断从机响应信号
if(!
P1_0)