-- MCP23017 Port Reader John Longworth November 2017 -- I2C Address 0x20 -- Using pins 3 & 4 to be compatible with ESP001 id = 0 -- Always 0 sda = 3 -- 1 ~ 12 IO index scl = 4 -- 1 ~ 12 IO index i2c.setup(id, sda, scl, i2c.SLOW) -- Initialize I2C local i = 0 device = 0x20 GPIOA = 0x12 -- I/O register for Port A GPIOB = 0x13 -- I/O register for Port B IODIRA = 0x00 -- Pin direction register Port A IODIRB = 0x01 -- Pin direction register Port B GPPUB = 0x0D -- Pull Up Register for Port B function read_reg(dev_addr, reg_addr) -- Read from Register i2c.start(id) i2c.address(id, dev_addr, i2c.TRANSMITTER) i2c.write(id, reg_addr) i2c.stop(id) i2c.start(id) i2c.address(id, dev_addr, i2c.RECEIVER) c = i2c.read(id, 1) i2c.stop(id) return c end function write_reg(dev_addr, reg_addr, reg_val) -- Write to Register i2c.start(id) i2c.address(id, dev_addr, i2c.TRANSMITTER) i2c.write(id, reg_addr) i2c.write(id, reg_val) i2c.stop(id) end write_reg(device, IODIRA, 0x80) -- Port A set first 7 GPA pins as outputs write_reg(device, GPIOA, 255) -- Write to Port A -- Set Port B pins as input as 1 e.g. all 8 = 0xFF write_reg(device, IODIRB, 0xFF) -- Port B all set as inputs write_reg(device, GPPUB, 0xFF) -- Set Pull Up Register on Port B print(string.byte(read_reg(device, GPIOA))) -- Read Port A print(255 - string.byte(read_reg(device, GPIOB))) -- Read Port B -- Pin Connections on my board -- Pin 9 (VDD) to 3v3 -- Pin 10 (VSS) to GND -- Pin 11 (NC) to GND (Not necessary) -- Pin 12 (SCL) to ESP GPIO2 -- Pin 13 (SDA) to ESP GPIO0 -- Pin 14 (NC) to GND (Not necessary) -- Pin 15 (A0) to GND -- Pin 16 (A1) to GND -- Pin 17 (A2) to GND -- Pin 18 (RESET) to 3v3 -- Connect pins to be read to Gnd on Port B