找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2278|回复: 3
收起左侧

使用单片机+bh1750FVI光强传感控制灯的开关程序

[复制链接]
ID:523178 发表于 2020-5-4 18:03 | 显示全部楼层 |阅读模式
给GY-30数字光强测量传感器写了一个驱动,根据IIC通信协议和GY-30的数据手册编写,期间一个问题缠绕我许久:每次接收完数据时,主机向从机发送一个ACK,很必要,要不然测出的数据不准确。我把测出的数据显示在了LCD1602上,并且可以根据光强值来控制灯的开关。后续我会推出控制灯的亮度的设计。数据手册和代码献上。
IMG20200504174044.jpg

单片机源程序如下:
  1. #include "lcd.h"
  2. #include "BH1750FVI.h"

  3. uchar brach[] = {"Lighty Intensity"};
  4. uchar str[] = {"Lx"};
  5. uint dat;
  6. float Light_intensity = 0.0f;
  7. uchar Wr, Qr, Br, Sr, Gr;       //光强值的万位,千位,百位,十位,个位
  8. //uchar respond =0;                                //IIC调试用

  9. sbit Light = P2^2;

  10. void delay_ms(unsigned int k)
  11. {
  12.         unsigned int i, j;
  13.         for(i = 0; i < k; i++)
  14.         {
  15.                  for(j = 0; j < 121; j++);
  16.         }
  17. }

  18. void Sys_Init(void)
  19. {
  20.         Light = 1;
  21.         LcdInit();
  22.         BH1750_Init();
  23. }

  24. void Set_BH1750(void)
  25. {
  26.         WriteData_to_BH1750(0x01);
  27. //        respond = c;
  28.         WriteData_to_BH1750(0x10);  //设置为高分辨率模式
  29. //        respond        += 0x30;
  30.         delay_ms(180);
  31. }
  32. void datapros(uint Light_intensity)
  33. {
  34.         Wr = Light_intensity / 10000;
  35.         Wr = Wr + 0x30;
  36.         Qr = Light_intensity % 10000 / 1000;
  37.         Qr = Qr + 0x30;
  38.         Br = Light_intensity % 1000 / 100;
  39.         Br = Br + 0x30;
  40.         Sr = Light_intensity % 100 / 10;
  41.         Sr = Sr + 0x30;
  42.         Gr = Light_intensity % 10;
  43.         Gr = Gr + 0x30;       
  44. }
  45. void main(void)
  46. {
  47.         Sys_Init();
  48.         while(1)
  49.         {
  50.                  LcdShowStr(0,0,brach);
  51.                 Set_BH1750();
  52. //                DisplayOneChar(12,1,respond);   IIC调试用
  53.                 RecvData_f_BH1750();          //连续读数据
  54.                 dat = buff[0];
  55.                 dat = (dat << 8) | buff[1];

  56.                 Light_intensity = (float)dat / 1.2;
  57.                 datapros(Light_intensity);    //数据处理
  58.                 DisplayOneChar(3,1,Wr);
  59.                 DisplayOneChar(4,1,Qr);
  60.                 DisplayOneChar(5,1,Br);
  61.                 DisplayOneChar(6,1,Sr);
  62.                 DisplayOneChar(7,1,Gr);

  63.                 LcdShowStr(9,1,str);

  64.                 if(Light_intensity <= 20)
  65.                         Light = 0;
  66.                 else
  67.                         Light = 1;
  68.         }
  69. }
复制代码

所有资料51hei提供下载:
数字光强测量计.rar (40.75 KB, 下载次数: 27)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:523178 发表于 2020-5-10 20:24 | 显示全部楼层
实际测试中出现了失误,最大值只测到54612lx,究其原因是换算公式中:Lighty_intensity = (float)dat / 1.2;
回复

使用道具 举报

ID:523178 发表于 2020-5-10 20:25 | 显示全部楼层
将1.2 改为1.0即可
回复

使用道具 举报

ID:523178 发表于 2020-5-10 20:26 | 显示全部楼层
实际测试中出现了错误,最大值为65535,但只能测到54612lx,究其原因是换算公式有问题:Lighty_intensity = (float)dat / 1.2; 将1.2改为1.0或者删除即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表