This Instructable will show you just how easy it is to add extra inputs to your Arduino. You can use this technique to add hundreds of extra inputs to your Arduino with only two wires by using a fancy communication protocol called i2c (eye-squared-see).
Step 1: Build The Circuit
Uno, Ethernet: A4 (SDA), A5 (SCL)
Mega2560: 20 (SDA), 21 (SCL)
Leonardo: 2 (SDA), 3 (SCL)
Due: 20 (SDA), 21 (SCL), SDA1, SCL1
The PCF8575 is not available in a breadboard-friendly form (only surface mount). The handy Sparkfun breakout boards allow you to plug this chip into the breadboard for prototyping.
You need to connect a 10kOhm resistor between SDA/SCL and PWR (see image).
Also note that push-buttons need resistors. If you want an i2c i/o expander in which you don’t need resistors on the switches check out the MCP23017.
If you are having troubles hooking up your switches try this for reference.
I included the LEDs only to provide some feedback. They add no functionality.
Step 2: The Code
i2c is handled using the Arduino wire library.
To understand i2c you are going to have to do a bit of reading. Expect to be very confused at first. If you plan to do any intermediate and advanced electronics learning i2c is imperative.
I will try to give a very simple explanation of i2c.
One thing you will notice, as you begin to work with electronics, is that you always have a mess of wires. A long time ago Phillips said ‘hell with all these wires – we need a way for all the devices to talk to eachother with only two wires’. Shortly after, i2c was created. Now you can buy i2c chips which do just about everything, and all these chips are able to communicate with eachother using only two wires. i2c is often called the ‘two wire interface’.
So how do these devices talk to each other? Well, they all have an address, much like you have a mailing address at your house. With this unique address you can talk to each device individually. The Arduino, which would be the master-i2c-device, can send instructions to the individual slave-i2c-devices using a fancy communication protocol. In Arduino, the send-communication looks like this:
Wire.send(someDate); //what data are you sending this device
Wire.endTransmission(); //end communication
- PCF8575
- SMD to DIP breakout board
- Teensy-Arduino (any Arduino will work)
- (3x) pushbutton
- (3x) resistors
- (3x) LED
For more detail: Using The PCF8575 i2c i/o Expander To Read Inputs With Arduino
2 Comments
rené
With which version of the Wire library and Arduino IDE did you make this work?
This:
Wire.read(lowByte(dt));
conflicts with the definition for read in the Wire library (which takes _no_ arguments).
I changed it to dt = lowByte(Wire.read());
This compiles, but I have no idea what the consequences are..
rené
Forgot to add, I am using Arduino 1.0.3