BH1750是16位数字输出型,环境光强度传感器集成电路,使用I2C接口通信,工作电压:VCC(2.4~3.6V),I2C电平(1.65~VCC),用于各类消费类LCD屏背光检测或环境光检测。
1)框图

| 引脚号 | 名称 | 说明 |
| 1 | VCC | 供电正极 |
| 2 | ADDR | 器件地址设置, 高电平时地址为:“1011100“ 低电平时地址为:“0100011“ |
| 3 | GND | 供电负极 |
| 4 | SDA | I2C数据线 |
| 5 | DVI | SDA,SCL参考电压引脚,内部寄存器异步重置端口 |
| 6 | SCL | I2C时钟线 |
3)上电时序
推荐的VCC和DVI的上电时序图:

VCC上电至少1us内DVI要保持低电平。

推荐使用高分辨率模式,高分辨率模式(1lx)适用于暗箱(<10lx)测试,高分辨率模式2(0.5lx)也适用于暗箱测试。
查看电气参数可看出,高分辨率模式测量时间一般为120ms,最大不超过180ms。测量精度:测量值/实际值一般等于1.2倍。

以器件地址设置为ADDR='L',分辨率设置为高分辨率模式为例,如下图:

注意:地址字节最后一位为读写标志位,‘0’为写,‘1’为读;读出数据高8位在前,低8位在后。
1)发送上电指令,0000_0001,
起始位->器件地址(7位)+读写位‘0’(1位)->等待应答->上电指令->结束位,
使设备上电等待测量;
2)发送测量指令,0001_0000(以连续高分辨率模式为例),
起始位->器件地址(7位)+读写位‘0’(1位)->等待应答->测量指令->结束位。
3)等待测量结束,一般高分辨率模式测量时间为120ms,最长为180ms,可等待180ms后读取测量结果。若为低分辨率模式,最长测量时间为24ms。
4)读取测量结果,
起始位->器件地址(7位)+读写位‘1’(1位)->等待应答->高8位读数->->低8位读数->不应答->结束位。
5)计算结果,
光照强度 =(寄存器值[15:0] * 分辨率) / 1.2 (单位:勒克斯lx)
寄存器值[15:0]:读到的寄存器值,先接收高8位,再接收低8位;
分辨率:设置的分辨率,本例位连续高分辨率模式,为1lx;
1.2 :测量精度,一般设置为1.2 。
6)灵敏度调整,通过调整光学窗口影响测量结果。
通过改变测量时间寄存器(MTreg)来改变灵敏度,MTreg寄存器默认值为“0100_0101” (69),最小设置值为“0001_1111”(31),最大设置值为“1111_1110”(254)。
在高分辨率模式下,设置流程如下:

设置MTreg高3位->设置MTreg低5位->设置为高分辨率模式测量->等待测量结束。
光照强度 =(寄存器值[15:0] * 分辨率) / 1.2 /(69/MTreg[7:0])(单位:勒克斯lx)
1)参照正点原子I2C驱动程序,包括GPIO初始化,起始信号,结束信号,等待应答信号,产生Ack应答信号,不产生Ack应答信号:
//IO方向设置
#define SDA_IN() {GPIOB->CRH&=0XFF0FFFFF;GPIOB->CRH|=(uint32_t)8<<20;} //PB13输入模式
#define SDA_OUT() {GPIOB->CRH&=0XFF0FFFFF;GPIOB->CRH|=(uint32_t)3<<20;} //PB13输出模式
//IO操作
#define IIC_SCL(n) (n) ? (GPIOB->BSRR = GPIO_PIN_12) : (GPIOB->BSRR = GPIO_PIN_12<<16u)
#define IIC_SDA(n) (n) ? (GPIOB->BSRR = GPIO_PIN_13) : (GPIOB->BSRR = GPIO_PIN_13<<16u)
#define READ_SDA (GPIOB->IDR)&GPIO_PIN_13
//IIC初始化
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
//PH4,5初始化设置
GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
IIC_SDA(1);
IIC_SCL(1);
}
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA(1);
IIC_SCL(1);
delay_us(4);
IIC_SDA(0); //START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL(0); //钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT(); //sda线输出
IIC_SCL(0);
IIC_SDA(0); //STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL(1);
IIC_SDA(1); //发送I2C总线结束信号
delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
uint8_t IIC_Wait_Ack(void)
{
uint8_t ucErrTime=0;
SDA_IN(); //SDA设置为输入
IIC_SDA(1);delay_us(1);
IIC_SCL(1);delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL(0); //时钟输出0
return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(0);
delay_us(2);
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
}
//不产生ACK应答
void IIC_NAck(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(1);
delay_us(2);
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
IIC_SCL(0); //拉低时钟开始数据传输
for(t=0;t<8;t++)
{
IIC_SDA((txd&0x80)>>7);
txd<<=1;
delay_us(2); //对TEA5767这三个延时都是必须的
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
delay_us(2);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
uint8_t IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN(); //SDA设置为输入
for(i=0;i<8;i++ )
{
IIC_SCL(0);
delay_us(2);
IIC_SCL(1);
receive<<=1;
if(READ_SDA)
receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
2)I2C读写函数
void Soft_I2C_Write(uint8_t slaveAddress,uint8_t* dataBuffer,uint8_t bytesNumber,uint8_t stopBit)
{
unsigned char i = 0;
IIC_Start();
IIC_Send_Byte((slaveAddress << 1) | 0x00); //发送从机地址写命令
IIC_Wait_Ack();
for(i = 0; i < bytesNumber; i++)
{
IIC_Send_Byte(*(dataBuffer + i));
IIC_Wait_Ack();
}
if(stopBit == 1) IIC_Stop();
}
void Soft_I2C_Read(uint8_t slaveAddress,uint8_t* dataBuffer,uint8_t bytesNumber,uint8_t stopBit)
{
unsigned char i = 0;
IIC_Start();
IIC_Send_Byte((slaveAddress << 1) | 0x01); //发送从机地址读命令
IIC_Wait_Ack();
for(i = 0; i < bytesNumber; i++)
{
if(i == bytesNumber - 1)
{
*(dataBuffer + i) = IIC_Read_Byte(0);//读取的最后一个字节发送NACK
}
else
{
*(dataBuffer + i) = IIC_Read_Byte(1);
}
}
if(stopBit == 1) IIC_Stop();
}
#define BHAdd 0x23 //从机地址 ADDR = L
//#define BHAdd 0x5C //从机地址 ADDR = H
#define BHPowDown 0x00 //关闭模块
#define BHPowOn 0x01 //打开模块等待测量指令
#define BHReset 0x07 //重置数据寄存器值在PowerOn模式下有效
#define BHModeH 0x10 //连续高分辨率模式 单位 1lx 测量时间120ms
#define BHModeH2 0x11 //连续高分辨率模式2 单位0.5lx 测量时间120ms
#define BHModeL 0x13 //连续低分辨率模式 单位 4lx 测量时间16ms
#define BHSigModeH 0x20 //一次高分辨率模式 单位 1lx 测量时间120ms,测量后转到 PowerDown模式
#define BHSigModeH2 0x21 //一次高分辨率模式2 单位0.5lx 测量时间120ms,测量后转到 PowerDown模式
#define BHSigModeL 0x23 //一次低分辨率模式 单位 4lx 测量时间16ms,测量后转到 PowerDown模式
#define Resolution BHModeH2 // 连续高分辨率模式,0.5lx
#if Resolution == BHModeH || Resolution == BHSigModeH
#define SCALE_INTERVAL 1
#elif Resolution == BHModeH2 || Resolution == BHSigModeH2
#define SCALE_INTERVAL 0.5f
#elif Resolution == BHModeL || Resolution == BHSigModeL
#define SCALE_INTERVAL 4
#endif
void BH1750_Init(void);
float BH1750_Read(void);
// 写传感器函数
void BH1750_Write(uint8_t REG_Address)
{
uint8_t buf[2]={0};
buf[0]=REG_Address;
Soft_I2C_Write(BHAdd,buf,1,1);
}
// 读传感器函数
float BH1750_Read(void)
{
uint8_t buf[2];
float temp;
Soft_I2C_Read(BHAdd, buf, 2, 1);
temp= (float)(((uint16_t)buf[0]<<8) + buf[1]) * SCALE_INTERVAL / 1.2f ;
return temp;
}
// 对传感器进行初始化
void BH1750_Init(void)
{
BH1750_Write(BHPowOn); // 通电
BH1750_Write(Resolution); // 设置分辨率
}
参考源代码如下链接:基于STM32F103的BH1750光照传感器驱动程序-单片机文档类资源-CSDN文库
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
我使用的是最新版本的Chrome(32.0.1700.107)和Chrome驱动程序(V2.8)。但是当我在Ruby中使用以下代码运行示例测试时:require'selenium-webdriver'WAIT=Selenium::WebDriver::Wait.new(timeout:100)$driver=Selenium::WebDriver.for:chrome$driver.manage.window.maximize$driver.navigate.to'https://www.google.co.in'defapps_hoverele_hover=$driver.find_
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易
如果我在功能规范中调用url_for,它会返回一个以http://www.example.com/开头的绝对URL.Capybara会很乐意尝试加载该站点上的页面,但这与我的应用程序无关。以下是重现该问题的最少步骤:从这个Gemfile开始:source'https://rubygems.org'gem"sqlite3"gem"jquery-rails"gem"draper"gem"rails",'4.1.0'gem"therubyracer"gem"uglifier"gem"rspec-rails"gem"capybara"gem"poltergeist"gem"launchy"运行
在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,
目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方
有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N