AM2320 auf dem Breadbord

AM2320 Temperatur- und Luftfeuchtigkeitssensor

Der AM2320 ist ein Sensor zur Messung der Umgebungstemperatur und der relativen Luftfeuchtigkeit. Er kommuniziert mit dem Mikrocontroller über den I2C-Bus. Von den technischen Daten ist er mit dem DHT22 (AM2302) vergleichbar, kostet aber nur etwa die Hälfte. Der Sensor ist – wie der DHT22 – lose oder als Modul erhältlich. Verwendet man den einfachen Sensor, benötigt man noch 2 Pull-Up-Widerstände – auf einem Modul sind diese üblicherweise bereits vorhanden.

Der letzte Abschnitt zur mangelhaften Genauigkeit der Messwerte (insbes. für die Luftfeuchtigkeit) wurde im März 2021 ergänzt.

Technische Daten

Die wichtigsten Daten des AM2320 sind in der folgenden Tabelle angegeben. Ausführliche technische Informationen enthält das Datenblatt.
Nach meinen Erfahrungen mit diesem Sensor weichen die tatsächlichen Messwerte deutlich von den technischen Daten ab. Der Sensor ist wesentlich ungenauer als andere Sensoren. Warum ich ihn nicht wieder kaufen würde, beschreibe ich weiter unten.

I2C-Adresse: 0x5C
Sensor AM2320
Sensor AM2320
Versorgungsspannung: 3,1 bis 5,5 V
Messbereiche  
   Temperatur: -40 bis +80°C
   rel. Luftfeuchtigkeit (RH): 0 – 99,9% RH
Genauigkeit  
   Temperatur: ±0,5°C
   rel. Luftfeuchtigkeit: ±3%

Wegen der festen I2C-Adresse 0x5C kann nur ein AM2320-Sensor pro I2C-Interface angeschlossen werden.
Die Daten anderer ähnlicher Sensoren zeigt eine Vergleichstabelle.

Installation der Bibliotheken

Zur Abfrage des Sensors verwendet man am einfachsten eine der bei Github zu findenden Bibliotheken. Ich hatte mich zuerst für die AM2320-Library von EngDial entschieden, mit der aber am ESP32 Probleme aufgetreten sind. Deshalb bin ich dann zur Adafruit-AM2320-Bibliothek gewechselt, deren Nutzung nun auch als Erstes beschrieben wird.

Adafruit AM2320 Sensor Library

Die »Adafruit AM2320 sensor library« kann über die Arduino-Bibliotheksverwaltung installiert werden (Suchbegriff z.B. »am2320«) – oder manuell nach Download von GitHub. Diese Bibliothek setzt die »Adafruit Unified Sensor«-Bibliothek voraus, die zusätzlich installiert werden muss, wenn man sie noch nicht installiert hat (siehe die Beschreibung auf adafruit.com). Auch diese Bibliothek kann man über die Bibliotheksverwaltung der Arduino-IDE installieren oder manuell von GitHub.
Die Bibliothek bietet zwei Methoden zum Lesen der Sensor-Werte: readTemperature() und readHumidity() (siehe unten: Beispielprogramm); getestet habe ich sie mit einem ESP32 (DevKitC) und einem ESP8266 (NodeMCU).

AM2320-Bibliothek von EngDial

Diese Bibliothek wird nicht in der Arduino-Bibliotheksverwaltung angeboten, man muss sie manuell installieren. Bei GitHub ist sie zu finden unter github.com/EngDial/AM2320. Nach Klicken auf den grünen Code-Button auf der Github-Seite kann man den Code als ZIP-Archiv herunterladen. Dieses entpackt man in den Bibliotheksordner der Arduino-Installation – unter Windows standardmäßig C:\Users\<benutzername>\Documents\Arduino\libraries. Nachschauen kann man den Pfad im Menü Datei → Voreinstellungen → Sketchbook-Speicherort der Arduino-IDE, wobei man an den angezeigten Pfad den Namen des Bibliotheksverzeichnisses libraries anhängen muss. Den entpackten Ordner benennt man dann noch von AM2320-master auf AM2320 um.
(Ausführlich ist die manuelle Installation von Bibliotheken hier beschrieben.)

Im wesentlichen stellt diese Bibliothek eine Methode Read() zum Auslesen des Sensors bereit. Diese liefert die Returncodes 0 (ok, Erfolg), 1 (Sensor ist offline) oder 2 (CRC- bzw. Prüfsummenfehler). Im Erfolgsfall kann man dann über die Variablen Humidity und cTemp die Messwerte für relative Luftfeuchtigkeit und Temperatur in Grad Celsius auslesen.

Die Bibliothek funktionierte gut mit einem Arduino Nano-Nachbau und einem ESP8266, aber nicht mit verschiedenen ESP32.

Problem mit dem ESP32 und der EngDial-Bibliothek

Programm und Aufbau der Schaltung auf der Steckplatine waren wie unten für den Nano und ESP8266 beschrieben. Das Programm ließ sich auch für den ESP32 kompilieren und hochladen, aber nicht sauber ausführen.
Betrug das Intervall zwischen zwei Messungen 1000 oder 2000 Millisekunden, schlug genau jede zweite Messung mit einem Prüfsummenfehler (CRC) fehl. Bei längeren Intervallen (z.B. 5 oder 10 Sekunden) war gar keine gültige Messung mehr möglich, es wurden ausschließlich CRC-Fehler angezeigt.

Dieses Verhalten trat mit zwei verschiedenen ESP32 (Standard-Developer Board DevKitC und ESP32 Pico Kit) auf, auch ein anderer AM2320-Sensor und ein Ersetzen der 10kΩ-Pull-Up-Widerstände durch welche mit 4,7kΩ brachten keine Änderung. Anders als ursprünglich angenommen, scheint die Ursache die EngDial-Bibliothek zu sein, denn mit der Adafruit-Lib trat kein Fehler auf.

Aufbau auf der Steckplatine

Pins des Sensors AM2320
Pins des Sensors AM2320

Der AM2320 hat vier Pins (vlnr.):

  1. VDD (Versorgungsspannung)
  2. SDA (Daten)
  3. GND (Masse)
  4. SCL (Takt)

Um auf dem I2C-Bus zu kommunizieren, müssen die SDA- und SCL-Leitungen über Pull-Up-Widerstände mit der Versorgungsspannung verbunden werden – meist findet man die Empfehlung, 10kΩ-Widerstände zu verwenden; 4,7kΩ tun es auch. (Verwendet man ein Modul mit aufgelötetem Sensor, sind diese Widerstände i.d.R. bereits vorhanden.) Versorgungsspannung ist die Spannung des Mikrocontrollers, beim Arduino also 5 Volt und beim ESP32 oder ESP8266 3,3 Volt.

SDA verbindet man am Arduino mit dem Eingang A4, SCL mit A5. Beim ESP8266 sind es die Pins D2 (GPIO 4) für SDA und D1 (GPIO 5) für SCL und beim ESP32 standardmäßig D21 für SDA und D22 für SCL. Laut Datenblatt soll man den Sensor maximal alle 2 Sekunden auslesen.

Auf dem Breadboard sieht es dann so aus:

AM2320 am Arduino Nano
AM2320 am Arduino Nano
AM2320 am ESP8266
AM2320 am ESP8266

Beispielprogramm mit der Adafruit-Bibliothek

Die folgenden Programme (Sketches) sind leicht geänderte Versionen der in den jeweiligen Bibliotheken mitgelieferten Beispielprogramme. Sie geben alle paar Sekunden die Messwerte für Temperatur und rel. Luftfeuchtigkeit über den seriellen Monitor der Arduino-IDE aus. Verwendet man die o.g. Standard-Anschlüsse für I2C, laufen die Programme auf Arduino, ESP8266 und ESP32.

/* Abfrage des AM2320-Sensors für Temperatur und Luftfeuchtigkeit
 *
 * siehe Beispielprogramm:
 * https://github.com/adafruit/Adafruit_AM2320/tree/master/examples/basic_am2320
 *
 * 2020-11-26 Heiko (unsinnsbasis.de)
 */
#include <Adafruit_Sensor.h>
#include <Adafruit_AM2320.h>
 
Adafruit_AM2320 am2320 = Adafruit_AM2320();
 
void setup() {
  Serial.begin(9600);  // ESP32/8266: ggf. 115200
  am2320.begin();
}
 
void loop() {
  Serial.print("Temperatur: ");
  Serial.print(am2320.readTemperature());
  Serial.println("°C");
  Serial.print("rel. Luftfeuchtigkeit: ");
  Serial.print(am2320.readHumidity());
  Serial.println("%");
  delay(5000);
}

Beispielprogramm mit der EngDial-Bibliothek

/* Abfrage des AM2320-Sensors für Temperatur und Luftfeuchtigkeit
 *
 * (siehe Beispielprogramm auf https://github.com/EngDial/AM2320)
 *
 * 2020-10-22 Heiko (unsinnsbasis.de)
 */
#include <Wire.h>  // Bibliothek für I2C einbinden
#include <AM2320.h>
 
// Sensor-Objekt anlegen
// (unter Verwendung des Standard-Objekts Wire für die I2C-Schnittstelle)
AM2320 sensor(&Wire);
 
void setup() {
  Serial.begin(9600);  // ESP32/8266: ggf. 115200
  Wire.begin();
}
 
void loop() {
  switch(sensor.Read()) {
    case 2:
      Serial.println(" CRC-Fehler");
      break;
    case 1:
      Serial.println(" Sensor offline");
      break;
    case 0:
      Serial.print(" rel. Luftfeuchtigkeit = ");
      Serial.print(sensor.Humidity);
      Serial.println(" %");
      Serial.print(" Temperatur = ");
      Serial.print(sensor.cTemp);
      Serial.println(" °C");
      Serial.println();
      break;
  }
  delay(5000);
}

Wenn man ein paarmal auf den Sensor ausatmet, sieht man, wie die Messwerte der Temperatur und vor allem der Luftfeuchtigkeit deutlich ansteigen und dann wieder sinken:

Ausgabe der Messwerte im seriellen Monitor der Arduino-IDE
Ausgabe der Messwerte im seriellen Monitor der Arduino-IDE

Mangelhafte Genauigkeit

Ich besitze zwei AM2320-Sensoren, die ich bei zwei verschiedenen Onlinehändlern in China im Abstand einiger Monate gekauft habe. Einer der beiden (anscheinend der „bessere”) lief im Vergleich von 13 Temperatur- und Luftfeuchtigkeitssensoren mit – dort war die Temperaturmessung sehr gut (dicht beim Mittelwert), die Messung der relativen Luftfeuchtigkeit war die schlechteste von vier Sensoren. Der andere Sensor war damals anderweitig im Einsatz, sodass ich die Anzeigewerte nur ungefähr vergleichen konnte. Diesen Sensor habe ich im März 2021 nachträglich kurz mit dem DHT22 und SHT20 verglichen: Er zeigt für die Luftfeuchtigkeit Werte an, die oft (aber nicht immer) 4 bis tlw. mehr als 5 Prozentpunkte unterhalb der anderen Sensoren liegen. Das ist im Extremfall eine relative Abweichung von mehr als 10% bei Luftfeuchtigkeitswerten von ca. 43% RH.

Auch den Entwicklern bei Adafruit ist die (Un-)Genauigkeit des AM2320 einen deutlichen Hinweis wert:

The datasheet mentions it has 3% humidity accuracy and 0.5C temperature accuracy, but we’re not very trusting of the specifications. So, while this sensor does seem to work, it’s not recommended for anything where you care deeply about guaranteed accuracy. Temperature is probably correct to 2-3 degrees Celsius. Humidity is probably within 5-10%.

Bei meinen beiden Sensoren scheinen die Temperaturwerte mit Abweichungen von 1-2°C im Bereich der üblichen Streuungen zwischen den verschiedenen Sensoren zu liegen, sind also ok. Die Werte für die rel. Luftfeuchtigkeit sind nach meinem Eindruck aber extrem unzuverlässig. (Da ich keine kalibrierten Geräte zur Messung „korrekter” Werte besitze, kann ich nur die Sensoren miteinander vergleichen und feststellen, ob sie auffällige Abweichungen voneinander zeigen.)

Außerdem zeigen beide AM2320-Sensoren sowohl mit einem Arduino-Nano-Klon als auch mit den ESP32 (DevKitC) das etwas seltsame Verhalten, dass sie zwar am I2C-Bus mit der Adresse 0x5C funktionieren, aber ein I2C-Scanner die Sensoren nicht findet.

Auch wenn der AM2320 vergleichsweise wenig kostet, würde ich ihn nicht wieder kaufen, sondern einen etwas teureren DHT22 (auch unter der sehr ähnlichen Bezeichnung AM2302 im Handel) oder SHT20 einsetzen – oder eine der vielen anderen Alternativen.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.