47 lines
1.4 KiB
C++
47 lines
1.4 KiB
C++
#include "esphome.h"
|
|
|
|
#define MAX17048_ADDRESS 0x36
|
|
#define MAX17048_VCELL 0x02 // voltage
|
|
#define MAX17048_SOC 0x04 // percentage
|
|
#define MAX17048_MODE 0x06
|
|
#define MAX17048_VERSION 0x08
|
|
#define MAX17048_CONFIG 0x0c
|
|
#define MAX17048_COMMAND 0xfe
|
|
|
|
class MAX17048Sensor : public PollingComponent, public Sensor {
|
|
public:
|
|
Sensor *voltage_sensor = new Sensor();
|
|
Sensor *percentage_sensor = new Sensor();
|
|
|
|
MAX17048Sensor() : PollingComponent(10000) {}
|
|
|
|
void setup() override {
|
|
// Initialize the device here. Usually Wire.begin() will be called in here,
|
|
// though that call is unnecessary if you have an 'i2c:' entry in your config
|
|
ESP_LOGD("custom", "Starting up MAX17048 sensor");
|
|
|
|
Wire.begin();
|
|
}
|
|
|
|
uint16_t read16(uint8_t reg) {
|
|
uint16_t temp;
|
|
Wire.begin();
|
|
Wire.beginTransmission(MAX17048_ADDRESS);
|
|
Wire.write(reg);
|
|
Wire.endTransmission();
|
|
Wire.requestFrom(MAX17048_ADDRESS, 2);
|
|
temp = (uint16_t)Wire.read() << 8;
|
|
temp |= (uint16_t)Wire.read();
|
|
Wire.endTransmission();
|
|
return temp;
|
|
}
|
|
|
|
void update() override {
|
|
float voltage = (float)(read16(MAX17048_VCELL)) * 78.125 / 1000000;
|
|
voltage_sensor->publish_state(voltage);
|
|
|
|
uint16_t percentage_tmp = read16(MAX17048_SOC);
|
|
float percentage = (float)(percentage_tmp) / 256;
|
|
percentage_sensor->publish_state(percentage);
|
|
}
|
|
}; |