备份:esp32 驱动 GY-30 光强度测量模块

文本

4. BH1750 指令集
BH1750 有多个操作模式,常用模式如下:

Power Down(断电模式):停止 BH1750 的操作,低功耗模式。
指令:0x00

Power On(上电模式):启动 BH1750,但不开始测量。
指令:0x01

Reset(重置模式):重置数据寄存器,只能在 Power On 模式下使用。
指令:0x07

Continuously H-Resolution Mode:连续高分辨率模式,1lx 分辨率,测量时间约为 120ms。
指令:0x10

Continuously H-Resolution Mode2:连续高分辨率模式2,0.5lx 分辨率,测量时间约为 120ms。
指令:0x11

Continuously L-Resolution Mode:连续低分辨率模式,4lx 分辨率,测量时间约为 16ms。
指令:0x13

One Time H-Resolution Mode:一次性高分辨率模式,1lx 分辨率,测量时间约为 120ms。
指令:0x20

One Time H-Resolution Mode2:一次性高分辨率模式2,0.5lx 分辨率,测量时间约为 120ms。
指令:0x21

One Time L-Resolution Mode:一次性低分辨率模式,4lx 分辨率,测量时间约为 16ms。
指令:0x23
 



#include "driver/spi_master.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "string.h"
#include "driver/i2c.h"
#include "esp_rom_sys.h"
#include "sdkconfig.h"
#include <stdio.h>
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart.h"

#define I2C_MASTER_SCL_IO           15   // ESP32 SCL 引脚
#define I2C_MASTER_SDA_IO           21    // ESP32 SDA 引脚
#define I2C_MASTER_NUM              I2C_NUM_0  // 使用 I2C 端口0
#define I2C_MASTER_FREQ_HZ          100000     // I2C 时钟频率
#define I2C_MASTER_TX_BUF_DISABLE   0      // 禁用发送缓冲区
#define I2C_MASTER_RX_BUF_DISABLE   0      // 禁用接收缓冲区
#define GY30_SENSOR_ADDR            0x23   // GY-30 默认 I2C 地址   AD0脚接地  接vcc 0x5c

/*
4. BH1750 指令集
BH1750 有多个操作模式,常用模式如下:

Power Down(断电模式):停止 BH1750 的操作,低功耗模式。
指令:0x00

Power On(上电模式):启动 BH1750,但不开始测量。
指令:0x01

Reset(重置模式):重置数据寄存器,只能在 Power On 模式下使用。
指令:0x07

Continuously H-Resolution Mode:连续高分辨率模式,1lx 分辨率,测量时间约为 120ms。
指令:0x10

Continuously H-Resolution Mode2:连续高分辨率模式2,0.5lx 分辨率,测量时间约为 120ms。
指令:0x11

Continuously L-Resolution Mode:连续低分辨率模式,4lx 分辨率,测量时间约为 16ms。
指令:0x13

One Time H-Resolution Mode:一次性高分辨率模式,1lx 分辨率,测量时间约为 120ms。
指令:0x20

One Time H-Resolution Mode2:一次性高分辨率模式2,0.5lx 分辨率,测量时间约为 120ms。
指令:0x21

One Time L-Resolution Mode:一次性低分辨率模式,4lx 分辨率,测量时间约为 16ms。
指令:0x23


*/
// I2C 初始化函数
void i2c_master_init() {
    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        .master.clk_speed = I2C_MASTER_FREQ_HZ,
    };
    i2c_param_config(I2C_MASTER_NUM, &conf);
    i2c_driver_install(I2C_MASTER_NUM, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
esp_err_t bh1750_write_command(uint8_t command) {
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (GY30_SENSOR_ADDR << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(cmd, command, true);  // 写入指令
    i2c_master_stop(cmd);
    esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
    return ret;
}

// 启动光强测量(高分辨率模式)
void bh1750_start_measurement() {
    bh1750_write_command(0x10);  // 0x10: 连续高分辨率模式
}
esp_err_t bh1750_read_lux(uint16_t *lux) {
    uint8_t data[2];
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (GY30_SENSOR_ADDR << 1) | I2C_MASTER_READ, true);
    i2c_master_read(cmd, data, 2, I2C_MASTER_ACK);
    i2c_master_stop(cmd);
    esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);

    if (ret == ESP_OK) {
        // 计算光照强度,单位为勒克斯
        *lux = ((data[0] << 8) | data[1]) / 1.2;
    }
    return ret;
}

void app_main(void) {
    i2c_master_init();  // 初始化 I2C
    bh1750_start_measurement();  // 启动光强测量

    while (1) {
        uint16_t lux = 0;
        if (bh1750_read_lux(&lux) == ESP_OK) {
            printf("Light intensity: %d lux\n", lux);
        } else {
            printf("Failed to read light intensity\n");
        }
        vTaskDelay(1000 / portTICK_PERIOD_MS);  // 每秒读取一次
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值