PCF8564

Es un circuito integrado bidireccional que es capas de expandir entradas/salidas de Arduino via el bus I2C, este dispositivo esta diseñado para operar desde 2.5~6V.

Es importante usar una resistencia pullup de 4k7 en cada linea del bus i2c.

1. Descripción general

Es importante usar una resistencia pullup de 4k7 en cada linea del bus i2c.

PCF8574
Pines de PCF8574
PinTipoDescripción
15SDABus I2C
14SCLBus I2C
13INTInterrupcion de salida (LOW)
1DireccionA0
2DireccionA1
3DireccionA2
16VccAlimentacion
8GNDTierra
4E/SP0
5E/SP1
6E/SP2
7E/SP3
9E/SP4
10E/SP5
11E/SP6
12E/SP7

2. Determinacion de la direccion unica

En el bus I2C pueden haber varios dispositivos, asi que cada uno debe tener una direccion unica para referirse a el.

#include <Wire.h>
#include <jm_PCF8574.h>

jm_PCF8574 pcf(0x20);
Selector de direccion
AddressA0 (1)A1 (2)A2 (3)
0x20000
0x21001
0x22010
0x23011
0x24100
0x25101
0x26110
0x27111

3. Métodos disponible en librería PCF8574.h

Puedes usar la libreria: pcf8574 de Skywodd que es un poqueto antigua (6 años) o la libreria jm_PCF8574 de Jean Marc Paratte

Métodos disponibles en LedControl.h
MétodoDescripciónEjemplo
pcf.i2c_address()pcf.i2caddress(0x20)
pcf.connected()pcf.connected()
pcf.begin()Iniciar comunicacion i2cpcf.begin()
pcf.end()Termina comunicacion i2cpcf.end()
pcf.read()Lee en el pinpcf.read()
pcf.write()Escribe en el pinpcf.write()
pcf.pinMask()?pcf.pinMask()
pcf.pinMode()Define entrada/salidapcf.pinMode(0,OUTPUT)
pcf.digitalRead()?pcf.digitalRead(0)
pcf.digitalWrite()?pcf.digitalWrite(0,LOW)
pcf.wait()?pcf.wait(1)
pcf.obj_pinMode()?pcf.obj_pinMode()
pcf.obj_digitalRead()?pcf.obj_digitalRead()
pcf.obj_digitalWrite()?pcf.obj_digitalWrite()
#define ADR1	((uint8_t) 0x3F)		//default PCF8574A I2C address
#define ADR2	((uint8_t) 0x27)		//alternative PCF8574 I2C address
#define BL_PIN	((uint8_t) 3)			//P3: LCD backlight pin number

#include <Wire.h>
#include <jm_PCF8574.h>

jm_PCF8574 pcf;  // I2C address fixed later by begin(...)

void setup(){
	Serial.begin(115200);
	while (!Serial && millis()<3000);  // wait for USB Serial ready
	Serial.print(F(__PROG__));
	Serial.print(F("..."));
	Serial.println();
	Serial.flush();
	Wire.begin();
	if (!ADR1)){
   	   pcf.begin(ADR2);
	}
	pinMode(LED_BUILTIN, OUTPUT);
	digitalWrite(LED_BUILTIN, LOW);

	pcf.pinMode(BL_PIN, OUTPUT);
	pcf.digitalWrite(BL_PIN, LOW);
}

void loop(){
	digitalWrite(LED_BUILTIN, HIGH);
	pcf.digitalWrite(BL_PIN, HIGH);
	delay(500);

	digitalWrite(LED_BUILTIN, LOW);
	pcf.digitalWrite(BL_PIN, LOW);
	delay(500);
}

4. Interrupcion de datos

Para el funcionamiento normal debe estar en pull_up. Un LOW en este pin 13 interrupe las entradas/salidas.

5. Definir entrada o salida

Se puede definir uno a varios pones al mismo tiempo.

#include <Wire.h>
#include <jm_PCF8574.h>

jm_PCF8574 pcf(0x20);

void setup(){
	pcf.pinMode(P5, OUTPUT);             //P5 como salida
	pcf.pinMode(3, OUTPUT);              //P3 como salida
	pcf.pinMode(0b00000100, INPUT);      //P2 como entrada
	pcf.pinMode(0b11110000, OUTPUT);     //P7~P4 como salidas

	pcf.digitalWrite(3, HIGH);           //P3 en HIGH
	pcf.digitalRead(0b00000100);         //Lee P2
	pcf.digitalWrite(0b11110000, HIGH);  //P7~P4 en HIGH
}

6. Referencias