.. note::
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 [|link_sf_facebook|] und treten Sie noch heute bei!
.. _2.2.2_py_pi5_mcp3008:
2.2.2 Thermistor (MCP3008)
============================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
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 temperaturempfindliches 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:
.. image:: ../python_pi5/img/list2_2.2.2_thermistor.png
Es ist auf jeden Fall bequem, ein komplettes Kit zu kaufen, hier ist der Link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Name
- ELEMENTE IN DIESEM KIT
- LINK
* - Raphael Kit
- 337
- |link_Raphael_kit|
Sie können diese Komponenten auch einzeln über die folgenden Links kaufen.
.. list-table::
:widths: 30 20
:header-rows: 1
* - KOMPONENTENBESCHREIBUNG
- KAUFLINK
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_thermistor`
- |link_thermistor_buy|
* - :ref:`cpn_mcp3008`
- \-
Schaltplan
-----------------
.. list-table::
:widths: 30 30 30 30
:header-rows: 1
* - T-Board Name
- Physikalisch
- WiringPi
- BCM
* - SPICE0
- Pin24
- 10
- 8
* - SPIMOSI
- Pin19
- 12
- 10
* - SPIMISO
- Pin21
- 13
- 9
* - SPISCLK
- Pin23
- 14
- 11
.. image:: ../python_pi5/img/schematic_2.2.2_thermistor_mcp3008.png
Experimentelle Verfahren
--------------------------
**Schritt 1:** Bauen Sie die Schaltung auf.
.. image:: ../python_pi5/img/july24_2.2.2_thermistor_mcp3008.png
**Schritt 2:** Richten Sie die SPI-Schnittstelle ein und installieren Sie die ``spidev``-Bibliothek (siehe :ref:`spi_configuration` 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.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Schritt 4:** Führen Sie die ausführbare Datei aus.
.. raw:: html
.. code-block::
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.
.. warning::
Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :ref:`faq_soc`.
**Code**
.. note::
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.
.. raw:: html
.. code-block:: python
#!/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**
#. 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.
.. code-block:: python
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-Taktrate auf 1 MHz.
.. code-block:: python
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000
#. 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.
.. code-block:: python
def read_adc(channel):
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
#. 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.
.. code-block:: python
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 (Ctrl+C) ab, um das Programm sauber zu beenden, und schließt die SPI-Schnittstelle.
.. code-block:: python
except KeyboardInterrupt:
spi.close()