Bemerkung
Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
Warum beitreten?
Expertenunterstützung: Löse Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.
Lernen & Teilen: Tausche Tipps und Tutorials aus, um deine Fähigkeiten zu verbessern.
Exklusive Vorschauen: Erhalte frühzeitigen Zugang zu neuen Produktankündigungen und Vorschauen.
Sonderrabatte: Genieße exklusive Rabatte auf unsere neuesten Produkte.
Festliche Aktionen und Verlosungen: Nimm an Verlosungen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu entdecken und zu erschaffen? Klicke auf [hier] und tritt noch heute bei!
2.2.2 Thermistor (MCP3008)
Bemerkung
Je nach Kit-Version bitte prüfen, ob ADC0834 oder MCP3008 enthalten ist, und mit dem entsprechenden Abschnitt fortfahren.
Einführung
Ähnlich wie ein Fotowiderstand Licht messen kann, ist ein Thermistor ein temperaturabhängiges elektronisches Bauteil, das zur Realisierung von Temperaturregelungsfunktionen wie z. B. einem Hitzewarnsystem eingesetzt werden kann.
Benötigte Komponenten
In diesem Projekt benötigen wir die folgenden Komponenten.
Schaltplan
T-Board-Name |
Physical |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
Experimentelle Schritte
Schritt 1: Baue die Schaltung auf.
Schritt 2: Richte die SPI-Schnittstelle ein und installiere die spidev-Bibliothek (siehe SPI-Konfiguration für detaillierte Anweisungen). Falls diese Schritte bereits erledigt sind, kannst du sie überspringen.
Schritt 3: Wechsle in den Ordner mit dem Code.
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Schritt 4: Führe die ausführbare Datei aus.
sudo python3 2.2.2-2_Thermistor_zero.py
Nach dem Start des Codes misst der Thermistor die Umgebungstemperatur, die nach der Berechnung auf dem Bildschirm angezeigt wird.
Warnung
Falls die Fehlermeldung RuntimeError: Cannot determine SOC peripheral base address erscheint, siehe Wenn gpiozero nicht funktioniert..
Code
Bemerkung
Du kannst den folgenden Code Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen.
Vorher musst du jedoch in das Quellcode-Verzeichnis (z. B. davinci-kit-for-raspberry-pi/python-pi5) wechseln.
Nach einer Änderung kannst du den Code direkt ausführen, um das Ergebnis zu sehen.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import spidev
import time
import math
# SPI für MCP3008 initialisieren (Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, Gerät 0 (CE0)
spi.max_speed_hz = 1000000 # 1 MHz
def read_adc(channel):
"""
Analogen Wert vom MCP3008-Kanal lesen (0–7)
"""
if channel < 0 or channel > 7:
return -1
# MCP3008-Kommunikationsformat
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
try:
while True:
# Analogen Wert von CH0 des MCP3008 lesen
analogVal = read_adc(0)
# In Spannung umrechnen (Referenz 3,3 V)
Vr = 3.3 * analogVal / 1023.0
# Thermistor-Widerstand berechnen
Rt = 10000.0 * Vr / (3.3 - Vr)
# Temperatur in Kelvin berechnen (Steinhart–Hart-Näherung)
tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0)))
# In Celsius und Fahrenheit umrechnen
Cel = tempK - 273.15
Fah = Cel * 1.8 + 32
# Temperatur ausgeben
print('Celsius: %.2f °C Fahrenheit: %.2f °F' % (Cel, Fah))
# Kurze Pause vor der nächsten Messung
time.sleep(0.2)
except KeyboardInterrupt:
spi.close()
Code-Erklärung
Importiert das Modul
spidevfür die Kommunikation mit dem MCP3008-ADC über SPI, das Modultimefür Verzögerungen und das Modulmathfür die logarithmischen Berechnungen bei der Temperaturumrechnung.#!/usr/bin/env python3 # -*- coding: utf-8 -*- import spidev import time import math
Initialisiert die SPI-Schnittstelle für den MCP3008 auf Bus 0 und Gerät 0 (CE0) und setzt die maximale SPI-Taktfrequenz auf 1 MHz.
spi = spidev.SpiDev() spi.open(0, 0) # Bus 0, Gerät 0 (CE0) spi.max_speed_hz = 1000000 # 1 MHz
Definiert eine Funktion zum Auslesen analoger Werte von einem angegebenen MCP3008-Kanal (0–7). Die Kommunikation erfolgt über das SPI-Protokoll, und es wird ein 10-Bit-Integer-Wert (0–1023) zurückgegeben.
def read_adc(channel): 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
Implementiert eine Schleife, die kontinuierlich den analogen Wert eines Thermistors an CH0 des MCP3008 ausliest. Der Rohwert wird in eine Spannung (3,3 V Referenz), dann in einen Widerstand und schließlich in eine Temperatur umgerechnet. Die Temperatur wird sowohl in Grad Celsius als auch in Fahrenheit ausgegeben. Zwischen den Messungen gibt es eine kurze Verzögerung.
try: while True: analogVal = read_adc(0) Vr = 3.3 * analogVal / 1023.0 Rt = 10000.0 * Vr / (3.3 - Vr) tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0))) Cel = tempK - 273.15 Fah = Cel * 1.8 + 32 print('Celsius: %.2f °C Fahrenheit: %.2f °F' % (Cel, Fah)) time.sleep(0.2)
Fängt einen
KeyboardInterrupt(Strg + C) ab, um das Programm sauber zu beenden, und schließt dabei die SPI-Schnittstelle.except KeyboardInterrupt: spi.close()