一、任务

  1. BH1750光照度获取,显示与OLED
    2.AHT30温度获取,现实与OLED
    二、BH1750的介绍

1、BH1750 是 ROHM 公司推出的数字型高精度光照强度传感器,以低功耗、易集成、测量精准为核心优势,广泛应用于各类需光照检测的智能场景
2、优点
(1)集成度高,开发难度低
(2)测量性能均匀,适配多场景
(3)低功耗设计
(4)环境适用强、稳定性高
3、缺点
(1)无内置防护
(2)依赖外部电路校准
(3)抗强光饱和能力有限
(4)测量速度受模式限制
4、引脚介绍
引脚名称 核心功能 单片机引脚定义
1 VCC 电源正极
2 GND 电源负极
3 SDA I2C串行数据线 PB7
4 SCL I2C串行时钟线 PB6
5、硬件电路
利用I2C的核心优势之一是同一总线可挂载多个从设备。

6、BH1750 获取数据
(1)确认硬件接线(VCC/GND/SDA/SCL/ADDR),确保供电与 I²C 连接正常;
(2)经 I²C 发送测量指令(如连续高分辨率 0x10);
(3)等待对应测量时间(高分辨率 120ms)
(4)读取 16 位原始数据(高 8 位 + 低 8 位);
(5)用 “原始值 / 1.2” 换算为实际光照值(单位 lx),连续模式可重复读,单次模式需重发指令。
7、驱动程序

BH1750传感器初始化
void BH1750_Init(void)
{
    // 初始化BH1750传感器的代码
    uint8_t cmd[1] = {POWER_ON};
    BH1750_Tx(cmd, 1);

}

BH1750传感器发送和接收数据函数。

static void BH1750_Tx(uint8_t *BH1750_Data, uint16_t len)
{
    // 发送数据给BH1750传感器的代码
    HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, BH1750_Data, len, 100);
}

static void BH1750_Rx(uint8_t *BH1750_Data, uint16_t len)
{
    // 接收数据从BH1750传感器的代码
    HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR, BH1750_Data, len, 100);
}

通过 I²C 总线从 BH1750 传感器接收数据并读取数据

void BH1750_Single_Read(float *BH1750_Data)
{
    // 从BH1750传感器读取数据的代码
    uint8_t resv[2];
    uint8_t cmd[1] = {POWER_ON};
    uint32_t Data;
    if(HAL_GetTick()-tick<130)return;
    tick=HAL_GetTick();
    BH1750_Rx(resv, 2);
    BH1750_Tx(cmd, 1);
    Data = (resv[0] << 8) | resv[1];
    *BH1750_Data = Data / 1.2;
}
void BH1750_Continuous_Read(float *BH1750_Data)
{
    // 从BH1750传感器读取数据的代码
    uint8_t resv[2];
    uint32_t Data;
    if(HAL_GetTick()-tick<180)return;
    tick=HAL_GetTick();
    BH1750_Rx(resv, 2);
    Data = (resv[0] << 8) | resv[1];
    *BH1750_Data = Data / 1.2;
}

三、AHT30的介绍
1、AHT30 是由奥松电子推出的 小型化、低功耗、高精度数字式温湿度传感器,采用 I²C 通信接口,凭借优异的测量性能和极简的集成设计
2、ATH30的优点
高精度、快速响应、低功耗、宽电压支持、抗干扰能力强、长期稳定性好。
3、缺点
(1)对极端环境耐受性有限
(2)测量频率受限:测量频率过高,传感器温度上升精度降低。
(3)数据处理注意:I2C协议读取数据优先级高的先行。

4、引脚介绍
引脚名称 核心功能 单片机引脚定义
1 VCC 电源正极
2 GND 电源负极
3 SDA I2C串行数据线 PB7
4 SCL I2C串行时钟线 PB6
5、硬件电路
6、驱动程序
对AHT30进行初始化

void AHT30_Init(void)
{
    uint8_t senddata;
    senddata = AHT30_Init_com;
    HAL_I2C_Master_Transmit(&hi2c2, AHT30_Write_ADDRESS, &senddata, 1, 0xFFFF);// 发送初始化命令
}

对AHT30进行一个软复位,该代码是作用是通过I2C通信来实现传感器发送的软复位指令,使其恢复初始状态(不用断电)。

void AHT30_SoftReset(void)
{
    uint8_t senddata;
    senddata = AHT30_SoftReset_com;
    HAL_I2C_Master_Transmit(&hi2c2, AHT30_Write_ADDRESS, &senddata, 1, 0xFFFF);// 发送软复位指令
    HAL_Delay(20);
}

触发函数向 AHT30 传感器发 3 字节指令唤醒它,启动一次温湿度采集,完成后数据存寄存器,为后续读取提供有效数据,还能按需控测量时机,平衡精度与功耗。

void AHT30_TrigeMea(void)
{
    uint8_t senddata[3];
    senddata[0] = AHT30_TrigeMea_com;
    senddata[1] = 0x33; // DATA0
    senddata[2] = 0x00; // DATA1
    HAL_I2C_Master_Transmit(&hi2c2, AHT30_Write_ADDRESS, senddata, 3, 0xFFFF);// 发送触发测量指令
    HAL_Delay(80);
}

通过I2C接口读取AHT30温湿度传感器中的数据,并将数据结果存储到指针变量里,设置状态标志位、校准标志位然后进行判断。若设备处于不忙状态进行解析数据,转换原始数据为实际物理量。

uint8_t AHT30_Read(float *humidity, float *temperature)
{
    AHT30_TrigeMea();
    HAL_Delay(75);
    static uint32_t humi, temp;
    uint8_t readdata[6];
    uint8_t BusyIndication, CalEnable;
    HAL_I2C_Master_Receive(&hi2c2, AHT30_Read_ADDRESS, readdata, 6, 0xFFFF);
    BusyIndication = (readdata[0] >> 7) & 0x01; // 状态标志位
    CalEnable = (readdata[0] >> 3) & 0x01;      // 校准标志位
    if (CalEnable == 0)// 未校准,软复位
    {
        AHT30_SoftReset();
    }
    if (BusyIndication == 0)// 设备不忙,可以读取数据
    {
        humi = (readdata[1] << 12) | (readdata[2] << 4) | (readdata[3] >> 4);
        temp = ((readdata[3] & 0x0F) << 16) | (readdata[4] << 8) | (readdata[5]);
        *humidity = ((humi * 100.0) / 1048576);
        *temperature = ((float)temp / 1048576) * 200 - 50;
        return 0;
    }
    return 1;
}

这些代码是基于STM32(HAL库)AHT30温湿度传感器驱动程序,主要实现了与传感器的 I2C 通信及数据处理功能,完成传感器控制与温湿度数据获取、转换,返回状态标识读取

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐