mirror of
https://github.com/esphome/esphome.git
synced 2026-06-24 13:43:00 +00:00
[mcp3204] differential mode support (#7436)
Co-authored-by: marko <marko@> Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
This commit is contained in:
@@ -16,16 +16,21 @@ void MCP3204::dump_config() {
|
|||||||
ESP_LOGCONFIG(TAG, " Reference Voltage: %.2fV", this->reference_voltage_);
|
ESP_LOGCONFIG(TAG, " Reference Voltage: %.2fV", this->reference_voltage_);
|
||||||
}
|
}
|
||||||
|
|
||||||
float MCP3204::read_data(uint8_t pin) {
|
float MCP3204::read_data(uint8_t pin, bool differential) {
|
||||||
uint8_t adc_primary_config = 0b00000110 | (pin >> 2);
|
uint8_t command, b0, b1;
|
||||||
uint8_t adc_secondary_config = pin << 6;
|
|
||||||
|
command = (1 << 6) | // start bit
|
||||||
|
((differential ? 0 : 1) << 5) | // single or differential bit
|
||||||
|
((pin & 0x07) << 2); // pin
|
||||||
|
|
||||||
this->enable();
|
this->enable();
|
||||||
this->transfer_byte(adc_primary_config);
|
this->transfer_byte(command);
|
||||||
uint8_t adc_primary_byte = this->transfer_byte(adc_secondary_config);
|
b0 = this->transfer_byte(0x00);
|
||||||
uint8_t adc_secondary_byte = this->transfer_byte(0x00);
|
b1 = this->transfer_byte(0x00);
|
||||||
this->disable();
|
this->disable();
|
||||||
uint16_t digital_value = (adc_primary_byte << 8 | adc_secondary_byte) & 0b111111111111;
|
|
||||||
return float(digital_value) / 4096.000 * this->reference_voltage_;
|
uint16_t digital_value = encode_uint16(b0, b1) >> 4;
|
||||||
|
return float(digital_value) / 4096.000 * this->reference_voltage_; // in V
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace mcp3204
|
} // namespace mcp3204
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class MCP3204 : public Component,
|
|||||||
void setup() override;
|
void setup() override;
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
float get_setup_priority() const override;
|
float get_setup_priority() const override;
|
||||||
float read_data(uint8_t pin);
|
float read_data(uint8_t pin, bool differential);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
float reference_voltage_;
|
float reference_voltage_;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ MCP3204Sensor = mcp3204_ns.class_(
|
|||||||
"MCP3204Sensor", sensor.Sensor, cg.PollingComponent, voltage_sampler.VoltageSampler
|
"MCP3204Sensor", sensor.Sensor, cg.PollingComponent, voltage_sampler.VoltageSampler
|
||||||
)
|
)
|
||||||
CONF_MCP3204_ID = "mcp3204_id"
|
CONF_MCP3204_ID = "mcp3204_id"
|
||||||
|
CONF_DIFF_MODE = "diff_mode"
|
||||||
|
|
||||||
CONFIG_SCHEMA = (
|
CONFIG_SCHEMA = (
|
||||||
sensor.sensor_schema(MCP3204Sensor)
|
sensor.sensor_schema(MCP3204Sensor)
|
||||||
@@ -20,6 +21,7 @@ CONFIG_SCHEMA = (
|
|||||||
{
|
{
|
||||||
cv.GenerateID(CONF_MCP3204_ID): cv.use_id(MCP3204),
|
cv.GenerateID(CONF_MCP3204_ID): cv.use_id(MCP3204),
|
||||||
cv.Required(CONF_NUMBER): cv.int_range(min=0, max=7),
|
cv.Required(CONF_NUMBER): cv.int_range(min=0, max=7),
|
||||||
|
cv.Optional(CONF_DIFF_MODE, default=False): cv.boolean,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.extend(cv.polling_component_schema("60s"))
|
.extend(cv.polling_component_schema("60s"))
|
||||||
@@ -30,6 +32,7 @@ async def to_code(config):
|
|||||||
var = cg.new_Pvariable(
|
var = cg.new_Pvariable(
|
||||||
config[CONF_ID],
|
config[CONF_ID],
|
||||||
config[CONF_NUMBER],
|
config[CONF_NUMBER],
|
||||||
|
config[CONF_DIFF_MODE],
|
||||||
)
|
)
|
||||||
await cg.register_parented(var, config[CONF_MCP3204_ID])
|
await cg.register_parented(var, config[CONF_MCP3204_ID])
|
||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
|
|||||||
@@ -7,16 +7,15 @@ namespace mcp3204 {
|
|||||||
|
|
||||||
static const char *const TAG = "mcp3204.sensor";
|
static const char *const TAG = "mcp3204.sensor";
|
||||||
|
|
||||||
MCP3204Sensor::MCP3204Sensor(uint8_t pin) : pin_(pin) {}
|
|
||||||
|
|
||||||
float MCP3204Sensor::get_setup_priority() const { return setup_priority::DATA; }
|
float MCP3204Sensor::get_setup_priority() const { return setup_priority::DATA; }
|
||||||
|
|
||||||
void MCP3204Sensor::dump_config() {
|
void MCP3204Sensor::dump_config() {
|
||||||
LOG_SENSOR("", "MCP3204 Sensor", this);
|
LOG_SENSOR("", "MCP3204 Sensor", this);
|
||||||
ESP_LOGCONFIG(TAG, " Pin: %u", this->pin_);
|
ESP_LOGCONFIG(TAG, " Pin: %u", this->pin_);
|
||||||
|
ESP_LOGCONFIG(TAG, " Differential Mode: %s", YESNO(this->differential_mode_));
|
||||||
LOG_UPDATE_INTERVAL(this);
|
LOG_UPDATE_INTERVAL(this);
|
||||||
}
|
}
|
||||||
float MCP3204Sensor::sample() { return this->parent_->read_data(this->pin_); }
|
float MCP3204Sensor::sample() { return this->parent_->read_data(this->pin_, this->differential_mode_); }
|
||||||
void MCP3204Sensor::update() { this->publish_state(this->sample()); }
|
void MCP3204Sensor::update() { this->publish_state(this->sample()); }
|
||||||
|
|
||||||
} // namespace mcp3204
|
} // namespace mcp3204
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class MCP3204Sensor : public PollingComponent,
|
|||||||
public sensor::Sensor,
|
public sensor::Sensor,
|
||||||
public voltage_sampler::VoltageSampler {
|
public voltage_sampler::VoltageSampler {
|
||||||
public:
|
public:
|
||||||
MCP3204Sensor(uint8_t pin);
|
MCP3204Sensor(uint8_t pin, bool differential_mode) : pin_(pin), differential_mode_(differential_mode) {}
|
||||||
|
|
||||||
void update() override;
|
void update() override;
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
@@ -24,6 +24,7 @@ class MCP3204Sensor : public PollingComponent,
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint8_t pin_;
|
uint8_t pin_;
|
||||||
|
bool differential_mode_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace mcp3204
|
} // namespace mcp3204
|
||||||
|
|||||||
@@ -4,7 +4,21 @@ mcp3204:
|
|||||||
|
|
||||||
sensor:
|
sensor:
|
||||||
- platform: mcp3204
|
- platform: mcp3204
|
||||||
id: mcp3204_sensor
|
id: mcp3204_default_single_0
|
||||||
mcp3204_id: mcp3204_hub
|
mcp3204_id: mcp3204_hub
|
||||||
number: 0
|
number: 0
|
||||||
update_interval: 5s
|
update_interval: 5s
|
||||||
|
|
||||||
|
- platform: mcp3204
|
||||||
|
id: mcp3204_single_0
|
||||||
|
mcp3204_id: mcp3204_hub
|
||||||
|
number: 0
|
||||||
|
diff_mode: false
|
||||||
|
update_interval: 5s
|
||||||
|
|
||||||
|
- platform: mcp3204
|
||||||
|
id: mcp3204_diff_0_1
|
||||||
|
mcp3204_id: mcp3204_hub
|
||||||
|
number: 0
|
||||||
|
diff_mode: true
|
||||||
|
update_interval: 5s
|
||||||
|
|||||||
Reference in New Issue
Block a user