Blue Flower

Guida alla realizzazione di un shield (TIL311_Shield2 AVANZATA) per fare alcuni esperimenti con Arduino Uno Rev. 3

Nel nostro articolo realizzaremo un semplice termometro digitale sfruttando il sensore di temperatura LM35 collegato all'ingresso analogico di Arduino e visualizzeremo la temperatura rilevata sui display.

Il sensore di temperatura LM35 fornisce una tensione di 10mV per ogni grado Celsius rilevato. Se la temperatura rilevata è di 20 °C i sensore genererà una tensione di 200mV (20°C  per 10mV/°C = 200mV). Utilizzando uno degli ingressi analogici di Arduino saremo in grado di misurare questa tensione e di visualizzare sul display, dopo alcuni semplici calcoli, il corrispondente valore di temperatura.

Per realizzare il nostro progetto utilizzeremo lo shield già presentato nell'articolo Timer con Arduino e display TIL311 opportunamente modificato e potenziato (TIL311_Shield2 Avanzato).

NOTA BENE: In questa versione dello shield il pulsante P3 è stato collegato al pin 2  dei DIO di Arduino mentre al pin 13 (ex P3) è stato collegato il BUZZER. Pertanto il programma presentato nell'articolo citato va modificato se viene utilizzato con questa nuova versione dello shield (basta cambiare int P3=13 con P3=2 ad inizio programma). La ragione principale del cambiamento è la possibilità di sfruttare l'interrupt hardware (disponibile solo ai pin 2 e 3 di Arduino) mediante P3. Vedremo degli esempi quanto prima.

I TIL 311 usano una matrice di punti per visualizzare i numeri da 0 a F (in esadecimale) fornendo in ingresso 4 bit. Con 0000 visualizza lo zero, con 0001=1, con 1001=9, con 1010=A con 1111=F (vedi data sheet allegato).

Passiamo alla realizzazione dello shield. Se vi interessa realizzare solo il Termometro i componenti marcati come "Opzionale" possono non essere montati o montati in seguito per la realizzazione degli altri progetti o delle varianti proposte.

Ecco lo schema elettrico dello sheld "TIL311_SHIEL2 AVANZATO"

 

 Elenco Materiale

1 basetta millefori 6x6 cm (passo 2,54 mm)

3 Pulsanti per c.s. NA (P1, P2, P3) (opzionale)

2 TIL 311 (Display a matrice di punti)

2 zoccoli DIL da 14 pin per TIL311

1 Striscia contatti a pettine passo 2,54mm (1/10 pollice) per connessione Vs Arduino con almeno 30 contatti

1 Sensore di temperatura LM35

1 Trimmer 10K montaggio orizzontale (opzionale)

1 Buzzer Piezo PKM22EPP-40 (opzionale)

1 striscia con fori torniti per espansione contatti Arduino (GND, +5V, ingressi Analogici A5, A4, A3) (opzionale)

1 Filo da 0,5 mm per collegamenti (piste lato rame)

1 Saldatore e stagno

e, ovviamente, tanta pazienza.

Inserire i componentii nella posizione indicata dallo schema seguente (ogni incrocio dei quadratini rappresenta una piazzola del c.s.). Prima zoccoli e pulsanti (puntare con un po' di stagno).

 

 

Il disegno in scala doppia dei collegamenti (visto dal lato componenti come se fosse trasparente). L'LM35 va inserito come in figura, cioè con la parte piatta verso il display.

 

 

A fine cablaggio è buona norma controllare con un tester che non ci siano corticircuiti e che tutti i collegamenti siano a posto.

Inserite i TIL311 sugli zoccoli prestando attenzione alla piedinatura. Ecco alcune immagini del TIL 311

A titolo di esempio si fornisce la versione PCB realizzata con Fritzing. ATTENZIONE: La dimensione dei componenti su Fritzing non rispecchia quella dei componenti reali montati su basetta (in particolare i pulsanti ed il Buzzer) ed anche le distanze tra i componenti non sono le stesse. Per i collegamenti fare riferimento al disegno e alle foto sopra. Le piste più scure rappresentano il lato rame mentre quelle più chiare sono i ponticelli lato componenti

 

 

 

 

Qui potete trovare la documentazione (data sheet) dei vari dispositivi:

Sensore di temperatura LM35

Display TIL 311

BUZZER PKM22EPP-40

 

Ecco finalmente il software per testare il nostro termometro digitale:

 

//Autore: Vincenzo Maida
//Data: 31/03/2015 - Torino (Italy)
//Termometro ambiente con LM35 basato su shield con display TIL311 (TIL311_SHIELD2 AVANZATA)


int pinLM35=A1; //pin sensore di temperatura LM35
double valoreSensore=0; //Valore letto dal sensore LM35
double tensione=0.0; //Valore di tensione corrispondente al valore letto dall'ADC
double temp=0; //Temperatura corrispondente al valore letto dall'LM35 (tensione)
//Display TIL311 (DP1 e DP2)
int BL1=5; //Input Blank (8) di DP1 Decine su uscita  PWM di Arduino. 0=Acceso; 1=Spento (attivo basso)
int pin1[] = {1,0,3,6};//Pin TIL311 Decina (Display 1 a sinistra). Segmenti A (3), B(2), C(13), D(12) del TIL 311 

int BL2=11; //Input Blank (8) di DP2 Unità su uscita  PWM di Arduino. 0=Acceso; 1=Spento (attivo basso)
int pin2[] = {8,7,9,12};//Pin TIL311 Unità (Display 2 a destra). Segmenti A(3), B(2), C(13), D(12) del TIL 311 
int TIL[][16]={
              {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
              {0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1},
              {0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1},
              {0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1}
            };
//Variabili per gestione display
int d=0; //Contatore decine
int u=0; //Contatore unità
int i=0;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  //Inizializza segmenti TIL311 di DP1 (Decine)
  for(i=0;i<4;i++){
  pinMode(pin1[i], OUTPUT);
  } 
  pinMode(BL1,OUTPUT);
  digitalWrite(BL1,LOW); //Accende il display decine
  
  //Inizializza segmenti TIL311 di DP2 (Unità)
  for(i=0;i<4;i++){
  pinMode(pin2[i], OUTPUT);
  } 
  pinMode(BL2,OUTPUT);
  digitalWrite(BL2,LOW); //Accende il display unità
 
}

// the loop routine runs over and over again forever:
void loop() {
  //Legge sensore LM35
  valoreSensore=analogRead(pinLM35);
  tensione=valoreSensore*5/1023; //Valore della tensione letta in ingresso
  temp=tensione*100;//Valore di tensione convertito in temperatura
  d=temp/10;//Calcolo le decine
  u=temp-(d*10);//Calcolo le unità
  
  //Aggiorna cife display
  //Display decine
  for(i=0;i<4;i++){
   digitalWrite(pin1[i],TIL[i][d]);
  }
  //Display unità
  for(i=0;i<4;i++){
   digitalWrite(pin2[i],TIL[i][u]);
  }
  delay(500);//Lettura ogni 500ms
  
}

 

NOTA: Noterete che appena acceso il sensore visualizza la temperatura "corretta" ma dopo un po' questa aumenta (nel mio caso fino a 30-32 gradi). Questo è dovuto al fatto che il sensore è troppo vicino ai displays e sotto c'è l'ATmega328 di Arduino che, anche se non sembra, scaldano! Per avere una rilevazione più corretta il sensore andrebbe montato più distante (potete usare i pin A5 o A4 oltre alle connessioni GND e +5V per l'alimentazione e montare il sensore con fili lunghi)

Un po' di teoria sugli ingressi analogici di Arduino

Arduino dispone di 6 ingressi analogici (da A0 a A5) che fanno capo ad un convertitore analogico-digitale (ADC o A/D) a 10 bit (quasi sicuramente in multiplexer, cioè un solo ADC per tutti gli ingressi). La tensione applicabile è di max 5Volt. La frequenza di campionamento (fc) è di circa 10 Ksample/sec ed il tempo di conversione di circa 100 us (microsecondi). L'ADC restituisce un numero intero compreso tra 0 e 1023 per tensioni che variano da 0 a +5V.

La suà sensibilità e di 4,89mV calcolata così: q=Vimax/intervalli dove: Vimax=5V; intervalli=(2^n)-1; con n=10 (numero di bit)  cioè in numeri q=5/1023=4,89mV che rappresenta la minima variazione di tensione che riesce a sentire.

Quindi se applico in ingresso una tensione di Vi=0V ottengo in uscita dal mio ADC il numero=0, per Vi=2,5V ottengo 512, per Vi=5V ottengo 1023. In altre parole valoreADC=Vi/q (arrotondato all'intero superiore)

In pratica se LM35 rileva una temperatura di 20°C fornirà una tensione di uscita di 200mV. L'uscita del'ADC sarà: valoreADC=Vi/q=200mV/4,89mV=41 (arrotondato!).

Quindi se voglio sapere che temperatura ha rilevato il sensore devo:

1. Leggere la tensione presente sull'ingresso analogico (nel nostro caso su A1) con l'istruzione valoreADC=analogRead(A1); Nel caso in esempio otterei il valore 41

2. Calcolare a quale tensione corrispondente tale valore cioè Vi=valoreADC*q=41*4,89mV=0,2V (ovvero 200mV)

3. Convertire la tensione corrispondente nel valore di temperatura mediante la costante dell'LM35 (cioè 10mV/°C) mediante la semplice proporzione: 1°C:10mV=x:Vi da cui x=1*Vi/10mV ma 1/10mV cioè 1/0,01 è uguale a 100 per cui x=Vi*100. Infatti nel nostro esempio con Vi=200mV=0,2V otteniamo x=0,2*100=20 gradi

Per saperne di più

https://www.arduino.cc/en/Reference/AnalogRead

https://www.arduino.cc/en/Tutorial/AnalogInputPins

http://www.vincenzov.net/tutorial/elettronica-di-base/appunti-classe-terza/ADC.htm

http://www.edutecnica.it/elettronica/adc/adc.htm

https://it.wikipedia.org/wiki/Convertitore_analogico-digitale

File Excel per i calcoli su ADC ed LM35

Il componente TIL311 per Fritzing da me realizzato: TIL311.fzpz