当前位置:文档之家› 基于51单片机的蓝牙智能光控窗帘

基于51单片机的蓝牙智能光控窗帘

基于51单片机的蓝牙智能光控窗帘一、设计思路系统选用 STC12C5A60S2 作为主控芯片,用以完成对系统执行机构的控制、信息处理和液晶显示。

单片机控制直流减速电机实现窗帘、窗户的控制。

光照强度、温湿度信号均通过无线蓝牙模块传输至单片机,经处理后实现电机对窗户、窗帘的自动控制。

根据设计方案和要求,可将电路分为 5 部分,分别为无线蓝牙遥控,传感器数据采集,电机驱动控制,单片机主控和电源部分。

此方案控制采用51单片机的最小系统来驱动步进电动机控制窗户和窗帘的拉开和关闭。

家居推拉窗及窗帘控制系统可以利用蓝牙无线模块根据室外环境亮度实现环境亮度光控。

以及光控状态下环境亮度的控制参数的调整等等。

该控制设计可谓是一款多功能的推拉窗及窗帘控制系统设计方案。

系统软件设计框图如下:1.光强度传感器 BH1750FVI不区分光源数字型环境光强度传感器BH1750FVI是日本RHOM株式会社近些年推出的一种两线式串行总线接口的集成电路,可以根据收集的光线强度数据来进行环境监测,其具有1~65535x的高分辨率,可支持较大范围的光照强度变化。

BH1750FVI结构框图如图1所示。

图1 BH1750FVI结构框图从结构框图可容易看出,外部光照被接近人眼反应的高精度光敏二极管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~7 V 电压。

4 脚VS 接电源电压,VS 电压范围VIH 为+2.5~46 V。

输出电流可达2 A,可驱动电感性负载。

1 脚和15 脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。

L298 可驱动2 个电动机,OUT1,OUT2 和OUT3,OUT4 之间可分别接电动机,本实验装置我们选用驱动一台电动机。

5,7,10,12 脚接输入控制电平,控制电机的正反转。

EnA,EnB 接控制使能端,控制电机的停转。

表1 是L298N 功能逻辑图。

L298N <wbr>驱动模块的应用In3,In4 的逻辑图与表1 相同。

由表1 可知EnA 为低电平时,输入电平对电机控制起作用,当EnA 为高电平,输入电平为一高一低,电机正或反转。

同为低电平电机停止,同为高电平电机刹停。

L298N 控制器原理如下:三、控制软件流程图(多个)1.传感器控制程序凡是利用一定的物性(物理、化学、生物)法则、定理、定律、效应等进行能量转换与信息转换,并且输出与输入严格一一对应的器件和装置均可称为传感器;传感器又被称为变换器、转换器、检测器、敏感元件、换能器和一次仪表等。

传感器一般由敏感元件、转换元件和测量电路三部分组成,有时还加上辅助电源。

系统中的传感器是感受被测量的大小并输出相对应的可用输出信号的器件或装置。

数据传输环节用来传输数据。

当检测系统的几个功能环节独立地分隔开的时候,则必须由一个地方向另一个地方传输数据,数据传输环节就是完成这种传输功能。

2. 中断控制程序当传感器模块传来的数据并判断正确时,则中断程序对T1口进行初始化,进而接收来自两个模块的新数据,比较判断后传到命令地址进而对电机进行驱动和通过显示器显示出来。

开始串口中断初始化T1数据传送到命令置回归标志位中断返回是否有数据NY中断控制程序3. 电机驱动程序步进电机执行来自控制器的命令,判断其命令是否正确,若不正确则返回,若正确则继续执行命令,比较做出相应的动作,当窗帘及推拉窗到达指定的位置时停止,器流程图如下。

四、主要程序的指令:附录一:蓝牙无线模块附录二:DHT11数字温湿度传感器附录三:光强度传感器BH1750附录一:蓝牙无线模块:修改at:#include <SoftwareSerial.h> // 引用程式庫SoftwareSerial BT(8, 9); // 接收腳, 傳送腳char val; // 儲存接收資料的變數void setup() {Serial.begin(9600); // 與電腦序列埠連線Serial.println("BT is ready!");// 設定藍牙模組的連線速率BT.begin(9600);}void loop() {// 若收到「序列埠監控視窗」的資料,則送到藍牙模組if (Serial.available()) {val = Serial.read();BT.print(val);}// 若收到藍牙模組的資料,則送到「序列埠監控視窗」if (BT.available()) {val = BT.read();Serial.print(val);}}从机:void setup(){Serial.begin(9600);}void loop(){while(Serial.available()){char c=Serial.read();if(c=='A'){Serial.println("Hello I am amarino");}}}主机:void setup(){Serial.begin(9600);}void loop(){Serial.println('A'); // 发送Awhile(1);}附录二:DHT11数字温湿度传感器:U8 code table2[]=" wendu shidu "; U8 code table3[]=" . . ";sbit RS=P2^6;sbit RW=P2^5;sbit E=P2^7;void write_com(U8 com){E=0;RS=0;RW=0;Delay(5);E=1;P0=com;E=0;}void write_date(U8 date){E=0;RS=1;RW=0;Delay(5);E=1;P0=date;E=0;P0=0;}void init(){U8 num;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);}}void write_dht11(U8 add,U8 date){U8 shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}/***********************dht11.h***************************/typedef unsigned char U8;typedef unsigned int U16;sbit P1_0 = P2^0 ;U8 U8FLAG,k;U8 U8temp;U8 U8T_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,U8c heckdata_temp;U8 U8comdata;void Delay(U16 z){U8 x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay_10us(){U8 i;i--;i--;i--;i--;i--;i--;}void COM(void) //数据0 1确认{U8 i;for(i=0;i<8;i++){U8FLAG=2;while((!P1_0)&&U8FLAG++); //1bit是否结束delay_10us();delay_10us();delay_10us();U8temp=0;// 26us~28us 表示为0if(P1_0)U8temp=1; // 超过28us依然为高电平表示为1U8FLAG=2;while((P1_0)&&U8FLAG++);if(U8FLAG==1)break;//U8FLAG溢出超时则跳出for循环//判断数据位是0还是1// 如果高电平高过预定0高电平值则数据位为1U8comdata<<=1;U8comdata|=U8temp;}}void RH(void) //-----湿温度读取子程序------------{P1_0=0;Delay(34); //主机拉低高于18msP1_0=1;//总线由上拉电阻拉高主机延时20usdelay_10us();delay_10us();delay_10us();delay_10us();P1_0=1;//主机设为输入判断从机响应信号if(!P1_0)//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行{U8FLAG=2;while((!P1_0)&&U8FLAG++);//判断从机是否发出80us 的低电平响应信号是否结束U8FLAG=2;while((P1_0)&&U8FLAG++);//判断从机是否发出80us 的高电平,如发出则进入数据接收状态COM();//数据接收状态U8RH_data_H_temp=U8comdata; //湿度整数8位COM();U8RH_data_L_temp=U8comdata; //湿度小数8位COM();U8T_data_H_temp=U8comdata; //温度整数8位COM();U8T_data_L_temp=U8comdata; //温度小数8位COM();U8checkdata_temp=U8comdata; //校验位P1_0=1;U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data _L_temp);if(U8temp==U8checkdata_temp) //数据校验正确执行{U8RH_data_H=U8RH_data_H_temp;U8RH_data_L=U8RH_data_L_temp;U8T_data_H=U8T_data_H_temp;U8T_data_L=U8T_data_L_temp;U8checkdata=U8checkdata_temp;}}}/***********************main.c***************************/#include <reg52.h>#include <LCD1602.h>U16 a,b,t;U8 flag,i;void main(){RW=1;t=0;flag=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;init();P1_0=1;P2=0xff;Delay(40);while(1){RH();write_dht11(0,U8T_data_H);write_dht11(3,U8T_data_L);write_dht11(9,U8RH_data_H);write_dht11(12,U8RH_data_L);if(flag==2)//100后flag为2,进行比较{if(a==U8T_data_H&&b==U8RH_data_H)Buzzer=0;while(a==U8T_data_H&&b==U8RH_data_H);flag=0;}test();}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t++;if(t==2000)//100秒检测一次{t=0;flag=2;//100秒后flag为2 }if(flag==0)//最开始flag为0 赋值{a=U8T_data_H;b=U8RH_data_H;flag=1;//flag变化}}附录三:光强度传感器BH1750://使用时,用户只需更改GPIO_Pin_14、GPIO_Pin_15这两个引脚,并在主函数里面调用此函数即可。

相关主题