文章目录

  • 一、产品简介
  • 二、IIC通信
  • 三、BH1750的使用
  • 四、程序源码

这里我先简单的介绍一下BH1750光照传感器模块的基本信息(不多废话),我将着重讲解它的使用部分,相信对于屏幕前的你也是更关心它是怎么使用的,OK,gogogo!!!

一、产品简介

芯片: BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。

工作原理: BH1750的内部由光敏二极管、运算放大器、ADC采集、晶振等组成。PD二极管通过光生伏特效应将输入光信号转换成电信号,经运算放大电路放大后,由ADC采集电压,然后通过逻辑电路转换成16位二进制数存储在内部的寄存器中(光照越强,光电流越大,电压就越大)。

物理电路图:

PCB原理图:

实物图:

可见,该模块有5个引脚,接下来再看看引脚介绍是啥模样

引脚定义:

模块指令:

使用步骤:

产品特点:

  • 支持I2CBUS接口
  • 接近视觉灵敏度的光谱灵敏度特性
  • 输出对应亮度的数字值
  • 对应广泛的输入光范围。(相当于1-65535lx)
  • 通过降低功率功能,实现低电流化。
  • 通过50Hz/60Hz除光噪音功能实现稳定的测定。
  • 支持1.8v逻辑输入接口。
  • 无需其他外部件。
  • 光源依赖性弱。
  • 有两种可选的I2Cslave地址。
  • 可调的测量结果影响较大的因素为光入口大小。
  • 使用这种功能计算1.1lx到100000lx马克斯/分钟的范围。
  • 最小误差变动在±20%。
  • 受红外线影响很小。

二、IIC通信

IIC是一种串行通信总线,IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。可以理解为 其通过SDA和CLK俩根线完成通信传输,

由于该模块是通过IIC协议进行通信的,所以接下来我再来介绍介绍IIC的相关驱动。

IIC驱动部分都是通用的,其各个模块是根据自身的设备地址及其配置、命令等寄存器操作不同来完成各自的通信。

IIC 驱动部分我划分为了6个部分,分为:

  • 开始信号
  • 停止信号
  • 发送应答信号
  • 接收应答信号
  • 发送一个字节
  • 接收一个字节

首先先来看时序图:

时序没看明白,别着急,听我一 一道来。

首先,请记住 : SDA和CLK只有“0和1”俩种状态;其次,主机在发送信号时CLK引脚要定义输出模式,在接收信号时CLK引脚要定义输入模式。

1. 开始信号:
对于开始信号,你可以这样理解,SDA是在CLK置高电平的情况下 由高电平->低电平,这就是开始信号,只不过为了通信稳定,一般在跳变中途延时5us。

接下来看看程序是怎么设计的:

void IIC_Start(void)
{SDA_OUT();     //sda线输出模式IIC_SDA=1;         IIC_SCL=1;delay_us(5);IIC_SDA=0;   //产生下降沿delay_us(5);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}

2. 停止信号:
同开始信号,SDA在CLK为高电平时 由低电平->高电平,完成停止信号。

void IIC_Stop(void)
{SDA_OUT(); //sda线输出IIC_SDA=0;  //产生上升沿delay_us(5);IIC_SCL=1; IIC_SDA=1; //发送I2C总线结束信号delay_us(5);
}

3. 发送应答信号:
在SDA为低电平时 CLK由高电平->低电平 ,完成应答;
在SDA为高电平时 CLK由高电平->低电平 ,拒绝应答;

所以在程序中 需设置一个变量进行判断是否接受应答:

void SendACK(int ack)
{GPIO_InitTypeDef GPIO_InitStruct;   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;    //定义输出模式GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Pin = sda;GPIO_Init(bh1750_PORT, &GPIO_InitStruct);  if(ack == 1)   //写应答信号SDA=1; else if(ack == 0)SDA=0; elsereturn;         SCL=1;     //拉高时钟线delay_us(5);                 //延时SCL=0;      //拉低时钟线delay_us(5);                //延时
}

4. 接收应答信号:
在CLK由低电平->高电平->低电平 期间SDA保持低电平

u8 IIC_waitAck()
{u8 ack =0;IIC_setSDAMode_In();IIC_SCL_OUT(0);             //准备时序delay_us(5);IIC_SCL_OUT(1);delay_us(5);if(IIC_SDA_IN){ack =1;}else{ack =0;  }IIC_SCL_OUT(0);              //拉低,表示应答完成delay_us(5);return  ack;
}

5. 发送一个字节:
CLK每完成一次 高电平->低电平 跳变,主机发送1bit,1字节发送完成后且需要接收从机发回来的应答信号。

void SendByte(uchar dat)
{uchar i;for (i=0; i<8; i++)         //8位计数器{if( 0X80 & dat )GPIO_SetBits(bh1750_PORT,sda);elseGPIO_ResetBits(bh1750_PORT,sda);dat <<= 1;SCL=1;               //拉高时钟线delay_us(5);             //延时SCL=0;                //拉低时钟线delay_us(5);            //延时}RecvACK();
}

6. 接收一个字节:
类似于发送一字节,只是引脚定义不同,具体如下:

u8 IIC_readByte()
{u8 data = 0;IIC_setSDAMode_In();IIC_SCL_OUT(0);                  //先拉低,为读取数据做准备delay_us(5);for(int i=0;i<8;i++){IIC_SCL_OUT(1);         // SCL为高期间才可以读取数据delay_us(5);if(IIC_SDA_IN){data|=(0x01<<(7-i));  }else{data &= ~(0x1<<(7-i));}    IIC_SCL_OUT(0);delay_us(5);}return data;
}

三、BH1750的使用

1. 写信号
首先需要对模块进行写操作,然后再初始化, 写操作的过程为:起始信号 -->发送设备地址+写信号 -->发送内部寄存器地址 --> 发送停止信号。

void Single_Write_BH1750(uchar REG_Address)
{BH1750_Start();                  //起始信号BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号BH1750_SendByte(REG_Address);    //内部寄存器地址BH1750_Stop();                   //发送停止信号
}

2. 初始化
对模块进行初始化,初始化SDA和CLK引脚 初步设置为推挽输出,然后对模块进行上电,根据指令表可知 上电指定为0x01,上电后需要延迟180ms左右让模块进行缓冲。

void Init_BH1750()
{GPIO_InitTypeDef GPIO_InitStruct;/*开启GPIOB的外设时钟*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Pin = sda | scl ;GPIO_Init(bh1750_PORT,&GPIO_InitStruct); Single_Write_BH1750(0x01);  delay_ms(180);            //延时180ms
}

3. 读寄存器内部数据
读数据操作的过程为:起始信号 -->发送设备地址+读信号 -->定义数组存储数据(最后一个数据需要拒绝应答) --> 发送停止信号。

void mread(void)
{   uchar i;    BH1750_Start();                          //起始信号BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号for (i=0; i<3; i++)                      //连续读取3个地址数据,存储中BUF{BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据if (i == 3){BH1750_SendACK(1);                //最后一个数据需要回NOACK}else{        BH1750_SendACK(0);                //回应ACK}}BH1750_Stop();                          //停止信号delay_ms(5);
}

4. 对数据进行操作、转存

float read_BH1750(void)
{int dis_data;                       //变量   float temp1;float temp2;Single_Write_BH1750(0x01);   // power onSingle_Write_BH1750(0x10);   // H- resolution modedelay_ms(180);            //延时180msmread();       //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1]; //合成数据 temp1=dis_data/1.2;temp2=10*dis_data/1.2;   temp2=(int)temp2%10;OLED_ShowString(87,2,".",12); OLED_ShowNum(94,2,temp2,1,12); return temp1;
}

5. 主函数里调用BH17502并显示在oled上

int main(void)
{ float light;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2delay_init();          //延时函数初始化    uart_init(9600);      //串口初始化为9600LED_Init();             //初始化与LED连接的硬件接口Init_BH1750();       //初始化BH1750OLED_Init();     //初始化OLEDOLED_Clear();     //清屏while(1){light=read_BH1750();  //读取BH1750的光强数据OLED_ShowString(0,2,"light:",12);  //显示光照强度OLED_ShowNum(48,2,light,6,12);  OLED_ShowString(110,2,"lx",12);if(light<100){LED1=0;OLED_ShowString(38,5,"LED-ON ",12);}else{LED1=1;OLED_ShowString(38,5,"LED-OFF",12);}}
}

四、程序源码

该程序结合oled显示输出,有需要可 留言评论区私信即可

BH1750( GY-302 )光照传感器相关推荐

  1. BH1750 光照传感器文档详解 及 驱动设计

    前言 最近接触到一个应用,需要在低功耗的产品上加上光照度采集,正好最近有接触到一款光照传感器 BH1750 ,性能价格都合适,那么今天就抽空来好好测试一下. 那么要写一篇测试文章,我会尽量以新手的角度 ...

  2. STM32 驱动 GY-302 光照传感器 BH1750 模块(软件IIC与硬件IIC驱动)

    1.特别说明 ​ 要是不想看原理和过程,直接下拉找代码吧,都是测试过的,很稳定,有硬件I2C驱动的,也有软件模拟I2C驱动的,基于STM32F103系列和STM32F4系列实现,基于标准库实现,条理清 ...

  3. CC2530下ZigBee协议栈中添加BH1750数字光照传感器

    项目里需要获得光照强度,之前用的是光敏电阻,但是光敏电阻实在不精确,换用BH1750数字光照传感器.网上购买后,送的资料都是单片机的,移植到ZigBee协议栈里面,时序有些问题,在网上找的一些资料,很 ...

  4. 蓝牙MESH网关_相对于米家多模网关,其实我更爱的是光照传感器

    前些日子,非常荣幸的收到了小米公测提供的米家智能多模网关和小米米家光照传感器.熟悉米家/Aqara的值友应该知道,Aqara作为米家生态链中唯一一家使用Zigbee作为产品核心技术的企业,在几年间已经 ...

  5. 【花雕小实验01】使用万用表测量OPT101模拟光照传感器模块

    早上起来,尝试使用万用表来测量OPT101模拟光照传感器模块,这里调到直流电压20V档,模块供电5V, 正常室内光线时,测得电压为0.26V,凌晨光线很弱 用手指挡住光线,电压降为0.07V 使用台灯 ...

  6. 涂鸦模组开发光照传感器

    涂鸦模组开发光照传感器(OPT3006) 概述 涂鸦智能 视频教学 系统框架设计 OPT3006 超薄环境光传感器 TYZS5 模组 特点 PCB绘制 涂鸦零代码开发 涂鸦模组开发文章 最后 概述 亮 ...

  7. 从零开始的DIY智能家居 - 基于 ESP32 的智能光照传感器

    文章目录 前言 硬件选择 代码解析 获取代码 设备控制命令: 设备和协议初始化流程: 配置设备信息 回调函数注册 数据获取与发送流程 总结 前言 上周出差有点急,结果家里灯没关,开了整整一周的时间(T ...

  8. 高精度光照传感器基本介绍

    高精度光照传感器基本介绍 光照传感器内部采用了目前光照采集方面灵敏度较高的光敏采集器件,该器件拥有灵敏度高,响应迅速等诸多优点.内部还配有滤光片,余弦修正器,配合高精度的模拟电路,以及程序处理,对光照 ...

  9. 利用arduino nano开发板配合oled、温度传感器、光照传感器、湿度传感器设计一个花盆

    利用arduino nano开发板配合oled.温度传感器.光照传感器.湿度传感器设计一个花盆 完整项目地址: https://github.com/linxinloningg/arduino_chi ...

最新文章

  1. python绘制雷达图代码实例-使用python绘制温度变化雷达图
  2. 2013年,移动App设计的13大精髓
  3. Python3各种进制之间的转换方法
  4. 设计模式学习-Composite(组合模式)
  5. linux100day(day4)--文本处理三剑客
  6. 创纪录!浪潮云海完成OpenStack Rocky版本全球最大规模单一集群测试!
  7. Excel还是那些事
  8. 这售价要抢疯了?iPhone SE 2再曝光:将搭载A13芯片
  9. 内核如何为系统调用的参数传递参数
  10. JAVA与js加密解密我常用的方法
  11. java编程思想.pdf,阿里开发手册.pdf,MySQL是怎样运行的_掘金小册_.pdf
  12. 杭电OJ 1720 进制处理
  13. dbv oracle驱动,Oracle的DBV工具
  14. 使用驱动器中的光盘之前需要将其格式化怎么弄
  15. Prometheus 四种metric类型
  16. 电视剧《乡村爱情2》之演员表(ZT)
  17. 「CSDN 征集」参与 CSDN 「Markdown」编辑器测评,即可有机会获取奖品哦
  18. nu.xom:Serializer
  19. openwrt 锐捷 单线多拨
  20. 计算机程序手工编织,丝绸编程秒杀计算机 《锦绣纪》致敬最强大脑

热门文章

  1. OSPF/2/NBRCHG:The status of the non-virtual neighbor changes.
  2. 自定义CollapsingToolbaLayout完成可收缩的带头像的Toolbar
  3. 初学者必会的Linux命令 - 文件查看篇
  4. HDU Identity Card
  5. 5月28-29日规模化敏捷联合作战沙盘之乌托邦计划—成都站
  6. 3D车道线检测能否成为自动驾驶的核心?盘一盘近三年的SOTA论文!
  7. html怎么随机设置颜色,设置随机颜色值
  8. 国产存储芯片,emmc,性能强
  9. 量化交易 米筐 获取股票列表与历史合约数据
  10. Java网课基础笔记(25)19-08-07