.. note::

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

    **Warum beitreten?**

    - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
    - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
    - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
    - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
    - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

    👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!

.. _2.2.2_py_pi5:

2.2.2 Thermistor
=========================

Einleitung
-----------------

Ein Thermistor ist ein temperaturabhängiges elektronisches Bauelement, ähnlich wie ein Fotowiderstand Licht erfassen kann. Er kann für Temperatursteuerungsfunktionen verwendet werden, wie zum Beispiel einen Wärmemelder zu realisieren.

Benötigte Komponenten
----------------------------

Für dieses Projekt benötigen wir die folgenden Komponenten.

.. image:: ../python_pi5/img/2.2.2_thermistor_list.png

Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Name	
        - TEILE IN DIESEM KIT
        - LINK
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

Sie können sie auch separat über die unten stehenden Links kaufen.

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - KOMPONENTENVORSTELLUNG
        - KAUF-LINK

    *   - :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_adc0834`
        - \-

Schaltplan
------------------

.. image:: ../python_pi5/img/2.2.2_thermistor_schematic_1.png


.. image:: ../python_pi5/img/2.2.2_thermistor_schematic_2.png

Experimentelle Verfahren
---------------------------------

**Schritt 1:** Bauen Sie den Schaltkreis auf.

.. image:: ../python_pi5/img/2.2.2_thermistor_circuit.png

**Schritt 2:** Wechseln Sie zum Ordner des Codes.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python-pi5

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

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 2.2.2_Thermistor_zero.py

Wenn der Code läuft, erkennt der Thermistor die Umgebungstemperatur, die auf dem Bildschirm angezeigt wird, sobald das Programm die Berechnung abgeschlossen hat.

.. 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 unten stehenden Code **modifizieren/zurücksetzen/kopieren/ausführen/stoppen**. Aber zuvor müssen Sie zum Quellcodepfad wie ``raphael-kit/python-pi5`` gehen. Nachdem Sie den Code modifiziert haben, können Sie ihn direkt ausführen, um den Effekt zu sehen.


.. raw:: html

    <run></run>

.. code-block:: python

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

   import ADC0834
   import time
   import math

   # Initialize the ADC0834 module
   ADC0834.setup()

   # Run the process in a try-except block
   try:
       while True:
           # Read the analog value from the sensor
           analogVal = ADC0834.getResult()

           # Convert the analog value to a voltage
           Vr = 5 * float(analogVal) / 255

           # Calculate the resistance of the thermistor
           Rt = 10000 * Vr / (5 - Vr)

           # Calculate the temperature in Kelvin
           temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25)))

           # Convert Kelvin to Celsius
           Cel = temp - 273.15

           # Convert Celsius to Fahrenheit
           Fah = Cel * 1.8 + 32

           # Print the temperature in both Celsius and Fahrenheit
           print('Celsius: %.2f C  Fahrenheit: %.2f F' % (Cel, Fah))

           # Wait for 0.2 seconds before the next read
           time.sleep(0.2)

   # Handle KeyboardInterrupt for graceful termination
   except KeyboardInterrupt:
       # Clean up ADC0834 resources
       ADC0834.destroy()


**Code-Erklärung**

#. Dieser Abschnitt importiert die ADC0834-Bibliothek für die Analog-Digital-Umwandlung, die time-Bibliothek zur Implementierung von Verzögerungen und die math-Bibliothek zur Durchführung mathematischer Operationen.

   .. code-block:: python

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

       import ADC0834
       import time
       import math

#. Initialisiert das ADC0834-Modul, um das Lesen von analogen Werten zu ermöglichen.

   .. code-block:: python

       # Initialize the ADC0834 module
       ADC0834.setup()

#. Implementiert eine Endlosschleife für kontinuierliches Datenlesen. Die Schleife liest den analogen Wert von einem Thermistor, wandelt diesen Wert in eine Spannung um, berechnet den Widerstand des Thermistors und übersetzt diesen Widerstand dann in Temperaturmessungen in Kelvin, Celsius und Fahrenheit. Zudem werden die Temperaturmessungen in Celsius und Fahrenheit ausgegeben, mit einer Pause von 0,2 Sekunden zwischen jeder Messung.

   .. code-block:: python

       # Run the process in a try-except block
       try:
           while True:
               # Read the analog value from the sensor
               analogVal = ADC0834.getResult()

               # Convert the analog value to a voltage
               Vr = 5 * float(analogVal) / 255

               # Calculate the resistance of the thermistor
               Rt = 10000 * Vr / (5 - Vr)

               # Calculate the temperature in Kelvin
               temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25)))

               # Convert Kelvin to Celsius
               Cel = temp - 273.15

               # Convert Celsius to Fahrenheit
               Fah = Cel * 1.8 + 32

               # Print the temperature in both Celsius and Fahrenheit
               print('Celsius: %.2f C  Fahrenheit: %.2f F' % (Cel, Fah))

               # Wait for 0.2 seconds before the next read
               time.sleep(0.2)

#. Fängt eine KeyboardInterrupt-Ausnahme ab, um das Programm sanft zu beenden und beinhaltet Aufräum-Anweisungen für die ADC0834-Ressourcen bei Beendigung.

   .. code-block:: python

       # Handle KeyboardInterrupt for graceful termination
       except KeyboardInterrupt:
           # Clean up ADC0834 resources
           ADC0834.destroy()

