Go Down

Topic: problema con 74HC595 e display a 7 segmenti (Read 1 time) previous topic - next topic

wirpool

un po' è una prova perchè io sono ancora alle prime armi... ho finito l'altra settimana i progetti del libro "Primi passi con ARDUINO" e un po' è una scelta tecnica perchè il negozio da cui mi rifornisco è chiuso e io volevo comunque provare a fare qualcosa...

andrea86

#6
Jan 07, 2013, 01:33 am Last Edit: Jan 07, 2013, 01:39 am by andrea86 Reason: 1
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.

Code: [Select]
#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);
}

uwefed

Quote
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.


È sbagliato usare dei Pin per alimentare dei componenti elettronici. Perché non colleghi il LM35 direttamente com massa e 5V.

Ciao Uwe

andrea86


Quote
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.


È sbagliato usare dei Pin per alimentare dei componenti elettronici. Perché non colleghi il LM35 direttamente com massa e 5V.

Ciao Uwe


Come mai e' sbagliato? Pensavo che l' unica limitazione era la corrente massima per pin.

Go Up