Go Down

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

wirpool

salve a tutti,
io vorrei fare un rilevatore di temperatura autonomo(lo collego all'elettricità con opportuno alimentatore e va da solo)... mi sono già procurato tutto il materiale(display 7 segmenti, shift register 74HC595, lm35) e sono a buon punto sia col circuito che col programma. Vorrei mostrare la temperatura sul display in modo che compaia la prima cifra e successivamente la seconda cifra del numero che forma la temperatura solo che non sò come inviare i dati dall'arduino allo shift register... nel senso che la temperatura me la legge(già verificato con scrittura al pc) ma io vorrei mostrarla sul display(che è già collegato e funzionante)... chi mi può aiutare per piacere?

qsecofr

secondo me dovresti spiegare meglio cosa cerchi: ossia
1)la comunicazione con lo shift register già ti va?  e ti manca solo la conversione del numero "decimale di arduino" al contenuto dello shift oppure..
2) ti manca proprio che non sai come caricare un valore nel registro...

insomma non si capisce imho molto bene a che punto ti sei arenato.

hai dato un occhio qui per il collegamento? (se è il collegamento che cerchi...)
http://arduino.cc/en/Tutorial/ShiftOut

wirpool

nono il collegamento mi va nel senso che se gli mando un numero di una cifra me lo mostra sul display ma un numero di due cifre no... stò cercando in internet un algoritmo per scomporre il numero nelle sue cifre tipo il numero 123 va scomposto in 1, 2, 3 ma non so come fare perchè tutti parlano in linguaggio c o c++ che sono simili ma non uguali a quello usato da arduino... qualche suggerimento?

uwefed

Un numero lo scomponi semplicemente: (diciamo che un numero tra0 e 99)

Code: [Select]
uni=numero%10;
decine=numero/10;

Ciao Uwe

qsecofr


nono il collegamento mi va nel senso che se gli mando un numero di una cifra me lo mostra sul display ma un numero di due cifre no... stò cercando in internet un algoritmo per scomporre il numero nelle sue cifre tipo il numero 123 va scomposto in 1, 2, 3 ma non so come fare perchè tutti parlano in linguaggio c o c++ che sono simili ma non uguali a quello usato da arduino... qualche suggerimento?


ti ha risposto uwe... generalizzando (se hai un intero di tante cifre) puoi fare per esempio sulle centinaia

byte centinaia = (numero / 100) % 10;
il modulo serve perchè se hai 1250  con la sola divisione ti risulta 12 e poi con il modulo ti risulta 2.
Però......non ho capito perchè fai questa cosa con un display a 7 segmenti... o meglio perchè non ne metti almeno due... perchè così fa un po'.... meglio sarebbe procurarsi un lcd hitaci almeno... inoltre dovrai studiare bene i delay tra un numero e l'altro perchè se no il 21 lo scambi col 12... insomma se devo essere onesto non mi piace tanto come soluzione e mi chiedevo per pura curiosità se è una prova o se è una scelta tecnica

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