mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 16:38:16 +01:00
TTP229 BSF support
This commit is contained in:
parent
9dd9e523ed
commit
1d6dd3aa5e
6 changed files with 136 additions and 0 deletions
28
esphome/components/ttp229_bsf/__init__.py
Normal file
28
esphome/components/ttp229_bsf/__init__.py
Normal file
|
@ -0,0 +1,28 @@
|
|||
import esphome.codegen as cg
|
||||
import esphome.config_validation as cv
|
||||
from esphome import pins
|
||||
from esphome.const import CONF_ID, CONF_SDO_PIN, CONF_SCL_PIN
|
||||
|
||||
DEPENDENCIES = ['i2c']
|
||||
AUTO_LOAD = ['binary_sensor']
|
||||
|
||||
CONF_TTP229_ID = 'ttp229_id'
|
||||
ttp229_bsf_ns = cg.esphome_ns.namespace('ttp229_bsf')
|
||||
|
||||
TTP229BSFComponent = ttp229_bsf_ns.class_('TTP229BSFComponent', cg.Component)
|
||||
|
||||
CONFIG_SCHEMA = cv.Schema({
|
||||
cv.GenerateID(): cv.declare_id(TTP229BSFComponent),
|
||||
cv.Required(CONF_SDO_PIN): pins.gpio_input_pullup_pin_schema,
|
||||
cv.Required(CONF_SCL_PIN): pins.gpio_output_pin_schema,
|
||||
}).extend(cv.COMPONENT_SCHEMA)
|
||||
|
||||
|
||||
def to_code(config):
|
||||
var = cg.new_Pvariable(config[CONF_ID])
|
||||
yield cg.register_component(var, config)
|
||||
|
||||
sdo = yield cg.gpio_pin_expression(config[CONF_SDO_PIN])
|
||||
cg.add(var.set_sdo_pin(sdo))
|
||||
scl = yield cg.gpio_pin_expression(config[CONF_SCL_PIN])
|
||||
cg.add(var.set_scl_pin(scl))
|
23
esphome/components/ttp229_bsf/binary_sensor.py
Normal file
23
esphome/components/ttp229_bsf/binary_sensor.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
import esphome.codegen as cg
|
||||
import esphome.config_validation as cv
|
||||
from esphome.components import binary_sensor
|
||||
from esphome.const import CONF_CHANNEL, CONF_ID
|
||||
from . import ttp229_bsf_ns, TTP229BSFComponent, CONF_TTP229_ID
|
||||
|
||||
DEPENDENCIES = ['ttp229_bsf']
|
||||
TTP229Channel = ttp229_bsf_ns.class_('TTP229Channel', binary_sensor.BinarySensor)
|
||||
|
||||
CONFIG_SCHEMA = binary_sensor.BINARY_SENSOR_SCHEMA.extend({
|
||||
cv.GenerateID(): cv.declare_id(TTP229Channel),
|
||||
cv.GenerateID(CONF_TTP229_ID): cv.use_id(TTP229BSFComponent),
|
||||
cv.Required(CONF_CHANNEL): cv.int_range(min=0, max=15),
|
||||
})
|
||||
|
||||
|
||||
def to_code(config):
|
||||
var = cg.new_Pvariable(config[CONF_ID])
|
||||
yield binary_sensor.register_binary_sensor(var, config)
|
||||
|
||||
cg.add(var.set_channel(config[CONF_CHANNEL]))
|
||||
hub = yield cg.get_variable(config[CONF_TTP229_ID])
|
||||
cg.add(hub.register_channel(var))
|
23
esphome/components/ttp229_bsf/ttp229_bsf.cpp
Normal file
23
esphome/components/ttp229_bsf/ttp229_bsf.cpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include "ttp229_bsf.h"
|
||||
#include "esphome/core/log.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace ttp229_bsf {
|
||||
|
||||
static const char *TAG = "ttp229_bsf";
|
||||
|
||||
void TTP229BSFComponent::setup() {
|
||||
ESP_LOGCONFIG(TAG, "Setting up ttp229_bsf... ");
|
||||
this->sdo_pin_->setup();
|
||||
this->scl_pin_->setup();
|
||||
this->scl_pin_->digital_write(true);
|
||||
delay(2);
|
||||
}
|
||||
void TTP229BSFComponent::dump_config() {
|
||||
ESP_LOGCONFIG(TAG, "ttp229:");
|
||||
LOG_PIN(" SCL pin: ", this->scl_pin_);
|
||||
LOG_PIN(" SDO pin: ", this->sdo_pin_);
|
||||
}
|
||||
|
||||
} // namespace ttp229_bsf
|
||||
} // namespace esphome
|
53
esphome/components/ttp229_bsf/ttp229_bsf.h
Normal file
53
esphome/components/ttp229_bsf/ttp229_bsf.h
Normal file
|
@ -0,0 +1,53 @@
|
|||
#pragma once
|
||||
|
||||
#include "esphome/core/component.h"
|
||||
#include "esphome/components/binary_sensor/binary_sensor.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace ttp229_bsf {
|
||||
|
||||
class TTP229BSFChannel : public binary_sensor::BinarySensor {
|
||||
public:
|
||||
void set_channel(uint8_t channel) { channel_ = channel; }
|
||||
void process(uint16_t data) { this->publish_state(data & (1 << this->channel_)); }
|
||||
|
||||
protected:
|
||||
uint8_t channel_;
|
||||
};
|
||||
|
||||
class TTP229BSFComponent : public Component {
|
||||
public:
|
||||
void set_sdo_pin(GPIOPin *sdo_pin) { sdo_pin_ = sdo_pin; }
|
||||
void set_scl_pin(GPIOPin *scl_pin) { scl_pin_ = scl_pin; }
|
||||
void register_channel(TTP229BSFChannel *channel) { this->channels_.push_back(channel); }
|
||||
void setup() override;
|
||||
void dump_config() override;
|
||||
float get_setup_priority() const override { return setup_priority::DATA; }
|
||||
void loop() override {
|
||||
// check datavalid if sdo is high
|
||||
if (!this->sdo_pin_->digital_read()) {
|
||||
return;
|
||||
}
|
||||
uint16_t touched = 0;
|
||||
for (uint8_t i = 0; i < 16; i++) {
|
||||
this->scl_pin_->digital_write(false);
|
||||
delayMicroseconds(2); // 500KHz
|
||||
bool bitval = !this->sdo_pin_->digital_read();
|
||||
this->scl_pin_->digital_write(true);
|
||||
delayMicroseconds(2); // 500KHz
|
||||
|
||||
touched |= uint16_t(bitval) << i;
|
||||
}
|
||||
for (auto *channel : this->channels_) {
|
||||
channel->process(touched);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
GPIOPin *sdo_pin_;
|
||||
GPIOPin *scl_pin_;
|
||||
std::vector<TTP229BSFChannel *> channels_{};
|
||||
};
|
||||
|
||||
} // namespace ttp229_bsf
|
||||
} // namespace esphome
|
|
@ -349,7 +349,9 @@ CONF_SAMSUNG = 'samsung'
|
|||
CONF_SCAN = 'scan'
|
||||
CONF_SCAN_INTERVAL = 'scan_interval'
|
||||
CONF_SCL = 'scl'
|
||||
CONF_SCL_PIN = 'scl_pin'
|
||||
CONF_SDA = 'sda'
|
||||
CONF_SDO_PIN = 'sdo_pin'
|
||||
CONF_SECOND = 'second'
|
||||
CONF_SECONDS = 'seconds'
|
||||
CONF_SEGMENTS = 'segments'
|
||||
|
|
|
@ -189,6 +189,9 @@ binary_sensor:
|
|||
- platform: ttp229_lsf
|
||||
channel: 1
|
||||
name: TTP229 LSF Test
|
||||
- platform: ttp229_bsf
|
||||
channel: 1
|
||||
name: TTP229 BSF Test
|
||||
- platform: custom
|
||||
lambda: |-
|
||||
auto s = new CustomBinarySensor();
|
||||
|
@ -392,3 +395,7 @@ servo:
|
|||
output: out
|
||||
|
||||
ttp229_lsf:
|
||||
|
||||
ttp229_bsf:
|
||||
sdo_pin: D0
|
||||
scl_pin: D1
|
||||
|
|
Loading…
Reference in a new issue