Pages: [1]   Go Down
Author Topic: problema con 74HC595 e display a 7 segmenti  (Read 1355 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21671
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
uni=numero%10;
decine=numero/10;
Ciao Uwe
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 4
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
}
« Last Edit: January 06, 2013, 07:39:20 pm by andrea86 » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21671
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: