Zum Inhalt springen

Temperaturmessung mit dem SH3x

    Der SHT31 ist ein hochpräziser Sensor, der von der Firma Sensirion entwickelt wurde und zur Messung von Temperatur und Luftfeuchtigkeit dient. Dieser Sensor zeichnet sich durch seine hohe Genauigkeit, Zuverlässigkeit und Langlebigkeit aus, was ihn zu einer ausgezeichneten Wahl für verschiedene Anwendungen in Industrie, Wissenschaft und Alltag macht.

    Wichtige Merkmale des SHT31:

    Messbereich: Temperatur: -40 °C bis +125 °C; Luftfeuchtigkeit: 0 % bis 100 % RH

    Genauigkeit: Temperatur: ±0,3 °C (bei 25 °C); Luftfeuchtigkeit: ±2 % relative Feuchte (RH)

    Schnittstelle: Der SHT31 verwendet eine I2C-Schnittstelle, die eine einfache Integration in Mikrocontroller und andere elektronische Systeme ermöglicht.

    Stromverbrauch: durchschnittlich 1,7 µA


    Kurze Einführung zum I2C-Bus

    Der I2C-Bus (Inter-Integrated Circuit) ist ein serieller Kommunikationsbus, der von Philips (heute NXP) entwickelt wurde. Er ermöglicht die Kommunikation zwischen verschiedenen integrierten Schaltungen (ICs) und Mikrocontrollern auf einfache und effiziente Weise. Der I2C-Bus verwendet lediglich zwei Leitungen: eine Datenleitung (SDA) und eine Taktleitung (SCL).

    Eigenschaften des I2C-Bus

    1. Zwei-Draht-Schnittstelle: Der I2C-Bus benötigt nur zwei Leitungen, um Daten zwischen Geräten zu übertragen, was die Verkabelung vereinfacht.
    2. Multi-Master- und Multi-Slave-Unterstützung: Mehrere Master und mehrere Slave-Geräte können an denselben Bus angeschlossen werden. Dies ermöglicht flexible und komplexe Kommunikationsnetzwerke.
    3. Adressierung: Jedes Gerät am I2C-Bus hat eine eindeutige Adresse, wodurch der Master gezielt mit einem bestimmten Slave kommunizieren kann.
    4. Taktgesteuert: Die Kommunikation erfolgt synchron, wobei der Master die Taktleitung steuert und somit den Datenfluss regelt.
    5. Einfache Implementierung: Der I2C-Bus ist weit verbreitet und gut dokumentiert, was die Integration in verschiedene Projekte und Anwendungen erleichtert.

    Durch seine Vielseitigkeit und Einfachheit ist der I2C-Bus in vielen elektronischen Geräten und Anwendungen, wie Sensoren, Speichermodulen und Mikrocontrollern, weit verbreitet.


    Aufbau einer Messschaltung mit dem ESP32

    Benötigte Teile:

    ESP32 (ich habe hier einen ESP32 Wroom 32 verwendet)

    SHT31 oder 33

    Breadboard

    Verbindungsdrähte (Jumper)

    Fitzing Schaltung ESP32 mit SHT31 verbinden

    Der Aufbau der Schaltung gestaltet sich recht einfach.
    Wie in der Kurzbeschreibung zum I2C Bus genannt, benötigen wir 2 Datenleitungen SCL (GPIO 21) und SDA (GPIO 22). Zusätzlich die Stromversorgung über Ground und 3.3 Volt.

    Das Datenblatt gibt eine Versorgungsspannung zwischen 2.4 – 5.5 Volt vor.


    Programmierung mit VS Studio Code

    Voraussetzung: Installiertes VS Studio Code

    Als Erstes müssen wir ein neues Projekt anlegen. Klicke bitte auf das PlatformIO-Symbol.
    Dann auf „Create New Project“.

    VS Studio Code -> Auswahl eines Ordners ->Pick a folder

    Natürlich können wir auch direkt im Homescreen von PlattformIO ein neues Projekt anlegen.

    PlatformIO Homescreen zum Zugriff auf Projekte nutzen

    Im Projekt Wizard treffen wir gewünschte Einstellungen, wie Projektname und legen auch das verwendete Board fest. Das Framework ist das Arduino Framework und unter Location kannst du festlegen, ob du den Standardspeicherpfad oder einen Eigenen verwenden möchtest. Mit Klick auf „Fertigstellen“ wird das neue Projekt erstellt.

    Projektwizard in PlatformIO

    Dann müssen wir die Bibliothek für den SHT31 einbinden. Im selben Fenster unter Libraries kannst du nach der SHT31 suchen und solltest die Adafruit SHT31 Library finden. Klicke bitte diesen Link an.

    Library SHT31 in PlatformIO auswählen

    Hier bekommst du Beispielcode für die Verwendung dieser Library und weitere Informationen genannt.
    Klicke bitte auf „Add to Project“. Im Screen siehst du den Vorgang. Mit Klick auf „Add“ wird die Library dem Projekt hinzugefügt.

    Screenshot - PlatformIO - Library in Projekt einbinden

    Ein Blick in die Platform.ini zeigt dir auch den Erfolg an. Die Library ist eingebunden.

    [env:esp32dev]
    platform = espressif32
    board = esp32dev
    framework = arduino
    lib_deps = adafruit/Adafruit SHT31 Library@^2.2.2


    Damit sind die Vorbereitungen auch abgeschlossen und wir können uns dem Code zuwenden.

    #include <Arduino.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <Adafruit_SHT31.h>
    
    // Erstellen eines Objekts für den SHT31 Sensor
    Adafruit_SHT31 sht31 = Adafruit_SHT31();
    
    void setup() {
      // Initialisierung der seriellen Kommunikation für Debugging
      Serial.begin(115200);
    
      // Initialisierung des I2C-Bus
      Wire.begin();
    
      // Initialisierung des SHT31 Sensors
      if (!sht31.begin(0x44)) {  // 0x44 ist die I2C-Adresse des SHT31
        Serial.println("Konnte SHT31 nicht finden, überprüfe die Verkabelung!");
        while (1) delay(1);
      }
    
      Serial.println("SHT31 Sensor gefunden!");
    }  
    
    void loop() {
      // Auslesen der Temperatur
      float temperature = sht31.readTemperature();
      // Auslesen der Luftfeuchtigkeit
      float humidity = sht31.readHumidity();
    
      // Überprüfen, ob die Messwerte gültig sind
      if (!isnan(temperature)) {  // isnan überprüft, ob der Wert 'NaN' (Not a Number) ist
        Serial.print("Temperatur: ");
        Serial.print(temperature);
        Serial.println(" °C");
      } else {
        Serial.println("Fehler beim Auslesen der Temperatur!");
      }
    
      if (!isnan(humidity)) {
        Serial.print("Luftfeuchtigkeit: ");
        Serial.print(humidity);
        Serial.println(" %");
      } else {
        Serial.println("Fehler beim Auslesen der Luftfeuchtigkeit!");
      }
    
      // Wartezeit von 10 Sekunden vor der nächsten Messung
      delay(10000);
    }

    Erklärung des Codes

    1. Bibliotheken einbinden: Die Wire.h und SPI.h Bibliotheken werden für die I2C-Kommunikation benötigt, und die Adafruit_SHT31.h Bibliothek für den SHT31 Sensor.
    2. Sensor-Objekt erstellen: Ein Adafruit_SHT31 Objekt wird erstellt, um den Sensor zu steuern.
    3. Setup-Funktion:
      • Initialisierung der seriellen Schnittstelle für Debugging-Zwecke.
      • Initialisierung des I2C-Busses.
      • Initialisierung des SHT31 Sensors und Überprüfung, ob der Sensor gefunden wurde.
    4. Loop-Funktion:
      • Auslesen der Temperatur- und Luftfeuchtigkeitswerte vom Sensor.
      • Überprüfen der Gültigkeit der Messwerte und Ausgabe auf die serielle Konsole.
      • Eine Verzögerung von 10 Sekunden vor der nächsten Messung.

    Skript prüfen und hochladen

    Nachdem wir uns mit dem Code selbst auseinander gesetzt haben, geht es nun ans Hochladen und austesten.
    Genau wie in der Arduino IDE auch, kann mit dem Checked-Symbol der Code syntaktisch geprüft werden. Mit dem Pfeil nach rechts wird der Code kompiliert und hochgeladen. Mit dem Stecker-Symbol kannst du Umschalten auf die Ausgabe der seriellen Schnittstelle.

    Screenshot - Steuerung PlatformIO über Toolbar

    Processing esp32dev (platform: espressif32; board: esp32dev; framework: arduino)
    Verbose mode can be enabled via -v, –verbose option
    CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32dev.html
    PLATFORM: Espressif 32 (6.7.0) > Espressif ESP32 Dev Module
    HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
    DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)

    PACKAGES:
    framework-arduinoespressif32 @ 3.20016.0 (2.0.16)
    tool-esptoolpy @ 1.40501.0 (4.5.1)
    tool-mkfatfs @ 2.0.1
    tool-mklittlefs @ 1.203.210628 (2.3)
    tool-mkspiffs @ 2.230.0 (2.30)
    toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
    LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
    LDF Modes: Finder ~ chain, Compatibility ~ soft
    Found 35 compatible libraries
    Scanning dependencies…
    Dependency Graph
    |– Adafruit SHT31 Library @ 2.2.2
    |– SPI @ 2.0.0
    |– Wire @ 2.0.0
    Building in release mode
    Compiling .pio\build\esp32dev\src\main.cpp.o
    Retrieving maximum program size .pio\build\esp32dev\firmware.elf
    Checking size .pio\build\esp32dev\firmware.elf
    Advanced Memory Usage is available via „PlatformIO Home > Project Inspect“
    RAM: [= ] 6.7% (used 21808 bytes from 327680 bytes)
    Flash: [== ] 22.0% (used 288645 bytes from 1310720 bytes)
    Configuring upload protocol…
    AVAILABLE: cmsis-dap, esp-bridge, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
    CURRENT: upload_protocol = esptool
    Looking for upload port…
    Using manually specified: COM3
    Uploading .pio\build\esp32dev\firmware.bin
    esptool.py v4.5.1

    Nach dem kompilieren des Codes startet dann auch sofort der Flashvorgang
    Der entsprechende COM Port wird geprüft, die Daten des ESP-Chips werden gelesen.
    Für andere Projekte ist es auch wichtig, die MAC-Adresse zu kennen. Einige Speicherbereiche werden gelöscht und teilweise neu beschrieben. Der Fortschritt des Upload wird dann auch prozentual dargestellt.

    Serial port COM3
    Connecting….
    Chip is ESP32-D0WDQ6-V3 (revision v3.0)
    Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
    Crystal is 40MHz
    MAC: 24:0a:c4:f8:f5:68
    Uploading stub…
    Running stub…
    Stub running…
    Changing baud rate to 460800
    Changed.
    Configuring flash size…
    Flash will be erased from 0x00001000 to 0x00005fff…
    Flash will be erased from 0x00008000 to 0x00008fff…
    Flash will be erased from 0x0000e000 to 0x0000ffff…
    Flash will be erased from 0x00010000 to 0x00056fff…
    Compressed 17536 bytes to 12202…
    Writing at 0x00001000… (100 %)
    Wrote 17536 bytes (12202 compressed) at 0x00001000 in 0.6 seconds (effective 237.1 kbit/s)…
    Hash of data verified.
    Compressed 3072 bytes to 146…
    Writing at 0x00008000… (100 %)
    Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.1 seconds (effective 310.8 kbit/s)…
    Hash of data verified.
    Compressed 8192 bytes to 47…
    Writing at 0x0000e000… (100 %)
    Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 449.3 kbit/s)…
    Hash of data verified.
    Compressed 289008 bytes to 161243…
    Writing at 0x00010000… (10 %)
    Writing at 0x0001be08… (20 %)
    Writing at 0x00024933… (30 %)
    Writing at 0x00029fd8… (40 %)
    Writing at 0x0002f664… (50 %)
    Writing at 0x000348b6… (60 %)
    Writing at 0x0003c00a… (70 %)
    Writing at 0x0004529c… (80 %)
    Writing at 0x0004c63e… (90 %)
    Writing at 0x00051b77… (100 %)
    Wrote 289008 bytes (161243 compressed) at 0x00010000 in 3.8 seconds (effective 612.3 kbit/s)…
    Hash of data verified.


    Ausgabe in der seriellen Schnittstelle:

    Nachdem der Upload-Vorgang erfolgreich war, kannst du mit dem Steckersymbol auf die Ausgabe der seriellen Schnittstelle umschalten und das Ergebnis der Arbeit deines Skriptes sehen.

    SHT31 Sensor gefunden!
    Temperatur: 26.87 °C
    Luftfeuchtigkeit: 61.57 %
    Temperatur: 26.85 °C
    Luftfeuchtigkeit: 61.47 %
    Temperatur: 26.81 °C
    Luftfeuchtigkeit: 61.46 %
    Temperatur: 26.78 °C
    Luftfeuchtigkeit: 61.56 %
    Temperatur: 26.74 °C
    Luftfeuchtigkeit: 61.44 %
    Temperatur: 26.74 °C
    Luftfeuchtigkeit: 61.45 %
    Temperatur: 26.71 °C
    Luftfeuchtigkeit: 61.48 %
    Temperatur: 26.70 °C
    Luftfeuchtigkeit: 61.49 %
    Temperatur: 26.67 °C
    Luftfeuchtigkeit: 61.60 %

    Dieses DIYTechAdventure sollte dir einen guten Startpunkt geben, um den SHT31 Sensor mit einem ESP32 im Arduino-Framework zu verwenden. Viel Erfolg bei deinem Projekt!


    0 Kommentare
    Inline Feedbacks
    View all comments