busco
June 13, 2013, 12:07pm
1
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)
uwefed
June 13, 2013, 9:48pm
3
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
leo72
June 14, 2013, 5:30am
4
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.
busco
June 14, 2013, 8:45am
5
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;
}
}
}
leo72
June 15, 2013, 6:21am
6
Bene. Ma per la prox volta includi il codice usando gli appositi tag, come ho appena fatto io