MCP23017 Input Array

Ein MCP23017 Input Array mit 64 Ports und gemeinsamem Interrupt

Steckplatine

fhem Konfiguration

i2c Device erzeugen

define i2c RPII2C 1
attr i2c alias Onboard I2C Controller 1
attr i2c room ops

Input mit allen Ports

Die folgende Schleife erzeugt jeweils ein Gerät für jeden Chip (i2c20, i2c21, i2c22 und i2c23).

{ foreach my $i (0..3) { \
  fhem(" \
    define i2c2$i I2C_MCP23017 0x2$i;; \
    attr i2c2$i IODev i2c;; \
    attr i2c2$i room ops;; \
    attr i2c2$i Interrupt A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7;; \
    attr i2c2$i InterruptOut connected_active-low;; \
    attr i2c2$i Pullup A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7;; \
    attr i2c2$i invert_input A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7;; \
");; } }

Gemeinsamer Interrupt

Theoretisch könnte man für alle 4 Chips einen gemeinsamen Interrupt verwenden. Bei Tests habe ich allerdings festgestellt, dass es dann nicht stabil funktioniert und die Interrupts nur sehr unzuverlässig ausgelöst werden. Daher habe ich jeweils für zwei Chips einen Interrupt eingerichtet. Das scheint soweit stabil zu arbeiten.

define int_22_23 RPI_GPIO 20
attr int_22_23 direction input
attr int_22_23 active_low yes
attr int_22_23 interrupt both
attr int_22_23 pud_resistor up
attr int_22_23 userReadings get_int {fhem ("get i2c22,i2c23")}

define int_20_21 RPI_GPIO 21
attr int_20_21 direction input
attr int_20_21 active_low yes
attr int_20_21 interrupt both
attr int_20_21 pud_resistor up
attr int_20_21 userReadings get_int {fhem ("get i2c20,i2c21")}