[I2C] PCF8574: Módulo de expansión y código para Arduino

Existen en el mercado diferentes placas que integran este circuito y que nos permiten realizar proyectos de forma cómoda y rápida. Suelen disponer de la opción de configurar con A0, A1 y A2 la dirección final I2C del módulo mediante puentes o soldaduras.

  1. El siguiente código muestra el uso del PCF8574 como salida. En el ejemplo, encendemos y apagamos en bucle cada uno de los pines. Observar que la señal del canal se envía negada, porque el PCF8574 actúa como sumidero de corriente y el pin está activo cuando la salida es LOW.
    pcf8574_salida.ino
    #include <Wire.h>
     
    const int pcfAddress = 0x20;
     
    void setup()
    {
       Wire.begin();
       Serial.begin(9600);
    }
     
    void loop()
    {
       for (short channel = 0; channel < 8; channel++)
       {
          // Escribir dato en cada uno de los 8 canales
          Wire.beginTransmission(pcfAddress);
          Wire.write(~(1 << channel));
          Wire.endTransmission();
     
          // Leer dato del canal
          delay(500);
       }
    }
  2. El siguiente código muestra el uso del PCF8574 como entrada. En el ejemplo realizamos la lectura progresiva de cada uno de los pines, y mostramos su valor por puerto serie.
    pcf8574_entrada.ino
    #include <Wire.h>
     
    const int pcfAddress = 0x20;
     
    void setup()
    {
       Wire.begin();
       Serial.begin(9600);
    }
     
    void loop()
    {
       short channel = 1;
       byte value = 0;
     
       // Leer dato del canal
       Wire.requestFrom(pcfAddress, 1 << channel);
       if (Wire.available()) {
          value = Wire.read();
       }
       Wire.endTransmission();
     
       // Mostrar el valor por el monitor serie
       Serial.println(value);
    }
  • Interrupciones. INTERRUPTOR OUT (INT); Es un pin de drenaje abierto por lo que se necesita conectar una resistencia de PULL-UP, esto se realizar para lograr un nivel alto (5V) constante. Este puerto funciona de la siguiente manera: Cuando detecta un flanco ya sea ascendente o descendente en cualquiera de los pines P1 a P7, este pin (INT) inmediatamente activa un mosfet interno de canal N, por ende tendremos un 0 V cada vez que se obtenga un cambio de estado en esos pines (P1 – P7).
    • NOTA: si se usa un microcontrolador (ATmega) que sea programado a través del IDE de arduino ya no será necesario colocar una resistencia de PULL-UP, ya que internamente cuenta una resistencia de PULL-UP, dicha resistencia interna se podrá activar desde la programación.
      interrupcion.ino
      int pin_INT =2;// INTERRUPTOR DEL CI PCF8574
      pinMode( pin_INT, INPUT_PULLUP);
  • si quieres definir varios pines al mismo tiempo es mas facil usar numero binarios.
    pcf8574.pinMode(0b11111111, OUTPUT); //Define P0 a P7 como salida.
    


  1. Alternativamente podemos emplear una librería como la desarrollada por SkyWood disponible en https://github.com/skywodd/pcf8574_arduino_library. La librería proporciona códigos de ejemplo para ilustrar su uso. No obstante, aquí tenéis un ejemplo resumido que muestra su uso
    pcf8574_lib.ino
    #include <Wire.h>
    #include "PCF8574.h"
     
    PCF8574 expander;
     
    void setup() 
    {
      Serial.begin(9600);
     
      expander.begin(0x20);
     
      /* Setup some PCF8574 pins for demo */
      expander.pinMode(0, OUTPUT);
      expander.pinMode(1, OUTPUT);
      expander.pinMode(2, OUTPUT);
      expander.pinMode(3, INPUT_PULLUP);
     
      /* Blink hardware LED for debug */
      digitalWrite(13, HIGH);  
     
      /* Toggle PCF8574 output 0 for demo */
      expander.toggle();
     
      /* Blink hardware LED for debug */
      digitalWrite(13, LOW);
    }
     
     
     
    void loop() 
    {
    }
  • pulsador.ino
    // Juan A. Villalpando
    // kio4.com
     
    #include "Arduino.h"
    #include "PCF8574.h"
     
    PCF8574 pcf8574(0x20); // Dirección del módulo
    int LED13 = 13;
     
    void setup(){
      pcf8574.begin();
      pinMode(LED13,OUTPUT);    
      pcf8574.pinMode(P1, INPUT); // Pulsador en P1 del módulo
    }
    void loop(){
      uint8_t P1_Read = pcf8574.digitalRead(P1);
           if (P1_Read == HIGH){
                 digitalWrite(LED13, HIGH);
         } else {digitalWrite(LED13, LOW);}
     
    delay(50);
    }
  • doc/tec/lab/bus_i2c/pcf8574_modulo/inicio.txt
  • Última modificación: 2026/03/28 18:42
  • por fepg