STM32驱动BH1750光照传感器:IIC通信与OLED显示实战解析

1. 硬件连接与IIC总线基础

刚接触STM32那会儿,我最喜欢折腾各种传感器,把它们的数据实时显示出来特别有成就感。今天咱们要玩的BH1750光照传感器就是个特别实用的器件,搭配OLED屏幕可以做个迷你光照监测仪。别看这东西小,里面涉及的IIC通信、数据转换、显示优化这些知识点,都是嵌入式开发的硬核基础。

先说说硬件连接。BH1750只有四个引脚:VCC接3.3V,GND接地,SDA和SCL接到STM32对应的引脚。OLED屏幕也是IIC设备,建议用常见的0.96寸SSD1306型号。这里有个省事的接法——把两个设备挂到同一组IIC总线上,共用SDA和SCL线。我习惯用STM32F103的PB6接SCL,PB7接SDA,记得一定要加上拉电阻,4.7K欧姆最稳妥。

接线时最容易忽略的细节:BH1750的ADDR引脚要直接接地,这样器件地址才是0x23。如果悬空或者接高电平,地址会变成0x5C,到时候怎么都读不到数据。OLED的地址通常是0x3C,但也有厂商用0x3D,最好用IIC扫描函数确认一下。

电源稳定性很重要。我在BH1750的VCC和GND之间并了个100uF的电解电容,再并个0.1uF的瓷片电容,这样能有效滤除电源噪声。光照传感器对电压波动很敏感,不加电容的话,读数可能会跳来跳去。

2. IIC通信配置与调试

IIC配置是第一个技术难点。很多新手在这里栽跟头,主要是GPIO模式没设对。STM32的IIC引脚必须配置为开漏输出(Open-Drain),千万别选成推挽输出。推挽输出会导致总线冲突,严重时甚至烧坏器件。

这是我的硬件IIC初始化代码:

void I2C_Init_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    I2C_InitTypeDef I2C_InitStruct;
    
    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    
    // 配置PB6(SCL)和PB7(SDA)为开漏输出
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;  // 复用开漏
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    // IIC参数配置
    I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStruct.I2C_OwnAddress1 = 0xAA;  // 主设备地址,随便填个不冲突的
    I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStruct.I2C_AcknowledgedAddres
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值