info i2c pcf8574p

salve ragazzi non riesco a comprendere bene come funziona l'espanzione dei canali i2c mi sapreste dare qualche informazione in merito e magari se possibile qualche codice per comprendere bene il funzionamente grazie a tutti

ragazzi per costesia dove posso trovare informazioni in merito?

se cerchi per questo chip nel forum italiano c'e' un post in merito di qualche giorno fa scritto da me, a proposito di un lcd. non c'e' scritto come si utilizza ma c'e' una libreria che lo usa. magari se leggi il codice di quella ti salta all'occhio qualcosa !!

ciao federico, per esempio se io volessi accendere solo dei led cosa devo eliminare in questo codice che hai postato tu giusto per capire grazie

# include <Wire.h>
# include <LiquidCrystal_I2C.h>
# include <WProgram.h>
# include <DS1307.h>

byte di dati [56];
char orario [16];
char dataOdierna [16];
int RTC [7];
int anno;
int changeScreen = 0;
int LCDbuttonState;
int LCDbuttonVal;
int switchPin = 7;

# define 0x20 expander / / Indirizzo con tre indirizzi perni di messa a terra (B0100000).
/ / Si noti che la R / W bit non fa parte di questo indirizzo.
volatile numero di byte = 0;

uint8_t campana [8] = (0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4);
uint8_t nota [8] = (0x2, 0x3, 0x2, 0xe, 0x1E, 0xc, 0x0);
uint8_t clock [8] = (0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0);
uint8_t cuore [8] = (0x0, 0xa, 0x1F, 0x1F, 0xe, 0x4, 0x0);
uint8_t anatra [8] = (0x0, 0xc, 0x1d, 0xf, 0xf, 0x6, 0x0);
uint8_t di controllo [8] = (0x0, 0x1, 0x3, 0x16, 0x1C, 0x8, 0x0);
uint8_t cross [8] = (0x0, 0x1b, 0xe, 0x4, 0xe, 0x1b, 0x0);
uint8_t retarrow [8] = (0x1, 0x1, 0x5, 0x9, 0x1f, 0x8, 0x4);

LiquidCrystal_I2C lcd (expander, 8,2); / / impostare l'indirizzo LCD a 0x20 di 16 caratteri e display 2 righe


void setup ()
(
  Wire.begin ();
  pinMode (switchPin, INPUT);
  LCDbuttonState = digitalRead (switchPin);

  Serial.begin (9600);
  lcd.init (); / / inizializza il display LCD
  lcd.noBacklight (); / / spegne e accende l'uscita sul pin 12.
/ / Lcd.backlight ();
/ / Sink 5 V + LED ------- ------ 330Rresistor ------ P8574pin

  lcd.createChar (0, campana);
  lcd.createChar (1, nota);
  lcd.createChar (2, clock);
  lcd.createChar (3, cuore);
  lcd.createChar (4, anatra);
  lcd.createChar (5, di controllo);
  lcd.createChar (6, Croce);
  lcd.createChar (7, retarrow);
  lcd.home ();

  lcd.print ( "System");
  lcd.setCursor (0, 1);
  lcd.print ( "Ready.");
  delay (1000);
  for (int i = 0; i <9; i + +) (
    lcd.scrollDisplayLeft ();
    delay (100);
  )
  lcd.clear ();
  lcd.home ();

  / / RTC SETUP
  / * RTC.stop ();
  RTC.set (DS1307_SEC, 1);
  RTC.set (DS1307_MIN, 8);
  RTC.set (DS1307_HR, 0);
  RTC.set (DS1307_DOW, 1);
  RTC.set (DS1307_DATE, 21);
  RTC.set (DS1307_MTH, 12);
  RTC.set (DS1307_YR, 9);
  RTC.start ();*/

  for (int i = 0; i <56; i + +) (
    RTC.set_sram_byte (65, I);
  )

)

void loop ()
(
  RTC.get (RTC, true);

  / * for (int i = 0; i <7; i + +)
   (
   Serial.println (RTC [i]);
   Serial.print ( "");
   )
   Serial.println ();*/

  / / rtc [0] -> secondi
  / / Tramite questo SE faccio lampeggiare il: per i secondi
  if (RTC [0]% 2) (
    sprintf (orario, "% 02d:% 02d", RTC [2], RTC [1]); / /% 02d convertirli 9 in 09 e 32 in 32
  )
  else (
    sprintf (orario, "% 02d% 02d", RTC [2], RTC [1]);
  )
  / / Serial.println (orario);

  anno = RTC [6] -2.000;
  sprintf (dataOdierna, "% 02d /% 02d /% 02d", RTC [4], RTC [5], anno);


  if (changeScreen == 0) (
    lcd.setCursor (1,0);
    lcd.print (orario);
    lcd.setCursor (7,0);
    lcd.print (2 byte);
    lcd.setCursor (0,1);
    lcd.print (dataOdierna);
  )
  else (
    lcd.setCursor (0,0);
    lcd.print (1 byte);
    lcd.setCursor (1,0);
    lcd.print ( "XX");
    lcd.setCursor (4,0);
    lcd.print (4 byte);
    lcd.setCursor (5,0);
    lcd.print ( "XX");
    lcd.setCursor (0,1);
    lcd.print ( "hcca XX");
  )

  LCDbuttonVal = digitalRead (switchPin); / / lettura valore di input e memorizzarlo in val
  if (LCDbuttonVal! = LCDbuttonState) (/ / lo stato del pulsante è cambiato!
    if (LCDbuttonVal == LOW) (/ / verifica se viene premuto il pulsante
Serial.println ( "Bottone premuto");
= changeScreen! changeScreen;
lcd.clear ();
    )
  )
  LCDbuttonState = LCDbuttonVal; / / salvare il nuovo stato della nostra variabile

)

grazie ancora

non vorrei essere troppo drastico ma devi togliere tutto :slight_smile: nel senso che quel codice li, cosi com'e' e' del tutto inutile al tuo scopo. Quello che potresti guardare e' la libreria che uso, la liquidcrystal_i2c che utilizza il pcf per capire in che modo comunica con questo. Inoltre se non ricordo male il pcf puo' fare pochissimi mA di source di corrente ma ne puo' fare il sink, percui il collegamento e' un attimo diverso.

SE avessi un pcf utilizzabile te lo proverei volentieri, ma non ne ho al momento... appena riesco faccio una ricerca + approfondita perche' sono abbastanza sicuro di aver visto qualcosa che puo' servirti sul forum.

Fede

grazie fede il fatto e che leggo un sacco di cose ma singeramente non riesco a capire molto mi sa che e un po complicato

C'e' una ragione specifica che ti spinge ad utilizzare un port expander i2c? Se vuoi fare una prova coi led c'e' questo tutorial molto buono, utilizza uno shift register ma non i2c

io avevo iniziato proprio da questo :slight_smile:

Fede