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.
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.
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.
Le code en python s'appuie sur le code utilisé pour lire les entrées analogiques du MCP3008 :
#!/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)
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