Ther­mo­me­ter mit LED-Stick

Lese­zeit: 7 Minu­ten

Lösung
Seite als PDF

Ein DHT11, ein DHT22 oder ein BMP280 misst die Tem­pe­ra­tur und zeigt sie in Schrit­ten zu je ein Grad auf einem Neo­pi­xel-Stick an. Die gemes­se­ne Tem­pe­ra­tur wird auf ganz­zah­li­ge Wer­te gerundet.

Benö­tig­te Bauteile

  • DHT11/DHT22 oder BMP280
  • RGB LED-Stick mit 20 LEDs (Gro­ve-Anschluss)
  • Lei­tungs­dräh­te

Die Hard­ware

DHT11/DHT22

Der DHT11 und der DHT22 sind digi­ta­le Sen­so­ren, sie wer­den an einem digi­ta­len Pin angeschlossen.

Die Pin­be­le­gung kann sich von der hier gezeig­ten unter­schei­den. Ach­te auf die Beschrif­tung auf dem Modul!

LED-Stick

Der LED-Stick besteht aus meh­re­ren mit­ein­an­der ver­bun­de­nen RGB-LEDs. Jede besitzt einen eige­nen Con­trol­ler und kann ein­zeln ange­steu­ert wer­den. Der LED-Stick benö­tigt nur einen digi­ta­len Eingang. 

Wenn kein Gro­ve-Shield ver­wen­det wer­den kann, wer­den die Anschlüs­se mit männ­lich-männ­li­chen Kabeln verlängert.

RGB ist eine Mischung der Far­ben Rot, Grün und Blau. Jede Far­be kann von 0 bis 255 gesetzt wer­den, die Wer­te wer­den durch Kom­ma­ta getrennt.

 Hier fin­dest du einen Über­blick über die 🔗RGB-Farb­codes (exter­ner Link abge­ru­fen am 19.02.24).

BMP280

Der BMP280 wird in ver­schie­de­nen Bau­for­men mit unter­schied­li­cher Pin­be­le­gung angeboten. 

Bei einem BMP280 mit sechs Pins müs­sen SDO und CSB eben­falls an VCC (5V) ange­schlos­sen werden.

Quel­le: 🔗https://​sen​sor​kit​.joy​-it​.net/​d​e​/​s​e​n​s​o​r​s​/​k​y​-​052 (abge­ru­fen am 01.03.24)

Das Pro­gramm

Benö­tig­te Biblio­the­ken installieren

DHT11/DHT22

BMP280

Biblio­the­ken ein­bin­den und Varia­blen definieren

DHT

# include "DHT.h"
# include "Adafruit_NeoPixel.h"

# define RING 4

// Anzahl der LEDs → muss angepasst werden
# define AnzahlLED 20

// LEDRing -> Name des LED-Rings
Adafruit_NeoPixel LEDRing(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);

// Pin des DHT-Sensors
# define SENSOR_DHT 7

// Sensortyp festlegen
// DHT22 oder DHT11
# define SensorTyp DHT22

// Sensor DHT einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp);

BMP380

# include "Adafruit_BMP280.h"
# include "Adafruit_NeoPixel.h"

# define RING 4

// Anzahl der LEDs → muss angepasst werden
# define AnzahlLED 20

// LEDRing -> Name des LED-Rings
Adafruit_NeoPixel LEDRing(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);

// Name des Sensor
Adafruit_BMP280 bmp; 

Der set­up-Teil

DHT

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

  // DHT starten
  dht.begin();

  // setBrightness(0..255)
  LEDRing.setBrightness(200);

  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();
}

BMP280

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

  // BMP280 starten
  if (!bmp.begin()) Serial.println("BMP280 gestartet!");

  // setBrightness(0..255)
  LEDRing.setBrightness(200);

  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();
}

Der loop-Teil

DHT

void loop() 
{
  // Temperatur lesen
  float gemesseneTemperatur = dht.readTemperature();

  // gelesene Temperatur in String umwandeln
  String Temperatur = String(gemesseneTemperatur);

  // . durch , ersetzen
  Temperatur.replace(".", ",");

  // Ausgabe Serieller Monitor
  Serial.println("Temperatur: " + Temperatur + "°C");
  Serial.println("--------------------------------");

  // alle LEDs aus
  LEDRing.clear();

  /*
    es können nur ganzzahlige Werte berücksichtigt werden
    es sollen entsprechend der Skala die LEDs leuchten
    der Wert vor dem Komma entscheidet über die Anzahl der LEDs
  */
  if (gemesseneTemperatur >= 10 && gemesseneTemperatur < 11)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 1);
  if (gemesseneTemperatur >= 11 && gemesseneTemperatur < 12)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 2);
  if (gemesseneTemperatur >= 12 && gemesseneTemperatur < 13)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 3);
  if (gemesseneTemperatur >= 13 && gemesseneTemperatur < 14)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 4);
  if (gemesseneTemperatur >= 14 && gemesseneTemperatur < 15)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 5);
  if (gemesseneTemperatur >= 15 && gemesseneTemperatur < 16)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 6);
  if (gemesseneTemperatur >= 16 && gemesseneTemperatur < 17)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 7);
  if (gemesseneTemperatur >= 17 && gemesseneTemperatur < 18)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 8);
  if (gemesseneTemperatur >= 18 && gemesseneTemperatur < 19)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 9);
  if (gemesseneTemperatur >= 19 && gemesseneTemperatur < 20)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 10);
  if (gemesseneTemperatur >= 20 && gemesseneTemperatur < 21)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 11);
  if (gemesseneTemperatur >= 21 && gemesseneTemperatur < 22)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 12);
  if (gemesseneTemperatur >= 22 && gemesseneTemperatur < 23)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 13);
  if (gemesseneTemperatur >= 23 && gemesseneTemperatur < 24)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 14);
  if (gemesseneTemperatur >= 24 && gemesseneTemperatur < 25)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 15);
  if (gemesseneTemperatur >= 25 && gemesseneTemperatur < 26)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 16);
  if (gemesseneTemperatur >= 26 && gemesseneTemperatur < 27)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 17);
  if (gemesseneTemperatur >= 27 && gemesseneTemperatur < 28)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 18);
  if (gemesseneTemperatur >= 28 && gemesseneTemperatur < 29)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 19);
  if (gemesseneTemperatur >= 29 && gemesseneTemperatur < 30)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 20);

  LEDRing.show();

  delay(2000);  
}

BMP280

void loop() 
{
  float gemesseneTemperatur = bmp.readTemperature();

  // gelesene Temperatur in String umwandeln
  String Temperatur = String(gemesseneTemperatur);

  // . durch , ersetzen
  Temperatur.replace(".", ",");

  // Ausgabe Serieller Monitor
  Serial.println("Temperatur: " + Temperatur + "°C");
  Serial.println("--------------------------------");
  
    // alle LEDs aus
  LEDRing.clear();

  /*
    es können nur ganzzahlige Werte berücksichtigt werden
    es sollen entsprechend der Skala die LEDs leuchten
    der Wert vor dem Komma entscheidet über die Anzahl der LEDs
  */
  if (gemesseneTemperatur >= 10 && gemesseneTemperatur < 11)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 1);
  if (gemesseneTemperatur >= 11 && gemesseneTemperatur < 12)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 2);
  if (gemesseneTemperatur >= 12 && gemesseneTemperatur < 13)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 3);
  if (gemesseneTemperatur >= 13 && gemesseneTemperatur < 14)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 4);
  if (gemesseneTemperatur >= 14 && gemesseneTemperatur < 15)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 5);
  if (gemesseneTemperatur >= 15 && gemesseneTemperatur < 16)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 6);
  if (gemesseneTemperatur >= 16 && gemesseneTemperatur < 17)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 7);
  if (gemesseneTemperatur >= 17 && gemesseneTemperatur < 18)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 8);
  if (gemesseneTemperatur >= 18 && gemesseneTemperatur < 19)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 9);
  if (gemesseneTemperatur >= 19 && gemesseneTemperatur < 20)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 10);
  if (gemesseneTemperatur >= 20 && gemesseneTemperatur < 21)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 11);
  if (gemesseneTemperatur >= 21 && gemesseneTemperatur < 22)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 12);
  if (gemesseneTemperatur >= 22 && gemesseneTemperatur < 23)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 13);
  if (gemesseneTemperatur >= 23 && gemesseneTemperatur < 24)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 14);
  if (gemesseneTemperatur >= 24 && gemesseneTemperatur < 25)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 15);
  if (gemesseneTemperatur >= 25 && gemesseneTemperatur < 26)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 16);
  if (gemesseneTemperatur >= 26 && gemesseneTemperatur < 27)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 17);
  if (gemesseneTemperatur >= 27 && gemesseneTemperatur < 28)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 18);
  if (gemesseneTemperatur >= 28 && gemesseneTemperatur < 29)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 19);
  if (gemesseneTemperatur >= 29 && gemesseneTemperatur < 30)  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, 20);
  LEDRing.show();

  delay(2000);  
}