Si necesitas ampliar el número de GPIO de tu microcontrolador, puedes añadir expansores de puertos MCP23017 o MCP23S17 por menos de 1.50€.
Cada uno de ellos te proporcionará 16 GPIOs de entrada/salida que se utilizan exactamente como si estuvieran en tu micro.
En el vídeo veremos cómo utilizar hasta 64 leds distintos con un único expansor de puertos.
El material utilizado en el vídeo es el siguiente:
A continuación te dejo el enlace al vídeo:
El código del ejemplo con un pulsador y un led es este:
i2c:
mcp23017:
- id: 'expansor'
address: 0x20
switch:
- platform: gpio
name: "MCP23017 Pin 7"
pin:
mcp23xxx: expansor
number: 7
mode: OUTPUT
inverted: False
binary_sensor:
- platform: gpio
name: "MCP23017 Pin 0"
pin:
mcp23xxx: expansor
number: 0
mode: INPUT_PULLUP
inverted: falseY aquí el código del ejemplo con la matriz de 64 leds:
globals:
- id: switches
type: std::vector<esphome::switch_::Switch*>
initial_value: "std::vector<esphome::switch_::Switch*>({&id(fila0), &id(fila1), &id(fila2), &id(fila3), &id(fila4), &id(fila5), &id(fila6), &id(fila7), &id(fila8), &id(fila9), &id(fila10), &id(fila11), &id(fila12), &id(fila13), &id(fila14), &id(fila15) })"
i2c:
mcp23017:
- id: 'expansor'
address: 0x20
switch:
- platform: gpio
id: fila15
pin:
mcp23xxx: expansor
number: 15
mode: OUTPUT
- platform: gpio
id: fila14
pin:
mcp23xxx: expansor
number: 14
mode: OUTPUT
- platform: gpio
id: fila13
pin:
mcp23xxx: expansor
number: 13
mode: OUTPUT
- platform: gpio
id: fila12
pin:
mcp23xxx: expansor
number: 12
mode: OUTPUT
- platform: gpio
id: fila11
pin:
mcp23xxx: expansor
number: 11
mode: OUTPUT
- platform: gpio
id: fila10
pin:
mcp23xxx: expansor
number: 10
mode: OUTPUT
- platform: gpio
id: fila9
pin:
mcp23xxx: expansor
number: 9
mode: OUTPUT
- platform: gpio
id: fila8
pin:
mcp23xxx: expansor
number: 8
mode: OUTPUT
- platform: gpio
id: fila7
pin:
mcp23xxx: expansor
number: 7
mode: OUTPUT
- platform: gpio
id: fila6
pin:
mcp23xxx: expansor
number: 6
mode: OUTPUT
- platform: gpio
id: fila5
pin:
mcp23xxx: expansor
number: 5
mode: OUTPUT
- platform: gpio
id: fila4
pin:
mcp23xxx: expansor
number: 4
mode: OUTPUT
- platform: gpio
id: fila3
pin:
mcp23xxx: expansor
number: 3
mode: OUTPUT
- platform: gpio
id: fila2
pin:
mcp23xxx: expansor
number: 2
mode: OUTPUT
- platform: gpio
id: fila1
pin:
mcp23xxx: expansor
number: 1
mode: OUTPUT
- platform: gpio
id: fila0
pin:
mcp23xxx: expansor
number: 0
mode: OUTPUT
button:
- platform: template
name: "Lanza recorrido"
on_press:
then:
- script.execute: recorrido
number:
- platform: template
name: "Selector de Fila"
id: fila_selector
min_value: 0
max_value: 7
step: 1
set_action:
- lambda: |-
// Apagar todos los switches
for (int i = 0; i < 8; i++) {
auto fila_switch = id(switches)[i];
fila_switch->turn_off();
}
// Activar el switch correspondiente al número recibido
id(switches)[(int)x]->turn_on();
- platform: template
name: "Selector de Columna"
id: columna_selector
min_value: 8
max_value: 15
step: 1
set_action:
- lambda: |-
// Encender todos los switches
for (int i = 8; i < 16; i++) {
auto fila_switch = id(switches)[i];
fila_switch->turn_on();
}
// Desactivar el switch correspondiente al número recibido
id(switches)[(int)x]->turn_off();
script:
- id: recorrido
then:
- lambda: |-
// Apagar todos los switches
for (int j = 0; j < 8; j++) {
auto fila_switch = id(switches)[j];
fila_switch->turn_off();
};
// Encender todos los switches
for (int i = 8; i < 16; i++) {
auto fila_switch = id(switches)[i];
fila_switch->turn_on();
}
for (int j = 0; j < 8; j++) {
// Activar el switch correspondiente al número recibido
id(switches)[(int)j]->turn_on();
for (int i = 8; i < 16; i++) {
// Desactivar el switch correspondiente al número recibido
id(switches)[(int)i]->turn_off();
delay (20);
id(switches)[(int)i]->turn_on();
}
id(switches)[(int)j]->turn_off();
}

