.. 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.3_py: 2.2.3 DHT-11 ================== Einführung -------------- In dieser Lektion lernen Sie, wie Sie einen DHT11 Temperatur- und Feuchtigkeitssensor mit einem Raspberry Pi verbinden und Daten davon ablesen. Sie werden erfahren, wie Sie den Sensor einrichten, die Temperatur sowohl in Celsius als auch in Fahrenheit ablesen und Feuchtigkeitsmessungen durchführen können. Dieses Projekt führt Sie in die Arbeit mit externen Sensoren, die Handhabung von Echtzeitdaten und die Grundlagen der Ausnahmebehandlung in Python ein. Erforderliche Komponenten ------------------------------ Für dieses Projekt benötigen wir die folgenden Komponenten. .. image:: ../img/list_2.2.3_dht-11.png Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Name - ARTIKEL IN DIESEM KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| Sie können sie auch einzeln über die untenstehenden Links kaufen. .. list-table:: :widths: 30 20 :header-rows: 1 * - KOMPONENTENÜBERSICHT - 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_humiture_sensor` - |link_humiture_buy| Schaltplan ----------------- .. image:: ../img/image326.png Experimentelle Verfahren -------------------------------------------- **Schritt 1:** Bauen Sie den Schaltkreis. .. image:: ../img/image207.png **Schritt 2:** Gehen Sie zum Ordner des Codes. .. raw:: html .. code-block:: cd ~/raphael-kit/python **Schritt 3:** Führen Sie die ausführbare Datei aus. .. raw:: html .. code-block:: sudo python3 2.2.3_DHT.py Nachdem der Code ausgeführt wurde, wird das Programm die von DHT11 erkannte Temperatur und Feuchtigkeit auf dem Computerbildschirm anzeigen. **Code** .. note:: Sie können den untenstehenden Code **modifizieren/zurücksetzen/kopieren/ausführen/stoppen**. Aber bevor Sie das tun, müssen Sie zum Quellcodepfad wie ``raphael-kit/python`` gehen. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um den Effekt zu sehen. .. raw:: html .. code-block:: python from gpiozero import OutputDevice, InputDevice import time class DHT11(): MAX_DELAY_COUINT = 100 BIT_1_DELAY_COUNT = 10 BITS_LEN = 40 def __init__(self, pin, pull_up=False): self._pin = pin self._pull_up = pull_up def read_data(self): bit_count = 0 delay_count = 0 bits = "" # -------------- send start -------------- gpio = OutputDevice(self._pin) gpio.off() time.sleep(0.02) gpio.close() gpio = InputDevice(self._pin, pull_up=self._pull_up) # -------------- wait response -------------- while gpio.value == 1: pass # -------------- read data -------------- while bit_count < self.BITS_LEN: while gpio.value == 0: pass # st = time.time() while gpio.value == 1: delay_count += 1 # break if delay_count > self.MAX_DELAY_COUINT: break if delay_count > self.BIT_1_DELAY_COUNT: bits += "1" else: bits += "0" delay_count = 0 bit_count += 1 # -------------- verify -------------- humidity_integer = int(bits[0:8], 2) humidity_decimal = int(bits[8:16], 2) temperature_integer = int(bits[16:24], 2) temperature_decimal = int(bits[24:32], 2) check_sum = int(bits[32:40], 2) _sum = humidity_integer + humidity_decimal + temperature_integer + temperature_decimal # print(bits) # print(humidity_integer, humidity_decimal, temperature_integer, temperature_decimal) # print(f'sum:{_sum}, check_sum:{check_sum}') # print() if check_sum != _sum: humidity = 0.0 temperature = 0.0 else: humidity = float(f'{humidity_integer}.{humidity_decimal}') temperature = float(f'{temperature_integer}.{temperature_decimal}') # -------------- return -------------- return humidity, temperature if __name__ == '__main__': dht11 = DHT11(17) while True: humidity, temperature = dht11.read_data() print(f"{time.time():.3f} temperature:{temperature}°C humidity: {humidity}%") time.sleep(2) **Code Erklärung** .. code-block:: python def read_data(self): bit_count = 0 delay_count = 0 bits = "" # -------------- send start -------------- gpio = OutputDevice(self._pin) gpio.off() time.sleep(0.02) gpio.close() gpio = InputDevice(self._pin, pull_up=self._pull_up) #... Diese Funktion wird verwendet, um die Funktionen von DHT11 zu implementieren. Es speichert die erkannten Daten im Array ``bits[]`` . DHT11 überträgt Daten von jeweils 40 Bit. Die ersten 16 Bits beziehen sich auf die Luftfeuchtigkeit, die mittleren 16 Bits auf die Temperatur und die letzten acht Bits werden zur Überprüfung verwendet. Das Datenformat ist: ``8bit Feuchtigkeits-Integer-Daten`` + ``8bit Feuchtigkeits-Dezimaldaten `` + ``8bit Temperatur-Integer-Daten`` + ``8bit Temperatur-Dezimaldaten`` + ``8bit Prüfbit`` . Wenn die Gültigkeit über das Prüfbit erkannt wird, gibt die Funktion zwei Ergebnisse zurück: 1. Fehler; 2. Luftfeuchtigkeit und Temperatur. .. code-block:: python _sum = humidity_integer + humidity_decimal + temperature_integer + temperature_decimal if check_sum != _sum: humidity = 0.0 temperature = 0.0 else: humidity = float(f'{humidity_integer}.{humidity_decimal}') temperature = float(f'{temperature_integer}.{temperature_decimal}') Wenn die empfangenen Daten beispielsweise ``00101011``(8-Bit-Wert der Feuchtigkeits-Ganzzahl) ``00000000`` (8-Bit-Wert der Feuchtigkeits-Dezimalzahl) ``00111100`` (8-Bit-Wert der Temperatur-Ganzzahl) ``00000000`` (8-Bit-Wert der Temperatur-Dezimalzahl) ``01100111`` (Bit prüfen) **Berechnung:** 00101011+00000000+00111100+00000000=01100111. Wenn das Endergebnis den Prüfbitdaten entspricht, ist die Datenübertragung abnormal: return False. Wenn das Endergebnis den Prüfbitdaten entspricht, sind die empfangenen Daten korrekt, dann werden ``humidity`` und ``temperature`` zurückgegeben und **Humidity = 43% , Temperature = 60 °C** ausgegeben. Phänomen-Bild -------------------- .. image:: ../img/image209.jpeg