Smart Home Automation mit Raspberry Pi 2 & Windows 10 IoT Core
Komponenten und Zubehör
| Bauteil | Menge | Hinweis |
|---|---|---|
| Arduino UNO | 1 pro Raum | Für jeden zu automatisierenden Raum ein separater Arduino UNO. |
| Raspberry Pi 2 Model B | 1 | |
| Jumper-Kabel (generisch) | 1 | |
| Breadboard (generisch) | 1 | |
| LDR (Lichtabhängiger Widerstand) | 1 | Liefert unterschiedliche Spannungswerte bei unterschiedlicher Lichtintensität. |
| PIR-Bewegungsmelder (generisch) | 1 | Passiver IR-Sensor erkennt menschliche Anwesenheit. |
| Relais-Modul (generisch) | 1 | Beliebiges Relais-Modul. Anzahl Relais = Anzahl zu steuernder Geräte. |
| Siemens Schütz (3TF32 00-0AP0) | 1 | Für Wasserpumpe max. AC3: 16A 415VAC. Spulenspannung 250VAC. Vor Kauf Pumpen-Leistung prüfen. |
| Leitungsschutzschalter (1P C16A) | 1 | Schützt Wasserpumpe vor elektrischen Fehlern/Überlast. Passend zum Schütz (16A). |
Apps und Online-Dienste
- Arduino IDE – Firmware für Arduino schreiben
- Microsoft Visual Studio 2015 (Community Edition, kostenlos bis 5 Nutzer) – Raspberry Pi 2 App entwickeln
- Microsoft Windows 10 IoT Core – Primäres OS auf dem Pi, steuert Geräte via Arduino und stellt Management-Konsole bereit
Über dieses Projekt
In der heutigen Zeit kann Technologie das menschliche Leben verbessern. Automatisierung war früher Science-Fiction – heute Realität. Durch Kombination neuester Technik mit dem Zuhause entsteht ein großartiges Smart Home. Mit Raspberry Pi und Windows 10 bauen wir ein System, das Hausgeräte automatisch steuert.
Erste Schritte: Grundlagen verstehen
Betrachte die Gesamtkonfiguration:

Raum-Konfiguration
Pro Raum steuert ein Arduino UNO Geräte und liest Sensoren. Der Raspberry Pi fragt periodisch Sensordaten vom Arduino ab. Die „Raum-Architektur“ zeigt die Verkabelung:

Jeder Raum hat: mehrere steuerbare Geräte (Licht, Ventilator, Steckdosen), einen PIR-Sensor (Anwesenheit), einen Temperatursensor (LM35) und einen LDR (Lichtintensität am Fenster).
Geräte-Adressierung
Geräte werden durch Kombination aus Raumnummer + Gerätenummer eindeutig identifiziert.

Zusammenfassung: Raspberry Pi = Hauptcontroller. Jeder Raum hat einen Arduino UNO als I2C-Slave. Kommunikation über I2C-Bus.
Schaltpläne
Implementierung für den ersten Raum. Schaltplan beachten.
I2C-Bus-Leiste: Für mehrere Arduinos am Bus.



Gerät an Relaisplatine anschließen

Software
Projekt besteht aus Raspberry Pi 2 (Visual Studio 2015, C#, Universal Windows XAML) und Arduino UNO. Vorausgesetzt: Grundkenntnisse in Arduino, C#, UWP/XAML.
Protokoll (I2C-Kommunikation Pi ↔ Arduino)
Ziele: Sensoren lesen, Gerätestatus lesen, Gerätestatus setzen.
Sende-Bytes: fest 3 Bytes. Empfangs-Array: 14 Bytes.
Protokoll-Details (X = ignorierter Wert):





Klasse I2C_Helper im Universal-Windows-Projekt implementiert das Protokoll (Solution Explorer → Library → Communication). Arduino-Seite nutzt Standard-I2C-Bibliothek.
Klassenstruktur (Objektmodell auf dem Pi)
OOP-Struktur: Home → Liste von Room → Liste von Device + Sensor-Struktur.


- Home: Liste<Room>, statische Load/Save-Methoden für Persistenz.
- Room: Liste<Device>, Sensor-Struktur (AmbientLight, PassiveIR, Temperature). Periodisches Refresh via Protokoll Modus 0.
- Device: Details + Ein/Aus-Funktionen via Protokoll Modus 2.
Benutzeroberfläche (Wireframes & Screenshots)
Hauptziele: Raumverwaltung, Geräteverwaltung, externe Dienste (GSM, Internet).
Aufgeteilt in:
- Startseite: Gerätestatus, Uhrzeit, Sperrfunktion
- Favoriten: Direkter Zugriff auf Lieblingsgeräte
- Raumseite: Zugriff auf konfigurierte Räume & Geräte
- Wasser-Geräte: Wasserpumpe & Geyser
- Einstellungen/Konfiguration: Raum- & Geräteverwaltung
Wireframes:





Entwickelte UI (Screenshots):














Konfiguration Schritt für Schritt








Wasserpumpe & Geyser steuern
Nicht direkt an Relais anschließen (Gefahr/Defekt)! Stattdessen: Pumpe/Geyser → Schütz → Relais steuert Schützspule. Schütz-Spulen- und Kontaktdaten müssen zur Pumpe passen. Lieber etwas höher dimensionieren.
Deployment auf Raspberry Pi 2
Referenz: Windows 10 IoT Core Deployment Guide
App als Startup-App registrieren
Artikel: Windows 10 IoT Core: Setting Startup App
Bekannte Probleme & Lösungen
Arduino Boot-Up Flackern (Pin D13)
Beim Booten flackert D13. Kein Relais an D13 anschließen, sonst flackert das angeschlossene Gerät.
Lösung: 1) D13 nicht nutzen. 2) OptiBoot-Firmware ohne D13-Flackern neu flashen (aufwendiger).
Uhrzeit-Problem (kein RTC auf Pi 2)
Raspberry Pi 2 hat keine Echtzeituhr. Nach Stromausfall/Neustart geht Zeit verloren.
Lösung: Externes RTC-Modul anschließen (an Pi oder Arduino). Alternativ NTP (braucht Internet) oder Arduino liest RTC und Pi fragt beim Boot ab.

Debugging-Probleme bei Universal Apps
Asynchrone Operationen in UWP führen zu schwer lokalisierbaren Fehlern. Häufig: Absturz ohne Fehlermeldung, Watch Window nutzlos.
Lösung: Breakpoints vor vermuteten Fehlerzeilen setzen. Zum Veröffentlichungszeitpunkt fehlen UWP noch Debugging-Features klassischer Windows-Apps.
Zukunft & Ausblick
Keine Grenzen für Features: RF/IR statt I2C, Azure-Webportal für Mobile, echte Automation (zeitgesteuert via RTC, ereignisgesteuert z. B. Licht bei Dämmerung). Raspberry Pi 2 mit 900 MHz Quad-Core und Windows 10 IoT Core bietet riesiges Potenzial.
Viel Erfolg & Sicherheit! Fragen gerne stellen.
Code
Arduino Sketch (I2C Slave)
/* Arduino Sketch v0.4 für "Home Automation using Raspberry Pi 2 and Windows 10 IoT"
Getestet auf Atmega328p. Arduino als I2C-Slave (Adresse 0x40) für RPi2 unter Win10 IoT.
Ziele: Periodisch Sensordaten sammeln (loop), OnReceive: 3-Byte-Modus empfangen & ausführen,
OnRequest: 14-Byte-Response basierend auf Modus senden.
Keine Gewährleistung. Nutzung privat/kommerziell erlaubt. Keine Haftung für Schäden.
*/
#include <Wire.h>
#define _DEBUG_
#define SLAVE_ADDRESS 0x40
// Pin-Deklaration
int Pin_AmbientLight_LDR = A0;
int Pin_PassiveIR = 2;
int Pin_Temperature = A1;
// Globale Variablen
volatile short Value_AmbientLight_LDR, Value_Temperature;
volatile bool Value_PassiveIR;
// Protokoll-Variablen
byte Mode, Pin, Value;
byte Response[14];
void setup() {
pinMode(Pin_AmbientLight_LDR, INPUT);
pinMode(Pin_PassiveIR, INPUT);
pinMode(Pin_Temperature, INPUT);
// Alle digitalen Pins 0-13, A2, A3 als Ausgänge für Relais
for (int p = 0; p <= 13; p++) pinMode(p, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
#ifdef _DEBUG_
Serial.begin(9600);
#endif
Wire.begin(SLAVE_ADDRESS);
Wire.onRequest(SendData);
Wire.onReceive(ReceiveData);
}
void loop() {
// LDR lesen (10-bit → 8-bit)
Value_AmbientLight_LDR = analogRead(Pin_AmbientLight_LDR);
Value_AmbientLight_LDR = map(Value_AmbientLight_LDR, 0, 1023, 0, 255);
// PIR lesen
Value_PassiveIR = (digitalRead(Pin_PassiveIR) == HIGH);
// Temperatur (LM35: 10mV/°C, 5V/1024 = 4.88mV/LSB → 0.488°C/LSB)
Value_Temperature = (short)((float)(analogRead(Pin_Temperature) * 0.48828125));
delay(100);
}
void ReceiveData(int byteCount) {
Mode = Wire.read();
Pin = Wire.read();
Value = Wire.read();
if (Mode == 2) digitalWrite(Pin, Value);
#ifdef _DEBUG_
Serial.print(Mode); Serial.print(" "); Serial.print(Pin); Serial.print(" "); Serial.println(Value);
#endif
}
void SendData() {
switch (Mode) {
case 0: // Sensoren lesen
Response[0] = (byte)Value_AmbientLight_LDR;
Response[1] = (byte)(Value_PassiveIR ? 1 : 0);
Response[2] = (byte)(Value_Temperature < 0 ? 0 : 1); // Vorzeichen
Response[3] = (byte)(Value_Temperature < 0 ? -Value_Temperature : Value_Temperature);
break;
case 1: // Gerätestatus lesen
Response[0] = digitalRead(0) == HIGH ? 1 : 0;
Response[1] = digitalRead(1) == HIGH ? 1 : 0;
Response[2] = digitalRead(3) == HIGH ? 1 : 0;
Response[3] = digitalRead(4) == HIGH ? 1 : 0;
Response[4] = digitalRead(5) == HIGH ? 1 : 0;
Response[5] = digitalRead(6) == HIGH ? 1 : 0;
Response[6] = digitalRead(7) == HIGH ? 1 : 0;
Response[7] = digitalRead(8) == HIGH ? 1 : 0;
Response[8] = digitalRead(9) == HIGH ? 1 : 0;
Response[9] = digitalRead(10) == HIGH ? 1 : 0;
Response[10] = digitalRead(11) == HIGH ? 1 : 0;
Response[11] = digitalRead(12) == HIGH ? 1 : 0;
Response[12] = digitalRead(A2) == HIGH ? 1 : 0;
Response[13] = digitalRead(A3) == HIGH ? 1 : 0;
break;
case 2: // Gerät gesetzt → Status zurückgeben
Response[0] = digitalRead(Pin) == HIGH ? 1 : 0;
break;
}
Wire.write(Response, 14);
}
Raspberry Pi 2 Software (Windows Headed App)
Vollständiger Quellcode: GitHub Repository
Schaltpläne
Mehrere Räume durch zusätzliche Arduinos mit einzigartigen I2C-Slave-Adressen am Bus erweiterbar.

Fritzing-Datei: Home Automation Schematic - Anurag S Vasanwala.fzz
Herstellungsprozess
- Fern-Temperatursensor mit Raspberry Pi & Python bauen – Schritt-für-Schritt-Anleitung
- 433 MHz Smart-Home-Controller mit Sensorflare und Raspberry Pi selbst bauen
- Raspberry Pi Badezimmer-Belegungssensor mit Sprach- & SMS-Benachrichtigung via Twilio
- Heimtemperatur mit Raspberry Pi Dashboard überwachen
- Raspberry Pi Home Automation System für Fernsteuerung bauen
- Adafruit 10DOF IMU Daten von Raspberry Pi 2 an Azure Event Hubs senden (Windows 10 IoT Core)
- Präzise Temperatur- & Feuchtigkeitsüberwachung mit SHT15 unter Windows 10 IoT Core
- Windows 10 IoT Core auf Raspberry Pi 3 Model B+ installieren – Schritt-für-Schritt
- Microsoft Kinect mit Raspberry Pi integrieren für Echtzeit-Menschenerkennung am Sonbi Roboter
- Automation & IoT: Die Zukunft des Supply Chain Managements gestalten