Bemerkung

Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauchen Sie tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie nach dem Kauf auftretende Probleme und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugriff auf neue Produktankündigungen und exklusive Einblicke.

  • Sonderrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Verlosungen: Nehmen Sie an Verlosungen und Feiertagsaktionen teil.

👉 Bereit, mit uns zu forschen und zu kreieren? Klicken Sie auf [hier] und treten Sie noch heute bei!

2.2.2 Thermistor (MCP3008)

Bemerkung

../_images/mcp3008_and_adc0834.jpg

Abhängig von Ihrer Kit-Version identifizieren Sie bitte, ob Sie ADC0834 oder MCP3008 haben, und fahren Sie mit dem entsprechenden Abschnitt fort.

Einführung

Genau wie ein Fotowiderstand Licht wahrnehmen kann, ist ein Thermistor ein temperatur­empfindliches elektronisches Bauteil, das zur Realisierung von Temperaturregelungsfunktionen verwendet werden kann, wie z. B. für einen Hitzewarnmelder.

Benötigte Komponenten

In diesem Projekt benötigen wir die folgenden Komponenten:

../_images/list2_2.2.2_thermistor1.png

Es ist auf jeden Fall bequem, ein komplettes Kit zu kaufen, hier ist der Link:

Name

ELEMENTE IN DIESEM KIT

LINK

Raphael Kit

337

Raphael Kit

Sie können diese Komponenten auch einzeln über die folgenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUFLINK

GPIO Extension Board

KAUFEN

Steckbrett

KAUFEN

Jumper-Kabel

KAUFEN

Widerstand

KAUFEN

Thermistor

KAUFEN

MCP3008

-

Schaltplan

T-Board Name

Physikalisch

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 Verfahren

Schritt 1: Bauen Sie die Schaltung auf.

../_images/july24_2.2.2_thermistor_mcp30081.png

Schritt 2: Richten Sie die SPI-Schnittstelle ein und installieren Sie die spidev-Bibliothek (siehe SPI-Konfiguration für detaillierte Anweisungen). Wenn Sie diese Schritte bereits abgeschlossen haben, können Sie diesen Schritt überspringen.

Schritt 3: Wechseln Sie in den Ordner mit dem Code.

cd ~/raphael-kit/python-pi5

Schritt 4: Führen Sie die ausführbare Datei aus.

sudo python3 2.2.2-2_Thermistor_zero.py

Sobald der Code ausgeführt wird, erkennt der Thermistor die Umgebungstemperatur, die auf dem Bildschirm ausgegeben wird, sobald die Programmberechnung abgeschlossen ist.

Warnung

Wenn die Fehlermeldung RuntimeError: Cannot determine SOC peripheral base address angezeigt wird, lesen Sie bitte If gpiozero doesn’t work..

Code

Bemerkung

Sie können den untenstehenden Code Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen. Vorher müssen Sie jedoch zum Quellcodepfad wie raphael-kit/python-pi5 wechseln. Nach dem Ändern des Codes können Sie ihn direkt ausführen, um das Ergebnis zu sehen.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import spidev
import time
import math

# Initialisiere SPI für MCP3008 (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):
    """
    Lese analogen Wert vom MCP3008-Kanal (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 (3,3V Referenz)
        Vr = 3.3 * analogVal / 1023.0

        # Thermistorwiderstand berechnen
        Rt = 10000.0 * Vr / (3.3 - Vr)

        # Temperatur in Kelvin mit Steinhart–Hart-Approximation berechnen
        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))

        # Vor nächster Messung warten
        time.sleep(0.2)

except KeyboardInterrupt:
    spi.close()

Code-Erklärung

  1. Dieser Abschnitt 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 Logarithmusberechnungen, die für die Temperaturumrechnung erforderlich sind.

    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-Taktrate auf 1 MHz.

    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
  3. Definiert eine Funktion zum Lesen analoger Werte von einem bestimmten MCP3008-Kanal (0–7). Das SPI-Protokoll wird verwendet, um mit dem MCP3008 zu kommunizieren, und ein 10-Bit-Integer (0–1023) wird zurückgegeben.

    def read_adc(channel):
        adc = spi.xfer2([1, (8 + channel) << 4, 0])
        value = ((adc[1] & 0x03) << 8) | adc[2]
        return value
    
  4. Implementiert eine Schleife, die kontinuierlich analoge Werte von einem Thermistor liest, der an CH0 des MCP3008 angeschlossen ist. Sie wandelt den Rohwert in eine Spannung (basierend auf 3,3 V Referenz), dann in einen Widerstand und schließlich mit der Steinhart–Hart-Gleichung in eine Temperatur um. Die Temperatur wird sowohl in Celsius als auch in Fahrenheit ausgegeben. Zwischen den Messungen wird eine kurze Verzögerung eingefügt.

    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 (Ctrl+C) ab, um das Programm sauber zu beenden, und schließt die SPI-Schnittstelle.

    except KeyboardInterrupt:
        spi.close()