86 lines
2.7 KiB
C
86 lines
2.7 KiB
C
#include <stdio.h>
|
||
#include <string.h>
|
||
#include "freertos/FreeRTOS.h"
|
||
#include "freertos/task.h"
|
||
#include "esp_log.h"
|
||
#include "sgm8031_use.h"
|
||
#include "sgm58031.h"
|
||
|
||
static const char *TAG = "sgm8031_use";
|
||
|
||
static i2c_dev_t s_device;
|
||
static bool s_initialized = false;
|
||
|
||
esp_err_t sgm8031_use_init(int i2c_port, int sda_pin, int scl_pin)
|
||
{
|
||
// Initialize I2C driver if not already done. (i2cdev_init doesn't hurt to call multiple times)
|
||
ESP_ERROR_CHECK_WITHOUT_ABORT(i2cdev_init());
|
||
|
||
memset(&s_device, 0, sizeof(i2c_dev_t));
|
||
|
||
// 使用 GND 地址针脚
|
||
esp_err_t err = sgm58031_init_desc(&s_device, SGM58031_ADDR_GND, i2c_port, sda_pin, scl_pin);
|
||
if (err != ESP_OK) {
|
||
ESP_LOGE(TAG, "SGM58031 init desc failed");
|
||
return err;
|
||
}
|
||
|
||
uint8_t id, version;
|
||
if (sgm58031_get_chip_id(&s_device, &id, &version) == ESP_OK) {
|
||
ESP_LOGI(TAG, "SGM58031 Found! ID: %d, Version: %d", id, version);
|
||
} else {
|
||
ESP_LOGW(TAG, "Failed to get SGM58031 Chip ID");
|
||
}
|
||
|
||
// 设置为单次转换模式,以便我们在不同通道间切换
|
||
ESP_ERROR_CHECK_WITHOUT_ABORT(sgm58031_set_conv_mode(&s_device, SGM58031_CONV_MODE_SINGLE_SHOT));
|
||
ESP_ERROR_CHECK_WITHOUT_ABORT(sgm58031_set_data_rate(&s_device, SGM58031_DATA_RATE_100)); // 适当的速度 100SPS
|
||
|
||
s_initialized = true;
|
||
return ESP_OK;
|
||
}
|
||
|
||
// 内部函数:读取指定通道和增益下的ADC值
|
||
static esp_err_t read_channel(sgm58031_mux_t mux, sgm58031_gain_t gain, int16_t *out_val)
|
||
{
|
||
if (!s_initialized) return ESP_ERR_INVALID_STATE;
|
||
|
||
// 配置 MUX 和 增益
|
||
esp_err_t err = sgm58031_set_input_mux(&s_device, mux);
|
||
if (err != ESP_OK) return err;
|
||
|
||
err = sgm58031_set_gain(&s_device, gain);
|
||
if (err != ESP_OK) return err;
|
||
|
||
// 启动单次转换
|
||
err = sgm58031_start_conversion(&s_device);
|
||
if (err != ESP_OK) return err;
|
||
|
||
// 直接延时足够的时间跳过 busy 检查 (8 SPS 时大约 125ms,100SPS只需 10ms,我们延时 50ms 保底)
|
||
vTaskDelay(pdMS_TO_TICKS(50));
|
||
|
||
// 读取值
|
||
return sgm58031_get_value(&s_device, out_val);
|
||
}
|
||
|
||
esp_err_t sgm8031_use_read_data(scale_data_t *out_data)
|
||
{
|
||
if (out_data == NULL) return ESP_ERR_INVALID_ARG;
|
||
int16_t weight_raw = 0;
|
||
esp_err_t err = read_channel(SGM58031_MUX_AIN0_AIN1, SGM58031_GAIN_0V256, &weight_raw);
|
||
if (err != ESP_OK) return err;
|
||
out_data->weight = (float)weight_raw; // 现在直接输出原始值供外部处理
|
||
return ESP_OK;
|
||
}
|
||
|
||
esp_err_t sgm8031_use_tare(void)
|
||
{
|
||
// 该函数已被外部 controller 取代,仅作为兼容占位或直接废弃
|
||
return ESP_OK;
|
||
}
|
||
|
||
void sgm8031_use_set_calibration_factor(float factor)
|
||
{
|
||
// 该函数已被外部 controller 取代
|
||
}
|