自动窗帘 光照传感器 红外控制 51单片机
自动控制窗帘普及
随着科技的进步,我们的日常生活中出现了各种各样的电子产品,给我们带来方便和乐趣,就连窗帘都实现了电动化、智能化,使得生活变得更加便捷。电动窗帘的出现能够省去很多麻烦,它目前已经出现在不少家庭当中。那么电动窗帘到底是什么?
自动窗帘工作原理
电动窗帘是指通过主控制器遥控开启或关闭的窗帘。要想知道电动窗帘原理,首先必须认识它的构造,最主要的就是有电机、滑轮和皮带,其实电动窗帘就是依靠电机来带动窗帘沿着轨道进行运动,家用电动窗帘设计,简单来说就是通过机械装置转动帘子或百叶窗来控制的。
遥控控制,通过遥控来控制电动窗帘,其实所谓的遥控就是这个窗帘的一个控制器,它能够控制窗帘电机的正反转。
自动窗帘优势展望
谈到电动窗帘的优势,其智能化优势尤为突出。电动窗帘系统定时控制器能预先在24小时内进行多次自动开启与关闭的设置。如遇您外出,电动窗帘系统会按照您的习惯在每天同一时间自动开启及关闭窗帘,确保安全。另外,通过电动窗帘系统专用遥控器及专用位置码接受器一并设定,设备能单独或同时控制不同的电动窗帘系统。
制作自动窗帘主要硬件
1、直流减速电机
2、电机驱动
3、光照传感器
制作完成的实物,图上标注出每个部件的名称
安装的光照传感器
电机驱动模块,可以驱动4个电机
具有红外遥控控制功能,实现手动和自动切换
窗帘机械机构部分,
带有窗帘限位开关,避免窗帘出现意外
控制状态和信息显示
单独光照传感器原理图
单独光照传感器程序
- #include
- #include //Keil library
- #include //Keil library
- #include
- #define uchar unsigned char
- #define uint unsigned int
- #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
- //ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
- ***it SCL=P1^0; //IIC时钟引脚定义
- ***it SDA=P1^1; //IIC数据引脚定义
- typedef unsigned char BYTE;
- typedef unsigned short WORD;
- BYTE BUF[8]; //接收数据缓存区
- uchar ge,shi,bai,qian,wan; //显示变量
- int dis_data; //变量
- void delay_nms(unsigned int k);
- void Init_BH1750(void);
- void conversion(uint temp_data);
- void Single_Write_BH1750(uchar REG_Address); //单个写入数据
- uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
- void Multiple_Read_BH1750(); //连续的读取内部寄存器数据
- //------------------------------------
- void Delay5us();
- void Delay5ms();
- void BH1750_Start(); //起始信号
- void BH1750_Stop(); //停止信号
- void BH1750_SendACK(bit ack); //应答ACK
- bit BH1750_RecvACK(); //读ack
- void BH1750_SendByte(BYTE dat); //IIC单个字节写
- BYTE BH1750_RecvByte(); //IIC单个字节读
- //-----------------------------------
- //*********************************************************
- void conversion(uint temp_data) // 数据转换出 个,十,百,千,万
- {
- wan=temp_data/10000+0x30 ;
- temp_data=temp_data%10000; //取余运算
- qian=temp_data/1000+0x30 ;
- temp_data=temp_data%1000; //取余运算
- bai=temp_data/100+0x30 ;
- temp_data=temp_data%100; //取余运算
- shi=temp_data/10+0x30 ;
- temp_data=temp_data%10; //取余运算
- ge=temp_data+0x30;
- }
- //毫秒延时**************************
- void delay_nms(unsigned int k)
- {
- unsigned int i,j;
- for(i=0;i
- {
- for(j=0;j<121;j++)
- {;}}
- }
- /**************************************
- 延时5毫秒(STC90C52RC@12M)
- 不同的工作环境,需要调整此函数
- 当改用1T的MCU时,请调整此延时函数
- **************************************/
- void Delay5ms()
- {
- WORD n = 560;
- while (n--);
- }
- /**************************************
- 延时5微秒(STC90C52RC@12M)
- 不同的工作环境,需要调整此函数,注意时钟过快时需要修改
- 当改用1T的MCU时,请调整此延时函数
- **************************************/
- void Delay5us()
- {
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- }
- /**************************************
- 起始信号
- **************************************/
- void BH1750_Start()
- {
- SDA = 1; //拉高数据线
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- SDA = 0; //产生下降沿
- Delay5us(); //延时
- SCL = 0; //拉低时钟线
- }
- /**************************************
- 停止信号
- **************************************/
- void BH1750_Stop()
- {
- SDA = 0; //拉低数据线
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- SDA = 1; //产生上升沿
- Delay5us(); //延时
- }
- /**************************************
- 发送应答信号
- 入口参数:ack (0:ACK 1:NAK)
- **************************************/
- void BH1750_SendACK(bit ack)
- {
- SDA = ack; //写应答信号
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- SCL = 0; //拉低时钟线
- Delay5us(); //延时
- }
- /**************************************
- 接收应答信号
- **************************************/
- bit BH1750_RecvACK()
- {
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- CY = SDA; //读应答信号
- SCL = 0; //拉低时钟线
- Delay5us(); //延时
- return CY;
- }
- /**************************************
- 向IIC总线发送一个字节数据
- **************************************/
- void BH1750_SendByte(BYTE dat)
- {
- BYTE i;
- for (i=0; i<8; i++) //8位计数器
- {
- dat <<= 1; //移出数据的最高位
- SDA = CY; //送数据口
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- SCL = 0; //拉低时钟线
- Delay5us(); //延时
- }
- BH1750_RecvACK();
- }
- /**************************************
- 从IIC总线接收一个字节数据
- **************************************/
- BYTE BH1750_RecvByte()
- {
- BYTE i;
- BYTE dat = 0;
- SDA = 1; //使能内部上拉,准备读取数据,
- for (i=0; i<8; i++) //8位计数器
- {
- dat <<= 1;
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- dat |= SDA; //读数据
- SCL = 0; //拉低时钟线
- Delay5us(); //延时
- }
- return dat;
- }
- //*********************************
- void Single_Write_BH1750(uchar REG_Address)
- {
- BH1750_Start(); //起始信号
- BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
- BH1750_SendByte(REG_Address); //内部寄存器地址,
- // BH1750_SendByte(REG_data); //内部寄存器数据,
- BH1750_Stop(); //发送停止信号
- }
- //********单字节读取*****************************************
- /*
- uchar Single_Read_BH1750(uchar REG_Address)
- { uchar REG_data;
- BH1750_Start(); //起始信号
- BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
- BH1750_SendByte(REG_Address); //发送存储单元地址,从0开始
- BH1750_Start(); //起始信号
- BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
- REG_data=BH1750_RecvByte(); //读出寄存器数据
- BH1750_SendACK(1);
- BH1750_Stop(); //停止信号
- return REG_data;
- }
- */
- //*********************************************************
- //
- //连续读出BH1750内部数据
- //
- //*********************************************************
- void Multiple_read_BH1750(void)
- { uchar i;
- BH1750_Start(); //起始信号
- BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
-
- for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
- {
- BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
- if (i == 3)
- {
- BH1750_SendACK(1); //最后一个数据需要回NOACK
- }
- else
- {
- BH1750_SendACK(0); //回应ACK
- }
- }
- BH1750_Stop(); //停止信号
- Delay5ms();
- }
- //初始化BH1750,根据需要请参考pdf进行修改****
- void Init_BH1750()
- {
- Single_Write_BH1750(0x01);
- }
- void uart_init()
- {
- TMOD=0x20; //TMOD=0
- TH1=0xf3; //12MHZ ,BPS:4800,N,8,1,0xf3=243
- TL1=0xf3;
- PCON=0x80; //方式一,8位数据位,一位起始位和一位结束位
- TR1=1; //
- SCON=0x40; //串口通信控制寄存器 模式一
-
- }
- void uart_putchar(unsigned char dat)
- {
- SBUF=dat; //把数据送给***uf缓存器中
- while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环
- TI=0; //到了,TI清为0
-
- }
- void uart_printf(unsigned char *buff)
- {
- while(*buff)
- uart_putchar(*buff++);
- }
- //*********************************************************
- //主程序********
- //*********************************************************
- void main()
- {
- float temp;
- unsigned char str[5];
- //delay_nms(100); //延时100ms
- uart_init();
- Init_BH1750(); //初始化BH1750
- while(1) //循环
- {
- Single_Write_BH1750(0x01); // power on
- Single_Write_BH1750(0x10); // H- resolution mode
- delay_nms(180); //延时180ms
- Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
- temp=(float)dis_data/1.2;
- conversion(temp); //计算数据和显示
- str[0]=wan;
- str[1]=qian;
- str[2]=bai;
- str[3]=shi;
- str[4]=ge;
- uart_printf("light:");
- uart_printf(str);
- uart_printf(" lxrn");
-
- }
- }
回帖(3)
2020-2-27 21:53:29
压差式行程开关不如霍尔式寿命长
压差式行程开关不如霍尔式寿命长
2
举报
2020-5-6 15:51:27
学习学习!!!!!!!!!!!
学习学习!!!!!!!!!!!
举报
2021-7-12 20:26:54
学习!!!!!!!
学习!!!!!!!
举报
更多回帖