torres.electronico

ARDUINO: Lectura de entradas con PCF8574 (I2c)

En este ejemplo, veremos como expandir nuestros puertos del microcontrolador, con un expansor I/O PCF8574 con tan solo dos hilos (SDA-SCL - Comunicación I2c), y controlar los puertos del microcontrolador configurados como salida...

entradaspcf8574-png.310467


CSS:
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//Ejemplo: Expansor de entradas I2c con PCF8574 - prof.martintorres@educ.ar - ETI Patagonia
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////

#include "Arduino.h"
#include "PCF8574.h"

#define ARDUINO_UNO_INTERRUPTED_PIN 2 // En el arduino solo el pin 1 y 2 son para interrupcion

void keyPressedOnPCF8574(); // Funcion interrupcion
 
// Set direccion i2c
PCF8574 pcf8574(0x20, ARDUINO_UNO_INTERRUPTED_PIN, keyPressedOnPCF8574);
unsigned long timeElapsed;

//variables pulsador 1
        uint8_t val0=0;
        int val_0_viejo=0; //button old
        int val_0; //buton new
        int S1_estado=0; //led estado
//variables pulsador 2
        uint8_t val1=0;
        int val_1_viejo=0; //button old
        int val_1; //buton new
        int S2_estado=0; //led estado
//variables pulsador 3
        uint8_t val2=0;
        int val_2_viejo=0; //button old
        int val_2; //buton new
        int S3_estado=0; //led estado
//variables pulsador 4
        uint8_t val3=0;
        int val_3_viejo=0; //button old
        int val_3; //buton new
        int S4_estado=0; //led estado
//variables pulsador 5
        uint8_t val4=0;
        int val_4_viejo=0; //button old
        int val_4; //buton new
        int S5_estado=0; //led estado
//variables pulsador 6
        uint8_t val5=0;
        int val_5_viejo=0; //button old
        int val_5; //buton new
        int S6_estado=0; //led estado
//variables pulsador 7
        uint8_t val6=0;
        int val_6_viejo=0; //button old
        int val_6; //buton new
        int S7_estado=0; //led estado
//variables pulsador 8
        uint8_t val7=0;
        int val_7_viejo=0; //button old
        int val_7; //buton new
        int S8_estado=0; //led estado       

int led=13;
int S8=12;
int S7=11;
int S6=10;
int S5=9;
int S4=8;
int S3=7;
int S2=6;
int S1=5;
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void setup() 
  {
  // Declaramos como salida los puertos fisicos del ARDUINO
  // y los ponemos en estado bajo 
  pinMode(led,OUTPUT);         ////se declará el pin 13 como SALIDA
digitalWrite(led, LOW); 
  pinMode(S8,OUTPUT);         ////se declará el pin 12 como SALIDA
digitalWrite(S8, LOW);
  pinMode(S7,OUTPUT);         ////se declará el pin 11 como SALIDA
 digitalWrite(S7, LOW);
  pinMode(S6,OUTPUT);         ////se declará el pin 10 como SALIDA
digitalWrite(S6, LOW);
  pinMode(S5,OUTPUT);         ////se declará el pin 9 como SALIDA
digitalWrite(S5, LOW);
  pinMode(S4,OUTPUT);         ////se declará el pin 8 como SALIDA
digitalWrite(S4, LOW);
  pinMode(S3,OUTPUT);         ////se declará el pin 7 como SALIDA
digitalWrite(S3, LOW);
  pinMode(S2,OUTPUT);         ////se declará el pin 6 como SALIDA
digitalWrite(S2, LOW);   
  pinMode(S1,OUTPUT);         ////se declará el pin 5 como SALIDA
digitalWrite(S1, LOW);   
 
  //Serial.begin(115200); // inicializamos la comunicación RS232
  Serial.begin(57600); // inicializamos la comunicación RS232
 
  pcf8574.pinMode(P0, INPUT); //se declará el pin PO del CI PCF8574 como entrada
  pcf8574.pinMode(P1, INPUT); //se declará el pin P1 del CI PCF8574 como entrada
  pcf8574.pinMode(P2, INPUT); //se declará el pin P2 del CI PCF8574 como entrada
  pcf8574.pinMode(P3, INPUT); //se declará el pin P3 del CI PCF8574 como entrada
  pcf8574.pinMode(P4, INPUT); //se declará el pin P4 del CI PCF8574 como entrada
  pcf8574.pinMode(P5, INPUT); //se declará el pin P5 del CI PCF8574 como entrada
  pcf8574.pinMode(P6, INPUT); //se declará el pin P6 del CI PCF8574 como entrada
  pcf8574.pinMode(P7, INPUT); //se declará el pin P7 del CI PCF8574 como entrada
  //Como ejemplo a futuro, otras configuraciones de los puertos del PCF8574
  //pcf8574.pinMode(P0, INPUT_PULLUP);
  //pcf8574.pinMode(P1, INPUT);
  //pcf8574.pinMode(P7, OUTPUT);
  //pcf8574.pinMode(P6, OUTPUT, HIGH);
  //pcf8574.pinMode(P4, OUTPUT, LOW);
    
  pcf8574.begin();// inicializamos la comunicación entre el uc y el CI PCF8574
  Serial.println("iniciando ejemplo.....");
 timeElapsed = millis();
  }
unsigned long lastSendTime = 0;        // last send time
unsigned long interval = 4000;          // interval between sends
 
bool startVal = HIGH;
bool keyPressed = false;

//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void loop()
{
 
    if (keyPressed)
       {
        /*
        uint8_t val0 = pcf8574.digitalRead(P0);
        uint8_t val1 = pcf8574.digitalRead(P1);
        uint8_t val2 = pcf8574.digitalRead(P2);
        uint8_t val3 = pcf8574.digitalRead(P3);
        uint8_t val4 = pcf8574.digitalRead(P4);
        uint8_t val5 = pcf8574.digitalRead(P5);
        uint8_t val6 = pcf8574.digitalRead(P6);
        uint8_t val7 = pcf8574.digitalRead(P7);
        */
        val0 = pcf8574.digitalRead(P0);
        val_0 = val0;
        val1 = pcf8574.digitalRead(P1);
         val_1 = val1;
        val2 = pcf8574.digitalRead(P2);
         val_2 = val2;
        val3 = pcf8574.digitalRead(P3);
         val_3 = val3;
        val4 = pcf8574.digitalRead(P4);
         val_4 = val4;
        val5 = pcf8574.digitalRead(P5);
         val_5 = val5;
        val6 = pcf8574.digitalRead(P6);
         val_6 = val6;
        val7 = pcf8574.digitalRead(P7);
         val_7 = val7;
        
        accion();
        debug_1();
       keyPressed= false;
     }

   if (millis() - lastSendTime > interval)
          {           
            digitalWrite(led, startVal);
            if (startVal==HIGH)
                {
                startVal = LOW;
                }
               else
                {
                startVal = HIGH;
                }
            debug_2();   
            lastSendTime = millis();
           }
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void accion()
{

if (val_0 == HIGH && val_0_viejo== LOW)
   {
    if (S1_estado==0)
       {
        digitalWrite(S1, HIGH);
        S1_estado=1;
       }
    else
       {
       digitalWrite(S1, LOW);
       S1_estado=0;   
       }
   }
   val_0_viejo = val_0;
/////////////////////////////////////////////
if (val_1 == HIGH && val_1_viejo== LOW)
   {
    if (S2_estado==0)
       {
        digitalWrite(S2, HIGH);
        S2_estado=1;
       }
    else
       {
       digitalWrite(S2, LOW);
       S2_estado=0;   
       }
   }
   val_1_viejo = val_1;   
/////////////////////////////////////////////
if (val_2 == HIGH && val_2_viejo== LOW)
   {
    if (S3_estado==0)
       {
        digitalWrite(S3, HIGH);
        S3_estado=1;
       }
    else
       {
       digitalWrite(S3, LOW);
       S3_estado=0;   
       }
   }
   val_2_viejo = val_2;
/////////////////////////////////////////////
if (val_3 == HIGH && val_3_viejo== LOW)
   {
    if (S4_estado==0)
       {
        digitalWrite(S4, HIGH);
        S4_estado=1;
       }
    else
       {
       digitalWrite(S4, LOW);
       S4_estado=0;   
       }
   }
   val_3_viejo = val_3;
/////////////////////////////////////////////
if (val_4 == HIGH && val_4_viejo== LOW)
   {
    if (S5_estado==0)
       {
        digitalWrite(S5, HIGH);
        S5_estado=1;
       }
    else
       {
       digitalWrite(S5, LOW);
       S5_estado=0;   
       }
   }
   val_4_viejo = val_4; 
/////////////////////////////////////////////
if (val_5 == HIGH && val_5_viejo== LOW)
   {
    if (S6_estado==0)
       {
        digitalWrite(S6, HIGH);
        S6_estado=1;
       }
    else
       {
       digitalWrite(S6, LOW);
       S6_estado=0;   
       }
   }
   val_5_viejo = val_5;
/////////////////////////////////////////////
if (val_6 == HIGH && val_6_viejo== LOW)
   {
    if (S7_estado==0)
       {
        digitalWrite(S7, HIGH);
        S7_estado=1;
       }
    else
       {
       digitalWrite(S7, LOW);
       S7_estado=0;   
       }
   }
   val_6_viejo = val_6;
/////////////////////////////////////////////
if (val_7 == HIGH && val_7_viejo== LOW)
   {
    if (S8_estado==0)
       {
        digitalWrite(S8, HIGH);
        S8_estado=1;
       }
    else
       {
       digitalWrite(S8, LOW);
       S8_estado=0;   
       }
   }
   val_7_viejo = val_7;           
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void debug_1()
{
        Serial.println("---");
        Serial.print(" P0 ");Serial.print (val0);
        Serial.println("   ");
        Serial.print(" P1 ");Serial.print(val1);
        Serial.println("   ");
        Serial.print(" P2 "); Serial.print(val2);
        Serial.println("   ");
        Serial.print(" P3 ");Serial.print(val3);
        Serial.println("   ");
        Serial.print(" P4 ");Serial.print(val4);
        Serial.println("   ");
        Serial.print(" P5 "); Serial.print(val5);
        Serial.println("   ");
        Serial.print(" P6 ");Serial.print(val6);
        Serial.println("   ");
        Serial.print(" P7 ");Serial.print(val7);
        
}

void debug_2()
{
        Serial.println("---");
        //Serial.println("   ");
        Serial.print("LED: ");Serial.print(startVal); 
}
/////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////// 
void keyPressedOnPCF8574()
     {
    
    // Interrupt called (No Serial no read no wire in this function, and DEBUG disabled on PCF library)
     keyPressed = true;
     } 
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
  • entradasPCF8574.png
    entradasPCF8574.png
    36.6 KB · Visitas: 9
  • Me gusta
Reactions: krlosss
Atrás
Arriba