Add bh1750, aht20, sgp40 drivers unified on native i2c_master API
Forked from managed_components (espressif/bh1750, espressif/aht20, esp-idf-lib/sgp40) and rewrote aht20/sgp40 internals to use driver/i2c_master.h directly instead of the i2c_bus and i2cdev wrapper components, so all three sensors share one create/delete handle pattern over a single i2c_master_bus_handle_t.
This commit is contained in:
116
bh1750/bh1750.c
Normal file
116
bh1750/bh1750.c
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include "bh1750.h"
|
||||
#include "driver/i2c_master.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/projdefs.h" // for pdMS_TO_TICKS
|
||||
|
||||
#define BH_1750_MEASUREMENT_ACCURACY \
|
||||
1.2 /*!< the typical measurement accuracy of BH1750 sensor \
|
||||
*/
|
||||
|
||||
#define BH1750_POWER_DOWN 0x00 /*!< Command to set Power Down*/
|
||||
#define BH1750_POWER_ON 0x01 /*!< Command to set Power On*/
|
||||
#define I2C_CLK_SPEED 400000
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
i2c_master_dev_handle_t i2c_handle;
|
||||
} bh1750_dev_t;
|
||||
|
||||
static esp_err_t bh1750_write_byte(const bh1750_dev_t* const sens, const uint8_t byte)
|
||||
{ return i2c_master_transmit(sens->i2c_handle, &byte, 1, pdMS_TO_TICKS(1000)); }
|
||||
|
||||
esp_err_t bh1750_create(i2c_master_bus_handle_t i2c_bus,
|
||||
const uint8_t dev_addr,
|
||||
bh1750_handle_t* handle_ret)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
bh1750_dev_t* sensor = (bh1750_dev_t*) calloc(1, sizeof(bh1750_dev_t));
|
||||
if (!sensor)
|
||||
{
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
|
||||
// Add new I2C device
|
||||
const i2c_device_config_t i2c_dev_cfg = {
|
||||
.device_address = dev_addr,
|
||||
.scl_speed_hz = I2C_CLK_SPEED,
|
||||
};
|
||||
ret = i2c_master_bus_add_device(i2c_bus, &i2c_dev_cfg, &sensor->i2c_handle);
|
||||
if (ret != ESP_OK)
|
||||
{
|
||||
free(sensor);
|
||||
return ret;
|
||||
}
|
||||
|
||||
assert(sensor->i2c_handle);
|
||||
*handle_ret = sensor;
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t bh1750_delete(bh1750_handle_t sensor)
|
||||
{
|
||||
bh1750_dev_t* sens = (bh1750_dev_t*) sensor;
|
||||
if (sens->i2c_handle)
|
||||
{
|
||||
i2c_master_bus_rm_device(sens->i2c_handle);
|
||||
}
|
||||
free(sens);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t bh1750_power_down(bh1750_handle_t sensor)
|
||||
{
|
||||
bh1750_dev_t* sens = (bh1750_dev_t*) sensor;
|
||||
return bh1750_write_byte(sens, BH1750_POWER_DOWN);
|
||||
}
|
||||
|
||||
esp_err_t bh1750_power_on(bh1750_handle_t sensor)
|
||||
{
|
||||
bh1750_dev_t* sens = (bh1750_dev_t*) sensor;
|
||||
return bh1750_write_byte(sens, BH1750_POWER_ON);
|
||||
}
|
||||
|
||||
esp_err_t bh1750_set_measure_time(bh1750_handle_t sensor, const uint8_t measure_time)
|
||||
{
|
||||
bh1750_dev_t* sens = (bh1750_dev_t*) sensor;
|
||||
uint32_t i = 0;
|
||||
uint8_t buf[2] = { 0x40, 0x60 }; // constant part of the the MTreg
|
||||
buf[0] |= measure_time >> 5;
|
||||
buf[1] |= measure_time & 0x1F;
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
esp_err_t ret = bh1750_write_byte(sens, buf[i]);
|
||||
if (ESP_OK != ret)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t bh1750_set_measure_mode(bh1750_handle_t sensor, const bh1750_measure_mode_t cmd_measure)
|
||||
{
|
||||
bh1750_dev_t* sens = (bh1750_dev_t*) sensor;
|
||||
return bh1750_write_byte(sens, (uint8_t) cmd_measure);
|
||||
}
|
||||
|
||||
esp_err_t bh1750_get_data(bh1750_handle_t sensor, float* const data)
|
||||
{
|
||||
bh1750_dev_t* sens = (bh1750_dev_t*) sensor;
|
||||
uint8_t read_buffer[2];
|
||||
esp_err_t ret = i2c_master_receive(
|
||||
sens->i2c_handle, read_buffer, sizeof(read_buffer), pdMS_TO_TICKS(1000));
|
||||
if (ESP_OK != ret)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
*data = ((read_buffer[0] << 8 | read_buffer[1]) / BH_1750_MEASUREMENT_ACCURACY);
|
||||
return ESP_OK;
|
||||
}
|
||||
Reference in New Issue
Block a user