mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 13:34:54 +01:00
AS3935 Use normal pin polling for IRQ (#805)
* AS3935 Use normal pin polling for IRQ See also https://github.com/esphome/feature-requests/issues/452 * Fix tests
This commit is contained in:
parent
7bf6fd316f
commit
b0bb692af4
5 changed files with 13 additions and 28 deletions
|
@ -1,12 +1,11 @@
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome import pins
|
from esphome import pins
|
||||||
from esphome.const import CONF_PIN, CONF_INDOOR, CONF_WATCHDOG_THRESHOLD, \
|
from esphome.const import CONF_INDOOR, CONF_WATCHDOG_THRESHOLD, \
|
||||||
CONF_NOISE_LEVEL, CONF_SPIKE_REJECTION, CONF_LIGHTNING_THRESHOLD, \
|
CONF_NOISE_LEVEL, CONF_SPIKE_REJECTION, CONF_LIGHTNING_THRESHOLD, \
|
||||||
CONF_MASK_DISTURBER, CONF_DIV_RATIO, CONF_CAPACITANCE
|
CONF_MASK_DISTURBER, CONF_DIV_RATIO, CONF_CAPACITANCE
|
||||||
from esphome.core import coroutine
|
from esphome.core import coroutine
|
||||||
|
|
||||||
|
|
||||||
AUTO_LOAD = ['sensor', 'binary_sensor']
|
AUTO_LOAD = ['sensor', 'binary_sensor']
|
||||||
MULTI_CONF = True
|
MULTI_CONF = True
|
||||||
|
|
||||||
|
@ -15,10 +14,10 @@ CONF_AS3935_ID = 'as3935_id'
|
||||||
as3935_ns = cg.esphome_ns.namespace('as3935')
|
as3935_ns = cg.esphome_ns.namespace('as3935')
|
||||||
AS3935 = as3935_ns.class_('AS3935Component', cg.Component)
|
AS3935 = as3935_ns.class_('AS3935Component', cg.Component)
|
||||||
|
|
||||||
|
CONF_IRQ_PIN = 'irq_pin'
|
||||||
AS3935_SCHEMA = cv.Schema({
|
AS3935_SCHEMA = cv.Schema({
|
||||||
cv.GenerateID(): cv.declare_id(AS3935),
|
cv.GenerateID(): cv.declare_id(AS3935),
|
||||||
cv.Required(CONF_PIN): cv.All(pins.internal_gpio_input_pin_schema,
|
cv.Required(CONF_IRQ_PIN): pins.gpio_input_pin_schema,
|
||||||
pins.validate_has_interrupt),
|
|
||||||
|
|
||||||
cv.Optional(CONF_INDOOR, default=True): cv.boolean,
|
cv.Optional(CONF_INDOOR, default=True): cv.boolean,
|
||||||
cv.Optional(CONF_NOISE_LEVEL, default=2): cv.int_range(min=1, max=7),
|
cv.Optional(CONF_NOISE_LEVEL, default=2): cv.int_range(min=1, max=7),
|
||||||
|
@ -35,8 +34,8 @@ AS3935_SCHEMA = cv.Schema({
|
||||||
def setup_as3935(var, config):
|
def setup_as3935(var, config):
|
||||||
yield cg.register_component(var, config)
|
yield cg.register_component(var, config)
|
||||||
|
|
||||||
pin = yield cg.gpio_pin_expression(config[CONF_PIN])
|
irq_pin = yield cg.gpio_pin_expression(config[CONF_IRQ_PIN])
|
||||||
cg.add(var.set_pin(pin))
|
cg.add(var.set_irq_pin(irq_pin))
|
||||||
cg.add(var.set_indoor(config[CONF_INDOOR]))
|
cg.add(var.set_indoor(config[CONF_INDOOR]))
|
||||||
cg.add(var.set_noise_level(config[CONF_NOISE_LEVEL]))
|
cg.add(var.set_noise_level(config[CONF_NOISE_LEVEL]))
|
||||||
cg.add(var.set_watchdog_threshold(config[CONF_WATCHDOG_THRESHOLD]))
|
cg.add(var.set_watchdog_threshold(config[CONF_WATCHDOG_THRESHOLD]))
|
||||||
|
|
|
@ -9,10 +9,8 @@ static const char *TAG = "as3935";
|
||||||
void AS3935Component::setup() {
|
void AS3935Component::setup() {
|
||||||
ESP_LOGCONFIG(TAG, "Setting up AS3935...");
|
ESP_LOGCONFIG(TAG, "Setting up AS3935...");
|
||||||
|
|
||||||
this->pin_->setup();
|
this->irq_pin_->setup();
|
||||||
this->store_.pin = this->pin_->to_isr();
|
LOG_PIN(" IRQ Pin: ", this->irq_pin_);
|
||||||
LOG_PIN(" Interrupt Pin: ", this->pin_);
|
|
||||||
this->pin_->attach_interrupt(AS3935ComponentStore::gpio_intr, &this->store_, RISING);
|
|
||||||
|
|
||||||
// Write properties to sensor
|
// Write properties to sensor
|
||||||
this->write_indoor(this->indoor_);
|
this->write_indoor(this->indoor_);
|
||||||
|
@ -27,13 +25,13 @@ void AS3935Component::setup() {
|
||||||
|
|
||||||
void AS3935Component::dump_config() {
|
void AS3935Component::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG, "AS3935:");
|
ESP_LOGCONFIG(TAG, "AS3935:");
|
||||||
LOG_PIN(" Interrupt Pin: ", this->pin_);
|
LOG_PIN(" Interrupt Pin: ", this->irq_pin_);
|
||||||
}
|
}
|
||||||
|
|
||||||
float AS3935Component::get_setup_priority() const { return setup_priority::DATA; }
|
float AS3935Component::get_setup_priority() const { return setup_priority::DATA; }
|
||||||
|
|
||||||
void AS3935Component::loop() {
|
void AS3935Component::loop() {
|
||||||
if (!this->store_.interrupt)
|
if (!this->irq_pin_->digital_read())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint8_t int_value = this->read_interrupt_register_();
|
uint8_t int_value = this->read_interrupt_register_();
|
||||||
|
@ -53,7 +51,6 @@ void AS3935Component::loop() {
|
||||||
this->energy_sensor_->publish_state(energy);
|
this->energy_sensor_->publish_state(energy);
|
||||||
}
|
}
|
||||||
this->thunder_alert_binary_sensor_->publish_state(false);
|
this->thunder_alert_binary_sensor_->publish_state(false);
|
||||||
this->store_.interrupt = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AS3935Component::write_indoor(bool indoor) {
|
void AS3935Component::write_indoor(bool indoor) {
|
||||||
|
@ -222,7 +219,5 @@ uint8_t AS3935Component::read_register_(uint8_t reg, uint8_t mask) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_RAM_ATTR AS3935ComponentStore::gpio_intr(AS3935ComponentStore *arg) { arg->interrupt = true; }
|
|
||||||
|
|
||||||
} // namespace as3935
|
} // namespace as3935
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
|
@ -50,14 +50,6 @@ enum AS3935Values {
|
||||||
NOISE_INT = 0x01
|
NOISE_INT = 0x01
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Store data in a class that doesn't use multiple-inheritance (vtables in flash)
|
|
||||||
struct AS3935ComponentStore {
|
|
||||||
volatile bool interrupt;
|
|
||||||
|
|
||||||
ISRInternalGPIOPin *pin;
|
|
||||||
static void gpio_intr(AS3935ComponentStore *arg);
|
|
||||||
};
|
|
||||||
|
|
||||||
class AS3935Component : public Component {
|
class AS3935Component : public Component {
|
||||||
public:
|
public:
|
||||||
void setup() override;
|
void setup() override;
|
||||||
|
@ -65,7 +57,7 @@ class AS3935Component : public Component {
|
||||||
float get_setup_priority() const override;
|
float get_setup_priority() const override;
|
||||||
void loop() override;
|
void loop() override;
|
||||||
|
|
||||||
void set_pin(GPIOPin *pin) { pin_ = pin; }
|
void set_irq_pin(GPIOPin *irq_pin) { irq_pin_ = irq_pin; }
|
||||||
void set_distance_sensor(sensor::Sensor *distance_sensor) { distance_sensor_ = distance_sensor; }
|
void set_distance_sensor(sensor::Sensor *distance_sensor) { distance_sensor_ = distance_sensor; }
|
||||||
void set_energy_sensor(sensor::Sensor *energy_sensor) { energy_sensor_ = energy_sensor; }
|
void set_energy_sensor(sensor::Sensor *energy_sensor) { energy_sensor_ = energy_sensor; }
|
||||||
void set_thunder_alert_binary_sensor(binary_sensor::BinarySensor *thunder_alert_binary_sensor) {
|
void set_thunder_alert_binary_sensor(binary_sensor::BinarySensor *thunder_alert_binary_sensor) {
|
||||||
|
@ -102,8 +94,7 @@ class AS3935Component : public Component {
|
||||||
sensor::Sensor *distance_sensor_;
|
sensor::Sensor *distance_sensor_;
|
||||||
sensor::Sensor *energy_sensor_;
|
sensor::Sensor *energy_sensor_;
|
||||||
binary_sensor::BinarySensor *thunder_alert_binary_sensor_;
|
binary_sensor::BinarySensor *thunder_alert_binary_sensor_;
|
||||||
GPIOPin *pin_;
|
GPIOPin *irq_pin_;
|
||||||
AS3935ComponentStore store_;
|
|
||||||
|
|
||||||
bool indoor_;
|
bool indoor_;
|
||||||
uint8_t noise_level_;
|
uint8_t noise_level_;
|
||||||
|
|
|
@ -172,7 +172,7 @@ dallas:
|
||||||
|
|
||||||
as3935_spi:
|
as3935_spi:
|
||||||
cs_pin: GPIO12
|
cs_pin: GPIO12
|
||||||
pin: GPIO13
|
irq_pin: GPIO13
|
||||||
|
|
||||||
sensor:
|
sensor:
|
||||||
- platform: adc
|
- platform: adc
|
||||||
|
|
|
@ -54,7 +54,7 @@ deep_sleep:
|
||||||
sleep_duration: 50s
|
sleep_duration: 50s
|
||||||
|
|
||||||
as3935_i2c:
|
as3935_i2c:
|
||||||
pin: GPIO12
|
irq_pin: GPIO12
|
||||||
|
|
||||||
|
|
||||||
sensor:
|
sensor:
|
||||||
|
|
Loading…
Reference in a new issue