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

../_images/mcp3008_and_adc0834.jpg

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.

../_images/list2_2.2.2_thermistor1.png

Schaltplan

T-Board-Name

Physical

WiringPi

BCM

SPICE0

pin24

10

8

SPIMOSI

pin19

12

10

SPIMISO

pin21

13

9

SPISCLK

pin23

14

11

../_images/schematic_2.2.2_thermistor_mcp30081.png

Experimentelle Schritte

Schritt 1: Baue die Schaltung auf.

../_images/july24_2.2.2_thermistor_mcp30081.png

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

  1. Importiert das Modul spidev für die Kommunikation mit dem MCP3008-ADC über SPI, das Modul time für Verzögerungen und das Modul math für die logarithmischen Berechnungen bei der Temperaturumrechnung.

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import spidev
    import time
    import math
    
  2. 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
    
  3. 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
    
  4. 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)
    
  5. Fängt einen KeyboardInterrupt (Strg + C) ab, um das Programm sauber zu beenden, und schließt dabei die SPI-Schnittstelle.

    except KeyboardInterrupt:
        spi.close()