最近在玩IP5109系列充電寶IC,想將電量數據回報給ESP32來顯示電量,但I2C還是沒搞明白有沒有大老可以給我顯示電量的範例程序?拜託了感謝

最近在玩IP5109系列充電寶IC,想將電量數據回報給ESP32來顯示電量,但I2C還是沒搞明白有沒有大老可以給我顯示電量的範例程序?拜託了感謝。

【以下回答由 GPT 生成】

对于IP5109系列充电宝IC的电量显示,可以通过I2C协议与ESP32进行通信来实现。以下是一个简单的示例程序,演示如何读取IP5109的电量数据并显示在ESP32上:

  1. 硬件连接: 将IP5109的SDA引脚连接到ESP32的GPIO号,将IP5109的SCL引脚连接到ESP32的GPIO号。

  2. 软件配置: 在ESP32上安装并配置esp-idf开发环境,包括I2C库。

  3. 示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "driver/i2c.h"

#define I2C_MASTER_SCL_IO 19    /*!< gpio number for I2C master clock */
#define I2C_MASTER_SDA_IO 18    /*!< gpio number for I2C master data  */
#define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */
#define I2C_MASTER_FREQ_HZ 100000   /*!< I2C master clock frequency */

#define IP5109_I2C_ADDR 0x75    /*!< I2C address for IP5109 */
#define IP5109_REG_CAPACITY_MSB 0x08  /*!< IP5109 register for capacity MSB */
#define IP5109_REG_CAPACITY_LSB 0x09  /*!< IP5109 register for capacity LSB */

esp_err_t i2c_init() {
    i2c_config_t conf;
    conf.mode = I2C_MODE_MASTER;
    conf.sda_io_num = I2C_MASTER_SDA_IO;
    conf.scl_io_num = I2C_MASTER_SCL_IO;
    conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
    conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
    conf.master.clk_speed = I2C_MASTER_FREQ_HZ;
    i2c_param_config(I2C_MASTER_NUM, &conf);
    return i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0);
}

uint16_t ip5109_read_capacity() {
    uint8_t data[2];
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, IP5109_I2C_ADDR << 1 | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(cmd, IP5109_REG_CAPACITY_MSB, true);
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, IP5109_I2C_ADDR << 1 | I2C_MASTER_READ, true);
    i2c_master_read_byte(cmd, &data[0], I2C_MASTER_ACK);
    i2c_master_read_byte(cmd, &data[1], I2C_MASTER_NACK);
    i2c_master_stop(cmd);
    i2c_cmd_link_delete(cmd);

    return (data[0] << 8 | data[1]);
}

void app_main() {
    esp_err_t ret = i2c_init();
    if (ret != ESP_OK) {
        printf("I2C initialization failed!\n");
        return;
    }

    uint16_t capacity = ip5109_read_capacity();
    printf("IP5109 Capacity: %d mAh\n", capacity);
}

请注意,示例代码中的I2C引脚号需要根据实际连接进行修改。该代码通过读取IP5109的寄存器来获取电量数据,并打印在ESP32的串口上。

希望以上示例能够对您有所帮助。如果有进一步的问题,请随时向我提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^