Updated Mcp3008 to support reference_voltage and voltage_sampler::VoltageSampler (#1387)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
SenexCrenshaw 2021-01-13 13:33:19 -05:00 committed by GitHub
parent e7b1d2efaa
commit 36089a1400
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 22 deletions

View File

@ -18,16 +18,15 @@ void MCP3008::dump_config() {
LOG_PIN(" CS Pin:", this->cs_); LOG_PIN(" CS Pin:", this->cs_);
} }
float MCP3008::read_data_(uint8_t pin) { float MCP3008::read_data(uint8_t pin) {
uint8_t data_msb = 0; uint8_t data_msb, data_lsb = 0;
uint8_t data_lsb = 0;
uint8_t command = ((0x01 << 7) | // start bit uint8_t command = ((0x01 << 7) | // start bit
((pin & 0x07) << 4)); // channel number ((pin & 0x07) << 4)); // channel number
this->enable(); this->enable();
this->transfer_byte(0x01); this->transfer_byte(0x01);
data_msb = this->transfer_byte(command) & 0x03; data_msb = this->transfer_byte(command) & 0x03;
data_lsb = this->transfer_byte(0x00); data_lsb = this->transfer_byte(0x00);
@ -35,18 +34,29 @@ float MCP3008::read_data_(uint8_t pin) {
int data = data_msb << 8 | data_lsb; int data = data_msb << 8 | data_lsb;
return data / 1024.0f; return data / 1023.0f;
} }
MCP3008Sensor::MCP3008Sensor(MCP3008 *parent, std::string name, uint8_t pin) MCP3008Sensor::MCP3008Sensor(MCP3008 *parent, std::string name, uint8_t pin, float reference_voltage)
: PollingComponent(1000), parent_(parent), pin_(pin) { : PollingComponent(1000), parent_(parent), pin_(pin) {
this->set_name(name); this->set_name(name);
this->reference_voltage_ = reference_voltage;
} }
float MCP3008Sensor::get_setup_priority() const { return setup_priority::DATA; }
void MCP3008Sensor::setup() { LOG_SENSOR("", "Setting up MCP3008 Sensor '%s'...", this); } void MCP3008Sensor::setup() { LOG_SENSOR("", "Setting up MCP3008 Sensor '%s'...", this); }
void MCP3008Sensor::update() { void MCP3008Sensor::dump_config() {
float value_v = this->parent_->read_data_(pin_); ESP_LOGCONFIG(TAG, "MCP3008Sensor:");
this->publish_state(value_v); ESP_LOGCONFIG(TAG, " Pin: %u", this->pin_);
ESP_LOGCONFIG(TAG, " Reference Voltage: %.2fV", this->reference_voltage_);
} }
float MCP3008Sensor::sample() {
float value_v = this->parent_->read_data(pin_);
value_v = (value_v * this->reference_voltage_);
return value_v;
}
void MCP3008Sensor::update() { this->publish_state(this->sample()); }
} // namespace mcp3008 } // namespace mcp3008
} // namespace esphome } // namespace esphome

View File

@ -4,38 +4,41 @@
#include "esphome/core/esphal.h" #include "esphome/core/esphal.h"
#include "esphome/components/sensor/sensor.h" #include "esphome/components/sensor/sensor.h"
#include "esphome/components/spi/spi.h" #include "esphome/components/spi/spi.h"
#include "esphome/components/voltage_sampler/voltage_sampler.h"
namespace esphome { namespace esphome {
namespace mcp3008 { namespace mcp3008 {
class MCP3008Sensor;
class MCP3008 : public Component, class MCP3008 : public Component,
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING, public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING,
spi::DATA_RATE_1MHZ> { // At 3.3V 2MHz is too fast 1.35MHz is about right spi::DATA_RATE_75KHZ> { // Running at the slowest max speed supported by the
// mcp3008. 2.7v = 75ksps
public: public:
MCP3008() = default; MCP3008() = default;
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);
protected: protected:
float read_data_(uint8_t pin);
friend class MCP3008Sensor;
}; };
class MCP3008Sensor : public PollingComponent, public sensor::Sensor { class MCP3008Sensor : public PollingComponent, public sensor::Sensor, public voltage_sampler::VoltageSampler {
public: public:
MCP3008Sensor(MCP3008 *parent, std::string name, uint8_t pin); MCP3008Sensor(MCP3008 *parent, std::string name, uint8_t pin, float reference_voltage);
void set_reference_voltage(float reference_voltage) { reference_voltage_ = reference_voltage; }
void setup() override; void setup() override;
void update() override; void update() override;
void dump_config() override;
float get_setup_priority() const override;
float sample() override;
protected: protected:
MCP3008 *parent_; MCP3008 *parent_;
uint8_t pin_; uint8_t pin_;
float reference_voltage_;
}; };
} // namespace mcp3008 } // namespace mcp3008

View File

@ -1,23 +1,29 @@
import esphome.codegen as cg import esphome.codegen as cg
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.components import sensor from esphome.components import sensor, voltage_sampler
from esphome.const import CONF_ID, CONF_NUMBER, CONF_NAME from esphome.const import CONF_ID, CONF_NUMBER, CONF_NAME
from . import mcp3008_ns, MCP3008 from . import mcp3008_ns, MCP3008
AUTO_LOAD = ['voltage_sampler']
DEPENDENCIES = ['mcp3008'] DEPENDENCIES = ['mcp3008']
MCP3008Sensor = mcp3008_ns.class_('MCP3008Sensor', sensor.Sensor, cg.PollingComponent) MCP3008Sensor = mcp3008_ns.class_('MCP3008Sensor', sensor.Sensor, cg.PollingComponent,
voltage_sampler.VoltageSampler)
CONF_REFERENCE_VOLTAGE = 'reference_voltage'
CONF_MCP3008_ID = 'mcp3008_id' CONF_MCP3008_ID = 'mcp3008_id'
CONFIG_SCHEMA = sensor.SENSOR_SCHEMA.extend({ CONFIG_SCHEMA = sensor.SENSOR_SCHEMA.extend({
cv.GenerateID(): cv.declare_id(MCP3008Sensor), cv.GenerateID(): cv.declare_id(MCP3008Sensor),
cv.GenerateID(CONF_MCP3008_ID): cv.use_id(MCP3008), cv.GenerateID(CONF_MCP3008_ID): cv.use_id(MCP3008),
cv.Required(CONF_NUMBER): cv.int_, cv.Required(CONF_NUMBER): cv.int_,
cv.Optional(CONF_REFERENCE_VOLTAGE, default='3.3V'): cv.voltage,
}).extend(cv.polling_component_schema('1s')) }).extend(cv.polling_component_schema('1s'))
def to_code(config): def to_code(config):
parent = yield cg.get_variable(config[CONF_MCP3008_ID]) parent = yield cg.get_variable(config[CONF_MCP3008_ID])
var = cg.new_Pvariable(config[CONF_ID], parent, config[CONF_NAME], config[CONF_NUMBER]) var = cg.new_Pvariable(config[CONF_ID], parent, config[CONF_NAME],
config[CONF_NUMBER], config[CONF_REFERENCE_VOLTAGE])
yield cg.register_component(var, config) yield cg.register_component(var, config)
yield sensor.register_sensor(var, config)

View File

@ -50,6 +50,7 @@ enum SPIClockPhase {
*/ */
enum SPIDataRate : uint32_t { enum SPIDataRate : uint32_t {
DATA_RATE_1KHZ = 1000, DATA_RATE_1KHZ = 1000,
DATA_RATE_75KHZ = 75000,
DATA_RATE_200KHZ = 200000, DATA_RATE_200KHZ = 200000,
DATA_RATE_1MHZ = 1000000, DATA_RATE_1MHZ = 1000000,
DATA_RATE_2MHZ = 2000000, DATA_RATE_2MHZ = 2000000,

View File

@ -197,6 +197,10 @@ wled:
adalight: adalight:
mcp3008:
- id: 'mcp3008_hub'
cs_pin: GPIO12
mcp23s08: mcp23s08:
- id: 'mcp23s08_hub' - id: 'mcp23s08_hub'
cs_pin: GPIO12 cs_pin: GPIO12
@ -207,6 +211,7 @@ mcp23s17:
cs_pin: GPIO12 cs_pin: GPIO12
deviceaddress: 1 deviceaddress: 1
sensor: sensor:
- platform: adc - platform: adc
pin: A0 pin: A0
@ -801,6 +806,12 @@ sensor:
id: ph_ezo id: ph_ezo
address: 99 address: 99
unit_of_measurement: 'pH' unit_of_measurement: 'pH'
- platform: mcp3008
update_interval: 5s
mcp3008_id: 'mcp3008_hub'
id: freezer_temp_source
reference_voltage: 3.19
number: 0
esp32_touch: esp32_touch:
setup_mode: False setup_mode: False