单片机/MCU论坛
直播中

小猫猫爱吃鱼

5年用户 118经验值
擅长:可编程逻辑 光电显示 控制/MCU
私信 关注
[资料]

多功能自动控制窗帘(光照检测、红外控制等)

自动控制窗帘普及
      随着科技的进步,我们的日常生活中出现了各种各样的电子产品,给我们带来方便和乐趣,就连窗帘都实现了电动化、智能化,使得生活变得更加便捷。电动窗帘的出现能够省去很多麻烦,它目前已经出现在不少家庭当中。那么电动窗帘到底是什么?

自动窗帘工作原理
电动窗帘是指通过主控制器遥控开启或关闭的窗帘。要想知道电动窗帘原理,首先必须认识它的构造,最主要的就是有电机、滑轮和皮带,其实电动窗帘就是依靠电机来带动窗帘沿着轨道进行运动,家用电动窗帘设计,简单来说就是通过机械装置转动帘子或百叶窗来控制的。
遥控控制,通过遥控来控制电动窗帘,其实所谓的遥控就是这个窗帘的一个控制器,它能够控制窗帘电机的正反转。

自动窗帘优势展望
谈到电动窗帘的优势,其智能化优势尤为突出。电动窗帘系统定时控制器能预先在24小时内进行多次自动开启与关闭的设置。如遇您外出,电动窗帘系统会按照您的习惯在每天同一时间自动开启及关闭窗帘,确保安全。另外,通过电动窗帘系统专用遥控器及专用位置码接受器一并设定,设备能单独或同时控制不同的电动窗帘系统。

制作自动窗帘主要硬件
1、直流减速电机


2、电机驱动
007.jpg
3、光照传感器

制作完成的实物,图上标注出每个部件的名称
安装的光照传感器

电机驱动模块,可以驱动4个电机

具有红外遥控控制功能,实现手动和自动切换

窗帘机械机构部分,

带有窗帘限位开关,避免窗帘出现意外

控制状态和信息显示


单独光照传感器原理图
光感模块连接图.jpg
单独光照传感器程序
  1. #include         
  2. #include      //Keil library  
  3. #include     //Keil library       
  4. #include  
  5. #define   uchar unsigned char
  6. #define   uint unsigned int       
  7. #define         SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  8.                       //ALT  ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
  9. ***it         SCL=P1^0;      //IIC时钟引脚定义
  10. ***it  SDA=P1^1;      //IIC数据引脚定义
  11. typedef   unsigned char BYTE;
  12. typedef   unsigned short WORD;

  13. BYTE    BUF[8];                     //接收数据缓存区             
  14. uchar   ge,shi,bai,qian,wan;            //显示变量
  15. int     dis_data;                   //变量

  16. void delay_nms(unsigned int k);
  17. void Init_BH1750(void);
  18. void conversion(uint temp_data);
  19. void  Single_Write_BH1750(uchar REG_Address);               //单个写入数据
  20. uchar Single_Read_BH1750(uchar REG_Address);                //单个读取内部寄存器数据
  21. void  Multiple_Read_BH1750();                               //连续的读取内部寄存器数据
  22. //------------------------------------
  23. void Delay5us();
  24. void Delay5ms();
  25. void BH1750_Start();                    //起始信号
  26. void BH1750_Stop();                     //停止信号
  27. void BH1750_SendACK(bit ack);           //应答ACK
  28. bit  BH1750_RecvACK();                  //读ack
  29. void BH1750_SendByte(BYTE dat);         //IIC单个字节写
  30. BYTE BH1750_RecvByte();                 //IIC单个字节读

  31. //-----------------------------------

  32. //*********************************************************
  33. void conversion(uint temp_data)  //  数据转换出 个,十,百,千,万
  34. {  
  35.     wan=temp_data/10000+0x30 ;
  36.     temp_data=temp_data%10000;   //取余运算
  37.         qian=temp_data/1000+0x30 ;
  38.     temp_data=temp_data%1000;    //取余运算
  39.     bai=temp_data/100+0x30   ;
  40.     temp_data=temp_data%100;     //取余运算
  41.     shi=temp_data/10+0x30    ;
  42.     temp_data=temp_data%10;      //取余运算
  43.     ge=temp_data+0x30;        
  44. }

  45. //毫秒延时**************************
  46. void delay_nms(unsigned int k)       
  47. {                                               
  48. unsigned int i,j;                               
  49. for(i=0;i
  50. {                       
  51. for(j=0;j<121;j++)                       
  52. {;}}                                               
  53. }

  54. /**************************************
  55. 延时5毫秒(STC90C52RC@12M)
  56. 不同的工作环境,需要调整此函数
  57. 当改用1T的MCU时,请调整此延时函数
  58. **************************************/
  59. void Delay5ms()
  60. {
  61.     WORD n = 560;

  62.     while (n--);
  63. }
  64. /**************************************
  65. 延时5微秒(STC90C52RC@12M)
  66. 不同的工作环境,需要调整此函数,注意时钟过快时需要修改
  67. 当改用1T的MCU时,请调整此延时函数
  68. **************************************/
  69. void Delay5us()
  70. {
  71.     _nop_();_nop_();_nop_();_nop_();
  72.     _nop_();_nop_();_nop_();_nop_();
  73.         _nop_();_nop_();_nop_();_nop_();
  74.         _nop_();_nop_();_nop_();_nop_();
  75. }

  76. /**************************************
  77. 起始信号
  78. **************************************/
  79. void BH1750_Start()
  80. {
  81.     SDA = 1;                    //拉高数据线
  82.     SCL = 1;                    //拉高时钟线
  83.     Delay5us();                 //延时
  84.     SDA = 0;                    //产生下降沿
  85.     Delay5us();                 //延时
  86.     SCL = 0;                    //拉低时钟线
  87. }

  88. /**************************************
  89. 停止信号
  90. **************************************/
  91. void BH1750_Stop()
  92. {
  93.     SDA = 0;                    //拉低数据线
  94.     SCL = 1;                    //拉高时钟线
  95.     Delay5us();                 //延时
  96.     SDA = 1;                    //产生上升沿
  97.     Delay5us();                 //延时
  98. }

  99. /**************************************
  100. 发送应答信号
  101. 入口参数:ack (0:ACK 1:NAK)
  102. **************************************/
  103. void BH1750_SendACK(bit ack)
  104. {
  105.     SDA = ack;                  //写应答信号
  106.     SCL = 1;                    //拉高时钟线
  107.     Delay5us();                 //延时
  108.     SCL = 0;                    //拉低时钟线
  109.     Delay5us();                 //延时
  110. }

  111. /**************************************
  112. 接收应答信号
  113. **************************************/
  114. bit BH1750_RecvACK()
  115. {
  116.     SCL = 1;                    //拉高时钟线
  117.     Delay5us();                 //延时
  118.     CY = SDA;                   //读应答信号
  119.     SCL = 0;                    //拉低时钟线
  120.     Delay5us();                 //延时

  121.     return CY;
  122. }

  123. /**************************************
  124. 向IIC总线发送一个字节数据
  125. **************************************/
  126. void BH1750_SendByte(BYTE dat)
  127. {
  128.     BYTE i;

  129.     for (i=0; i<8; i++)         //8位计数器
  130.     {
  131.         dat <<= 1;              //移出数据的最高位
  132.         SDA = CY;               //送数据口
  133.         SCL = 1;                //拉高时钟线
  134.         Delay5us();             //延时
  135.         SCL = 0;                //拉低时钟线
  136.         Delay5us();             //延时
  137.     }
  138.     BH1750_RecvACK();
  139. }

  140. /**************************************
  141. 从IIC总线接收一个字节数据
  142. **************************************/
  143. BYTE BH1750_RecvByte()
  144. {
  145.     BYTE i;
  146.     BYTE dat = 0;

  147.     SDA = 1;                    //使能内部上拉,准备读取数据,
  148.     for (i=0; i<8; i++)         //8位计数器
  149.     {
  150.         dat <<= 1;
  151.         SCL = 1;                //拉高时钟线
  152.         Delay5us();             //延时
  153.         dat |= SDA;             //读数据               
  154.         SCL = 0;                //拉低时钟线
  155.         Delay5us();             //延时
  156.     }
  157.     return dat;
  158. }

  159. //*********************************

  160. void Single_Write_BH1750(uchar REG_Address)
  161. {
  162.     BH1750_Start();                  //起始信号
  163.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
  164.     BH1750_SendByte(REG_Address);    //内部寄存器地址,
  165.   //  BH1750_SendByte(REG_data);       //内部寄存器数据,
  166.     BH1750_Stop();                   //发送停止信号
  167. }

  168. //********单字节读取*****************************************
  169. /*
  170. uchar Single_Read_BH1750(uchar REG_Address)
  171. {  uchar REG_data;
  172.     BH1750_Start();                          //起始信号
  173.     BH1750_SendByte(SlaveAddress);           //发送设备地址+写信号
  174.     BH1750_SendByte(REG_Address);                   //发送存储单元地址,从0开始       
  175.     BH1750_Start();                          //起始信号
  176.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  177.     REG_data=BH1750_RecvByte();              //读出寄存器数据
  178.         BH1750_SendACK(1);   
  179.         BH1750_Stop();                           //停止信号
  180.     return REG_data;
  181. }
  182. */
  183. //*********************************************************
  184. //
  185. //连续读出BH1750内部数据
  186. //
  187. //*********************************************************
  188. void Multiple_read_BH1750(void)
  189. {   uchar i;       
  190.     BH1750_Start();                          //起始信号
  191.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  192.        
  193.         for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF
  194.     {
  195.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  196.         if (i == 3)
  197.         {

  198.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
  199.         }
  200.         else
  201.         {               
  202.           BH1750_SendACK(0);                //回应ACK
  203.        }
  204.    }

  205.     BH1750_Stop();                          //停止信号
  206.     Delay5ms();
  207. }


  208. //初始化BH1750,根据需要请参考pdf进行修改****
  209. void Init_BH1750()
  210. {
  211.    Single_Write_BH1750(0x01);  

  212. }
  213. void uart_init()
  214. {
  215.    TMOD=0x20;     //TMOD=0
  216.    TH1=0xf3;      //12MHZ   ,BPS:4800,N,8,1,0xf3=243
  217.    TL1=0xf3;
  218.    PCON=0x80;     //方式一,8位数据位,一位起始位和一位结束位
  219.    TR1=1;         //
  220.    SCON=0x40;     //串口通信控制寄存器  模式一
  221.        
  222. }
  223. void uart_putchar(unsigned char dat)
  224. {
  225.         SBUF=dat; //把数据送给***uf缓存器中
  226.         while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环
  227.         TI=0;  //到了,TI清为0

  228.        
  229. }
  230. void uart_printf(unsigned char *buff)
  231. {

  232.         while(*buff)
  233.         uart_putchar(*buff++);
  234. }
  235. //*********************************************************
  236. //主程序********
  237. //*********************************************************
  238. void main()
  239. {  
  240.    float temp;
  241.    unsigned char str[5];
  242.    //delay_nms(100);           //延时100ms       

  243.    uart_init();
  244.    Init_BH1750();       //初始化BH1750

  245.   while(1)              //循环
  246.   {

  247.     Single_Write_BH1750(0x01);   // power on
  248.     Single_Write_BH1750(0x10);   // H- resolution mode
  249.     delay_nms(180);              //延时180ms
  250.     Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
  251.     dis_data=BUF[0];
  252.     dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
  253.     temp=(float)dis_data/1.2;
  254.     conversion(temp);         //计算数据和显示
  255.         str[0]=wan;
  256.         str[1]=qian;
  257.         str[2]=bai;
  258.         str[3]=shi;
  259.         str[4]=ge;
  260.         uart_printf("light:");
  261.         uart_printf(str);
  262.         uart_printf(" lxrn");
  263.             
  264.   }
  265. }



回帖(3)

王栋春

2020-2-27 21:53:29
压差式行程开关不如霍尔式寿命长
2 举报

afca

2020-5-6 15:51:27
学习学习!!!!!!!!!!!
举报

jf_51339201

2021-7-12 20:26:54
学习!!!!!!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分