Skip to Content

Temperatur-Sensor Arduino Tutorial

Temperatur-Sensor Arduino Tutorial

In diesem Tutorial lernst du, wie man Temperatur und relative Luftfeuchtigkeit mit dem Si7021 Sensor und einem Arduino misst.

Der Si7021 Sensor ist eine beliebte Wahl zur Messung von Temperatur und Luftfeuchtigkeit in DIY-Projekten. Er ist ein zuverlässiger und genauer Sensor, der über I2C kommuniziert, was die Integration mit Mikrocontrollern wie Arduino und ESP32 erleichtert. Mit einem weiten Betriebsbereich und niedrigem Stromverbrauch eignet sich der Si7021 für verschiedene Anwendungen, darunter Wetterstationen, Smart-Home-Geräte und Umweltüberwachungssysteme. Seine kompakte Größe und einfache Schnittstelle machen ihn ideal für Anfänger und erfahrene Maker, die ihren Projekten Umweltmessfunktionen hinzufügen möchten.

Lass uns mit den benötigten Bauteilen beginnen.

Benötigte Bauteile

Natürlich benötigst du einen Si7021 Temperatur- und Feuchtigkeitssensor. In der Regel kauft man nicht den reinen Sensor, sondern ein Breakout-Board, das einige zusätzliche Komponenten enthält, die den Anschluss des Sensors erleichtern.

Außerdem brauchst du einen Mikrocontroller. Für dieses Projekt habe ich einen Arduino Uno verwendet, aber jeder andere Arduino oder ein ESP32/ESP8266 funktioniert ebenfalls.

Schließlich wollen wir die gemessenen Temperatur- und Feuchtigkeitsdaten anzeigen. Ich habe mich für ein OLED entschieden, aber du könntest auch ein LCD display.

Si7021 Temperatur- & Feuchtigkeitssensor

Arduino

Arduino Uno

USB Data Sync cable Arduino

USB-Kabel für Arduino UNO

Dupont wire set

Dupont-Kabelset

Half_breadboard56a

Breadboard

OLED display

OLED-Display

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Der Si7021 Temperatur- & Feuchtigkeitssensor

Der Si7021 ist ein sehr kleiner, stromsparender Feuchtigkeits- und Temperatursensor mit integrierter Elektronik. Er ist werkseitig kalibriert für genaue Messungen und kommuniziert über eine I2C-Schnittstelle. Das folgende Bild zeigt das Funktionsblockdiagramm des Si7021:

Functional Block Diagram of Si7021
Funktionsblockdiagramm des Si7021 (source)

Wie du sehen kannst, enthält er die Feuchtigkeits- und Temperatursensorelemente, einen Analog-Digital-Wandler (ADC), die Steuerlogik mit Speicher zur Speicherung der Kalibrierfaktoren sowie die Elektronik für die I2C-Schnittstelle.

Technische Spezifikationen

Das Temperatursensorelement des Si7021 kann Temperaturen im Bereich von –10 bis 85 °C mit ±0,4 °C Genauigkeit messen. Der Feuchtigkeitssensor misst die relative Luftfeuchtigkeit im Bereich von 0 bis 80 % RH mit ± 3 % RH Genauigkeit.

Der Sensor arbeitet mit 1,9 bis 3,6 V und der Stromverbrauch während des Betriebs beträgt 150 μA (60 nA im Standby-Modus).

Ein besonderes Merkmal des Sensors ist das integrierte Heizelement, das verwendet werden kann, um die Temperatur des Sensors zu erhöhen, um Kondensation zu entfernen oder Taupunktmessungen durchzuführen. Beachte, dass das Einschalten des Heizelements den Stromverbrauch auf bis zu 94,20 mA (bei 3,3 V) erhöht. Weitere Details findest du im Datenblatt:

Typische Anwendungsschaltung

Um den Si7021 in einer tatsächlichen Anwendung zu verwenden, musst du normalerweise Pull-up-Widerstände für die I2C-Schnittstelle und einen Kondensator zur Stabilisierung der Stromversorgung hinzufügen. Das folgende Bild zeigt die typische Anwendungsschaltung:

Typical Application Circuit of Si7021
Typische Anwendungsschaltung des Si7021 (source)

In den meisten Fällen möchtest du jedoch ein Breakout-Board verwenden, das diese Bauteile bereits integriert hat.

Breakout-Board für SI7021

Das folgende Bild zeigt ein typisches Breakout-Board für den SI7021. Es fügt die erwähnten Pull-up-Widerstände und einen Spannungsregler hinzu, der es ermöglicht, das Board mit 3,3 V oder 5 V zu betreiben.

Front & Back of Si7021 breakout board
Vorder- & Rückseite des Si7021 Breakout-Boards

Beachte, dass viele Breakout-Boards mit „SI7021“ beschriftet sind, tatsächlich aber einen anderen, wenn auch vergleichbaren Sensor enthalten. Im obigen Beispiel siehst du das „SI7021“-Label auf dem Board und die Labels „HTU21“ und „SHT21“ direkt unter dem Sensor.

Der SI7021, HTU21 und SHT21 sind in Bezug auf Spezifikationen und Kommunikationsprotokolle austauschbar und haben sogar dieselbe I2C-Adresse (0x40). Allerdings speichern sie ihre Seriennummern in einem anderen Format, was ein kleines Problem bei der Verwendung der Adafruit_Si7021 oder der SparkFun_Si7021 Bibliotheken verursacht. Mehr dazu später.

Beachte außerdem, dass SHT21, HTU21 und Si7021 mit oder ohne schützende PTFE-Membran über dem Sensorelement erhältlich sind. Siehe das folgende Bild für die beiden Typen:

Si7021 Sensor with or without a protective membrane
Si7021 Sensor mit oder ohne Schutzmembran

Anschluss des Si7021 an Arduino

Dank der I2C-Schnittstelle ist der Anschluss des Si7021 Sensors an einen Arduino sehr einfach. Verbinde zuerst die SCL- und SDA-Pins des Si7021 Breakout-Boards mit den entsprechenden Pins am Arduino-Board, wie unten gezeigt. Verbinde dann Masse und VIN.

Wiring of Si7021sensor with Arduino
Verdrahtung des Si7021 Sensors mit Arduino

Das Breakout-Board läuft mit 5 V oder 3,3 V und du kannst entweder für VIN verwenden. In der obigen Verdrahtung verwende ich 3,3 V für VIN.

Als Nächstes schreiben wir etwas einfachen Code, um die Funktion des Si7021 Sensors zu testen.

Code zum Auslesen der Daten vom Si7021

Bevor wir Temperatur- und Feuchtigkeitsdaten vom Si7021 Sensor auslesen können, müssen wir eine Bibliothek installieren. Zwei gängige Optionen sind die Adafruit_Si7021 oder die SparkFun_Si7021 Bibliothek. Ich werde die Adafruit_Si7021 Bibliothek verwenden.

Öffne den Library Manager, suche nach „Si7021“ und install die Adafruit_Si7021 Bibliothek, wie unten gezeigt.

Adafruit_Si7021 library installed in  Library Manager
Adafruit_Si7021 Bibliothek im Library Manager installiert

Jetzt können wir etwas einfachen Testcode schreiben. Wir beginnen mit dem Einbinden der Adafruit_Si7021 Bibliothek und erstellen das Sensorobjekt. In der setup() Funktion initialisieren wir den Sensor über sensor.begin(), und in der loop-Funktion lesen und geben wir die gemessene Feuchtigkeit und Temperatur aus.

#include "Adafruit_Si7021.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();

void setup() {
  Serial.begin(9600);
  sensor.begin();
}

void loop() {
  Serial.print("Hum:");
  Serial.println(sensor.readHumidity(), 2);
  Serial.print("Temp:");
  Serial.println(sensor.readTemperature(), 2);
  delay(1000);
}

Wenn du diesen Code hochlädst und ausführst, solltest du die folgende Ausgabe im Serial Monitor sehen. Achte darauf, dass die Baudrate korrekt auf 9600 Baud eingestellt ist.

Output of Si7021 measurements on Serial Monitor
Ausgabe der Si7021 Messwerte im Serial Monitor

Du kannst auch den Serial Plotter öffnen und auf den Sensor blasen. Du solltest einen Anstieg der gemessenen Feuchtigkeit und Temperatur sehen. Im Bild unten zeigt die blaue Linie die Feuchtigkeit, die bei 100 % gesättigt ist, und einen leichten Temperaturanstieg (rote Linie).

Output of Si7021 measurements on Serial Plotter
Ausgabe der Si7021 Messwerte im Serial Plotter

Wenn der Sensor nicht funktioniert, überprüfe, ob er korrekt verdrahtet ist und als I2C-Gerät erkannt wird. Du kannst dies mit einem I2C-Scanner überprüfen.

#include "I2CScanner.h"

I2CScanner scanner;

void setup() {
  Serial.begin(9600);
  while (!Serial) {};

  scanner.Init();
}

void loop() {
  scanner.Scan();
  delay(5000);
}

Wenn du den obigen Code hochlädst und ausführst, sollte folgende Ausgabe im Serial Monitor erscheinen

--- Scan started ---
I2C device found at address 0x40  !

wobei 0x40 die Standard-I2C-Adresse des Si7021 Sensors ist. Wenn du das nicht siehst, ist entweder die Verdrahtung nicht korrekt, dein Sensor defekt oder hat eine andere I2C-Adresse, was nicht sein sollte.

Si7021 Sensor nicht gefunden

Wenn du versuchst, den Beispielcode si7021.ino aus der Adafruit_Si7021 Bibliothek auszuführen, kann die Fehlermeldung „Did not find Si7021 sensor!“ erscheinen. Der Fehler wird durch den folgenden Codeabschnitt in der setup() Funktion ausgelöst:

void setup() {  
  ...
  if (!sensor.begin()) {
    Serial.println("Did not find Si7021 sensor!");
    while (true)
      ;
  }
  ...
}

Du wirst diese Meldung sehen, selbst wenn der I2C-Scan bestätigt, dass der Si7021 Sensor an der Adresse 0x40 erkannt wird und eigentlich einwandfrei funktioniert.

Ich habe mir die Initialisierung code des Sensors genauer angesehen und der Fehler wird durch den Aufruf der _readRegister8() Funktion im folgenden Code verursacht.

bool Adafruit_Si7021::begin() {
  if (!i2c_dev->begin())
    return false;

  reset();
  if (_readRegister8(SI7021_READRHT_REG_CMD) != 0x3A)
    return false;

  readSerialNumber();
  _readRevision();

  return true;
}

Der Grund ist, dass viele Breakout-Boards, die mit „Si7021“ beschriftet sind, tatsächlich einen SHT21 oder HTU21 Sensor verwenden. Diese Sensoren sind vergleichbar mit dem Si7021, speichern aber offenbar die Seriennummer in einem anderen Format/Adresse, was diesen Fehler verursacht.

Der einfachste Weg, dies zu umgehen, ist, die begin() Funktion aufzurufen, aber den Rückgabewert zu ignorieren – so wie ich es im Beispielcode oben gemacht habe. Der Sensor selbst und der restliche Code funktionieren einwandfrei, aber du kannst die Seriennummer oder Version des Sensors nicht ausgeben.

Ich habe auch die SparkFun_Si7021 Bibliothek ausprobiert, die dasselbe Problem hatte. Wenn du keine der beiden Bibliotheken verwenden möchtest und das Problem selbst beheben willst, kannst du die Funktionalität selbst implementieren. Das ist nicht schwer. Der Blogbeitrag Bare Si7021 temperature/relative humidity sensor zeigt, wie es gemacht wird.

Für jede praktische Anwendung möchtest du wahrscheinlich die Temperatur- und Feuchtigkeitsdaten auf einem Display anzeigen und nicht im Serial Monitor ausgeben. Genau das machen wir im nächsten Abschnitt. Wir fügen ein OLED hinzu und zeigen die Sensordaten dort an.

Ein OLED hinzufügen, um Si7021 Daten anzuzeigen

Da das OLED ebenfalls ein I2C-Gerät ist, ist der Anschluss unkompliziert. Wir verbinden einfach SDA und SCL mit denselben Pins, an denen der Si7021 Sensor angeschlossen ist. Da das OLED mit 3,3 V läuft, können wir auch die Stromversorgungsleitungen teilen. Das folgende Bild zeigt die komplette Verdrahtung.

Connecting OLED and Si7021 with Arduino
Anschluss von OLED und Si7021 an Arduino

Wenn du Probleme mit dem OLED hast, schau dir das Tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino an. Das Bild unten zeigt die komplette Verdrahtung auf einem echten Breadboard:

Wiring of OLED and Si7021 with Arduino
Verdrahtung von OLED und Si7021 mit Arduino

Code zur Anzeige der Si7021 Daten auf OLED

In diesem Abschnitt schreiben wir den Code, um die vom Si7021 Sensor gemessene Temperatur und Luftfeuchtigkeit auf einem OLED-Display anzuzeigen. Zum Schreiben auf das OLED verwenden wir die Adafruit_SSD1306 Bibliothek. Du kannst sie install it via the Library Manager wie gewohnt installieren:

Adafruit_SSD1306 library installed in Library Manager
Adafruit_SSD1306 Bibliothek im Library Manager installiert

Der folgende Code liest die Messwerte vom Si7021 Sensor aus und zeigt die Temperatur- und Feuchtigkeitswerte auf dem OLED an. Schau dir zuerst den kompletten Code an, dann gehen wir auf die Details ein.

#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

void centered(const char* text, int y) {
  int16_t x1, y1;
  uint16_t w, h;
  oled.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
  oled.setCursor(64 - w / 2, y);
  oled.print(text);
}

void display() {
  static char text[30];
  float temp = sensor.readTemperature();
  float hum = sensor.readHumidity();

  oled.clearDisplay();
  sprintf(text, "%.1f c", temp);
  centered(text, 12);
  sprintf(text, "%.1f %%", hum);
  centered(text, 38);
  oled.display();
}

void setup() {
  oled_init();
  sensor.begin();
}

void loop() {
  display();
  delay(1000);
}

Bibliotheken und Display-Initialisierung

Wir beginnen mit dem Einbinden der notwendigen Bibliotheken für den Si7021 Sensor und das Adafruit SSD1306 OLED-Display. Dann initialisieren wir das OLED-Display in der oled_init() Funktion. Diese Funktion richtet das Display ein, löscht es, setzt die Textgröße und die Textfarbe.

#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

Beachte, dass die I2C-Adresse für das OLED-Display in 0x3C auf oled.begin() gesetzt ist. Die meisten dieser kleinen OLEDs verwenden diese Adresse, aber deine könnte anders sein. Wenn du nichts auf dem OLED siehst, hat es höchstwahrscheinlich eine andere I2C-Adresse und du musst die Adresse, die an oled.begin() übergeben wird, ändern. Wenn du die I2C-Adresse nicht kennst, schau dir das How to Interface the SSD1306 I2C OLED Graphic Display With Arduino Tutorial an.

Display-Funktionen

Die centered() Funktion wird verwendet, um Text zentriert auf dem OLED-Display an einer bestimmten y-Koordinate auszugeben. Die display() Funktion liest die Temperatur- und Feuchtigkeitsdaten vom Sensor aus und zeigt sie auf dem OLED-Bildschirm an.

void centered(const char* text, int y) {
  // Function to center text on OLED
}

void display() {
  // Function to display temperature and humidity on OLED
}

Setup-Funktion

In der setup() Funktion initialisieren wir die serielle Kommunikation für Debugging-Zwecke, initialisieren das OLED-Display und starten die Kommunikation mit dem Si7021 Sensor. Wie bereits erwähnt, wenn der Si7021 Sensor nicht erkannt wird, überprüfe die Verdrahtung, die I2C-Adresse und ignoriere den Rückgabewert von sensor.begin().

void setup() {
  oled_init();
  sensor.begin();
}

Loop-Funktion

Die loop() Funktion ruft kontinuierlich die display() Funktion auf, um die Werte zu aktualisieren und auf dem OLED anzuzeigen. Danach wartet sie 1 Sekunde (1000 ms) bis zum nächsten Update.

void loop() {
  display();
  delay(1000);
}

Ausgabe auf OLED

Wenn du den Code hochlädst und ausführst, solltest du die Temperatur in Celsius und die relative Luftfeuchtigkeit in Prozent auf dem OLED angezeigt bekommen.

Si7021Output on OLED
Si7021 Ausgabe auf OLED

Und schon hast du ein schönes, kleines Umwelt-Sensor-Setup!

Fazit

In diesem Tutorial hast du gelernt, wie man den Si7021 Temperatur- und Feuchtigkeitssensor, ein OLED und einen Arduino Uno verwendet, um einen Umweltsensor zu bauen.

Da der Si7021 einen Niedrigstrommodus hat und mit 3,3 V läuft, eignet er sich auch gut für den Bau eines batteriebetriebenen Umweltsensors mit einem ESP32. Schau dir zum Beispiel das Simple ESP32 Internet Weather Station an, wo wir einen batteriebetriebenen ESP32 verwenden. Wenn du den Stromverbrauch noch weiter reduzieren möchtest, empfehle ich statt eines OLED ein e-Paper-Display. Das Weather Station on e-Paper Display Tutorial könnte dir dabei helfen.

Beachte, dass es viele alternative Temperatur- (und Feuchtigkeits-) Sensoren gibt, die du verwenden kannst. Hier ist eine Liste von Tutorials, in denen einige dieser Sensoren verwendet werden.

Am vergleichbarsten in Bezug auf Stromverbrauch, Benutzerfreundlichkeit und Genauigkeit ist wahrscheinlich der BME280 Sensor. Es gibt einen sehr guten comparison of Temperature/Humidity sensors, den es sich zu lesen lohnt.

Wenn du lieber den ESP32 statt eines Arduino verwendest, schau dir die folgenden Tutorials an.

Ich hoffe, du hattest Spaß beim Bauen und Experimentieren mit diesem Projekt. Wenn du Fragen hast, kannst du sie gerne im Kommentarbereich stellen.

Viel Spaß beim Tüfteln ; )