Ciao, per un progettino ho avuto bisogno di comandare 4 display a 7 segmenti. Però al posto dei shift register come il 74HC595 ho usato il MCP23017. Entrambi "aumentano" le uscite, però l' ultimo ha 16 uscite e non si ferma a questo la superiorità del MCP23017.
Qui ho usato un LM35 che puoi direttamente "incastrare" sull' arduino uno utilizzando il pin A0 per fornire la massa e il pin A2 per fornire i +5 Vdc per alimentare il LM35. Mentre il pin A1 è utilizzato per leggere il valore della temperatura, sempre dal LM35. I pin A4 e A5 sono usati per controllare il MCP23017 tramite il protocollo I2C. Visto che una singola cifra può essere rappresentata con solo 4 cifre binarie ( in pratica quello che fa il BCD ) con solo 8 bit comandi due display 7 segmenti. Quindi se trasmetti un byte fai in modo che i primi 4 bit servono per le decine e gli altri 4 bit servono per le unità. Poi però ti serve un decoder BCD / pin dei display. Cerca 74HC4543 su google e tipo a milano li trovi a 20 centesimi l' uno.
Per esempio la temperatura è 21°C.
Per ottenere le decine tempAmb / 10 e quindi 2.
Per ottenere le unità tempAmb % 10 e quindi 1.
Poi si deve comporre il byte da trasmettere al MCP23017 ( o al massimo al 74HC595 ) e quindi 4 bit ( a partire da sinistra ) devono essere le decine e poi seguono gli altri 4 bit ( quelli più a destra ) che servono per le unità. Per farlo basta moltiplicare * 16 le decine ( in binario 2 è 00000010 e se moltiplichi * 16 diventa 00100000 che poi è 32 in decimale ) e poi sommare le unità ( 00100000 + 00000001 = 00100001 ).
Riassumendo con ( tempAmb / 10 * 16 ) + ( tempAmb % 10 ) componi il byte da mandare all' integrato.
#include <Wire.h>
int tempAmb, tempOld;
void setup()
{
pinMode ( 14, OUTPUT );
digitalWrite ( 14, LOW ); // il pin A0 fornirà GND
pinMode ( 16, OUTPUT );
digitalWrite (16, HIGH ); // il pin A2 fornirà +5
Wire.begin(); // attiva il I2C
Wire.beginTransmission(0x20); // 0x20 è l' indirizzo hardware del MCP23017
Wire.write(0x00); // ti indirizzi sul primo registro del MCP23017
Wire.write(0x00); // dici al MCP23017 che i primi 8 pin devono essere uscite e non ingressi
Wire.endTransmission();
}
void loop()
{
tempAmb = ( analogRead ( 1 ) * 500 ) / 1024; // leggi dal pin A1 il valore analogico del LM35
if ( tempAmb != tempOld ) // se la temperatura è cambiata...
{
tempOld = tempAmb;
Wire.beginTransmission(0x20); // 0x20 è l' indirizzo hardware del MCP23017
Wire.write(0x12); // ti indirizzi sul registro del MCP23017 che comanda le prime 8 uscite
Wire.write(( tempAmb / 10 * 16 ) + ( tempAmb % 10 )); // leggi esempio
Wire.endTransmission();
}
delay (1000);
}