Viagra para tus proyectos

Viagra para tus proyectos

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: false

Y 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();
            }
Scroll al inicio