Add 16 inputs/outputs to the microcontroller using a simple I2C component
Add 16 GPIO pins to your microcontroller by using a MCP23017 extension.
The MCP23017 use the 2 pins of I2C bus (that can be shared with other I2C devices), and in exchange, it provides 16 more general purpose pins. Each of the 16 pins can be configured in input, output, inputs with either pullup resistor or open drain.
It is even possible to obtain an interrupt signal via an external pin when an input changes state... like this, it is not necessary to continually check the status of the entries by your program (this method is called 'pooling').
This integrated circuit can be used between 2.7 and 5.5V (suitable for all of 3.3V as Raspberry Pi or 5V as Arduino). You can consume up to 20mA on any pin... so you can turn on a LED. You can add a power Mofset if you need more power or do like the PiFace by adding using an ULN2803.
This integrated circuit use a DIP-type case... which means that it can be used with any breadboard or prototyping board :-) .
You can change the I2C address by connecting the ADDR0-2 pins to the power supply or ground, which allows to have 8 unique addresses on a single BUS. By combining the MCP23017 it is possible to have up to 128 inputs/outputs :-)!
This component is the one used in the LCD RGB shield to control the LCD display and the 5-button keyboard (KeyPad). It is a reliable component and easy to implement.
SeeSaw - a more flexible I2C component
If you are looking for something more versatile you may have a look to seesaw, an ATSAMD09 Adafruit's breakout offering ADC Inputs, PWM outputs, 7 GPIOs, one Neopixel output, 64 bytes EEPROM, all served over an I2C connection.
Learn more from Breakout ATSAMD09 with SeeSaw