打印
[活动专区]

【杰发科技AC7802x测评】+光照强度检测及显示

[复制链接]
1358|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2023-7-19 00:36 编辑

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


图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)

配置所用引脚的函数为:
void BH1750_Init(void)
{
    GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN0);
    GPIO_SetFunc(GPIOA, GPIO_PIN1, GPIO_FUN0);
    GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_OUT);
    GPIO_SetDir(GPIOA, GPIO_PIN1, GPIO_OUT);
}

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

void IIC_OUTPUT_MODE_SET()
{
    GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN0);
    GPIO_SetPullup(GPIOA, GPIO_PIN0, ENABLE);
    GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_OUT);
}

BH1750发送字节数据的函数为:
void BH1750_SendByte(char data)
{
    char i;
    IIC_OUTPUT_MODE_SET();
    SCL_Clr();
    udelay(1);
    for (i=0;i<8;i++)
    {
        if(data&0x80) SDA_Set();
        else SDA_Clr();
        data <<= 1;
        SCL_Set();
        udelay(1);
        SCL_Clr();
        udelay(1);
    }
}

BH1750接收字节数据的函数为:
char BH1750_RecvByte()
{
    char i;
    char data = 0;
    IIC_INPUT_MODE_SET();
    for (i=0;i<8;i++)
    {
        SCL_Clr();
        udelay(1);
        SCL_Set();
        data <<= 1;
        SCL_Set();
        if(IIC_SDA_IN) data|=0x01;
        udelay(1);
    }
    SCL_Clr();
    return data;
}

BH1750向指定寄存器写入数据的函数为:
void Single_Write_BH1750(char REG_Address)
{
    BH1750_Start();
    BH1750_SendByte(SlaveAddress);
    BH1750_RecvACK();
    BH1750_SendByte(REG_Address);
    BH1750_RecvACK();
    BH1750_Stop();
}

BH1750由寄存器读取数据的函数为:
void Multiple_Read_BH1750()
{
    BH1750_Start();
    BH1750_SendByte(SlaveAddress+1);
    BH1750_RecvACK();
    BUF[0] = BH1750_RecvByte();
    BH1750_SendACK(0);
    BUF[1] = BH1750_RecvByte();
    BH1750_SendACK(1);
    BH1750_Stop();
    mdelay(5);
}

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

检测光照强度并加以显示的主程序为:
int main(void)
{
    InitDelay();
    InitDebug();
    GPIO_LedInit();
    TIMER_PrdInit();
    GPIO_OLEDInit();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(10,0,"AC7802x Test",16);
    OLED_ShowString(10,2,"BH1750",16);
    OLED_ShowString(10,4,"Light:    lx",16);
    BH1750_Init();
    mdelay(100);
    while (1)
    {
            Get_Sunlight_Value();
            mdelay(500);

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

图2夜晚灯光照度






使用特权

评论回复

相关帖子

沙发
tpgf| | 2023-8-11 13:50 | 只看该作者
用于采集光照强度的传感器的原理是什么呢

使用特权

评论回复
板凳
木木guainv| | 2023-8-11 14:39 | 只看该作者
光照强度的检测对检测环境的要求高吗

使用特权

评论回复
地板
八层楼| | 2023-8-11 15:17 | 只看该作者
检测的传感器本身存在需要散热的问题吗

使用特权

评论回复
5
观海| | 2023-8-11 15:33 | 只看该作者
八层楼 发表于 2023-8-11 15:17
检测的传感器本身存在需要散热的问题吗

应该不存在这个问题吧 没有发热器件啊

使用特权

评论回复
6
磨砂| | 2023-8-11 20:00 | 只看该作者
通常应用下我们对光照强度的检测精度有什么要求呢

使用特权

评论回复
7
晓伍| | 2023-8-11 21:02 | 只看该作者
我们在检测光照强度的时候是采用直接对准光源的吗

使用特权

评论回复
8
jinglixixi|  楼主 | 2023-8-11 21:25 | 只看该作者
晓伍 发表于 2023-8-11 21:02
我们在检测光照强度的时候是采用直接对准光源的吗

使用特权

评论回复
9
jinglixixi|  楼主 | 2023-8-11 21:29 | 只看该作者
木木guainv 发表于 2023-8-11 14:39
光照强度的检测对检测环境的要求高吗

应该保证环境不影响到传感器对光线的检测,如水雾、油污、腐蚀性气体等。

使用特权

评论回复
10
stly| | 2023-8-11 22:59 | 只看该作者
光照强度的检测对检测环境的要求高吗

使用特权

评论回复
11
llljh| | 2023-8-11 23:12 | 只看该作者
用于采集光照强度的传感器的原理是什么呢

使用特权

评论回复
12
jinglixixi|  楼主 | 2023-8-12 00:25 | 只看该作者
llljh 发表于 2023-8-11 23:12
用于采集光照强度的传感器的原理是什么呢

无非光敏器件获取光信号,然后以内部微控器转换为已标度的数字信号输出。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

455

主题

2756

帖子

38

粉丝