.. note:: 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 [|link_sf_facebook|] und tritt 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 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. .. image:: ../python_pi5/img/list2_2.2.2_thermistor.png Schaltplan ---------- .. list-table:: :widths: 30 30 30 30 :header-rows: 1 * - T-Board-Name - Physical - 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 Schritte -------------------------- **Schritt 1:** Baue die Schaltung auf. .. image:: ../python_pi5/img/july24_2.2.2_thermistor_mcp3008.png **Schritt 2:** Richte die SPI-Schnittstelle ein und installiere die ``spidev``-Bibliothek (siehe :ref:`spi_configuration` für detaillierte Anweisungen). Falls diese Schritte bereits erledigt sind, kannst du sie überspringen. **Schritt 3:** Wechsle in den Ordner mit dem Code. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Schritt 4:** Führe die ausführbare Datei aus. .. raw:: html .. code-block:: 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. .. warning:: Falls die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` erscheint, siehe :ref:`faq_soc`. **Code** .. note:: 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. .. raw:: html .. code-block:: python #!/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 ``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. .. code-block:: python #!/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. .. code-block:: python 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. .. code-block:: python 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. .. code-block:: python 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. .. code-block:: python except KeyboardInterrupt: spi.close()