вступление
В этой статье показано, как удаленно управлять устройством, подключенным к 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 мигает красным в течение очень короткого времени, когда он инициализируется следующим образом. Помните, что в подключенном сетевом источнике питания может быть короткий скачок мощности, и убедитесь, что устройство, работающее от сети, может справиться с этим.
Проверьте демонстрационное решение здесь.