I bought an 8-port general purpose IO expander for adding ports to my MSP430 projects via I2C, but I couldn’t find any library for accessing it. Fortunately the I2C communication with the on-board Texas Instruments PCF8574 chip is pretty straightforward, so after studying the LiquidCrystal_I2C library, which uses the PCF8574 for communicating with the popular 16×2 LCDs, I made my own library for this port expander. You are welcome to it. I release it as Public Domain code.
Download PortExpander_I2C
Example based on “Blink”:
[c]
#include <PortExpander_I2C.h>
PortExpander_I2C pe(0x20);
int ledPin = 7; // 8th port
void setup() {
pe.init();
}
void loop() {
pe.digitalWrite(ledPin, HIGH);
delay(1000);
pe.digitalWrite(ledPin, LOW);
delay(1000);
}
[/c]
Reading from the port expander works by setting the pin high and then waiting for the pin to be grounded. If you want to detect a signal going high, you will need a transistor or something clever for flipping the signal.
[c]
#include <PortExpander_I2C.h>
PortExpander_I2C pe(0x20);
void setup() {
pe.init();
Serial.begin(9600);
for( int i = 0; i < 8; i++ ){
pe.pinMode(i,INPUT);
}
}
void loop() {
for( int i = 0; i < 8; i++ ){
if( pe.digitalRead(i) == 0 ){
Serial.print(“Pin ” );
Serial.print(i);
Serial.println(” is low.”);
}
}
}
[/c]
Merci beaucoup. Thanks a lot. Best regards.
Fantastic library.
Spent hours trying to write the code out before finding this.
Thanks
don’t forget to add #Wire.h this is required for I2C
got a $99 LCD to I2c card working it has the same IC as the $6+ I/O card been sold on ebay…
pins are as follows…
pin 1=gnd, 2=GND, 3=GND with var resistor, 4=P0, 5=P1, 6=P2 7,8,9,10 N/C
11=P4, 12= P5, 13=P6, 14=P7 15=Vcc with jumper, 16= P3 with transistor 2N3904 (200 ma).
I2C addressing A0,A1,A2:
High High High = 0x27, HHL=0x26, HLH=0x25, HLL=0x24, LHH=0x23, LHL=0x22, LLH=21
Low Low Low= 0x20…
The pings on the card come Hight by Default= 0x27 and can be changed by soldering the jumpers to low…
How do I control 3 pcf8574 with arduino?
I’ve done this to separate my ic’s:
PortExpander_I2C pe1(0x20);
PortExpander_I2C pe2(0x21);
PortExpander_I2C pe3(0x24);
Now, if I set pin like this one below:
” int ledPin = 7; // 8th port ”
I’m setting pins for first 0x20 PCF. How do I choose pins for 2nd and 3rd chip?
@Mazure I haven’t tried three — not sure. Sorry.
Great library, thanks!
Very useful for the ESP8266-1, just add Wire.begin(0,2) to set up to specify GPIO0 for SDA and GPIO2 for SCL.
There’s a great Instructable on setting up the little ESP for I2C:
http://www.instructables.com/id/How-to-use-the-ESP8266-01-pins/