mirror of
https://github.com/esphome/esphome.git
synced 2024-11-21 22:48:10 +01:00
support keypads with pulldowns (#5404)
Co-authored-by: Samuel Sieb <samuel@sieb.net>
This commit is contained in:
parent
056a28906b
commit
1100f67b66
4 changed files with 18 additions and 6 deletions
|
@ -21,6 +21,7 @@ CONF_COLUMNS = "columns"
|
||||||
CONF_KEYS = "keys"
|
CONF_KEYS = "keys"
|
||||||
CONF_DEBOUNCE_TIME = "debounce_time"
|
CONF_DEBOUNCE_TIME = "debounce_time"
|
||||||
CONF_HAS_DIODES = "has_diodes"
|
CONF_HAS_DIODES = "has_diodes"
|
||||||
|
CONF_HAS_PULLDOWNS = "has_pulldowns"
|
||||||
|
|
||||||
|
|
||||||
def check_keys(obj):
|
def check_keys(obj):
|
||||||
|
@ -45,6 +46,7 @@ CONFIG_SCHEMA = cv.All(
|
||||||
cv.Optional(CONF_KEYS): cv.string,
|
cv.Optional(CONF_KEYS): cv.string,
|
||||||
cv.Optional(CONF_DEBOUNCE_TIME, default=1): cv.int_range(min=1, max=100),
|
cv.Optional(CONF_DEBOUNCE_TIME, default=1): cv.int_range(min=1, max=100),
|
||||||
cv.Optional(CONF_HAS_DIODES): cv.boolean,
|
cv.Optional(CONF_HAS_DIODES): cv.boolean,
|
||||||
|
cv.Optional(CONF_HAS_PULLDOWNS): cv.boolean,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
check_keys,
|
check_keys,
|
||||||
|
@ -69,3 +71,5 @@ async def to_code(config):
|
||||||
cg.add(var.set_debounce_time(config[CONF_DEBOUNCE_TIME]))
|
cg.add(var.set_debounce_time(config[CONF_DEBOUNCE_TIME]))
|
||||||
if CONF_HAS_DIODES in config:
|
if CONF_HAS_DIODES in config:
|
||||||
cg.add(var.set_has_diodes(config[CONF_HAS_DIODES]))
|
cg.add(var.set_has_diodes(config[CONF_HAS_DIODES]))
|
||||||
|
if CONF_HAS_PULLDOWNS in config:
|
||||||
|
cg.add(var.set_has_pulldowns(config[CONF_HAS_PULLDOWNS]))
|
||||||
|
|
|
@ -11,11 +11,16 @@ void MatrixKeypad::setup() {
|
||||||
if (!has_diodes_) {
|
if (!has_diodes_) {
|
||||||
pin->pin_mode(gpio::FLAG_INPUT);
|
pin->pin_mode(gpio::FLAG_INPUT);
|
||||||
} else {
|
} else {
|
||||||
pin->digital_write(true);
|
pin->digital_write(!has_pulldowns_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (auto *pin : this->columns_) {
|
||||||
|
if (has_pulldowns_) {
|
||||||
|
pin->pin_mode(gpio::FLAG_INPUT);
|
||||||
|
} else {
|
||||||
|
pin->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto *pin : this->columns_)
|
|
||||||
pin->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MatrixKeypad::loop() {
|
void MatrixKeypad::loop() {
|
||||||
|
@ -28,9 +33,9 @@ void MatrixKeypad::loop() {
|
||||||
for (auto *row : this->rows_) {
|
for (auto *row : this->rows_) {
|
||||||
if (!has_diodes_)
|
if (!has_diodes_)
|
||||||
row->pin_mode(gpio::FLAG_OUTPUT);
|
row->pin_mode(gpio::FLAG_OUTPUT);
|
||||||
row->digital_write(false);
|
row->digital_write(has_pulldowns_);
|
||||||
for (auto *col : this->columns_) {
|
for (auto *col : this->columns_) {
|
||||||
if (!col->digital_read()) {
|
if (col->digital_read() == has_pulldowns_) {
|
||||||
if (key != -1) {
|
if (key != -1) {
|
||||||
error = true;
|
error = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -39,7 +44,7 @@ void MatrixKeypad::loop() {
|
||||||
}
|
}
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
row->digital_write(true);
|
row->digital_write(!has_pulldowns_);
|
||||||
if (!has_diodes_)
|
if (!has_diodes_)
|
||||||
row->pin_mode(gpio::FLAG_INPUT);
|
row->pin_mode(gpio::FLAG_INPUT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ class MatrixKeypad : public key_provider::KeyProvider, public Component {
|
||||||
void set_keys(std::string keys) { keys_ = std::move(keys); };
|
void set_keys(std::string keys) { keys_ = std::move(keys); };
|
||||||
void set_debounce_time(int debounce_time) { debounce_time_ = debounce_time; };
|
void set_debounce_time(int debounce_time) { debounce_time_ = debounce_time; };
|
||||||
void set_has_diodes(int has_diodes) { has_diodes_ = has_diodes; };
|
void set_has_diodes(int has_diodes) { has_diodes_ = has_diodes; };
|
||||||
|
void set_has_pulldowns(int has_pulldowns) { has_pulldowns_ = has_pulldowns; };
|
||||||
|
|
||||||
void register_listener(MatrixKeypadListener *listener);
|
void register_listener(MatrixKeypadListener *listener);
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ class MatrixKeypad : public key_provider::KeyProvider, public Component {
|
||||||
std::string keys_;
|
std::string keys_;
|
||||||
int debounce_time_ = 0;
|
int debounce_time_ = 0;
|
||||||
bool has_diodes_{false};
|
bool has_diodes_{false};
|
||||||
|
bool has_pulldowns_{false};
|
||||||
int pressed_key_ = -1;
|
int pressed_key_ = -1;
|
||||||
|
|
||||||
std::vector<MatrixKeypadListener *> listeners_{};
|
std::vector<MatrixKeypadListener *> listeners_{};
|
||||||
|
|
|
@ -667,6 +667,7 @@ matrix_keypad:
|
||||||
- pin: 17
|
- pin: 17
|
||||||
- pin: 16
|
- pin: 16
|
||||||
keys: "1234"
|
keys: "1234"
|
||||||
|
has_pulldowns: true
|
||||||
|
|
||||||
key_collector:
|
key_collector:
|
||||||
- id: reader
|
- id: reader
|
||||||
|
|
Loading…
Reference in a new issue