PCF8574P problema con ingressi

Stò provando il PCF8574P per la prima volta e per comandare LCD alfanumerici
ho utilizzato la libreria LiquidCrystal_I2C trovata sul playground Arduino
e con 2 LCD alfanumerici funziona!

Volevo provare degli I/O ma ho faticato a trovare una libreria dedicata.
Ho provato questa:

Programmare OUTPUT nessun problema. Funziona ed è anche facile da utilizzare.

Per INPUT non sono riuscito a farla funzionare, nell'esempio fa riferimento all'Interrupt

Nel file allegato riga 20:
expander.enableInterrupt(8,ISRgateway); // Enable interrupt by attach interruption
handler to arduino pin D8 and save ISRgateway as callback function

Quel numero 8 indica il pin Arduino?
Ho provato ma senza esito.

riga 22:
expander.attachInterrupt(3,ISRexpander,FALLING); /

3 è il pin del PCF8574P dove è collegato il pulsante

Allego anche lo schema che ho utilizzato.

Qualcuno mi può indicare qualche valida libreria?

Grazie per suggerimenti.

ButtonBlink.pde (2.16 KB)

PCF8574P_01.pdf (17.2 KB)

  1. credo che si riferisca al pin 8 del Pcf, visto che la definizione della modalità del pin è un metodo dell'oggetto expander.
  2. ma che lib usi? un link aiuterebbe

perche riinventare la ruota.
http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/ lo schema di collegamento PCF display é contenuto nel file zip della libreria.

Ciao Uwe

Ma a lui il pilotaggio del display funziona.
Non funziona invece la parte di pilotaggio del Pcf come ingresso, però sarebbe da sapere quale lib sta usando.

Grazie per le risposte.

Ho comunque risolto con la ibreria qui indicata.

http://jaerder.videmogroup.org/arduino/IOexp_v09.zip

Funziona anche se lo sketch non è ancora OK, vedi i pulsanti.
L'avrei comunicato appena sistemato decentemente.

Questo è il codice che ho utilizzato.

*/
#include <IOexp.h>    //Libreria I/O expander scaricata.
#include <Wire.h>
#define IO_ADDR 0x38  //Indirizzo PCF8674P con A0=0, A1=0, A2=0 
byte ac_av_singo[]={1,2,4,8,16,32}; //Array per lo scorrimento.
byte ind=1;
byte PU1,PU2;   //Pulsanti scorre avanti e indietro.
IOexp exp0(IO_ADDR);  //Oggetto I/O expander.
unsigned long t_prec;      //Per antirimbalzo.
unsigned long t_anti=1000; //Tempo antirimbalzo.
//---Predisposizione-------------------------------
void setup(){
  Serial.begin(9600);   
  Wire.begin();          //Inizializza BUS I2C. 
  exp0.write(P0,true);   //Disattiva P0.
  exp0.write(P1,true);   //    "     P1.
  exp0.write(P2,true);   //    "     P2.
  exp0.write(P3,true);   //    "     P3.
  exp0.write(P4,true);   //    "     P4.
  exp0.write(P5,true);   //    "     P5.
  exp0.write(P6,true);   //    "     P6.
  exp0.write(P7,true);   //    "     P7.
  t_prec=millis(); //Antirimbalzo pulsanti. 
  for(byte i=0;i<6;i++){
    ac_av_singo[i]=255-ac_av_singo[i];
  }  
}
//---Ciclo principale------------------------------
void loop(){
  exp0.write(P6,true); //Disattiva ingresso P4
  PU1=exp0.read(P6);   //Legge pulsante sul pin P4.
  if(PU1==0){          //Se P4 premuto.
    if(millis()>t_prec+t_anti){ //Controllo antiripetizione.
      exp0.fullwrite(ac_av_singo[ind-1]); //Scorre array.
      Serial.print("ind= ");
      Serial.println(ind);
      ind++;
      if(ind>6)
        ind=1;
      t_prec=millis();
    }
  }  
  exp0.write(P7,true); //Disattiva ingresso P5.  
  PU2=exp0.read(P7);   //Legge pulsante sul pin P5.
  if(PU2==0){          //Se P5 premuto. 
    if(millis()>t_prec+t_anti){ //Controllo antiripetizione.
      exp0.fullwrite(ac_av_singo[ind-1]); //Scorre array.
      Serial.print("ind= ");
      Serial.println(ind);
      t_prec=millis();
      ind--;
      if(ind<1)
        ind=6;
    }  
  }  
}

Bene. Ma per la prox volta includi il codice usando gli appositi tag, come ho appena fatto io :wink: