diff --git a/esphome/components/ads1220/__init__.py b/esphome/components/ads1220/__init__.py index 387346c9d0..a41a9f0551 100644 --- a/esphome/components/ads1220/__init__.py +++ b/esphome/components/ads1220/__init__.py @@ -1,7 +1,12 @@ import esphome.codegen as cg import esphome.config_validation as cv +from esphome import pins from esphome.components import spi -from esphome.const import CONF_ID +from esphome import pins +from esphome.const import ( + CONF_ID, + CONF_DC_PIN, +) DEPENDENCIES = ["spi"] AUTO_LOAD = ["sensor", "voltage_sampler"] @@ -10,20 +15,21 @@ MULTI_CONF = True ads1220_ns = cg.esphome_ns.namespace("ads1220") ADS1220Component = ads1220_ns.class_("ADS1220Component", cg.Component, spi.SPIDevice) -CONF_CONTINUOUS_MODE = "continuous_mode" CONFIG_SCHEMA = ( cv.Schema( { cv.GenerateID(): cv.declare_id(ADS1220Component), - cv.Optional(CONF_CONTINUOUS_MODE, default=False): cv.boolean, + cv.Required(CONF_DC_PIN): pins.gpio_output_pin_schema, } ) .extend(cv.COMPONENT_SCHEMA) .extend(spi.spi_device_schema(None)) ) - async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) await cg.register_component(var, config) await spi.register_spi_device(var, config) + + drdy = await cg.gpio_pin_expression(config[CONF_DC_PIN]) + cg.add(var.set_drdy_pin(drdy)) diff --git a/esphome/components/ads1220/ads1220.cpp b/esphome/components/ads1220/ads1220.cpp index 42dbd0e140..2d39bedd62 100644 --- a/esphome/components/ads1220/ads1220.cpp +++ b/esphome/components/ads1220/ads1220.cpp @@ -37,8 +37,13 @@ void ADS1220Component::setup() { this->spi_setup(); //pinMode(csPin, OUTPUT); //digitalWrite(csPin, HIGH); - pinMode(drdyPin, INPUT); - + //drdyPin = 21; + //pinMode(sensor->drdy_pin, INPUT_PULLUP); + + this->drdy_pin->setup(); + this->drdy_pin->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + + //vRef = 2.048; vRef = 3.300; gain = 1; @@ -158,28 +163,29 @@ float ADS1220Component::request_measurement(ADS1220Sensor *sensor) { // Setup temperature sensor config = sensor->get_temp_sensor_mode(); ESP_LOGI(TAG, "ADS1220 temp sensor mode: 0x%02x", config); - if (prev_temp_sensor != config) { + if (prev_temp_sensor_mode != config) { //enableTemperatureSensor(config); - prev_temp_sensor = config; + prev_temp_sensor_mode = config; } // Setup burnout current sources - config = sensor->get_burnout_current_sources(); + config = sensor->get_fault_test_mode(); ESP_LOGI(TAG, "ADS1220 fault test mode: 0x%02x", config); - if (prev_burnout_current_sources != config) { + if (prev_fault_test_mode != config) { //enableBurnOutCurrentSources(config); - prev_burnout_current_sources = config; + prev_fault_test_mode = config; } // Setup multiplexer config = sensor->get_multiplexer(); - //ESP_LOGI(TAG, "ADS1220 mux: 0x%02x", (ads1220Multiplexer)config); + ESP_LOGI(TAG, "ADS1220 mux: 0x%02x", (ads1220Multiplexer)config); if (prev_multiplexer != config) { setCompareChannels((ads1220Multiplexer)config); prev_multiplexer = (ads1220Multiplexer)config; } + ESP_LOGI(TAG, "Start conversion!"); resultInMV = getVoltage_mV(); resultInVoltage = resultInMV / 1000.0; @@ -462,28 +468,22 @@ uint32_t ADS1220Component::readResult() uint8_t data[4] = { 0x00 }; uint32_t rawResult = 0; - //ESP_LOGI(TAG, "Read result from ADS1220!"); - //delay(1); - if(convMode == ADS1220_SINGLE_SHOT){ - //ESP_LOGI(TAG, "Start conversion!"); - //delay(1); start(); } - while(digitalRead(drdyPin)) {} + while(this->drdy_pin->digital_read()) { + delay(1); + } - //ESP_LOGI(TAG, "Store result to memory!"); - //delay(1); - this->enable(); - delay(1); + //delay(1); data[0] = this->read_byte(); data[1] = this->read_byte(); data[2] = this->read_byte(); this->disable(); - delay(1); + //delay(1); rawResult = data[0]; rawResult = (rawResult << 8) | data[1]; @@ -518,7 +518,7 @@ uint8_t ADS1220Component::readRegister(uint8_t reg) uint8_t data[4] = { 0x00 };; this->enable(); - delay(1); + //delay(1); this->write_byte(ADS1220_RREG | (reg<<2)); @@ -527,7 +527,7 @@ uint8_t ADS1220Component::readRegister(uint8_t reg) data[2] = this->read_byte(); this->disable(); - delay(1); + //delay(1); return data[0]; } @@ -544,13 +544,13 @@ void ADS1220Component::writeRegister(uint8_t reg, uint8_t val) spi_device_register_3_buffered = val; this->enable(); - delay(1); + //delay(1); this->write_byte(ADS1220_WREG | (reg<<2)); this->write_byte(val); this->disable(); - delay(1); + //delay(1); } @@ -559,12 +559,12 @@ void ADS1220Component::send_command(uint8_t cmd) //ESP_LOGI(TAG, "Send command %u to ADS1220", cmd); this->enable(); - delay(1); + //delay(1); this->write_byte(cmd); this->disable(); - delay(1); + //delay(1); } diff --git a/esphome/components/ads1220/ads1220.h b/esphome/components/ads1220/ads1220.h index 293e11049f..b13a5e69eb 100644 --- a/esphome/components/ads1220/ads1220.h +++ b/esphome/components/ads1220/ads1220.h @@ -116,14 +116,17 @@ class ADS1220Sensor; class ADS1220Component : public Component, public spi::SPIDevice { public: + ADS1220Sensor *sensor; void register_sensor(ADS1220Sensor *obj) { this->sensors_.push_back(obj); } /// Set up the internal sensor array. void setup() override; void dump_config() override; /// HARDWARE_LATE setup priority float get_setup_priority() const override { return setup_priority::DATA; } - void set_continuous_mode(bool continuous_mode) { continuous_mode_ = continuous_mode; } - + + void set_drdy_pin(GPIOPin *pin) { drdy_pin = pin; } + //GPIOPin *get_drdy_pin() { return drdy_pin; } + /// Helper method to request a measurement from a sensor. float request_measurement(ADS1220Sensor *sensor); @@ -132,8 +135,9 @@ class ADS1220Component : public Component, public spi::SPIDevicetemperature_mode_ = temp; } - + float sample() override; + uint8_t get_multiplexer() const { return multiplexer_; } uint8_t get_gain() const { return gain_; } - uint8_t get_datarate() const { return datarate_; } uint8_t get_operating_mode() const { return op_mode_; } uint8_t get_conversion_mode() const { return conv_mode_; } uint8_t get_temp_sensor_mode() const { return temp_sensor_mode_; } - uint8_t get_burnout_current_sources() const { return burnout_current_sources_; } + uint8_t get_fault_test_mode() const { return fault_test_mode_; } uint8_t get_vref_source() const { return vref_source_; } uint8_t get_drdy_mode() const { return drdy_mode_; } @@ -271,9 +271,9 @@ class ADS1220Sensor : public sensor::Sensor, public PollingComponent, public vol ADS1220IdacRouting idac_1_routing_; ADS1220IdacRouting idac_2_routing_; - bool temp_sensor_mode_; - bool burnout_current_sources_; - + uint8_t temp_sensor_mode_; + uint8_t fault_test_mode_; + }; } // namespace ads1220 diff --git a/esphome/components/ads1220/sensor.py b/esphome/components/ads1220/sensor.py index 9aa42820ad..a7dcd518b2 100644 --- a/esphome/components/ads1220/sensor.py +++ b/esphome/components/ads1220/sensor.py @@ -1,5 +1,6 @@ import esphome.codegen as cg import esphome.config_validation as cv +from esphome import pins from esphome.components import sensor, voltage_sampler from esphome.const import ( CONF_GAIN, @@ -14,7 +15,7 @@ from esphome.const import ( ) from . import ads1220_ns, ADS1220Component - +CODEOWNERS = ["@miikasyvanen"] DEPENDENCIES = ["ads1220"] @@ -138,11 +139,12 @@ def validate_gain(value): return cv.enum(GAIN)(value) - ADS1220Sensor = ads1220_ns.class_( "ADS1220Sensor", sensor.Sensor, cg.PollingComponent, voltage_sampler.VoltageSampler ) +ADS1220GPIOPin = ads1220_ns.class_("ADS1220GPIOPin", cg.GPIOPin) + CONF_ADS1220_ID = "ads1220_id" CONF_DATARATE = "datarate" CONF_OP_MODE = "operation_mode" @@ -155,6 +157,7 @@ CONF_IDAC_1_ROUTING = "idac_1_routing" CONF_IDAC_2_ROUTING = "idac_2_routing" CONF_DRDY_MODE = "drdy_mode" CONF_FAULT_TEST_MODE = "fault_test_mode" +#CONF_DRDY_PIN = "drdy_pin" TYPE_ADC = "adc" TYPE_TEMPERATURE = "temperature" @@ -205,10 +208,6 @@ CONFIG_SCHEMA = cv.typed_schema( ) async def to_code(config): - #var = await sensor.new_sensor(config) - #await cg.register_component(var, config) - #await cg.register_parented(var, config[CONF_ADS1220_ID]) - paren = await cg.get_variable(config[CONF_ADS1220_ID]) var = cg.new_Pvariable(config[CONF_ID], paren) await sensor.register_sensor(var, config)