-- WhichPin for MCP23017 by John Longworth December 2017 -- Using pins 3 & 4 to be compatible with ESP001 -- 7 segment digit 1 = b + c = 64 + 32 = 96 (0x60) -- 7 segment digit 2 = abdeg = 128+64+16+8+2 = 218 (0xDA)... -- DP = 1 added to display to show decimal point nums = {0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0x9F,0xFC} -- 1, 2 ...0 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 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, 0x00) -- Set port A to output 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 tmr.alarm(1,2000,1,function() i = 255 - string.byte(read_reg(device, GPIOB)) -- Read Port B seg = 0 for loop = 0, 7 do if (bit.isset(i,loop)) then seg = loop + 1 end end if (seg > 8) then seg = 9 elseif (seg == 0) then seg = 10 end print(seg) write_reg(device, GPIOA, nums[seg]) end)