Статьи

Управляйте своим кондиционером с Raspberry Pi и группой Microsoft — часть 4

вступление

В этой статье показано, как удаленно управлять устройством, подключенным к Raspberry PI2, то есть универсальное приложение Windows на PI2 прослушивает команды, поступающие из очереди служебной шины Azure. Я уже объяснял несколько деталей в предыдущих статьях этой серии. — Я рассмотрю некоторые вещи быстрее, чем раньше.

Вентилятор управляется с помощью переключателя Kayes SRD-05VDC-SL-C, как показано здесь справа. Это реле, которое управляет питанием от сети. Raspberry PI2 — это устройство с очень низким энергопотреблением, работающее в диапазоне 5 В, поэтому для управления питанием от сети (100-250 В в зависимости от того, где вы живете) требуется что-то среднее между Raspberry и фактическим питанием от сети — это маленькое устройство здесь. Подключение сетевого питания напрямую к плохим выводам GPIO PI2, скорее всего, приведет к эффектному, но довольно короткому фейерверку, так что это совершенно нецелесообразно.

Основные настройки приложения

Как я объяснил ранее, я настроил это приложение, используя внедрение зависимостей, в основном создавая набор очень слабо связанных объектов, которые взаимодействуют только через интерфейсы и / или события — получение объектов, от которых они зависят, через свой конструктор вместо них. обновлять их сами.

Итак, еще раз мы взглянем на MainPage_Loaded в MainPage.xaml.cs приложения IoT TemperatureReader, и я выделил все, что не играет роли в управлении вентилятором.

var gpioService = new GpioService();
var fanSwitch = new SwitchDevice(gpioService, Settings.SwitchPinId);
var controller = new AnalogTemperatureSensorController(gpioService);
var thermometer = new Thermometer(gpioService, controller);
var poster = new TemperatureQueueClient(QueueMode.Send);
var fanCommandListener = new FanSwitchQueueClient(QueueMode.Listen);
await fanCommandListener.Start();

fanCommandListener.OnDataReceived += (cs, cmd) =>
{
  Debug.WriteLine(
    $"Fanswitchcommand received {cmd.Status}; current status fan on = 
      {fanSwitch.IsOn} at {DateTime.Now}");
  fanSwitch.SwitchOn(cmd.Status == FanStatus.On);
};

Внимательные читатели увидят в этом забавную вещь: я не использую никаких новых объектов вообще . Все типы объектов в этом уже описаны в предыдущих статьях этой серии.

Так как же это работает?

Как только приложение загружено, создается GpioService, о котором я уже говорил в моем предыдущем посте . Затем создается объект fanSwitch. Это SwitchDevice — также уже объясненный в предыдущем посте как базовый класс для класса, который управляет светодиодом, и который теперь управляет SRD-05VDC-SL-C — благодаря использованию другого контакта GPOI. Затем создается FanSwitchQueueClient, который прослушивает команды, поступающие с шины службы Azure. Работа этого класса объясняется во втором посте этой серии .

Затем, наконец, к FanSwitchQueueClient OnDataReceived присоединяется обработчик событий — очень маленький фрагмент кода, который устанавливает переключатель в состояние, запрашиваемое командой, поступающей из служебной шины Azure.

Кроме того, этот небольшой кусочек кода сообщает не только температуру, но и текущее состояние вентилятора обратно тому, кто слушает другую служебную шину:

thermometer.OnTemperatureMeasured += async (thObject, data) =>
{
  data.FanStatus = fanSwitch.IsOn ? FanStatus.On : FanStatus.Off;
  await poster.PostData(data);
};

И это, друзья мои, это в основном все. Ничего нового — просто используйте то, что уже построено. Так зачем тратить на это целый пост в блоге? Главным образом, чтобы показать, что с правильной архитектурой вы можете создавать очень легко повторно используемые и подключаемые компоненты — вроде оборудования IoT.

Еще кое-что

SRD-05VDC-SL-C имеет странность в отношении Windows 10 на Raspberry PI2: как только вы откроете контакт, к которому он подключен, и установите его режим привода на выход, SRD-05VDC-SL-C сам включается Очень нежелательное положение вещей. Вот почему конструктор SwitchDevice содержит оператор для немедленного переключения:

public SwitchDevice(IGpioService gpioCtrl, int pinId)
{
  _pinId = pinId;
  _gpioCtrl = gpioCtrl;
  SwitchOn(false);
}

Иногда вы можете кратко увидеть, что красный индикатор состояния SRD-05VDC-SL-C мигает красным в течение очень короткого времени, когда он инициализируется следующим образом. Помните, что в подключенном сетевом источнике питания может быть короткий скачок мощности, и убедитесь, что устройство, работающее от сети, может справиться с этим.

Проверьте демонстрационное решение здесь.