🌡️

Klimastation

Projekt P03 - Uhrzeit + Temperatur + Humidity

Plus
TM1637
DHT22
NeoPixel
1

Projektübersicht

Visuelle Klimaanzeige

  • TM1637 Display - Echtzeit-Uhr (HH:MM)
  • DHT22 Sensor - Temperatur und Luftfeuchtigkeit
  • NeoPixel-Streifen 1 - Temperatur-Balkenanzeige
  • NeoPixel-Streifen 2 - Humidity-Balkenanzeige

Konzept

Intuitive Farbskala: Rot (zu niedrig) → Gelb → Grün (optimal) → Gelb → Rot (zu hoch)

2

Komponenten

Hardware

  • TM1637 - 4-Digit 7-Segment Display (CLK: D2, DIO: D3)
  • DS1307 - Echtzeituhr mit I2C (A4, A5)
  • DHT22 - Temperatur/Humidity Sensor (D4)
  • 10x NeoPixel - Temperatur-Anzeige (D5)
  • 10x NeoPixel - Humidity-Anzeige (D6)
3

NeoPixel-Farbskala

Temperatur (15°C - 30°C)

🔴🟠🟡🟢🟢🟢🟢🟡🟠🔴
15° 17° 19° 21° 23° 25° 27° 29° (je 1.5°C/LED)

Luftfeuchtigkeit (30% - 70%)

🔴🟠🟡🟢🟢🟢🟢🟡🟠🔴
30% 34% 38% 42% 50% 54% 58% 62% (je 4%/LED)

Code - Initialisierung

#include <TM1637Display.h>
#include <RTClib.h>
#include <DHT.h>
#include <FastLED.h>

// TM1637 Display
const int PIN_CLK = 2;
const int PIN_DIO = 3;
TM1637Display display(PIN_CLK, PIN_DIO);

// NeoPixel Streifen
const int NUM_LEDS = 10;
CRGB ledsTemp[NUM_LEDS];   // Pin 5
CRGB ledsHumid[NUM_LEDS];  // Pin 6

// Sensoren
DHT dht(4, DHT22);
RTC_DS1307 rtc;

Code - Farbberechnung

// Farbe basierend auf Position (0-9) in der Skala
CRGB getScaleColor(int position) {
    // Mitte (4,5) = Grün, Ränder (0,9) = Rot
    int distFromCenter = abs(position - 4);

    switch (distFromCenter) {
        case 0: return CRGB::Green;     // Optimal
        case 1: return CRGB::GreenYellow;
        case 2: return CRGB::Yellow;
        case 3: return CRGB::Orange;
        default: return CRGB::Red;    // Zu extrem
    }
}

// Wert auf Position (0-9) mappen
int mapToScale(float value, float min, float max) {
    int pos = map(value, min, max, 0, 9);
    return constrain(pos, 0, 9);
}

Code - LED-Anzeige

void updateTempLeds(float temp) {
    int activePos = mapToScale(temp, 15.0, 30.0);

    for (int i = 0; i < NUM_LEDS; i++) {
        if (i <= activePos) {
            ledsTemp[i] = getScaleColor(i);
        } else {
            ledsTemp[i] = CRGB::Black;
        }
    }
    FastLED.show();
}

void updateHumidLeds(float humid) {
    int activePos = mapToScale(humid, 30.0, 70.0);

    for (int i = 0; i < NUM_LEDS; i++) {
        if (i <= activePos) {
            ledsHumid[i] = getScaleColor(i);
        } else {
            ledsHumid[i] = CRGB::Black;
        }
    }
    FastLED.show();
}

Code - Hauptschleife

void loop() {
    // Uhrzeit auf TM1637 anzeigen
    DateTime now = rtc.now();
    int displayTime = now.hour() * 100 + now.minute();
    display.showNumberDecEx(displayTime, 0b01000000,
                            true);  // Doppelpunkt an

    // Alle 2 Sekunden Sensor lesen
    static unsigned long lastRead = 0;
    if (millis() - lastRead > 2000) {
        lastRead = millis();

        float temp = dht.readTemperature();
        float humid = dht.readHumidity();

        if (!isnan(temp) && !isnan(humid)) {
            updateTempLeds(temp);
            updateHumidLeds(humid);
        }
    }
    delay(500);  // Doppelpunkt-Blinken
}
4

TM1637 Display

Vorteile gegenüber LCD

  • Nur 2 Pins - CLK und DIO
  • Gut lesbar - Große 7-Segment-Ziffern
  • Doppelpunkt - Ideal für Uhrzeitanzeige
  • Einfache Library - TM1637Display.h

Wichtige Funktionen

showNumberDec(num, leading_zeros)
showNumberDecEx(num, dots, leading_zeros)

5

Wokwi-Simulation

Komponenten im Simulator

  • wokwi-tm1637-7segment (4 Digits)
  • wokwi-ds1307 (RTC mit I2C)
  • wokwi-dht22 (Temperatur/Humidity)
  • 2x 10 wokwi-neopixel (verkabelt)

Testen

DHT22 im Simulator anklicken um Werte zu ändern!

🌡️

Geschafft!

Du hast eine visuelle Klimastation gebaut!

Erweiterungsideen

Datum-Anzeige, Min/Max-Speicherung, Alarm bei Extremwerten

← →
1 / 11