Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
doc:tec:lab:bus_i2c:pcf8574_modulo:inicio [2026/03/28 18:34] – borrado - editor externo (Fecha desconocida) 127.0.0.1doc:tec:lab:bus_i2c:pcf8574_modulo:inicio [2026/03/28 18:42] (actual) – [Ejemplos con librería] fepg
Línea 1: Línea 1:
 +====== [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.
 +
 +<grid>
 +<col xs="12" md="6">
 +{{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574_expansion2.png?nolink |}}
 +</col><col xs="12" md="6">
 +{{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574_expansion.png?nolink |}}
 +</col></grid>
 +
 +===== Ejemplos de código y librerías para Arduino =====
 +
 +<WRAP center round download>
 +
 +    * [[https://youtu.be/wSoczBCGdFo|Creating Arduino Library for PCF8574 I/O Expander]] / [[https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbHd1UkZubU1yOUs5UEthTlNIOWtFNkMtbjRtQXxBQ3Jtc0traUprRWxnNkZEaXZnMU5nSVdEN0ZWRXNOdGJDNXBuT0JmWXl0WTNpRC1adnRQVk01MXRMXzJmNVBsLWI4X2dOdG5nZ3gxRHFOMnhyZmtxcFl1c0lXZEJUTVZzTUcwck1JTWhyU2ppdU1tY25NYUEyMA&q=https%3A%2F%2Fgithub.com%2Fakuzechie%2FPCF8574-8-bit-I-O-Expander&v=wSoczBCGdFo|GitHub repository to access PCF8574 library]] => {{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574-8-bit-i-o-expander-main.zip |}} FIXME {{ doc:tec:lab:bus_i2c:pcf8574_modulo:creating_arduino_library_for_dht22_sensor.mp4 |}}
 +    * {{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574-master.zip |}} FIXME => <code c>#include "PCF8574.h"</code>
 +    * [[https://www.arduinolibraries.info/libraries/pcf8574|pcf8574 Arduino Library List]] => {{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574-1.0.3.zip |}} FIXME 
 +
 +</WRAP>
 +
 +<WRAP center round help>
 +
 +  * Artículos
 +    * [[https://victorventura.es/polaridad.es/pcf8574-expansor-i2c-de-8-bits-de-puertos-gpio-digitales-de-entrada-y-salida/|PCF8574. Expansor I2C de 8 bits de puertos GPIO digitales de entrada y salida.]]
 +    * [[https://programarfacil.com/blog/arduino-blog/comunicacion-i2c-con-arduino/|Comunicación I2C con Arduino lo mejor de dos mundos]]
 +    * [[https://www.luisllamas.es/mas-pines-digitales-con-arduino-y-el-expansor-es-i2c-pcf8574/|MÁS PINES DIGITALES CON ARDUINO Y EXPANSOR E/S I2C PCF8574]]
 +
 +  * Youtube
 +    * [[https://youtu.be/6pFLdIC18P4|Expansor de puertos: 74HC595 + bit banging y PCF8574]]
 +    * [[https://youtu.be/o3Dtc4W8fTw|Ampliación de pines digitales para Arduino con el expansor PCF8574]]
 +
 +</WRAP>
 +
 +
 +==== Ejemplos sin librería ====
 +
 +  - 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. <code c 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);
 +   }
 +}
 +</code>
 +  - 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. <code c 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);
 +}
 +</code>
 +
 +  * **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. <code c interrupcion.ino>
 +
 +int pin_INT =2;// INTERRUPTOR DEL CI PCF8574
 +pinMode( pin_INT, INPUT_PULLUP);
 +
 +</code>
 +
 +<WRAP center round help>
 +  * [[https://www.electroallweb.com/index.php/2019/12/07/pcf8574-circuito-expansor-de-pines/|PCF8574 circuito expansor de pines]]
 +  * si quieres definir varios pines al mismo tiempo es mas facil usar numero binarios. <code>
 +pcf8574.pinMode(0b11111111, OUTPUT); //Define P0 a P7 como salida.
 +
 +</code>
 +</WRAP>
 +\\ 
 +==== Ejemplos con librería ====
 +
 +<WRAP center round download>
 +  * {{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574_arduino_library-master.zip |}}
 +</WRAP>
 +
 +  - 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 <code c 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() 
 +{
 +}
 +</code>
 +
 +  * <code c 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);
 +}
 +</code>