2 Display 7 segmenti + comunicazione usb

Ciao a tutti. E' la prima volta che gioco con l'elettronica e sto iniziando a sperimentare con Arduino. La prima cosa che ho fatto è questo misuratore di temperatura che mi mostra i valori su due display a 7 segmenti, così costruito:

Come vedere ho impegnato tutti e 14 i pin digitali per poter alimentare i display a 7 segmenti (7x2 apppunto).

Il problema è che se collego la porta usb sacrifico (si disattivano) due led dei display, rispettivamente quelli del pin 0 e 1 che vengono sfruttati dalla porta usb come rx/tx.

Qualcuno ha un idea per mostrare i valori su display ma contemporaneamente collegare il dispositivo via usb?

Grazie ;)

devi usare un integrato che occupa solo 4 piedi su arduino. si chiama max7219 e trovi un sacco di guide su nternet. cerca anche sul mio sito in calce.

Scusa WillyLord, potresti postare il codice che hai usato per costruire questo misuratore di temperatura? Perchè sto per iniziare con arduino e qualche esempio in più è sempre comodo =)

Ciao, per poter gestire i display e risparmiare contemporaneamente pin avresti due modi: 1.) 1 shift register (per esempio 74hc595) e 2 decoder bcd to 7Seg (per esempio 7447). Con questi 3 integrati useresti solo 2 pin dell'arduino (data e clock) e con 1 singolo byte potresti inviare i 2 numeri in codifica BCD ai due decoder. In pratica i primi 4 bit per il decoder A e gli ultimi 4 per il decoder B. 2.) 2 shift register in cascata, uno per display. Si userebbero sempre 2 pin (clock comune e un singolo pin data) e dovresti collegare le linee Q0..Q7 di ciascun registro ai pin A...G(eventualmente il punto lo lasceresti sconnesso o sempre spento) e codificare il numero in 2 byte da inviare sul pin data. I 2 byte sarebbero la rappresentazione diretta di quali segmenti accendere o spegnere in ciascun display.

Vedi te cosa scegliere, entrambe le implementazioni hanno pro e contro sia dal lato software (software di gestione dei bit) che da quello hardware (numero e cablaggio degli integrati). Io personalmente sceglierei il primo metodo, semplificherebbe abbastanza la codifica dei bit via software. (potresti usare un array di costanti ZERO, UNO...NOVE dove appunto in posizione 0 sta la costante ZERO definita 0000, BCD, eppoi a partire da questo assemblare il byte finale).

Comunque ti sarà sicuramente d'aiuto questa pagina: http://www.arduino.cc/en/Tutorial/ShiftOut per capire meglio come usare ShiftOut che è la funzione chiave per poter usare solo 2 pin.

Ciao Anddre, questo è il codice:

/**
 * Temperature + 7 segments display
 * @author  Arturo Verde
*/

#include "Simple7Segments.h"

// Define variable display.
// The numbers are the pins of the display

int pin = 1; // analog pin
int tempc = 0; // temperature variables
int samples[32]; // variables to make a better precision
int i;
int tempD;
int tempU;

void setup()
{

for(i = 0;i<=31;i++){ // ottengo 8 temperature di esempio su cui fare la media

  samples[i] = ( 5 * analogRead(pin) * 100.0) / 1024.0;
  tempc = tempc + samples[i];
  delay(80);

}


Simple7Segments unita(7, 6, 3, 4, 5, 8, 9, 14);
Simple7Segments decine(11, 10, 0, 1, 2, 12, 13, 14);

tempc=tempc/32.0; // Diviso 8 per avere il calcolo preciso nel Celsius (2 cifre)

tempc=(tempc-1); // Sottrazzione per eliminare il gap di surriscaldamento del circuito

tempD=tempc/10.0; // Faccio diviso 10 per ottenere le decine

tempU=(tempc-(tempD*10)); // Calcolo la cifra delle unit?

char* strD;
itoa(tempD, strD, 10); // Converto in stringa i due valori
decine.showNumber(strD[0]);

char* strU;
itoa(tempU, strU, 10);
unita.showNumber(strU[0]);

tempc=0;
tempD=0; tempU=0;

delay(20000);
decine.showNumber('-');
unita.showNumber('-');
}

void loop()
{

}

E’ fatto per funzionare con una batteria, qunindi per rispariare energia, dopo 20 sec si spengono le luce e tocca resettarlo me mostrare nuovamente i risultati.
Ma come spiegano anche gli amici del forum non è questo il modo giusto di lavorare, dobbiamo usare gli shift che ci consentono di risparmiare pin.
Grazie del Vs aiuto! :wink: