Slimme woning in de les met Arduino

FunduinoLaatst bijgewerkt op

Das Smart Home Education System – Aufbau, 16 Module und Home Assistant

Willkommen beim Funduino Smart Home Education System. Dieses Lern- und Experimentierset richtet sich an technikbegeisterte Lernende, Lehrkräfte und Ausbilder, die Smart-Home-Technik, Sensorik, Aktorik und das Internet der Dinge praxisnah vermitteln möchten.

An Bord sind Sensoren für Temperatur, Luftfeuchtigkeit, Licht, Bewegung, Flüssigkeit, Gas und Entfernung – dazu Aktoren wie Servo, Lüfter, LEDs, OLED-Display, WS2812-Beleuchtung und Lautsprecher, gesteuert von einem ESP32 mit WLAN und Bluetooth.

Diese Anleitung führt dich durch den Aufbau, die Einrichtung der Arduino IDE und alle 16 Module einzeln – jedes mit eigenem Beispielsketch. Am Ende kannst du Sensorwerte auswerten, Aktoren ansteuern und eigene Automatisierungen bauen. Zum Schluss zeigen wir, wie du das ganze System in Home Assistant einbindest.

Modellwerkstatt des Funduino Smart Home Education Systems
Das Funduino Smart Home Education System

Hardware-Übersicht

Das Funduino Smarthome-System besteht aus einer Modellwerkstatt, die um die Elektronik-Platine ergänzt wird – so bekommt jedes Projekt einen Alltagsbezug.

Auf der Platine sitzen diese Komponenten:

  • Nr. 1: LED rot – verbunden mit Pin 25
  • Nr. 2: LED grün – verbunden mit Pin 26
  • Nr. 3: Taster – verbunden mit Pin 23
  • Nr. 4: Buzzer (Piezo-Lautsprecher) – verbunden mit Pin 19
  • Nr. 5: Potentiometer – verbunden mit Pin 39
  • Nr. 6: Ultraschall-Entfernungssensor – verbunden mit Pin 17 und Pin 18
  • Nr. 7: OLED-Display mit SSD1306-Chip – verbunden mit I²C, also SCL 22 und SDA 21
  • Nr. 8: Lüfter – verbunden mit Pin 4
  • Nr. 9: IR-Empfänger VS1838 für Fernbedienungen – verbunden mit Pin 16
  • Nr. 10: Innenbeleuchtung WS2812 mit 8 LEDs – verbunden mit Pin 15
  • Nr. 11: Temperatur- und Luftfeuchtigkeitssensor DHT11 – verbunden mit Pin 14
  • Nr. 12: Lichtstärkesensor LDR – verbunden mit Pin 35
  • Nr. 13: Bewegungsmelder PIR – verbunden mit Pin 13
  • Nr. 14: Servo für die automatische Tür – verbunden mit Pin 12
  • Nr. 15: Gassensor MQ135 – verbunden mit Pin 34
  • Nr. 16: Feuchtigkeitssensor – verbunden mit Pin 36

Der Lüfter lässt sich zusätzlich per Hand über den Taster auf der Vorderseite einschalten.

Vorderseite der Smart-Home-Platine mit nummerierten Bauteilen
Platinenansicht vorne
Rückseite der Smart-Home-Platine mit nummerierten Bauteilen
Platinenansicht hinten
1 / 2

Aufbau und Vorbereitung

Der Aufbau besteht aus zwei Abschnitten.

Zuerst baust du die Modellwerkstatt zusammen. Das geht schnell und ist selbsterklärend.

Im zweiten Schritt ergänzt du die Anbauteile der Platine: Auf der Rückseite steckst du Servo, WS2812-LED-Stab, MQ135-Sensor, Lüfter und Feuchtigkeitssensor ein.

Wichtige Hinweise dazu:

  • Servo: Er wird mit dem schwarzen Kunststoffhalter auf der Rückseite montiert. Nimm dafür die zwei gleich großen Schräubchen, die dem Servo beiliegen. Sie werden von vorn durch die Platine gesteckt und in den Kunststoffhalter geschraubt.
  • Lüfter: Er wird von hinten mit den beiliegenden weißen Nylonschrauben und -muttern per Hand befestigt. Der runde Aufkleber des Lüfters zeigt nach innen.

Danach baust du die Platine in die rechte Seitenwand ein. Nimm zunächst die Acrylglasplatten aus dem Modell heraus, hebe die obere schwarze Strebe mit den kleinen Scheinwerfern an und setze die Platine so ein, dass sie an allen Seiten fixiert ist. Anschließend kommen die Acrylglasplatten wieder hinein.

Setze die Tür noch nicht ein! Sie wird erst montiert, wenn der Servo programmiert und auf 90 Grad gestellt ist – sonst bewegt sie sich in einem beliebigen Bereich oder stößt an den Seiten an.

Arduino IDE für den ESP32 einrichten

Auf dem Smarthome sitzt ein ESP32. Programmieren lässt er sich auf viele Arten – in dieser Anleitung verwenden wir durchgehend die Arduino IDE.

1. Arduino IDE installieren

Lade die Arduino IDE von arduino.cc herunter und installiere sie wie gewohnt.

2. ESP32-Unterstützung hinzufügen

Damit die IDE den ESP32 kennt, trägst du unter Datei › Voreinstellungen im Feld „Zusätzliche Boardverwalter-URLs“ diese Adresse ein:

https://dl.espressif.com/dl/package_esp32_index.json

3. ESP32-Boardpaket installieren

Gehe auf Werkzeuge › Board › Boardverwalter, gib im Suchfeld „ESP32“ ein, wähle „ESP32 by Espressif Systems“ und klicke auf Installieren.

4. Board und Port auswählen

Unter Werkzeuge › Board wählst du „ESP32 Dev Module“, unter Werkzeuge › Port den Anschluss, an dem dein ESP32 hängt (zum Beispiel COM3). Der richtige Port ist meist der zuletzt hinzugekommene Eintrag.

5. Aufbau eines Sketches

Ein Arduino-Programm heißt Sketch und hat zwei Bereiche: In setup() wird einmalig vorbereitet, in loop() läuft deine Hauptlogik immer wieder.

Wichtig beim Hochladen: Nach dem Klick auf den Upload-Pfeil wird der Sketch zuerst kompiliert, das dauert einige Sekunden. Sobald der Upload startet, musst du am ESP32 die Taste „Boot“ drücken – nur in diesem Modus lässt sich sein Speicher beschreiben. Ohne Tastendruck bricht der Vorgang mit einer Fehlermeldung ab. Das gilt für jeden Sketch in dieser Anleitung.

Modul 1: Rote LED

Stecke den ESP32 auf die Platine und schließe das USB-Kabel an. Auf der Platine ist er bereits mit allen Modulen verbunden – du musst nichts verkabeln.

Für den Anfang nimmst du die rote LED an Pin 25 und lässt sie im Sekundentakt blinken. Das ist zugleich die Probe, ob Board, Port und Upload funktionieren.

Rote LED auf der Smart-Home-Platine
Die rote LED an Pin 25
Rote LED blinken lassen
// Auf der Platine ist die rote LED mit dem digitalen Pin 25 des ESP32 verbunden.
int ledPin = 25;

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  digitalWrite(ledPin, HIGH);  // LED an
  delay(1000);                 // 1 Sekunde warten
  digitalWrite(ledPin, LOW);   // LED aus
  delay(1000);                 // 1 Sekunde warten
}

Modul 2: Grüne LED

Die grüne LED programmierst du genauso wie die rote. Im Sketch änderst du lediglich den Ausgangspin: Die grüne LED hängt an Pin 26, nicht an Pin 25.

Grüne LED auf der Smart-Home-Platine
Die grüne LED an Pin 26
Grüne LED blinken lassen
// Die grüne LED hängt an Pin 26 statt an Pin 25.
int ledPin = 26;

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  digitalWrite(ledPin, HIGH);  // LED an
  delay(1000);                 // 1 Sekunde warten
  digitalWrite(ledPin, LOW);   // LED aus
  delay(1000);                 // 1 Sekunde warten
}

Modul 3: Taster

In diesem Beispiel schaltet der Taster beide Leuchtdioden gleichzeitig für 5 Sekunden ein.

Ein Tastendruck leitet eine Spannung an den Eingangspin 23 des ESP32 weiter. Parallel dazu sitzt in der Leitung ein Pulldown-Widerstand (unterhalb des Tasters). Er sorgt dafür, dass der Pin wieder auf GND-Niveau gezogen wird, sobald du den Taster loslässt.

Falls der Taster nicht wie erwartet reagiert: Der Sketch setzt den Pin mit pinMode(BUTTON_PIN, INPUT_PULLUP). Bei einem externen Pulldown-Widerstand genügt pinMode(BUTTON_PIN, INPUT) – probiere es in dem Fall damit.

Taster auf der Smart-Home-Platine
Der Taster an Pin 23
Taster: beide LEDs für 5 Sekunden einschalten
#define LED_RED    25
#define LED_GREEN  26
#define BUTTON_PIN 23

void setup()
{
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_GREEN, LOW);
}

void loop()
{
  if (digitalRead(BUTTON_PIN) == HIGH)  // Wenn der Taster gedrückt ist ...
  {
    digitalWrite(LED_RED, HIGH);    // rote LED einschalten
    digitalWrite(LED_GREEN, HIGH);  // grüne LED einschalten
    delay(5000);                    // 5 Sekunden an lassen
    digitalWrite(LED_RED, LOW);     // rote LED ausschalten
    digitalWrite(LED_GREEN, LOW);   // grüne LED ausschalten
  }
}

Modul 4: Buzzer

Den Buzzer auf der Platine steuerst du genauso an wie eine Leuchtdiode: Er braucht nur eine Spannung und erzeugt dann einen Ton. Dieser Ton hat immer dieselbe Tonhöhe und lässt sich – anders als bei einem Lautsprecher – nicht verändern.

Der Buzzer ist mit Pin 19 verbunden.

Piezo-Buzzer auf der Smart-Home-Platine
Der Piezo-Buzzer an Pin 19
Buzzer: Ton im Wechsel ein- und ausschalten
int buzzer = 19;

void setup()
{
  pinMode(buzzer, OUTPUT);
}

void loop()
{
  digitalWrite(buzzer, HIGH);  // Ton an
  delay(1000);                 // 1 Sekunde warten
  digitalWrite(buzzer, LOW);   // Ton aus
  delay(5000);                 // 5 Sekunden warten
}

Modul 5: Potentiometer

Das Potentiometer ist ein Drehregler. Je nach Stellung gelangt eine kleinere oder größere Spannung an Pin 39. Im Sketch rechnest du den Wert mit dem map-Befehl um und gibst ihn an die rote LED weiter – sie leuchtet dann heller oder dunkler.

Beachte den Wertebereich: Der ESP32 liest analoge Werte mit 12 Bit ein, die Messwerte liegen also zwischen 0 und 4095 – nicht zwischen 0 und 1023 wie beim Arduino UNO.

Potentiometer auf der Smart-Home-Platine
Das Potentiometer an Pin 39
Potentiometer: Helligkeit der roten LED regeln
#define LED_RED 25
#define POT_PIN 39  // Poti an ADC 39

void setup()
{
  pinMode(LED_RED, OUTPUT);
}

void loop()
{
  // Der analoge Wert wird unter der Variablen v gespeichert.
  // Die Messwerte liegen zwischen 0 und 4095.
  int v = analogRead(POT_PIN);

  // Der map-Befehl wandelt die Werte von 0 bis 4095 in Werte von 0 bis 255 um.
  int duty = map(v, 0, 4095, 0, 255);

  // Am Pin der roten LED wird ein Wert zwischen 0 und 255 ausgegeben.
  // Je nach Stellung des Potentiometers leuchtet sie heller oder dunkler.
  analogWrite(LED_RED, duty);
}

Modul 6: Ultraschall-Entfernungsmessung

Der Sensor misst Entfernungen, indem er einen Ultraschall-Impuls sendet (TRIG) und die Zeit bis zum Echo misst (ECHO). Aus der Laufzeit ergibt sich der Abstand in Zentimetern.

Die Anschlüsse auf der Platine:

  • TRIG – GPIO 18
  • ECHO – GPIO 17
  • Buzzer – GPIO 19

Der Sketch sendet einen 10-Mikrosekunden-Impuls, misst mit pulseIn() die Echozeit, rechnet sie grob in Zentimeter um (cm = µs / 58) und lässt den Buzzer im Takt piepen, sobald etwas näher als 20 Zentimeter ist. So bekommst du eine einfache akustische Abstandswarnung für den Nahbereich.

Ultraschall-Entfernungssensor auf der Smart-Home-Platine
Der Ultraschallsensor an den Pins 17 und 18
Ultraschall: Abstandswarnung mit dem Buzzer
#define TRIG_PIN 18
#define ECHO_PIN 17
#define BUZZER   19

void setup()
{
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);
}

void loop()
{
  // Messimpuls senden
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // Echo messen: Zeit, bis die Schallwelle zurückgeworfen wurde
  long messzeit = pulseIn(ECHO_PIN, HIGH);
  long cm = messzeit / 58;

  // Buzzer steuern
  if (cm < 20)
  {
    digitalWrite(BUZZER, HIGH);
    delay(150);
    digitalWrite(BUZZER, LOW);
    delay(150);
  }
  else
  {
    digitalWrite(BUZZER, LOW);
    delay(50);
  }
}

Modul 7: OLED-Display

Dieses Beispiel startet das SSD1306-OLED (I²C, Adresse 0x3C) und zeigt den Text „Funduino“ an. Die Standard-I²C-Pins des ESP32 sind SDA 21 und SCL 22.

Für das Display brauchst du zum ersten Mal eine Bibliothek: SSD1306Ascii.

  • Arduino IDE öffnen
  • Werkzeuge › Bibliotheken verwalten (oder Sketch › Bibliothek einbinden › Bibliotheken verwalten)
  • Im Suchfeld SSD1306Ascii eingeben
  • Den Eintrag von Bill Greiman auswählen und installieren

Weitere Beispiele findest du danach unter Datei › Beispiele › SSD1306Ascii. Dort kannst du andere Schriftarten und Schriftgrößen ausprobieren – und es gibt auch grafische Elemente, die sich auf dem Display darstellen lassen.

OLED-Display auf der Smart-Home-Platine
Das OLED-Display am I²C-Bus
OLED-Display: Text anzeigen
#include <Wire.h>
#include <SSD1306Ascii.h>
#include <SSD1306AsciiWire.h>

SSD1306AsciiWire oled;

void setup()
{
  Wire.begin();                       // ESP32: SDA = 21, SCL = 22
  oled.begin(&Adafruit128x64, 0x3C);  // Display starten (Adresse 0x3C)
  oled.setFont(System5x7);            // einfache Schrift
  oled.clear();
  oled.setCursor(0, 0);
  oled.println("Funduino");           // Text ausgeben
}

void loop()
{
  // nichts weiter nötig
}

Modul 8: Lüfter

Dieser Sketch schaltet den Lüfter an Pin 4 abwechselnd 5 Sekunden ein und 5 Sekunden aus.

Technischer Hintergrund: Der Lüfter hängt nicht direkt am Ausgangspin des ESP32, denn dessen digitale Ausgänge liefern nur sehr wenig Strom. Pin 4 steuert stattdessen einen Transistor an, und der schaltet die 3,3-Volt-Versorgung auf den Lüfter durch.

Trotz dieser Leistungsschaltung ist ein Lüfter mit vergleichsweise geringer Leistung verbaut. Weil die Werkstatt nur ein kleines Volumen hat, reicht der Luftstrom trotzdem, um den Innenraum in kürzester Zeit mit Außenluft zu füllen.

Bei der ersten Verwendung müssen sich neue Lüfter ein wenig einlaufen, damit sich das Schmiermittel im Kugellager gleichmäßig verteilt. Es kann deshalb nötig sein, den Lüfter beim ersten Betrieb mit dem Finger kurz anzuschieben.

Lüfter in der Vorderseite der Modellwerkstatt
Der Lüfter an Pin 4
Lüfter: 5 Sekunden ein, 5 Sekunden aus
#define FAN_PIN 4

void setup()
{
  pinMode(FAN_PIN, OUTPUT);
}

void loop()
{
  digitalWrite(FAN_PIN, HIGH);  // EIN
  delay(5000);
  digitalWrite(FAN_PIN, LOW);   // AUS
  delay(5000);
}

Modul 9: Infrarot-Fernbedienung

Mit dem VS1838 liest du die Codes beliebiger Infrarot-Fernbedienungen ein. Das Modul liefert bereits demodulierte Signale. Der Sketch verwendet die Bibliothek IRremote von Armin Joachimsmeyer – installiere sie vorher über den Bibliotheksmanager.

Was ist der serielle Monitor?

Der serielle Monitor ist ein Fenster in der Arduino IDE, das Text über die USB-Verbindung vom Mikrocontroller anzeigt. Alles, was du mit Serial.print() sendest, erscheint dort – ideal, um IR-Codes oder Sensordaten zu sehen. Über das Eingabefeld unten kannst du auch Text zurück an den ESP32 schicken, das brauchst du hier aber noch nicht.

So öffnest du ihn: rechts oben auf das Lupensymbol klicken oder Werkzeuge › Serieller Monitor. Stelle unten rechts 115200 Baud ein – das muss zum Serial.begin(115200) im Sketch passen.

Fehlersuche: Erscheinen nur Hieroglyphen, stimmt die Baudrate nicht. Erscheint gar nichts, prüfe den Port und ob das Board wirklich verbunden ist – notfalls hilft ein Reset. Und schließe den Monitor vor dem Hochladen, manche Systeme blockieren sonst den Port.

Infrarot-Empfänger VS1838 auf der Smart-Home-Platine
Der Infrarot-Empfänger VS1838 an Pin 16
Infrarot: Tastencodes der Fernbedienung auslesen
#include <IRremote.hpp>

#define IR_PIN 16  // VS1838 Signal an GPIO 16

void setup()
{
  Serial.begin(115200);
  delay(200);
  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);  // IR-Empfang starten
  Serial.println("IR-Ready: Druecke eine Taste auf der Fernbedienung.");
}

void loop()
{
  if (IrReceiver.decode())
  {
    // Kurzinfo und Rohcode in HEX ausgeben
    IrReceiver.printIRResultShort(&Serial);
    Serial.print("  Raw: 0x");
    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);

    // Fuer das naechste Signal bereit machen
    IrReceiver.resume();
  }
}

Modul 10: WS2812-LED-Stab

WS2812-LEDs sind adressierbare RGB-LEDs mit eingebautem Controller. Alle acht Pixel hängen hintereinander an einer einzigen Datenleitung, die mit Pin 15 des ESP32 verbunden ist.

Warum reicht eine Leitung? Jede LED liest die ersten 24 Bit (Rot, Grün, Blau) aus dem Datenstrom, behält sie für sich und reicht den Rest an die nächste LED weiter – eine sogenannte Daisy-Chain. So steuert der Mikrocontroller alle Pixel nacheinander mit nur einem Pin.

Für diesen Sketch brauchst du wieder eine Bibliothek: Adafruit NeoPixel.

WS2812-LED-Stab als Innenbeleuchtung der Modellwerkstatt
Der WS2812-LED-Stab mit 8 Pixeln an Pin 15
WS2812: acht Pixel in acht Farben
#include <Adafruit_NeoPixel.h>

#define WS_PIN    15
#define NUM_LEDS  8

Adafruit_NeoPixel strip(NUM_LEDS, WS_PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  strip.begin();
  strip.setBrightness(80);  // optional
}

void loop()
{
  strip.setPixelColor(0, strip.Color(255,   0,   0));  // Rot
  strip.setPixelColor(1, strip.Color(  0, 255,   0));  // Grün
  strip.setPixelColor(2, strip.Color(  0,   0, 255));  // Blau
  strip.setPixelColor(3, strip.Color(255, 255,   0));  // Gelb
  strip.setPixelColor(4, strip.Color(  0, 255, 255));  // Cyan
  strip.setPixelColor(5, strip.Color(255,   0, 255));  // Magenta
  strip.setPixelColor(6, strip.Color(255, 255, 255));  // Weiß
  strip.setPixelColor(7, strip.Color(255, 128,   0));  // Orange

  strip.show();  // Farben anzeigen
}

Modul 11: Temperatur und Luftfeuchtigkeit mit dem DHT11

Der DHT11 misst Temperatur und Luftfeuchtigkeit und liefert beide Werte digital über eine einzige Datenleitung. Auf der Platine hängt er an Pin 14.

Benötigte Bibliotheken über Werkzeuge › Bibliotheken verwalten:

  • DHT sensor library (von Adafruit)
  • Adafruit Unified Sensor (wird als Abhängigkeit mitinstalliert)

Der erste Sketch gibt die Messwerte im seriellen Monitor aus. Der zweite zeigt sie stattdessen auf dem OLED-Display an – damit kombinierst du zum ersten Mal zwei Module miteinander.

Temperatur- und Luftfeuchtigkeitssensor DHT11 auf der Smart-Home-Platine
Der DHT11 an Pin 14
DHT11: Temperatur und Luftfeuchtigkeit im seriellen Monitor
#include <DHT.h>

#define DHTPIN  14      // Datenpin des DHT am ESP32
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Serial.begin(115200);
  dht.begin();
  Serial.println("DHT gestartet. Lese Temperatur und Feuchte ...");
}

void loop()
{
  float hum  = dht.readHumidity();
  float temp = dht.readTemperature();  // in Grad Celsius

  if (isnan(hum) || isnan(temp))
  {
    Serial.println("Fehler beim Lesen vom DHT!");
  }
  else
  {
    Serial.print("Temp: ");
    Serial.print(temp, 1);  // Die 1 bedeutet: eine Nachkommastelle
    Serial.print(" °C   Feuchte: ");
    Serial.print(hum, 1);
    Serial.println(" %");
  }

  delay(2000);  // Der DHT11 liefert höchstens etwa alle 2 Sekunden neue Werte.
}
DHT11: Messwerte auf dem OLED-Display anzeigen
#include <Wire.h>
#include <SSD1306Ascii.h>
#include <SSD1306AsciiWire.h>
#include <DHT.h>

#define DHTPIN  14
#define DHTTYPE DHT11  // bei Bedarf zu DHT22 ändern

SSD1306AsciiWire oled;
DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Wire.begin();                       // ESP32: SDA = 21, SCL = 22
  oled.begin(&Adafruit128x64, 0x3C);  // OLED-Adresse 0x3C
  oled.setFont(System5x7);
  oled.clear();
  oled.println("DHT -> OLED");
  dht.begin();
}

void loop()
{
  float hum  = dht.readHumidity();
  float temp = dht.readTemperature();  // in Grad Celsius

  oled.clear();
  oled.setCursor(0, 0);

  if (isnan(hum) || isnan(temp))
  {
    oled.println("Fehler beim Lesen!");
  }
  else
  {
    oled.println("Funduino");
    oled.setCursor(0, 2);
    oled.print("Temp: ");
    oled.print(temp, 1);
    oled.println(" C");
    oled.setCursor(0, 3);
    oled.print("Feuchte: ");
    oled.print(hum, 1);
    oled.println(" %");
  }

  delay(2000);
}

Modul 12: Lichtstärke mit dem LDR

Ein LDR (Fotowiderstand) ändert seinen Widerstand mit der Helligkeit: hell bedeutet kleiner Widerstand, dunkel bedeutet großer Widerstand. Zusammen mit einem festen Widerstand, der schon auf der Platine sitzt, bildet er einen Spannungsteiler. An Pin 35 liegt dadurch eine messbare Spannung zwischen 0 und 3,3 Volt an.

Halte während der Messung einfach den Finger über den Sensor – die Messwerte ändern sich deutlich. Später kannst du damit automatisch die WS2812-Beleuchtung einschalten.

Fotowiderstand auf der Smart-Home-Platine
Der Lichtstärkesensor LDR an Pin 35
LDR: Helligkeit messen
#define LDR_PIN 35  // Pin 35 am ESP32

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  // Unter raw wird der rohe Messwert als Zahl zwischen 0 und 4095 gespeichert.
  int raw = analogRead(LDR_PIN);

  // Der map-Befehl wandelt den Wert in einen prozentualen Wert um.
  int pct = map(raw, 0, 4095, 0, 100);

  Serial.print("LDR raw: ");
  Serial.print(raw);
  Serial.print("   Helligkeit: ");
  Serial.print(pct);
  Serial.println(" %");

  delay(200);
}

Modul 13: Bewegungsmelder PIR SR602

Ein PIR-Sensor (Passive Infrared) wie der SR602 erkennt schnelle Änderungen der Wärmestrahlung in seinem Sichtfeld – etwa wenn jemand vorbeigeht. Im Inneren sitzen pyroelektrische Elemente hinter einer Fresnel-Linse. Erkennt der Sensor eine Bewegung, setzt er seinen Ausgang auf HIGH und hält ihn kurz dort.

Im Sketch baust du daraus eine kleine Alarmanlage: Erkennt der Sensor eine Bewegung, leuchtet die rote LED.

PIR-Bewegungsmelder auf der Smart-Home-Platine
Der Bewegungsmelder SR602 an Pin 13
Bewegungsmelder: rote LED bei Bewegung
#define PIR_PIN 13
#define LED_RED 25

void setup()
{
  pinMode(PIR_PIN, INPUT);  // Der SR602 liefert ein aktives HIGH.
  pinMode(LED_RED, OUTPUT);
  digitalWrite(LED_RED, LOW);
}

void loop()
{
  int motion = digitalRead(PIR_PIN);

  if (motion == HIGH)
  {
    digitalWrite(LED_RED, HIGH);  // Alarm: Bewegung erkannt
  }
  else
  {
    digitalWrite(LED_RED, LOW);   // keine Bewegung
  }
}

Modul 14: Servo und automatische Tür

Ein Servo ist ein kleiner Stellmotor mit Getriebe und Positionsrückmeldung. Die Zielposition gibst du per Steuersignal vor. Anders als ein gewöhnlicher Motor dreht sich ein Servo nicht im Kreis, sondern bewegt sich nur in einem Bereich von etwa 180 Grad.

Im Smarthome öffnet der Servo die Eingangstür. Später kannst du dafür mehrere Module kombinieren: Die Tür öffnet zum Beispiel auf einen Tastendruck oder sobald der Ultraschallsensor jemanden vor dem Eingang erkennt.

Der Servo wird mit 3,3 Volt versorgt und kann wie alle Servos kurzzeitig viel Strom ziehen. Es kann deshalb sein, dass die LEDs flackern, während er sich bewegt.

Die Sache mit der Tür: Sie wird erst jetzt eingebaut. Der Servo muss vorher elektronisch in eine passende Stellung gefahren werden, damit sich die Tür später im richtigen Bereich bewegt und nicht an den Seiten anstößt. Stelle den Servo auf 90 Grad, bevor du die Tür montierst.

Servomotor für die Tür der Modellwerkstatt
Der Servo für die automatische Tür an Pin 12
Servo: Positionen anfahren
#include <ESP32Servo.h>

#define SERVO_PIN 12

Servo servo;

void setup()
{
  servo.attach(SERVO_PIN);
}

void loop()
{
  servo.write(0);    delay(1000);  // 0 Grad
  servo.write(90);   delay(1000);  // 90 Grad
  servo.write(180);  delay(1000);  // 180 Grad
  servo.write(90);   delay(1000);  // zurück auf 90 Grad
}

Modul 15: Gassensor MQ135

Der MQ135 ist ein gassensitiver Widerstand mit Heizer. Deshalb wird er warm und hängt nicht an der 3,3-Volt-Leitung, sondern an der 5-Volt-Versorgung des USB-Kabels – er braucht etwas mehr Leistung. Gase wie CO₂, Ammoniak oder Alkohole verändern seinen Widerstand. Auf der Platine bildet er mit einem Lastwiderstand einen Spannungsteiler, dessen Spannung du an Pin 34 auslesen kannst.

Anwendungsbeispiel im Smarthome: In der Werkstatt soll der Sensor austretende Gase erkennen – etwa ausgelaufenes Benzin, Gas eines Fahrzeugs mit Gasantrieb oder eines Schweißbrenners. Simulieren lässt sich das mit ganz geringen Mengen Gas aus einem Feuerzeug. Es reicht, das Gas zwei Sekunden lang mit dem Lüfter ins Innere zu leiten – den Lüfter kannst du dafür per Taster von Hand einschalten.

Aufwärmzeit: Der Sensor braucht ein paar Minuten, bis er aufgeheizt ist und sich die Messwerte stabilisieren. Für eine grobe Tendenz funktioniert er aber schon direkt nach dem Einschalten. Die Werte sind ohnehin relativ zu verstehen – exakte Angaben bräuchten eine Kalibrierung samt Temperatur- und Feuchtekorrektur, und das ist für diesen Modellzweck nicht vorgesehen.

Gassensor MQ135 auf der Smart-Home-Platine
Der Gassensor MQ135 an Pin 34
MQ135: Gaswert im seriellen Monitor
#define MQ135_PIN 34

int messwert = 0;
int prozent = 0;

void setup()
{
  Serial.begin(115200);
  delay(200);
  Serial.println("MQ135 Start - bitte einige Minuten aufwaermen lassen");
}

void loop()
{
  messwert = analogRead(MQ135_PIN);

  // grobe Skalierung auf 0 bis 100 Prozent - nur als Tendenz!
  prozent = map(messwert, 0, 4095, 0, 100);

  Serial.print("MQ135 messwert: ");
  Serial.print(messwert);
  Serial.print("   Tendenz: ");
  Serial.print(prozent);
  Serial.println(" %");

  delay(500);
}

Modul 16: Tropfensensor

Die Sensorplatine hat freiliegende Leiterbahnen. Trifft Feuchtigkeit darauf, leitet sie einen winzigen Strom zwischen den Bahnen, und der Widerstand sinkt. Das Modul gibt dann an seinem Signalausgang eine zur Nässe proportionale Spannung aus und leitet sie an Pin 36 weiter.

Anwendungsbeispiel im Smarthome: Der Sensor erkennt, ob auf dem Boden der Werkstatt Flüssigkeit steht – ob also etwas ausgelaufen oder sogar ein Rohr gebrochen ist.

Zum Testen genügt ein leicht angefeuchteter Finger auf dem Sensor. Der Sketch zeigt den Messwert im seriellen Monitor an: Bei geringer Feuchtigkeit leuchtet die grüne LED, bei hoher die rote.

Feuchtigkeitssensor mit freiliegenden Leiterbahnen
Der Tropfensensor an Pin 36
Tropfensensor: Nässe messen und LEDs schalten
#define Tropfen_PIN 36  // Tropfensensor, analog
#define LED_ROT     25
#define LED_GRUEN   26

void setup()
{
  Serial.begin(115200);
  pinMode(LED_ROT, OUTPUT);
  pinMode(LED_GRUEN, OUTPUT);
}

void loop()
{
  int raw = analogRead(Tropfen_PIN);        // 0 bis 4095
  int Prozent = map(raw, 0, 4095, 0, 100);  // grobe Naesse in Prozent

  // LEDs schalten
  if (raw > 100)  // Schwellwert
  {
    digitalWrite(LED_ROT, HIGH);
    digitalWrite(LED_GRUEN, LOW);
  }
  else
  {
    digitalWrite(LED_ROT, LOW);
    digitalWrite(LED_GRUEN, HIGH);
  }

  // Ausgabe
  Serial.print("RAW: ");
  Serial.print(raw);
  Serial.print("   Naesse in Prozent: ");
  Serial.print(Prozent);
  Serial.println(" %");

  delay(200);
}

Einbindung in Home Assistant

Dieser Abschnitt setzt Vorwissen mit Home Assistant voraus. Er zeigt kompakt, wie du den ESP32 des Smart-Home-Moduls mit allen Sensoren und Aktoren einbindest.

1. ESPHome installieren – In Home Assistant unter Einstellungen › Add-ons › Add-on Store das Add-on ESPHome installieren, öffnen und starten. Danach erscheint ESPHome in der linken Seitenleiste.

2. Neues Gerät anlegen – In ESPHome auf NEW DEVICE klicken und einen Namen vergeben, zum Beispiel esp32-nr1. Die Board-Auswahl ist zunächst egal, du überschreibst sie gleich im YAML.

3. YAML einfügen und anpassen – Gerät öffnen, auf EDIT gehen und den Inhalt durch die Konfiguration für das Funduino Smart Home ersetzen. Anpassen musst du mindestens die WLAN-Zugangsdaten (ssid und password) und optional Name und Friendly Name. Den API-Schlüssel und das OTA-Passwort kannst du übernehmen oder neu erzeugen lassen – änderst du sie, muss Home Assistant das Gerät danach neu koppeln.

4. Erstes Flashen per USB – Schließe den ESP32 per USB an den Rechner an, auf dem ESPHome läuft, und klicke beim Gerät auf INSTALL. Wähle „Plug into this computer“ oder lade die Firmware manuell herunter und flashe sie mit einem Web-Flasher. Danach verbindet sich der ESP32 mit deinem WLAN. Klappt das nicht, startet automatisch der Fallback-Hotspot – damit kannst du dich verbinden und die WLAN-Daten korrigieren.

5. In Home Assistant hinzufügen – Sobald der ESP32 online ist, meldet sich Home Assistant unter Einstellungen › Geräte & Dienste meist von selbst. Andernfalls fügst du die Integration ESPHome manuell hinzu und gibst esp32-nr1.local oder die IP-Adresse aus deinem Router ein.

Danach legt Home Assistant die Entitäten automatisch an: Taster und Bewegungsmelder als Binärsensoren, die beiden LEDs und den Alarm als Schalter, den Lüfter als Fan, Entfernung, Helligkeit, MQ135, Temperatur, Luftfeuchtigkeit, Drehregler und Tropfensensor als Sensoren, den LED-Stab samt LED 1 bis 8 als Lichter und die Servoposition als Number. Das OLED läuft im Hintergrund mit.

Spätere Updates gehen dann per OTA über WLAN: in ESPHome auf INSTALL › Wirelessly.

Die fertige YAML-Konfiguration für das Funduino Smart Home wird hier nachgereicht: Bei der Umstellung des Blogs ist der Code-Block beschädigt worden – Einrückungen und Listenzeichen sind verloren gegangen, und YAML hängt an genau diesen beiden Dingen. Eine unvollständig wiederhergestellte Fassung würde mehr Arbeit machen als helfen. Schreib uns gern kurz, wenn du sie brauchst.

Handleiding beoordelen

Opmerkingen

Stel een vraag of deel je ervaring

Neem contact met ons op als iets niet werkt. Vermeld daarbij je board en de foutmelding.

We controleren elke reactie voordat deze wordt gepubliceerd. Je e-mailadres blijft bij ons.