Note
Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Plongez plus profondément dans Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.
Pourquoi nous rejoindre ?
Support d’experts : Résolvez les problèmes après-vente et les défis techniques avec l’aide de notre communauté et de notre équipe.
Apprendre & Partager : Échangez des conseils et tutoriels pour améliorer vos compétences.
Aperçus exclusifs : Obtenez un accès anticipé aux nouvelles annonces de produits et aux avant-premières.
Réductions spéciales : Profitez de réductions exclusives sur nos derniers produits.
Promotions festives et concours : Participez à des concours et promotions lors des fêtes.
👉 Prêt à explorer et créer avec nous ? Cliquez sur [Ici] et rejoignez-nous dès aujourd’hui !
2.2.2 Thermistance (MCP3008)
Note
Selon la version de votre kit, identifiez si vous disposez de ADC0834 ou MCP3008 et passez à la section correspondante.
Introduction
Tout comme une photorésistance peut détecter la lumière, une thermistance est un composant électronique sensible à la température qui peut être utilisée pour réaliser des fonctions de contrôle thermique, comme un avertisseur de chaleur.
Composants requis
Dans ce projet, nous avons besoin des composants suivants.
Principe
Une thermistance est une résistance sensible à la température qui présente une variation précise et prévisible de sa résistance en fonction de petites variations de température. L’ampleur de cette variation dépend de sa composition spécifique. Les thermistances font partie d’un groupe plus large de composants passifs. Contrairement aux composants actifs, les dispositifs passifs ne peuvent pas fournir de gain de puissance ni d’amplification à un circuit.
La thermistance est un élément sensible, et elle existe en deux types : à coefficient de température négatif (CTN ou NTC en anglais) et à coefficient de température positif (CTP ou PTC en anglais). Sa résistance varie considérablement avec la température. La résistance d’une CTP augmente avec la température, tandis que pour une CTN, c’est l’inverse. Dans cette expérience, nous utilisons une CTN.
Le principe est que la résistance d’une thermistance CTN change avec la température de l’environnement. Elle détecte la température en temps réel. Quand la température augmente, la résistance diminue. La tension est alors convertie en données numériques par l’adaptateur A/N (analogique/numérique). La température en degrés Celsius ou Fahrenheit est affichée via un programme.
Dans cette expérience, une thermistance et une résistance de tirage (pull-up) de 10 kΩ sont utilisées. Chaque thermistance possède une résistance nominale mesurée à 25 °C, ici de 10 kΩ.
Voici la relation entre la résistance et la température :
RT = RN expB(1/TK – 1/TN)
RT est la résistance de la thermistance CTN à la température TK.
RN est la résistance de la thermistance CTN à la température nominale TN. Ici, RN vaut 10 kΩ.
TK est la température en Kelvin, en K. TK = 273,15 + température en °C.
TN est la température nominale en Kelvin, ici 273,15 + 25.
B (beta) est la constante de matériau de la thermistance CTN, aussi appelée indice de sensibilité thermique, ici de valeur 3950.
exp est l’abréviation d’exponentielle, et la base e est un nombre naturel valant environ 2,7.
En transformant cette formule, on obtient : TK = 1 / (ln(RT / RN) / B + 1 / TN) Ce qui permet de calculer la température en Kelvin, et donc en Celsius en soustrayant 273,15.
Cette relation est empirique et précise uniquement lorsque la température et la résistance se trouvent dans la plage de mesure efficace.
Schéma de câblage
Nom sur la carte T |
Physique |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
Procédures expérimentales
Étape 1 : Construire le circuit.
Pour les utilisateurs du langage C
Étape 2 : Accédez au répertoire contenant le code.
cd ~/davinci-kit-for-raspberry-pi/c/2.2.2-2/
Étape 3 : Compilez le code.
gcc 2.2.2_Thermistor.c -o Thermistor -lwiringPi -lm
Note
-lm sert à charger la bibliothèque mathématique. Ne l’omettez pas, sinon vous obtiendrez une erreur.
Étape 4 : Exécutez le fichier compilé.
./Thermistor
Une fois le code lancé, la thermistance détectera la température ambiante qui sera affichée à l’écran après calcul du programme.
Note
Si cela ne fonctionne pas après exécution, ou si un message d’erreur apparaît : « wiringPi.h: No such file or directory », veuillez vous référer à Installer et vérifier WiringPi.
Code
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <math.h>
#define SPI_CHANNEL 0 // CE0
#define SPI_SPEED 1000000 // 1MHz
int read_ADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Bit de démarrage
buffer[1] = (8 + channel) << 4; // Mode à entrée unique + canal
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int value = ((buffer[1] & 3) << 8) | buffer[2];
return value;
}
int main(void) {
int analogVal;
double Vr, Rt, temp, cel, Fah;
if (wiringPiSetup() == -1) {
printf("Échec de l’initialisation de wiringPi !\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("Échec de l’initialisation SPI !\n");
return 1;
}
while (1) {
analogVal = read_ADC(0); // Lecture sur CH0
// MCP3008 est un CAN 10 bits (0–1023)
Vr = 3.3 * analogVal / 1023.0; // Vref supposé = 3,3V
Rt = 10000.0 * Vr / (3.3 - Vr); // Diviseur de tension, résistance 10 kΩ
temp = 1 / ((log(Rt / 10000.0) / 3950.0) + (1 / (273.15 + 25.0)));
cel = temp - 273.15;
Fah = cel * 1.8 + 32;
printf("Celsius : %.2f C Fahrenheit : %.2f F\n", cel, Fah);
delay(1000);
}
return 0;
}
Explication du code
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <math.h>
Ces en-têtes incluent les bibliothèques pour le contrôle GPIO (wiringPi.h), la communication SPI (wiringPiSPI.h), les opérations d’E/S standards (stdio.h) et les fonctions mathématiques (math.h) en C.
#define SPI_CHANNEL 0
#define SPI_SPEED 1000000
Définit les constantes pour le canal SPI et la vitesse de communication SPI. Ici, le canal SPI 0 (CE0) et une fréquence d’horloge de 1 MHz sont utilisés.
int read_ADC(int channel)
Cette fonction lit les données analogiques d’un canal spécifique du MCP3008.
buffer[0] = 1;
buffer[1] = (8 + channel) << 4;
buffer[2] = 0;
Ces lignes préparent la commande SPI selon le protocole MCP3008 : un bit de démarrage, la configuration pour le mode à entrée unique, et le numéro du canal.
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
Envoie la commande SPI et reçoit les données 10 bits du MCP3008.
int value = ((buffer[1] & 3) << 8) | buffer[2];
Extrait et combine la valeur sur 10 bits renvoyée par le MCP3008.
if (wiringPiSetup() == -1) { ... }
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { ... }
Ces lignes initialisent WiringPi et configurent le SPI. Si l’initialisation échoue, le programme s’arrête.
analogVal = read_ADC(0);
Lit le signal analogique sur le canal 0 du MCP3008, où est connectée la thermistance.
Vr = 3.3 * analogVal / 1023.0;
Convertit la valeur numérique du CAN en tension analogique. La plage du CAN est de 0–1023 avec une référence de 3,3V.
Rt = 10000.0 * Vr / (3.3 - Vr);
Calcule la résistance de la thermistance en utilisant la formule du diviseur de tension (avec une résistance série de 10 kΩ).
temp = 1 / ((log(Rt / 10000.0) / 3950.0) + (1 / (273.15 + 25.0)));
Utilise l’équation B pour convertir la résistance en température Kelvin. Formule : T(K) = 1 / [ln(Rt/R₀)/B + 1/T₀] - R₀ = 10 kΩ - B = 3950 - T₀ = 25°C = 298,15K
cel = temp - 273.15;
Convertit la température de Kelvin en degrés Celsius.
Fah = cel * 1.8 + 32;
Convertit la température Celsius en Fahrenheit.
printf("Celsius : %.2f C Fahrenheit : %.2f F\n", cel, Fah);
Affiche la température en Celsius et en Fahrenheit avec deux décimales de précision.
Pour les utilisateurs du langage Python
Étape 2 : Configurez l’interface SPI et installez la bibliothèque spidev (voir Configuration SPI pour des instructions détaillées). Si vous avez déjà effectué ces étapes, passez à la suivante.
Étape 3 : Accédez au répertoire contenant le code.
cd ~/davinci-kit-for-raspberry-pi/python
Étape 4 : Exécutez le fichier Python.
sudo python3 2.2.2-2_thermistor.py
Une fois le code lancé, la thermistance détecte la température ambiante qui sera affichée à l’écran après calcul du programme.
Avertissement
Si un message d’erreur apparaît : RuntimeError: Cannot determine SOC peripheral base address, veuillez vous référer à Si gpiozero ne fonctionne pas..
Code
Note
Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci-dessous. Mais avant cela, vous devez vous placer dans le répertoire source comme davinci-kit-for-raspberry-pi/python. Après modification, vous pouvez exécuter le code directement pour voir le résultat.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import spidev
import time
import math
import RPi.GPIO as GPIO
# Définir le mode GPIO
GPIO.setmode(GPIO.BCM)
# Initialiser SPI pour MCP3008 (Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, Périphérique 0 (CE0)
spi.max_speed_hz = 1000000 # 1 MHz
def read_adc(channel):
"""
Lire la valeur analogique d’un canal du MCP3008 (0–7)
"""
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
try:
while True:
# Lire la valeur analogique sur CH0 du MCP3008
analogVal = read_adc(0)
# Convertir en tension (Vref supposée = 3,3V)
Vr = 3.3 * analogVal / 1023.0
# Calculer la résistance de la thermistance (R2 = 10 kΩ dans le diviseur)
Rt = 10000.0 * Vr / (3.3 - Vr)
# Calcul de Steinhart–Hart
tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0)))
# Conversion en Celsius et Fahrenheit
Cel = tempK - 273.15
Fah = Cel * 1.8 + 32
# Afficher le résultat
print('Celsius : %.2f °C Fahrenheit : %.2f °F' % (Cel, Fah))
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
spi.close()
GPIO.cleanup()
Explication du code
Cette section importe les bibliothèques nécessaires :
spidevpour la communication SPI avec le MCP3008timepour gérer les délaismathpour les calculs logarithmiques dans la formule de Steinhart–HartRPi.GPIOpour initialiser et nettoyer les GPIO (ajouté pour une complétude structurelle)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import spidev import time import math import RPi.GPIO as GPIO
Initialise le mode GPIO en BCM et configure l’interface SPI sur le bus 0 et le périphérique 0 (CE0), avec une vitesse de 1 MHz.
# Définir le mode GPIO GPIO.setmode(GPIO.BCM) # Initialiser SPI pour MCP3008 (Bus 0, CE0) spi = spidev.SpiDev() spi.open(0, 0) # Bus 0, Périphérique 0 (CE0) spi.max_speed_hz = 1000000 # 1 MHz
Définit une fonction
read_adc(channel)pour lire la valeur analogique d’un canal donné (0–7) du MCP3008. Envoie une commande SPI de 3 octets et reçoit un résultat analogique 10 bits (0–1023).def read_adc(channel): """ Lire la valeur analogique d’un canal du MCP3008 (0–7) """ if channel < 0 or channel > 7: return -1 adc = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((adc[1] & 0x03) << 8) | adc[2] return value
Boucle principale : lit la tension depuis une thermistance connectée au canal 0, calcule sa résistance, puis applique l’équation de Steinhart–Hart pour obtenir la température en °C et °F. Les valeurs sont affichées toutes les 0,2 secondes.
try: while True: # Lire la valeur analogique sur CH0 du MCP3008 analogVal = read_adc(0) # Convertir en tension (Vref supposée = 3,3V) Vr = 3.3 * analogVal / 1023.0 # Calculer la résistance de la thermistance (R2 = 10 kΩ dans le diviseur) Rt = 10000.0 * Vr / (3.3 - Vr) # Calcul de Steinhart–Hart tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0))) # Conversion en Celsius et Fahrenheit Cel = tempK - 273.15 Fah = Cel * 1.8 + 32 # Afficher le résultat print('Celsius : %.2f °C Fahrenheit : %.2f °F' % (Cel, Fah)) time.sleep(0.2)
Le bloc
finallygarantit un arrêt propre : fermeture de l’interface SPI et nettoyage des GPIO pour libérer toutes les ressources matérielles.except KeyboardInterrupt: pass finally: spi.close() GPIO.cleanup()