Komplexe Messaufgaben erfordern oft mehrere Sensoren – doch das geht auch einfacher. Diese kleine Platine vereint den AHT20 und den BMP280 Sensor und bietet dir die Möglichkeit, Temperatur, Luftfeuchtigkeit und Druck effizient auf kleinstem Raum zu erfassen. Dank der kompakten Bauweise, die kaum größer als ein 10-Cent-Stück ist, eignet sich die Platine ideal für Anwendungen mit begrenztem Platzangebot, wie IoT-Geräte, Wetterstationen oder tragbare Elektronik.
Die Kommunikation über den I²C-Bus macht die Integration in bestehende Projekte kinderleicht und minimiert den Verkabelungsaufwand. Trotz der geringen Größe überzeugen die Sensoren mit einer hohen Messgenauigkeit und Zuverlässigkeit, wodurch diese Lösung nicht nur platzsparend, sondern auch leistungsstark ist.
Den BMP280 und weitere Luftdrucksensoren habe ich dir im Beitrag Genauigkeitstest bei der PTB: Luftdrucksensoren BMP180, BMP280 und BME680 einem Test unterzogen und dir einen ausführlichen Bericht veröffentlicht.
Inhaltsverzeichnis
- Technische Daten der Sensoren AHT20 & BMP280
- Bezug der Sensor-Platine mit AHT20 und BMP280
- Aufbau der Sensor-Platine
- Aufbau der Schaltung am Arduino UNO R3
- Programmieren der Sensor-Platine in der Arduino IDE
- Anzeigen der Sensorwerte auf einem OLED-Display
Technische Daten der Sensoren AHT20 & BMP280
Nachfolgend die technischen Daten der beiden Sensoren:
Technische Daten | AHT20 | BMP280 |
---|---|---|
Versorgungsspannung | 2.0 – 5.5V DC | 1.71 – 3.6V |
Schnittstelle | I²C | I²C |
Messbereich | Temperatur: -40 bis +85 °C Feuchtigkeit: 0 – 100 % | Temperatur: -40 bis +85 °C Luftdruck: 300 – 1100 hPa |
Genauigkeit | Temperatur: ±0.3 °C Feuchtigkeit: ±2 % | Temperatur: ±1 °C (typ. bei 950-1050 hPa) Luftdruck: ±0.12 hPa (±1 m) |
Aus der Tabelle können wir zusätzlich entnehmen, dass der AHT20 sowie auch der BMP280 die Temperatur messen, dieses können wir uns gleichzeitig zu eigen machen und prüfen, inwieweit die Sensorwerte auseinander gehen.
Bezug der Sensor-Platine mit AHT20 und BMP280
Ich habe mir diese kleine Platine (wie so oft) bei Aliexpress.com für ein paar Euro bestellt. Du bekommst diese aber auch über ebay.de für knapp 4,90 € inkl. Versandkosten*.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Aufbau der Sensor-Platine
Die kleine 15 mm x 15 mm Platine verfügt über vier Pins (SCL, GND, SDA & VDD) und noch zwei 3 mm Bohrungen an den Seiten.
Aufbau der Schaltung am Arduino UNO R3
Schließen wir die Sensor-Platine via I2C an den Arduino UNO an, um diese später auszulesen. Da der BMP280 Sensor mit maximal 3.6V arbeitet, dürfen wir hier nur den 3.3V Pin als Stromversorgung verwenden.
Für den Aufbau der Schaltung benötigst du:
- einen Arduino UNO R3* oder Arduino Nano V3*
- ein passendes Datenkabel*
- eine Sensor-Platine mit AHT20 & BMP280 Sensor*
- vier Breadboardkabel*, 10 cm, männlich – männlich
- ein 170 oder 400 Pin Breadboard*
Programmieren der Sensor-Platine in der Arduino IDE
Bevor wir mit der Programmierung beginnen, installieren wir die Bibliotheken für die beiden Sensoren AHT20 & BMP280. Dazu öffnen wir den Bibliotheksverwalter (1) und suchen zunächst nach „aht20“ (2) es wird dir nun eine lange Liste von kompatiblen Bibliotheken aufgelistet. Aus dieser Liste wähle ich „Adafruit AHTX0 von Adafruit“ und klicke dort INSTALLIEREN (3). Diese Bibliothek hat jedoch einige Abhängigkeiten, welche zusätzlich installiert werden müssen. Daher klicken wir im neuen Dialog auf „ALLE INSTALLIEREN“ (4).
Um die Bibliothek für den BMP280 Sensor zu installieren, suchen wir zunächst nach dieser (5) und wählen auch hier die Version von Adafruit aus (6).
Im ersten Schritt möchte ich die Daten der beiden Sensoren auf der seriellen Schnittstelle ausgeben. Dazu kopiere ich mir zunächst die benötigten Code-Snippets aus den Beispielen, welche den beiden Bibliotheken beiliegen.
Wert |BMP280 |AHT20
------------------------------------------------------------------------------
Temperatur |20.59 °C |20.80 °C
Luftdruck |101491.25 Pa |
Luftfeuchtigkeit | |50.96% rH
------------------------------------------------------------------------------
Temperatur |20.59 °C |20.79 °C
Luftdruck |101489.41 Pa |
Luftfeuchtigkeit | |51.44% rH
Nachfolgend der Code zur tabellarischen Darstellung der Daten:
// Importieren der benötigten Bibliotheken #include <Wire.h> // für den BMP280 Sensor #include <Adafruit_BMP280.h> // für den AHT20 Sensor #include <Adafruit_AHTX0.h> //Objekt instanziieren vom Typ Adafruit_BMP280 Adafruit_BMP280 bmp; //Objekt instanziieren vom Typ Adafruit_AHTX0 Adafruit_AHTX0 aht; void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); //beginn der Kommunikation mit dem BMP280 Sensor bmp.begin(); //Konfigurieren des BMP280 Sensors bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2, Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16, Adafruit_BMP280::STANDBY_MS_500); //beginn der Kommunikation mit dem AHT20 Sensor aht.begin(); //Ausgeben einer Tabelle Serial.println("Wert \t\t\t\t|BMP280\t\t\t|AHT20"); Serial.println("------------------------------------------------------------------------------"); } void loop() { //lesen der Daten vom AHT20 Sensor sensors_event_t humidity, temp; aht.getEvent(&humidity, &temp); Serial.print("Temperatur\t\t\t|"); Serial.print(String(bmp.readTemperature(), 2) + " °C"); Serial.print("\t\t|"); Serial.println(String(temp.temperature, 2) + " °C"); Serial.print("Luftdruck\t\t\t|"); Serial.print(String(bmp.readPressure(), 2) + " Pa"); Serial.println("\t\t|"); Serial.print("Luftfeuchtigkeit\t\t|"); Serial.print("\t\t\t|"); Serial.println(String(humidity.relative_humidity,2)+"% rH"); delay(5000); Serial.println("------------------------------------------------------------------------------"); }
Anzeigen der Sensorwerte auf einem OLED-Display
Die beiden Sensoren (AHT20 & BMP280) liefern jeweils die Temperatur, da ich diesen Wert lediglich einmal benötige, nutze ich diesen vom BMP280. Ansonsten zeige ich auf dem Display noch zusätzlich den Luftdruck in hPa (Hektopascal) sowie die Luftfeuchtigkeit in % an.
Für die Schaltung verwende ich ein 0,96″ OLED-Display, welches du auf ebay.de bereits ab 2,95 € zzgl. Versandkosten beziehen kannst.
// Importieren der benötigten Bibliotheken #include <Wire.h> // für den BMP280 Sensor #include <Adafruit_BMP280.h> // für den AHT20 Sensor #include <Adafruit_AHTX0.h> // für das OLED-Display #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // das Display wird via 0x3C am I2C Port angesteuert #define SCREEN_ADDRESS 0x3C Adafruit_SSD1306 display(128, 32, &Wire, -1); //Objekt instanziieren vom Typ Adafruit_BMP280 Adafruit_BMP280 bmp; //Objekt instanziieren vom Typ Adafruit_AHTX0 Adafruit_AHTX0 aht; void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); // beginn der Kommunikation mit dem Display display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); // setzen der Textgröße display.setTextSize(1); // setzen der Schriftfare "weiß" display.setTextColor(SSD1306_WHITE); //beginn der Kommunikation mit dem BMP280 Sensor bmp.begin(); //Konfigurieren des BMP280 Sensors bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2, Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16, Adafruit_BMP280::STANDBY_MS_500); //beginn der Kommunikation mit dem AHT20 Sensor aht.begin(); } // Funktion zum schreiben einer Textzeile auf dem Display // lineIndex - der Index der Zeile // desc - Beschreibung zbsp. "Temperature" // value - der Wert zbsp. "18.56" // sign - die Einheit zbsp. "C" void drawText(int lineIndex, String desc, float value, String sign) { display.setCursor(3, lineIndex * 10); display.println(desc + String(value, 2) + sign); } void loop() { //lesen der Daten vom AHT20 Sensor sensors_event_t humidity, temp; aht.getEvent(&humidity, &temp); // leeren des Displays display.clearDisplay(); // anzeigen der Temperatur drawText(0, "Temperature:", bmp.readTemperature(), " C"); // anzeigen des Luftdrucks drawText(1, "Pressure:", bmp.readPressure()/100, " hPa"); // anzeigen der Luftfeuchtigkeit drawText(2, "Humidity:", humidity.relative_humidity, " % rH"); // absenden der Daten an das Display display.display(); // eine kleine Pause von 5 Sekunden delay(5000); }