Table des matières

Mesure de la température via une sonde TMP36 connectée au MCP3008

Nous allons utiliser une sonde analogique de température TMP36 pour mesurer la température du milieu ambiant autour du capteur. Ceux ci sont capables de donner la température avec une précision de plus ou moins 1°C à 25°C, et plus ou moins 2°C entre -40°C et 125°C.

Ce capteur peut être alimenté entre 2.7 et 5.5V, et consomme moins de 50µA en fonctionnement, et 0.5µA en veille1).

Nous utiliserons la version au format TO-92, avec 3 broches.

Prérequis

Nous aurons besoin d'un Raspberry Pi (A, A+, B, B+) configuré, ainsi que d'une breadboard, de câbles, d'une puce MCP3008 et d'un TMP36. Il faudra avoir déjà interfacé le Raspberry Pi et le MCP3008 comme nous l'avons vu dans le tutoriel sur l'utilisation d'un MCP3008 pour ajouter des entrées analogiques.

Montage

 photo du TMP36 Si vous tenez la sonde comme sur la photo (pattes vers le bas, coté plat face à vous), la patte de gauche devra être connectée au 3.3V du Raspberry, la patte de droite à la masse, et la patte centrale sur l'une des entrées analogique du MCP3008.

Code Python

Le code en python s'appuie sur le code utilisé pour lire les entrées analogiques du MCP3008 :

readTempTMP36.py
#!/usr/bin/env python
import time
import os
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#fonction lisant les donnees SPI de la puce MCP3008, parmi 8 entrees, de 0 a 7
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
	    if ((adcnum > 7) or (adcnum < 0)):
			    return -1
	    GPIO.output(cspin, True)
	    GPIO.output(clockpin, False)  # start clock low
	    GPIO.output(cspin, False)	 # bring CS low
 
	    commandout = adcnum
	    commandout |= 0x18  # start bit + single-ended bit
	    commandout <<= 3    # we only need to send 5 bits here
	    for i in range(5):
			    if (commandout & 0x80):
					    GPIO.output(mosipin, True)
			    else:  
					    GPIO.output(mosipin, False)
			    commandout <<= 1
			    GPIO.output(clockpin, True)
			    GPIO.output(clockpin, False)
 
	    adcout = 0
	    # read in one empty bit, one null bit and 10 ADC bits
	    for i in range(12):
			    GPIO.output(clockpin, True)
			    GPIO.output(clockpin, False)
			    adcout <<= 1
			    if (GPIO.input(misopin)):
					    adcout |= 0x1
 
	    GPIO.output(cspin, True)
 
	    adcout /= 2	   # first bit is 'null' so drop it
	    return adcout
 
# ces numeros de pins GPIO doivent etre modifies pour correspondre aux broches utilisees.
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25
 
# definition de l'interface SPI
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)
 
#definition du ADC utilise (broche du MCP3008)
adcnum = 0
while True:
# Lecture de la valeur brute du capteur
read_adc0 = readadc(adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS)
# conversion de la valeur brute lue en milivolts = ADC * ( 3300 / 1024 )
millivolts = read_adc0 * ( 3300.0 / 1024.0)
bias=0;
 
# 10 mv per degree
temp_C = ((millivolts - 100.0) / 10.0) - 40.0+ bias
# convert celsius to fahrenheit
temp_F = ( temp_C * 9.0 / 5.0 ) + 32
 
print "valeurs lues : "
print "\tvaleur brute : %s" % read_adc0
print "\ttension : %s millivolts" % millivolts
print "\ttemperature : %s C" % temp_C
print "\ttemperature : %s F" % temp_F
time.sleep(1)

Conclusion

Ce capteur simple, économique, et facile à utiliser consomme extrêmement peu de courant, et permet facilement d'obtenir une mesure approximative de la température. Il n'est pas d'une très grande précision, et est sensible à la qualité de l'alimentation électrique. Il est toutefois parfaitement adapté pour de nombreux montages ou l'on souhaite mesurer une température à plus ou moins 2°C.

Pour des mesures plus précises, on se tournera vers un capteur plus complexe, un peu plus cher, mais bien plus stable et avec une meilleure résolution : la sonde de température numérique DS18B20

Retour à la liste des tutoriels

Retour à la l'accueil de la section

1)
Spécifications officielles constructeur (datasheet) - PDF, englais : http://www.analog.com/static/imported-files/data_sheets/TMP35_36_37.pdf