====== I2C pcf8574 8bit port expander ====== I made a test / prototype setup on a breadboard with two pcf8574 ics ; one for output and one for input. Both connected to the same I2C bus. Adding more digital inputs to an Arduino was my first objective, as I am planning to use this on a project which has buttons that control a menu. For now this little write-up should suffice for the moment I am going to design a PCB for this. ===== The breadboard built ===== The four resistors are 100Ω The four LEDs are regular red 3mm leds The four buttons are momentary on push buttons ==== Fritzing ==== {{ :projects:i2c_pcf8574_8bit_port_expander:pcf8574-arduino-io_bb.png?400|}} The program called [[http://fritzing.org/welcome/|Fritzing]] does a nice job of making an understandable picture of the board. This is not only nice for using in a write-up but in real-live it is faster than pulling everything from your breadboard just to place components a couple of holes further away (because you need the extra space). Fritzing can also make a schematic, I've included it here but it looks horrible. When I make the final design on a PCB I will use [[http://www.cadsoftusa.com/|Eagle]] for this. {{ :projects:i2c_pcf8574_8bit_port_expander:pcf8574-arduino-io_schem.png?200 |}} ==== Breadboard ==== I took a photo of the breadboard build, nice to see but difficult to see where what goes: {{ :projects:i2c_pcf8574_8bit_port_expander:2012-10-21_11-36-11_88.jpg?200 | }} {{ :projects:i2c_pcf8574_8bit_port_expander:2012-10-21_15-52-19_558.jpg?200 | }} ==== The code ==== The [[http://www.arduino.cc/playground/Learning/Linux|Arduino IDE]] has a library called [[http://arduino.cc/en/Reference/Wire|Wire]] which is used for I2C stuff. I wrote code that reads the button input and writes this to the LED output: // I2C PCF8574 8 bit i/o port expander // by AEP // // testing / prototyping the Wire library in combination with the ic PCF8574 // Reads data from PCF8574 over I2C and sends data to another PCF8574 over the same I2C bus // Created 21 oct 2012 #include byte iInput=0; byte iOutput=0; void setup() { Wire.begin(); } void loop() { Wire.requestFrom(33,1);// Begin transmission to PCF8574 with the buttons if(Wire.available()) // If bytes are available to be recieved { iInput = Wire.read();// Read a byte } if(iInput<255) //If the value less than 255 { if (iInput==254) // P0 { iOutput = 1; }; if (iInput==253) // P1 { iOutput = 2; }; if (iInput==251) // P2 { iOutput = 4; }; if (iInput==247) // P3 { iOutput = 8; }; } Wire.beginTransmission(32); //Begin transmission to PCF8574 (with the LEDs) Wire.write(iOutput); //Send data to PCF8574 (with the LEDs) Wire.endTransmission(); //End Transmission to PCF8574 (with the LEDs) }