[活动专区] 【杰发科技AC7802x测评】+光照强度检测及显示

[复制链接]
2004|12
 楼主| jinglixixi 发表于 2023-7-19 00:31 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2023-7-19 00:36 编辑

#申请原创#
BH1750是一种用于光照强度检测的传感器,它相较于用光敏器件来检测光照强度具有集成度高,检测值无需自行标度的优点。
该传感器以I2C接口来工作,故十分节省引脚资源,这个装置的电路构成如图1所示。

1.jpg
图1光照强度检测电路

BH1750传感器与开发板的连接关系为:
SCL---PA1
SDA---PA0

所用引脚输出高低电平的引脚定义为:
#defineSDA_Set()    GPIO_SetPinLevel(GPIOA,GPIO_PIN0, GPIO_LEVEL_HIGH)
#defineSDA_Clr()    GPIO_SetPinLevel(GPIOA,GPIO_PIN0, GPIO_LEVEL_LOW)

#defineSCL_Set()    GPIO_SetPinLevel(GPIOA,GPIO_PIN1, GPIO_LEVEL_HIGH)
#defineSCL_Clr()    GPIO_SetPinLevel(GPIOA,GPIO_PIN1, GPIO_LEVEL_LOW)

数据语句读取引脚状态的语句定义为:
#defineIIC_SDA_IN   GPIO_GetPinLevel(GPIOA,GPIO_PIN0)

配置所用引脚的函数为:
  1. void BH1750_Init(void)
  2. {
  3.     GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN0);
  4.     GPIO_SetFunc(GPIOA, GPIO_PIN1, GPIO_FUN0);
  5.     GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_OUT);
  6.     GPIO_SetDir(GPIOA, GPIO_PIN1, GPIO_OUT);
  7. }

由于在检测过程中要进行数据的收发,故对引脚的工作模式要进行动态的切换,因此对于了设置输入、输出工作模式的函数,其内容如下:
  1. void IIC_INPUT_MODE_SET()
  2. {
  3.     GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN0);
  4.     GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_IN);
  5. }

  6. void IIC_OUTPUT_MODE_SET()
  7. {
  8.     GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN0);
  9.     GPIO_SetPullup(GPIOA, GPIO_PIN0, ENABLE);
  10.     GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_OUT);
  11. }

BH1750发送字节数据的函数为:
  1. void BH1750_SendByte(char data)
  2. {
  3.     char i;
  4.     IIC_OUTPUT_MODE_SET();
  5.     SCL_Clr();
  6.     udelay(1);
  7.     for (i=0;i<8;i++)
  8.     {
  9.         if(data&0x80) SDA_Set();
  10.         else SDA_Clr();
  11.         data <<= 1;
  12.         SCL_Set();
  13.         udelay(1);
  14.         SCL_Clr();
  15.         udelay(1);
  16.     }
  17. }

BH1750接收字节数据的函数为:
  1. char BH1750_RecvByte()
  2. {
  3.     char i;
  4.     char data = 0;
  5.     IIC_INPUT_MODE_SET();
  6.     for (i=0;i<8;i++)
  7.     {
  8.         SCL_Clr();
  9.         udelay(1);
  10.         SCL_Set();
  11.         data <<= 1;
  12.         SCL_Set();
  13.         if(IIC_SDA_IN) data|=0x01;
  14.         udelay(1);
  15.     }
  16.     SCL_Clr();
  17.     return data;
  18. }

BH1750向指定寄存器写入数据的函数为:
  1. void Single_Write_BH1750(char REG_Address)
  2. {
  3.     BH1750_Start();
  4.     BH1750_SendByte(SlaveAddress);
  5.     BH1750_RecvACK();
  6.     BH1750_SendByte(REG_Address);
  7.     BH1750_RecvACK();
  8.     BH1750_Stop();
  9. }

BH1750由寄存器读取数据的函数为:
  1. void Multiple_Read_BH1750()
  2. {
  3.     BH1750_Start();
  4.     BH1750_SendByte(SlaveAddress+1);
  5.     BH1750_RecvACK();
  6.     BUF[0] = BH1750_RecvByte();
  7.     BH1750_SendACK(0);
  8.     BUF[1] = BH1750_RecvByte();
  9.     BH1750_SendACK(1);
  10.     BH1750_Stop();
  11.     mdelay(5);
  12. }

获取光照强度检测值的函数为:
  1. void Get_Sunlight_Value(void)
  2. {
  3.     int dis_data=0;
  4.     float temp;
  5.     char i=0;
  6.     unsigned int sd;
  7.     Single_Write_BH1750(0x01);
  8.     Single_Write_BH1750(0x10);
  9.     mdelay(180);
  10.     Multiple_Read_BH1750();
  11.     for(i=0;i<3;i++)    dis_data=BUF[0];
  12.     dis_data=(dis_data<<8)+BUF[1];
  13.     temp=(float)dis_data/1.2;
  14.     sd=temp;
  15.     OLED_ShowNum(20,6,sd,5,16);
  16. }

检测光照强度并加以显示的主程序为:
  1. int main(void)
  2. {
  3.     InitDelay();
  4.     InitDebug();
  5.     GPIO_LedInit();
  6.     TIMER_PrdInit();
  7.     GPIO_OLEDInit();
  8.     OLED_Init();
  9.     OLED_Clear();
  10.     OLED_ShowString(10,0,"AC7802x Test",16);
  11.     OLED_ShowString(10,2,"BH1750",16);
  12.     OLED_ShowString(10,4,"Light:    lx",16);
  13.     BH1750_Init();
  14.     mdelay(100);
  15.     while (1)
  16.     {
  17.             Get_Sunlight_Value();
  18.             mdelay(500);

经程序的编译和下载,其检测效果如图2所示。

2.jpg
图2夜晚灯光照度






tpgf 发表于 2023-8-11 13:50 | 显示全部楼层
用于采集光照强度的传感器的原理是什么呢
木木guainv 发表于 2023-8-11 14:39 | 显示全部楼层
光照强度的检测对检测环境的要求高吗
八层楼 发表于 2023-8-11 15:17 | 显示全部楼层
检测的传感器本身存在需要散热的问题吗
观海 发表于 2023-8-11 15:33 | 显示全部楼层
八层楼 发表于 2023-8-11 15:17
检测的传感器本身存在需要散热的问题吗

应该不存在这个问题吧 没有发热器件啊
磨砂 发表于 2023-8-11 20:00 | 显示全部楼层
通常应用下我们对光照强度的检测精度有什么要求呢
晓伍 发表于 2023-8-11 21:02 | 显示全部楼层
我们在检测光照强度的时候是采用直接对准光源的吗
 楼主| jinglixixi 发表于 2023-8-11 21:25 | 显示全部楼层
晓伍 发表于 2023-8-11 21:02
我们在检测光照强度的时候是采用直接对准光源的吗

 楼主| jinglixixi 发表于 2023-8-11 21:29 | 显示全部楼层
木木guainv 发表于 2023-8-11 14:39
光照强度的检测对检测环境的要求高吗

应该保证环境不影响到传感器对光线的检测,如水雾、油污、腐蚀性气体等。
stly 发表于 2023-8-11 22:59 | 显示全部楼层
光照强度的检测对检测环境的要求高吗
llljh 发表于 2023-8-11 23:12 | 显示全部楼层
用于采集光照强度的传感器的原理是什么呢
 楼主| jinglixixi 发表于 2023-8-12 00:25 | 显示全部楼层
llljh 发表于 2023-8-11 23:12
用于采集光照强度的传感器的原理是什么呢

无非光敏器件获取光信号,然后以内部微控器转换为已标度的数字信号输出。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部