MCP9700A come leggere il valore di temperatura

Sfruttiamo il Netduino per la realizzazione di un dispositivo che permette la lettura della temperatura tramite il sensore MCP9700A.
Il sensore fornisce una tensione analogica proporzionale alla temperatura rilevata. E’ un dispositivo molto semplice e compatto, ha tre pin, uno per l’alimentazione, uno per la massa e uno per la tensione analogica di uscita.

MCP9700A

Per capire come collegare questo sensore al Netduino analizziamo prima le sue caratteristiche. Può essere alimentato da un intervallo di tensione che va da 2.3Vdc a 5.5Vdc, misura temperature che vanno da un minimo di -40°C a un massimo di 125°C con una precisione tipica di -+1°C (-+2°C massima). Ad una temperatura di 0°C il dispositivo eroga in uscita una tensione di 500mV utile come riferimento di partenza per il nostro circuito. La variazione di un grado produce una variazione di tensione di 10mV. La minima tensione in uscita dal sensore è di 100mV mentre quella massima è di 1.75V.
Per approfondire tutti gli aspetti di questo sensore potete consultare il suo datasheet.
La tabella seguente mostra un riassunto di quanto detto:

DescrizioneValori
Alimentazione del sensoreda 2.3Vdc a 5.5Vdc
Intervallo di temperaturada -40°C a 125°C
Precisione tipica+/- 1°C da 0 a 70°C
Variazione di tensione10mV per grado
Tensione di uscita a 0°C500mV
Intervallo di tensione in uscitada 100mV a 1.75V

Il grafico seguente mostra invece la curva di risposta del sensore.

Curva di risposta MCP9700A

La precisione del sensore è garantita alimentandolo a 3.3Vdc. In effetti, a parità di temperatura rilevata, alimentandolo prima a 3.3Vdc e poi a 5Vdc ho notato delle differenze di tensione in uscita dal sensore.
Come sappiamo il gli ingressi analogici del Netduino possono accettare una tensione massima di 3.3Vdc, l’MCP9700A può essere collegato direttamente all’ingresso analogico poiché la sua massima tensione in uscita è pari a 1.75Vdc.
Il Netduino dispone di un’alimentazione da 3.3Vdc che ho utilizzato per alimentare il sensore.

Il valore di tensione in uscita dal sensore viene collegato all’ingresso A0 del Netduino per essere digitalizzato; questo dato viene inviato al PC usando la comunicazione RS232.

Il circuito elettrico è il seguente.

Netduino e sensore MCP9700A

Foto_Circuito_Netduino

Il software per la gestione del circuito è composto da una parte relativa all’acquisizione del segnale analogico del sensore e da una parte che gestisce la comunicazione RS232 con il PC.
Di seguito il codice C#:

public static void Main()
{
SerialPort UART1 = new SerialPort("COM1", 9600, Parity.None,
8, StopBits.One);
AnalogInput AN0 = new AnalogInput(Pins.GPIO_PIN_A0);
Byte[] IntToByte = new Byte[2];
Int16 Analog0 = 0;

UART1.Open();

while (true)
{
//acquisisci il valore analogico
Analog0 = (Int16)AN0.Read();

//copio il valore intero in due byte
IntToByte[0] = (byte)(Analog0 & 0xff);
IntToByte[1] = (byte)((Analog0 >> 8) & 0xff);

//invia al pc un informazione
UART1.Write(IntToByte, 0, IntToByte.Length);
//attendi 500 millisecondi
Thread.Sleep(500);
}

UART1.Close();
}

 

Dopo aver definito gli oggetti per la comunicazione seriale e per l’acquisizione del segnale analogico, il programma entra in un ciclo infinito e ogni 500 millisecondi la funzione Read() esegue una lettura del segnale analogico proveniente dal sensore MCP9700A, questo valore è memorizzato in una variabile intera.
Per poter spedire questo valore tramite l’oggetto UART1, devo convertirlo in un array di Byte. Le istruzioni seguenti svolgono questo compito

//copio il valore intero in due byte
IntToByte[0] = (byte)(Analog0 & 0xff);
IntToByte[1] = (byte)((Analog0 >> 8) & 0xff);

 

Queste istruzioni servono a mettere i primi 8bit della variabile Analog0(16bit) nel primo byte dell’array e i successivi bit nel secondo byte dell’array.
Ho realizzato questa illustrazione per spiegare meglio cosa avviene utilizzando le funzioni precendenti:

Conversione da In16 ad array di Byte

Colleghiamo il Netduino al pc per alimentare il circuito ed eseguiamo il Debug(f5) per caricare il programma. A compilazione e programmazione avvenuta, avviamo hyper terminal per leggere i dati dalla seriale. Per maggiorni informazioni su hyper terminal potete rileggere l’articolo riguardante Netduino e RS232.

Ora che tutto è funzionante dobbiamo ragionare sull’interpretazione dei dati inviati al pc. La proporzione seguente ci permette di ottenere il valore della tensione sull’ingresso analogico in base al valore intero che il Netduino invia al pc:

MaxTenADC : Risol_ADC = TensADC : ValInt

dove:
MaxTenADC = 3.3Vdc tensione massima applicabile al pin analogico del Netduino
Risol_ADC = 10bit (1024) massima risoluzione del convertitore analogico digitale del Netduino
TensADC = tensione applicata al pin analogico
ValInt = valore intero ottenuto dalla conversione

Facciamo un esempio pratico, se il Netdino invia al pc un valore di 156 possiamo calcolare la tensione in ingresso in questo modo:

(MaxTenADC * ValInt) / Risol_ADC

(3.3Vdc * 156) / 1024 = 0.502 Vdc

quindi sull’ingresso analogico misureremo una tensione di circa 500 mVdc. Considerando la curva di risposta del sensore appuriamo che, con una tensione di 500mV, la temperatura misurata è di 0°C. Il datasheet ci dice che ad ogni variazione di grado corrisponde una variazione di 10mV, ciò ci permette di fare un calcolo per ottenere il valore in gradi in base al numero inviato dal Netduino via seriale.

(((3.3Vdc * 156) / 1024) – 0.5)/0.01 = 0.2°C

dove:
3.3Vdc è la tensione massima applicabile all’ingresso analogico
156 è il valore intero ottenuto dalla conversione analogico digitale
1024 è il massimo valore intero ottenibile con la conversione analogico digitale
0.5 è la tensione del sensore a 0°C
0.01 è la variazione di tensione per ogni grado (10mv/°C)

con questo semplice esperimento abbiamo creato un termometro capace di inviare i dati ad un pc. Volendo possiamo acquistare un ulteriore sensore di temperatura e collegarlo ad un altro ingresso analogico per creare un termometro differenziale.
In allegato trovate un file di progetto C# per leggere i dati dalla seriale.

Vi aspetto con commenti e suggerimenti e vi rimando al prossimo esperimento!