学习日记——光感传感器—I2C(2020.2.15)

I2C基础知识

• 简介: I2C(Inter-Integrated Circuit)是内部整合电路的称呼,是一种串行通讯总线,使用多主从架构,由飞利浦公司在1980年 为了让主板、嵌入式系统或手机用以连接低速周边装置而发展。I2C的正确读法为"I-squared-C" ,而"I-two-C"则是另一种 错误但被广泛使用的读法,在中国则多以"I方C"称之。I2C 总线支持任何IC 生产过程(NMOS CMOS、双极性)。两线――串行 数据(SDA)和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器— —MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。
• 特征:
1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;
2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送 器或主机接收器;
3、它是多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
4、串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
5、连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。
• 7位寻址: 第一个字节的头7 位组成了从机地址,最低位(LSB)是第8 位,它决定了传输的方向。第一个字节的最低位是“0”,表示 主机会写信息到被选中的从机;“1”表示主机会向从机读信息,当发送了一个地址后,系统中的每个器件都在起始条件后将 头7 位与它自己的地址比较,如果一样,器件会判定它被主机寻址,至于是从机接收器还是从机发送器,都由R/W 位决定。

BH1750基础知识

简介
BH1750FVI是日本罗姆(ROHM)半导体生产的数字式环境光传感IC。BH1750环境光传感器内置16位的模数转换 器,它能够直接输出一个数字信号,不需要再做复杂的计算。这是一种容易使用简易电阻器的版本,通过计算电压, 来获得有效的数据。这款环境光传感器能够直接通过光度计来测量。当物体在均匀的光照下它能够在每平方米获得 1lux的光通量,它们的光强度是1lux。有时为了充分利用光源,你可以增加一个光源的反射装置。那样在某些方向 就能获得更多的光通量,以增加被照表面的亮度。
功能测试
BH1750FVI支持单次或连续两种测量模式,每种测量模式又提供了0.5lux、1lux、4lux三种分辨率供选择。分辨力 越高,一次测量所需的时间就越长。在单次测量模式时,每次测量之后传感器都自动进入Power Down模式。
主要特性
I2C数字接口,支持速率最大400Kbps 输出量为光照度(Illuminance) 测量范围1~65535 lux,分辨率最小到1lux 低功耗(Power down)功能 屏蔽50/60Hz市电频率引起的光照变化干扰 支持两个I2C地址,通过ADDR引脚选择 较小的测量误差(精度误差最大值+/-20%)

查找开发板上的扩展板接口

学习日记——光感传感器—I2C(2020.2.15)_第1张图片

配置引脚

学习日记——光感传感器—I2C(2020.2.15)_第2张图片

配置时钟

学习日记——光感传感器—I2C(2020.2.15)_第3张图片

配置参数

全部默认即可
学习日记——光感传感器—I2C(2020.2.15)_第4张图片

生成光照传感器工程

1、自定义工程名称。
2、选择英文路径,否则会丢 失启动文件而无法编译通过, 需要手动添加启动文件: startup_stm32l431xx.s
3、选择MDK-ARM V5开发软件, 即KEIL5软件。

代码编写说明

1、发送检测光照强度模式指令;
2、检测时间延时;
3、读取光照强度数据;
注意:
读地址为0X47,写地址为0X46;
调用函数:
1、 HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
2、HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
**变量说明:****hi2c:I2C_HandleTypeDef结构体;DevAddress为设备7位地址,第八位为读写指令;pData指 向缓存数组地址,即写数据和读数据;Size为缓存数组长度,即写数据或读数据的长度。Timeout为超时 持续时间。
3、HAL_GPIO_WritePin(GPIO_TypeDef
GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
4、void HAL_GPIO_TogglePin(GPIO_TypeDef
GPIOx, uint16_t GPIO_Pin)//运行LED灯
5、void HAL_Delay(uint32_t Delay);//延时 6、printf();//打印数据到串口函数,需要重新定义函数fputc();才能正常使用printf();

代码编写实现

读取光照传感器数据函数:

float ReadBH1750(void) 
{ 
	uint8_t temp[1]={0x11};//连续高分辨率模式2 
	float lux=0; uint8_t ReadData[2]={0}; 
	HAL_I2C_Master_Transmit(&hi2c1, 0x46, temp, 1, 0xff); 
	HAL_Delay(180); HAL_I2C_Master_Receive(&hi2c1, 0x47,ReadData, 2, 0xff); 
	lux=(float)((ReadData[0]<<8)|ReadData[1]); 
	lux/=1.2; return lux; 
}

while (1)循环内程序:

float lux=ReadBH1750();
 printf("BH1750:%d\r\n",(int)lux); 
 if(lux<2||(lux>900&&lux<1100)) HAL_GPIO_WritePin(LED_SW_GPIO_Port,LED_SW_Pin,GPIO_PIN_SET); 
 else 
 HAL_GPIO_WritePin(LED_SW_GPIO_Port,LED_SW_Pin,GPIO_PIN_RESET); 
 HAL_Delay(1000);

你可能感兴趣的:(学习日记——光感传感器—I2C(2020.2.15))