Умный дом на Raspberry Pi 2 и Windows 10 IoT Core
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino UNO | 1 на комнату | На каждую автоматизируемую комнату свой Arduino UNO |
| Raspberry Pi 2 Model B | 1 | Центральный контроллер |
| Перемышки (набор) | 1 | |
| Бредборд | 1 | |
| Фоторезистор (LDR) | 1 на комнату | Измеряет освещенность у окна |
| PIR-датчик движения | 1 на комнату | Обнаружение присутствия человека |
| Релейный модуль | по числу устройств | Количество реле = количество управляемых приборов |
| Магнитный пускатель Siemens 3TF32 00-0AP0 | 1 | Для управления водяным насосом до 16А 415В AC3. Катушка 250В AC |
| Автоматический выключатель 1P C16A (MCB) | 1 | Защита насоса от перегрузок. Рейтинг по контактору |
Программное обеспечение и сервисы
- Arduino IDE — прошивка микроконтроллеров комнат
- Microsoft Visual Studio 2015 (Community Edition — бесплатно до 5 пользователей) — разработка UWP-приложения для RPi2
- Microsoft Windows 10 IoT Core — основная ОС на Raspberry Pi 2, управляет устройствами через Arduino и предоставляет консоль управления
О проекте
В современную эпоху технологии способны улучшить качество жизни. Автоматизация, некогда научная фантастика, стала реальностью. Сочетая Raspberry Pi и Windows 10, можно построить систему домашней автоматизации, способную автономно управлять бытовыми приборами.
Начало работы: общая архитектура

Архитектура одной комнаты
В каждой комнате свой Arduino UNO — ведомое устройство. Он управляет приборами (свет, вентилятор, розетки) и опрашивает датчики: PIR (присутствие), LM35 (температура), LDR (освещенность у окна). Raspberry Pi периодически опрашивает Arduino по шине I2C.

Адресация устройств
Устройство идентифицируется составным адресом: номер комнаты + номер устройства.

Итак: Raspberry Pi — мастер I2C, каждый Arduino UNO — слейв с уникальным адресом. Обмен данными по I2C.
Схемы подключения
Начнем с первой комнаты. Для подключения нескольких Arduino используйте I2C-шину (общую линию SDA/SCL с подтягивающими резисторами).



Подключение нагрузки через реле

Программная часть
Проект состоит из двух частей: Raspberry Pi 2 (UWP-приложение на C# в Visual Studio 2015) и Arduino UNO (скетч на C++). Предполагается средний уровень знаний: Arduino, C#, XAML, работа с I2C.
Протокол обмена по I2C
Цели протокола: чтение датчиков, чтение состояний устройств, установка состояния устройств.
Запрос от RPi к Arduino — 3 байта (Режим, Пин, Значение). Ответ от Arduino — 14 байт (данные датчиков или состояния пинов).
Режимы:
- Mode 0 — чтение датчиков (освещенность, PIR, температура)
- Mode 1 — чтение состояний 14 выходов (D0–D13, A2, A3)
- Mode 2 — установка состояния пина (включение/выключение реле)





Класс I2C_Helper в UWP-проекте инкапсулирует протокол. На стороне Arduino используется стандартная библиотека Wire.h в режиме слейва.
Объектная модель (Class Structure)
Иерархия: Home → список Room → список Device + структура Sensors (AmbientLight, PassiveIR, Temperature).


Home— хранит список комнат, статические методы сохранения/загрузки конфигурации.Room— устройства и сенсоры, периодическое обновление данных (Mode 0).Device— свойства и методы On/Off через протокол Mode 2.- Классы сенсоров дают доступ к环境数据 комнаты.
Пользовательский интерфейс
Основные цели: управление комнатами, управление устройствами, внешние сервисы (GSM, интернет). Решено разделение на страницы:
- Главная: статус устройств, дата/время, блокировка
- Избранные устройства: быстрый доступ
- Комнаты: список комнат и их устройств
- Водяные приборы: насос и гейзер
- Настройки: конфигурация комнат и устройств
Wireframes (наброски экранов)





Реализованный UI (скриншоты приложения)














Пошаговая настройка
Программа спроектирована для простой конфигурации. Экраны мастера настройки:








Управление водяным насосом и гейзером
Насос/гейзер нельзя подключать прямо к реле — сгорит реле и опасно. Используйте магнитный пускатель (контактор): катушку пускателя подключите к реле, а силовую цепь насоса — через контакты пускателя и автоматический выключатель (MCB). Подбирайте контактор с запасом по току и напряжению катушки.
Развертывание на Raspberry Pi 2
Инструкция по деплою UWP-приложения на RPi2 под Windows 10 IoT Core: см. официальную документацию Microsoft.
Регистрация приложения как автозапуска
Чтобы приложение стартовало при загрузке RPi2, см. статью: «Windows 10 IoT Core: Setting Startup App».
Известные проблемы и решения
1. Дребезг пина D13 при загрузке Arduino
При старте Arduino мигает встроенный светодиод на D13. Если на D13 висит реле — прибор дернется.
Решение: не использовать D13 для реле. Или перепрошить загрузчик OptiBoot без мигания D13.
2. Отсутствие RTC на Raspberry Pi 2
RPi2 не имеет часов реального времени. После потери питания время сбрасывается.
Решение: подключить внешний RTC (DS3231 и др.) к I2C шине RPi2 или к Arduino (тогда RPi запрашивает время при загрузке). NTP требует интернета.

3. Сложности отладки UWP-приложения
Асинхронные операции в UWP затрудняют поиск ошибок. Часто исключения не указывают на проблемную строку, приложение может молча вылететь.
Решение: расставляйте точки останова (breakpoints) заранее, до предполагаемой проблемной строки.

Перспективы развития
Платформа Windows 10 IoT Core на Raspberry Pi 2 открывает огромные возможности: 4-ядерный CPU 900 МГц, мощный GPU для красивого XAML-интерфейса, многопоточность (Task). В будущем можно добавить:
- Беспроводное управление (RF, IR) вместо проводной I2C шины
- Веб-портал управления через Azure для мобильных устройств
- Настоящую автоматизацию: событийную (включить свет при падении освещенности) и временную (расписание с RTC)
Удачи и будьте осторожны с высоким напряжением!
Исходный код: GitHub репозиторий
Код: Скетч Arduino (I2C Slave)
/* Arduino Sketch v0.4 для Home Automation с Raspberry Pi 2 + Win 10 IoT
Тестирован на ATmega328p. Arduino как I2C-slave (адрес 0x40).
Задачи: периодический опрос датчиков, прием 3-байтовых команд, отправка 14-байтовых ответов. */
#include <Wire.h>
#define _DEBUG_
#define SLAVE_ADDRESS 0x40
int Pin_AmbientLight_LDR = A0;
int Pin_PassiveIR = 2;
int Pin_Temperature = A1;
volatile short Value_AmbientLight_LDR, Value_Temperature;
volatile bool Value_PassiveIR;
byte Mode, Pin, Value;
byte Response[14];
void setup() {
pinMode(Pin_AmbientLight_LDR, INPUT);
pinMode(Pin_PassiveIR, INPUT);
pinMode(Pin_Temperature, INPUT);
for (int p = 0; p <= 13; p++) if (p != 2) 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() {
Value_AmbientLight_LDR = map(analogRead(Pin_AmbientLight_LDR), 0, 1023, 0, 255);
Value_PassiveIR = (digitalRead(Pin_PassiveIR) == HIGH);
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: // Sensors
Response[0] = (byte)Value_AmbientLight_LDR;
Response[1] = Value_PassiveIR ? 1 : 0;
Response[2] = (Value_Temperature < 0) ? 0 : 1; // sign
Response[3] = (byte)(Value_Temperature < 0 ? -Value_Temperature : Value_Temperature);
break;
case 1: // Device states (14 pins)
for (int i = 0, p = 0; i < 14; i++) {
if (i == 2) continue; // skip pin 2 (PIR input)
Response[i] = digitalRead(p++) == HIGH ? 1 : 0;
}
break;
case 2: // Set pin state
Response[0] = digitalRead(Pin) == HIGH ? 1 : 0;
break;
}
Wire.write(Response, 14);
}
Программа для Raspberry Pi 2 (Windows Headed App)
Полный исходный код UWP-приложения: GitHub
Схемы (Fritzing)
Полная схема с возможностью подключения нескольких комнат (уникальные I2C-адреса).

Файл Fritzing: Home Automation Schematic - Anurag S Vasanwala.fzz
Производственный процесс
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Создание умного домашнего контроллера 433 МГц с Sensorflare и Raspberry Pi
- Датчик занятости ванной комнаты на Raspberry Pi с голосовыми и SMS-уведомлениями через Twilio
- Мониторинг домашней температуры с панелью управления на Raspberry Pi
- Создайте систему домашней автоматизации на Raspberry Pi для удаленного управления
- Передача данных Adafruit 10DOF IMU с Raspberry Pi 2 в Azure Event Hubs на Windows 10 IoT Core
- Точный мониторинг температуры и влажности с SHT15 на Windows 10 IoT Core
- Установка Windows 10 IoT Core на Raspberry Pi 3 Model B+: Пошаговое руководство
- Интеграция Microsoft Kinect с Raspberry Pi для детекции людей в реальном времени на роботе Sonbi
- Автоматизация и IoT: формирование будущего управления цепочками поставок