<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TMP36 Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/tmp36/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/tmp36/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Thu, 25 Apr 2024 09:20:35 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>TMP36 Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/tmp36/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Arduino e sensore di temperatura TMP36</title>
		<link>https://logicaprogrammabile.it/arduino-sensore-di-temperatura-tmp36/</link>
					<comments>https://logicaprogrammabile.it/arduino-sensore-di-temperatura-tmp36/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 09 Sep 2013 19:21:52 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Sensore Temperatura]]></category>
		<category><![CDATA[TMP36]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=3778</guid>

					<description><![CDATA[<p>Come utilizzare il sensore di temperatura TMP36 La conversione di grandezze fisiche in elettriche è un aspetto che prima o poi viene affrontato quando iniziamo a realizzare piccoli esperimenti con Arduino. Oggi la sensoristica è ricca di dispositivi capaci di svolgere questa conversione (come il...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-sensore-di-temperatura-tmp36/">Arduino e sensore di temperatura TMP36</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come utilizzare il sensore di temperatura TMP36</h1>
<p>La conversione di grandezze fisiche in elettriche è un aspetto che prima o poi viene affrontato quando iniziamo a realizzare piccoli esperimenti con Arduino. Oggi la sensoristica è ricca di dispositivi capaci di svolgere questa conversione (<a href="https://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf">come il sensore di temperatura TMP36</a>).</p>
<p>Nello specifico, per quanto riguarda la misura della temperatura abbiamo in commercio dispositivi di ogni sorta, da quelli ultrasensibili a quelli con precisioni dell&#8217;ordine del centesimo di grado, dai costi contenuti ai costi esorbitanti. A tal proposito ho in precedenza utilizzato sia il sensore di temperatura <a href="https://logicaprogrammabile.it/mcp9700a-netduino-sensore-temperatura-analogico/">analogico MCP9700</a> sia il sensore <a href="https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/">digitale MCP9803</a>.</p>
<p>Il segnale di conversione di questi sensori può essere sia analogico (variazione di tensione in funzione della variazione della temperatura) sia digitale (con convertitore analogico digitale ed invio dei dati su linea I2C, SPI o 1Wire).</p>
<p>Per i nostri esperimenti ci accontenteremmo di un sensore molto diffuso, dal costo contenuto e dal semplice utilizzo, il <a href="http://www.amazon.it/gp/product/B00STWHUMW/ref=as_li_ss_tl?ie=UTF8&amp;camp=3370&amp;creative=24114&amp;creativeASIN=B00STWHUMW&amp;linkCode=as2&amp;tag=logicaprogram-21" target="_blank" rel="nofollow noopener"><strong>sensore TMP36</strong></a> prodotto da <a href="http://www.analog.com/en/index.html">Analog Device</a>.</p>
<p>Il <strong>TMP36</strong> permette di acquisire<strong> temperature</strong> comprese nell&#8217;<strong>intervallo</strong> tra<strong> -40°C e +125°C</strong> restituendo in uscita valori di tensione lineari tra circa <strong>0.1Vdc e 1.7Vdc</strong>. Una variazione di grado produce una variazione della tensione di uscita pari a 10mV; alla temperatura di <strong>0°C</strong> il sensore eroga una tensione di <strong>500mV</strong>.</p>
<p>Il circuito che ho realizzato è molto banale, si limita a collegare il sensore direttamente ad <strong>Arduino UNO</strong> tramite la porta analogica <strong>A0</strong>:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/09/TMP36.png"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-3783" src="https://logicaprogrammabile.it/wp-content/uploads/2013/09/TMP36.png" alt="Sensore Temperatura TMP36 con Arduino" width="500" height="215" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/09/TMP36.png 500w, https://logicaprogrammabile.it/wp-content/uploads/2013/09/TMP36-300x129.png 300w" sizes="(max-width: 500px) 100vw, 500px" /></a></p>
<p><span id="more-3778"></span></p>
<p>guardando frontalmente il <strong>TMP36</strong> troviamo sul lato sinistro il<strong> pin di alimentazione</strong>, sul pin centrale il <strong>segnale in uscita</strong> e sul pin destro il <strong>collegamento a massa</strong>.</p>
<p>Il primo sketch di esempio legge dalla <strong>porta analogica A0</strong> il valore di tensione che eroga il <strong>TMP36</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="avrasm">void setup()
{
  //Init Seriale
  Serial.begin(9600);
}

void loop()
{
  delay(500);
  int val_ADC = analogRead(0);
  //invio il dato acquisito al pc
  Serial.println(val_ADC);
}</pre>
<pre class="lang:arduino decode:true"><span style="font-family: 'Open Sans';">
Il codice precedente non fa altro che convertire in forma digitale la tensione presente sul piedino A0, generata dal TMP36. Questo valore deve essere ora interpretato in modo da ottenere direttamente il valore in °C. Per far ciò abbiamo bisogno del datasheet del componente, e precisamente il grafico di conversione °C/Vdc, rappresentato anche nella figura seguente:</span></pre>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/09/Tmp36_CtoV.png"><img decoding="async" class="aligncenter size-full wp-image-3786" src="https://logicaprogrammabile.it/wp-content/uploads/2013/09/Tmp36_CtoV.png" alt="TMp36 Grafico conversione °C in Vdc" width="320" height="262" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/09/Tmp36_CtoV.png 320w, https://logicaprogrammabile.it/wp-content/uploads/2013/09/Tmp36_CtoV-300x245.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></a></p>
<p>come possiamo osservare dal grafico (per il <strong>TMP36</strong> la linea b evidenziata in rosso) per una tensione di uscita di 0.5Vdc il sensore rileva la temperatura di 0°C. Questo dato ci permette subito di intuire che tensioni inferiori a 0.5Vdc indicano una temperatura sotto lo zero. Inoltre sapiamo che una variazione di grado si ripercuote con una variazione di tensione di 10mV. Quindi, passando agli esempi, se sul pin A0 sono presenti 510mV significa che il sensore sta rilevando una temperatura di 1°C (510mV &#8211; 500mV = 10 mV variazione di 1°C).</p>
<p>Non ci resta che interpretare i dati a nostra disposizione e scrivere uno sketch che restituisca il valore in °C:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="avrasm">//variabili globali
int val_Adc = 0;
float temp = 0;

void setup()
{
  //init seriale
  Serial.begin(9600);
}

void loop()
{
  //leggo dalla porta A0
  val_Adc = analogRead(0);
  //converto il segnale acquisito in un valore
  //espresso in gradi centigradi
  temp = ((val_Adc * 0.00488) - 0.5) / 0.01;
  //invio il dato sulla seriale
  Serial.println(temp);
  //ritardo di mezzo secondo
  delay(500);
}</pre>
<p>la formula che converte il valore acquisito in gradi centigradi è la seguente</p>
<p><strong>°C = ((valoreADC * PrecisioneADC) &#8211; TensioneZeroGradi) / stepGradoTensione</strong></p>
<p>dove</p>
<p><strong>°C</strong> = valore della temperatura in gradi centigradi<br />
<strong>valoreADC</strong> = valore della conversione analogico digitale restituito da analogRead<br />
<strong>PrecisioneADC</strong> = questo valore è ottenuto dividendo la tensione di riferimento dell&#8217;ADC (default 5Vdc) e il numero massimo restituito dalla conversione (1024). (5Vdc /1024 = 0.00488)<br />
<strong>TensioneZeroGradi</strong> = indica la tensione di uscita dal sensore quando rileva una temperatura di 0°C<br />
<strong>stepGradoTensione</strong> = indica la variazione di tensione per ogni variazione di grado (0.01 = 10 mV)</p>
<h2>Come aumentare la risoluzione nelle letture del TMP36</h2>
<p>Eseguendo l&#8217;ultimo sketch ci accorgiamo che i valori di temperatura non sono proprio quelli che ci aspettiamo. Considerando la <strong>precisione</strong> del sensore <strong>TMP36</strong> che si attesta a <strong>+/- 2°C</strong> per tutta la scala, otteniamo comunque dei valori che differiscono di circa 5-7°C dal valore reale. Questo &#8216;errore&#8217; dipende da diversi fattori tra cui imprecisione dell&#8217;ADC, rumore del segnale e approssimazione dei valori nei calcoli.<br />
Per limitare questi errori possiamo adottare due tecniche, la prima è quella di usare il <strong>pin AREF</strong> dell&#8217;<strong>Arduino UNO</strong> per dare al convertitore analogico digitale dell&#8217;ATmega328 un riferimento di tensione più basso (di default è 5Vdc), l&#8217;altra tecnica è quella di effettuare diverse letture ed eseguire una media dei valori letti.</p>
<p>Nello schema seguente viene indicato come collegare il <strong>pin AREF</strong> al <strong>pin power di 3.3Vdc</strong>:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/09/TMP36_1.png"><img decoding="async" class="aligncenter size-full wp-image-3792" src="https://logicaprogrammabile.it/wp-content/uploads/2013/09/TMP36_1.png" alt="Arduino tutorial pin AREF" width="507" height="308" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/09/TMP36_1.png 507w, https://logicaprogrammabile.it/wp-content/uploads/2013/09/TMP36_1-300x182.png 300w" sizes="(max-width: 507px) 100vw, 507px" /></a></p>
<p>Anche via software dobbiamo indicare al microcontrollore che intendiamo usare il pin AREF per le operazioni di conversione A-D. l&#8217;istruzione è la <strong>analogReference()</strong> e viene impiegata in questo modo:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="avrasm">//variabili globali
int val_Adc = 0;
float temp = 0;

void setup()
{
 //init seriale
 Serial.begin(9600);
 //utilizzando l'istruzione analogReference
 //indico al convertitore AD che deve impiegare
 //la tensione presente sul pin AREF come
 //valore di riferimento per la conversione
 analogReference(EXTERNAL);
}</pre>
<p>Usando la tensione di 3.3Vdc come riferimento per la conversione analogico digitale otteniamo che il valore <strong>PrecisioneADC</strong> nella formula precedente cambia da 0.00488 a 0.0032 (3.3Vdc / 1024 = 0.0032), aumentando così la precisione della formula.<br />
Impieghiamo anche la lettura multipla di valori per cercare di minimizzare le fluttuazioni, come descritto nel codice seguente:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="avrasm">int val_Adc = 0;
float temp = 0;

void setup()
{
 //init seriale
 Serial.begin(9600);
 //utilizzando l istruzione analogReference
 //indico al convertitore AD che deve impiegare
 //la tensione presente sul pin AREF come
 //valore di riferimento per la conversione
 analogReference(EXTERNAL);
}

void loop()
{
 //ritardo di mezzo secondo
 delay(500);
 //init variabile
 val_Adc = 0;
 //eseguo un ciclo
 for(byte Ciclo = 0; Ciclo &lt; 100; Ciclo++)
 {
  //acquisisco il valore e lo sommo alla
  //variabile
  val_Adc += analogRead(0);
  //questo ritardo serve per dare il tempo
  //all ADC di eseguire correttamente
  //la prossima acquisizione
  delay(10);
 }

 //eseguo la media dei 100 valori letti
 val_Adc /= 100;
 //calcolo la temperatura in °C
 temp = ((val_Adc * 0.0032) - 0.5) / 0.01;
 //invio i dati al computer
 Serial.println(temp);
}</pre>
<p>in questo modo otterremmo delle misure di temperatura che si avvicineranno molto al valore reale.</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-sensore-di-temperatura-tmp36/">Arduino e sensore di temperatura TMP36</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-sensore-di-temperatura-tmp36/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
	</channel>
</rss>
