Modulo per ampliare le uscite

Ciao,
sto utilizzando un modulo per ampliare le uscite di arduino (ha 8 uscite)
Attuamente uso questo codice per pilotarme quattro ..

   if ((I_S1==0) && (I_S2==0) && (I_M1==0) && (I_M2==0) )
       { Wire.write((byte)0b00001111); }
 
    if ((I_S1==0) && (I_S2==0) && (I_M1==0) && (I_M2==1) )
       { Wire.write((byte)0b00001110); }
     
    if ((I_S1==0) && (I_S2==0) && (I_M1==1) && (I_M2==0) )
       { Wire.write((byte)0b00001101); }
     
    if ((I_S1==0) && (I_S2==0) && (I_M1==1) && (I_M2==1) )
       { Wire.write((byte)0b00001100); }

per pilotarne 8 dovrei scrivere ben 256 combinazioni.
Mi potete indicare un altro modo per poterle pilotare

Grazie

Ma no...

Basta ragionare un attimo

Se una variabile comanda una specifica posizione e le posizioni hanno un valore (posizionale appunto, come ci ha insegnato la maestra alle elementari)

Basta solo costruire una somma di moltiplicazioni, ogni moltiplicazione tra la variabile controllante la posizione e il peso binario della posizione

Con una riga (lunga) te la cavi

mmmm... ma cosa sono quelle 4 variabili I_S1 ecc.
Vedo
15 0
14 1
13 2
12 3

Cioè non puoi scrivere direttamente:

Wire.write((byte)12);

Sono perplesso, prova questo sketch nel setup():

byte counter = 255;
    byte b;
    Serial.println("counter\tb");
    do  {
        b = ~counter;

        Serial.print(counter);
        Serial.print("\t");
        Serial.print(b);
        Serial.println();
        --counter;
    } while (b != 255);

Questo è l'output parziale:

counter	b
255	        0
254	        1
253	        2
252	        3
251	        4

Spiega meglio le necessità che hai perché le soluzioni ci sono.

Ciao.

Una cosa del tipo

IS_1*1 + IS_2*2 + IM_1*4

Giusto?

C1P8...

Negli anni mi ricordo...

Era dato come un errore di traduzione
O come una traduzione volutamente errata

Comunque ci hai pigliato

Come spesso ci piglia il droide che ti ha ispirato il nick

Edit

Beh, no, mi correggo
Manca un piccolo particolare...
Negativamente importante

?
Non capisco

Wire.write((byte) (!I_S1)<<3 + (!I_S2)<<2 + (!I_M1)<<1 + !I_M2);
oppure:
Wire.write((byte) (!I_S1)<<3 | (!I_S2)<<2 | (!I_M1)<<1 | !I_M2);

AH, ci sono:

Il not

Ciao,
grazie per le risposte ..
provo a spiegare meglio il problema ..

in base ad 8 variabili devo impostare le otto uscite del modulo aggiuntivo.

attualmente per valorizzarne quattro utilizzo il codice che vi ho mostrato.
se devo utilizzare tutte le otto variabili come faccio?

mettiamo che le variabili siano
a, b, c, d, e, f, g, h

attualmente farei

if((a==0) && (b==0) && (c==0) && (d==0) && (e==0) && (f==0) && (g==0) && (h==0) )
       { Wire.write((byte)0b00000000);}
if((a==0) && (b==0) && (c==0) && (d==0) && (e==0) && (f==0) && (g==0) && (h==1) )
       { Wire.write((byte)0b00000001);}

....
....
e così via 

Grazie

Ma sei al contrario rispetto a prima

Due risposte valide ti sono state date, se non ti sono chiare studiale

Solo dopo averle studiate se ti rimangono dubbi parliamone

Ostia
Vero è
Non me ne ero accorto

Quindi le risposte sono valide

Le domande forse no

di che modulo si tratta?

In effetti senza sapere di che modulo si tratta le informazioni non possono essere esaustive.

Suppongo che le variabili a÷h conservano lo stato on/off ricavato premendo 8 pulsanti. Allora vuoi assemblare le otto variabili all'interno di un byte. Puoi provare questa funzione:

byte assemblaByte() {
    return ((a << 7) | 
               (b << 6) |
               (c << 5) |
               (d << 4) |
               (e << 3) |
               (f << 2) |
               (g << 1) |
               (h << 0));
}

Restituisce un byte che puoi anche salvare in una variabile o inviare direttamente con:

Wire.write((byte)assemblaByte());

C'è un altro problema; ha poco senso scrivere sempre lo stesso valore.

Ciao.

Molto interessante la soluzione proposta da Maurotec.

Concorquoto

Io solitamente aborro le operazioni bit a bit

Ma quando ci vuole ci vuole...

Lo avevo già scritto al #7... :slight_smile:

Modulo PCF8574

Grazie mille per la soluzione :slight_smile: