Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Физический интерфейс домашней автоматизации

Компоненты и расходные материалы

TowerPro Servo
× 1
Маленькие петли
× 1
Кнопки
× 1
Ардуино Юн
× 1
Трансформатор тока 100 А
× 1
резисторы и конденсаторы
× 7

Об этом проекте

Посмотрите два видео ниже, чтобы быстро объяснить этот проект.

Физический интерфейс домашней автоматизации Интерфейс с управлением в реальном мире

Интерфейс передает информацию и позволяет пользователю управлять вещами. Большинство платформ домашней автоматизации полагаются на «виртуальный интерфейс». Вы достаете смартфон и открываете приложение, чтобы посмотреть, что происходит в вашем доме, и включать и выключать свет. Это нормально, когда тебя нет дома. Но просмотр виртуального представления и анализ информации на дисплее требует работы. Это требует концентрации и не кажется интуитивно понятным.

Я хотел создать «физический интерфейс» - небольшую модель дома, которая физически имитирует то, о чем я хочу знать, с моим настоящим домом. Поэтому, когда дверь гаража открыта, я хочу, чтобы дверь гаража на модели также открывалась. Этот образец дома можно было бы разместить на моем журнальном столике, и я могу взглянуть на него, чтобы увидеть, оставлена ​​ли дверь гаража открытой перед сном. Или я могу иметь это на моем столе на работе, подключенном к моему дому через VPN. Когда я на работе, я могу взглянуть на него, чтобы увидеть, не оставили ли входную дверь открытой. Этот физический интерфейс может быть таким же креативным или утилитарным, как я.

Итак, на следующих этапах я

  1. Постройте модельный дом, чтобы отображать такие параметры, как положение дверей, потребление энергии и то, был ли оставлен свет.
  2. Создайте энергомонитор с помощью библиотеки Open Energy Monitor Arduino и передавайте информацию об использовании энергии в модельный дом и в OpenHAB.
  3. Предоставьте несколько способов отправки положения двери / окна в модельный дом. Покажите, как данные контактного датчика Wink Hub и Wink «Tripper» могут быть использованы в домашней системе автоматизации.
  4. Используйте Wink и Arduino для выполнения выходных данных, таких как открытие / закрытие фактических ворот гаража или включение и выключение света.

В модельном доме есть сервоприводы и светодиоды, подключенные к контроллеру Arduino. Этот контроллер подписывается на сообщения MQTT, которые указывают положение дверей и потребление энергии, и соответственно приводит в действие сервоприводы. Та же идея со светодиодом, который показывает, горит ли свет или нет. Есть несколько вариантов передачи этой информации датчика брокеру MQTT, поэтому я подробно расскажу об этом на следующих этапах. Посередине всего этого находится Raspberry Pi с брокером MQTT (Mosquitto) и OpenHAB. Хотя OpenHAB не требуется для запуска модельного дома, он необходим для обеспечения интерфейса для приложения для смартфона, а также для удаленного мониторинга и активации. То, что я хочу иметь физический интерфейс, не означает, что я готов отказаться от виртуального.



На модельном домике также есть две кнопки. Одна из кнопок включает / выключает лампочку зигби. Другая кнопка открывает и закрывает дверь гаража (на НАСТОЯЩЕМ доме).


Часть 1:Строительство дома

1) Постройте модельный дом

2) Варианты управления, проводка и код

Часть 2:входы (датчики)

3) Датчик:монитор энергии

4) Датчик:вариант узла датчика DIY

5) Датчик:контактный датчик Wink Hub &Tripper

Часть 3. Выводы

6) Фары

7) Устройство открывания гаражных ворот


Шаг 1. Строительство модельного дома

Я не собираюсь делать этот шаг предписывающим. Когда дело касается декоративно-прикладного искусства, я довольно зрелый человек, поэтому просто покажу, как я построил свой модельный домик. Вы захотите построить его, чтобы он напоминал ваше собственное жилище и отражал то, что вам небезразлично. Здесь много места для творчества. Некоторые из компонентов на этом рисунке (например, трансформатор тока) будут использоваться на более поздних этапах.

Компоненты :

  • (1) Коробка. Вам решать, насколько большой и каких пропорций.
  • (3) Сервопривод Tower Pro SG90 http://www.dx.com/p/towerpro-sg90-9g-mini-servo-w ...
  • (2) маленькие петли http://www.homedepot.com/p/Stanley-National-Hardw ...
  • (некоторые) Клейкий материал. Я использовал двойной клей от крючков 3М.
  • Arduino Yun или Arduino Uno с экраном Ethernet.
  • Кнопки http://www.radioshack.com/mini-spst-1-5-amp-moment ...
  • Вокруг дома валяется всякая всячина


Крыша

Я вырезал одну из боковых створок коробки и прикрепил ее к другой (все еще прикрепленной) боковой створке, чтобы получилась крыша. Я использовал небольшую коробку, чтобы обеспечить конструкцию под прямым углом, а позже поддержал ее лучше с помощью конструктора Lego. Вероятно, вы можете просто использовать все, что есть в доме, чтобы сделать этот угол под прямым углом.

Двери / Окна

Вырежьте отверстия для дверей, которые хотите показать. Прикрепите петли к двери двойной липкой лентой и прикрепите к дому. Я знаю, ничего особенного, так что не стесняйтесь импровизировать с тем, что у вас есть в доме. Я использовал двухсторонний пенопластовый клей 3M, который поставляется с крючками. Я также использовал эти клейкие ленты из вспененного материала для крепления серводвигателей. Для гаражных ворот рычаг серводвигателя открывает гаражные ворота, и сила тяжести закрывает гаражные ворота. Что касается входной двери, мне нужно было прикрепить шнур к навесной двери, чтобы сервомеханизм мог открыть дверь. Желтая деталь Lego, которую вы видите, предназначена для смещения сервопривода от петли.

//www.youtube.com/embed/z-xyVXUSqNM

Счетчик энергии

Ничего фантастического. Просто вырежьте стрелу и прикрепите ее к сервомеханизму. Вырежьте фигуру, слегка напоминающую куст, и отметьте ее киловаттной шкалой, а затем натяните серводвигатель на коробку с кустом между ними.

Над сервоприводом энергопотребления я приклеил красный светодиод.

Еще у меня есть две кнопки для управления освещением и воротами гаража. Это кнопки мгновенного действия. Кнопки снабжены гайкой с внешней стороны, чтобы удерживать ее у стенки картонной коробки. С другой стороны - металлические контакты для пайки проводов.

Шаг 2. Строительство дома - провода и код

Электромонтаж

Вот схема подключения. Я испортил проводку внутри коробки. Если вы хотите просто знать, какие провода на каких контактах:

  • светодиодный индикатор состояния:7
  • светодиодный индикатор освещения:4
  • Сервопривод 1 (входная дверь):3
  • Сервопривод 2 (гаражные ворота):5
  • Серво 3 (куст потребления энергии):6
  • Кнопка 1 (светится / гаснет):8
  • Кнопка 2 (открытие / закрытие ворот гаража):9

Параметры контроллера

Вы можете использовать то, что вам удобно и что есть под рукой. Менее дорогой (20 долларов) вариант - использовать клон Arduino Uno и сетевой экран. Я начал с этого, но это привязало меня к кабелю Ethernet. Поэтому я переключил его на Arduino Yun (65 долларов США). Намного дороже, но также дало мне возможность пользоваться Wi-Fi. Yun было действительно легко использовать. Вы в основном:

  1. Подключите Yun к маршрутизатору через Ethernet.
  2. Перейдите на веб-страницу Юня.
  3. Настройте пароли и статический IP-адрес на вашем маршрутизаторе.
  4. Загрузить эскиз Юня.

Ниже приведены эскизы Arduino Uno и Arduino Yun. Они очень похожи, и за исключением Ethernet-моста, используемого в Yun, вы можете в значительной степени скопировать код Yun на Uno. После того, как я переключился на Yun, я добавил две кнопки управления. В результате в эскизе Uno этих кнопок нет.

Видео на первом этапе показывает Arduino Yun. Вот видео с использованием Uno и Ethernet-щита. Когда было снято это видео, я еще не установил две кнопки, но все остальное работает так же.

//www.youtube.com/embed/7i6McpbU3Gs


smarthome_ethernet.ino smarthome_yun.ino


Шаг 3. Датчик:монитор энергии

Теперь, когда у нас есть физический интерфейс, способный отображать потребление энергии, нам нужно создать узел датчика, чтобы считывать потребление энергии в доме и публиковать это потребление брокеру MQTT. Есть несколько способов сделать это. Я использую Arduino Yun. Это наименее сложный, но не наименее затратный метод. Если вы хотите, вы можете использовать Arduino Uno, сетевой экран и беспроводной маршрутизатор в качестве моста Wi-Fi. Или вы можете использовать Pi с пакетом Open Energy Monitor. Я просто расскажу о методе Юня.

Я использую трансформатор тока за 7 долларов от ebay. Вы можете найти версию Yhdc SCT-013-000 100А здесь. Подключите его в соответствии со схемой подключения выше и загрузите эскиз Arduino Yun внизу этого шага. Обязательно измените код, указав IP-адрес вашего брокера MQTT. Эта страница библиотеки Open Energy Monitor - хороший справочник. Вот идеальные значения компонентов.

  • Нагрузочный резистор =33 Ом.
  • Резистор делителя напряжения =10 кОм
  • Конденсатор =10 мкФ

Изображение моего монитора энергии не совсем соответствует схеме, потому что у меня не было под рукой именно этих компонентов. Мне пришлось использовать два резистора на 68 Ом параллельно, потому что у меня не было нагрузочного резистора на 33 Ом. И у меня не было конденсатора 10 мкФ для схемы выпрямителя, поэтому я использовал вместо него два конденсатора 22 мкФ. Последовательная эквивалентная емкость достаточно близка.

Подключите трансформатор тока к одной из входящих фаз вашего дома. У меня был только один трансформатор на 100 А, поэтому я контролирую только одну из фаз. В конце концов, я хотел бы получить больше трансформаторов для контроля другой ветви входящей мощности, а также ответвленных цепей. Используя реальный амперметр, моя самодельная установка всегда считывала на 1 ампер выше амперметра при разных показаниях амперметра (см. 5-е изображение выше). Довольно просто вычесть лишний усилитель.


OpenHAB

Поскольку у нас есть поступающие данные, мы могли бы также отобразить их в OpenHAB, чтобы данные могли быть отображены в виде графиков. Вот соответствующая конфигурация OpenHAB.

Определение предмета

 

Число itm_smarthome_energy_amps "Энергия (амперы) [% .1f]" {mqtt ="<[mymosquitto:2853:state:default]"}

Число itm_smarthome_energy_watts "Энергия (Вт) [ % .1f] "{mqtt =" <[mymosquitto:2852:state:default] "}

Карта сайта

 

Text label ="Energy" icon ="firstfloor"
{

Frame label ="Energy Usage" {Text item =itm_smarthome_energy_amps

Text item =itm_smarthome_energy_watts

Chart item =itm_smarthome_energy_watts period =h refresh =5000} // Энергопотребление кадра

} // Text label ="Energy"

Настойчивость

Поскольку мы используем диаграммы, нам нужно определить какую-то стратегию сохранения энергии. RRD4J проще всего использовать, поэтому вот что у меня есть для "/openhab/configurations/persistence/rrd4j.persist".

 

Стратегии {
// для графиков rrd нам нужна стратегия cron everyMinute:"0 * * * *?"}

Items {DemoSwitch, NoOfLights, Window_GF_Toilet, Heating * :strategy =everyChange, everyMinute, restoreOnStartup // давайте сохраним только значения температуры в rrd Temperature *, Weather_Chart *:strategy =everyMinute, restoreOnStartup itm_smarthome_energy_watts:strategy =everyUpdate}

Экран монитора энергопотребления

energy_monitor_yun.ino

Шаг 4. Датчик:узлы беспроводных датчиков своими руками

Есть несколько вариантов беспроводных датчиков открытия / закрытия.

В одном из моих предыдущих проектов я использовал беспроводной трансивер за 5 долларов для отправки данных датчика через шлюз MQTT. Я все еще использую этот проект, чтобы получить статус гаражных ворот в OpenHAB, и в демонстрационном видео именно так гаражные ворота в модельном доме отражают мой фактический статус гаражных ворот. Подробный код и схему можно найти на этом шаге, если вы хотите ее использовать. Это некрасиво, но это в гараже, где никто, скорее всего, не заметит.

Также есть датчик освещенности, который я использую, чтобы указать, был ли оставлен свет включенным. Это также из предыдущего руководства, подробно описанного в этом шаге. Это часть датчика Uber, который использует фоторезистор для отправки информации о яркости по беспроводной сети обратно в OpenHAB. В этом случае я просто подписываюсь на тему MQTT, которая указывает уровень освещенности.

Я также сделал датчик герконового переключателя с батарейным питанием, который использует тот же беспроводной трансивер и шлюз, что и в предыдущем Instructable. Однако это не очень хорошо выглядит. Я не могу использовать его на межкомнатной двери или окне по эстетическим причинам. Итак, чтобы решить эту проблему, я использую более красивые датчики герконового переключателя потребительского уровня от Wink. Это подводит нас к следующему шагу.

//www.youtube.com/embed/uiD-HLezygI//www.youtube.com/embed/VKniJzIVHsI

Шаг 5. Датчик:Wink Hub

Я попал в этот пост в блоге от одного из первых пользователей Wink Hub, который нашел способ рутировать хаб, чтобы получить доступ к эксплойту PHP. Этот эксплойт позволяет запускать служебную программу «aprontest» для управления объектами, связанными с Wink Hub. Используя этот метод, я смог управлять освещением из интерфейса OpenHAB.

Самым интересным преимуществом рутирования Wink Hub является то, что он дает вам локальный контроль над светом и состоянием датчиков без доступа к серверу Wink. Wink Hub и Wink API всегда должны выходить в Интернет, чтобы связаться с сервером Wink для управления освещением или получения статуса датчика. Теперь, с помощью этого PHP-эксплойта, управление освещением и датчиками может быть сохранено в вашей локальной сети. Это здорово.

Я включил PHP-скрипт внизу этого шага. Если вы не можете открыть этот файл, попробуйте эту ссылку. Этот скрипт запускается на Raspberry Pi и опрашивает Wink Hub на предмет состояния двух герконов Wink Tripper. Этот статус отправляется в OpenHAB через REST API. Затем OpenHAB опубликует темы MQTT для этих позиций дверей. Затем контроллер для модельного дома открывает или закрывает двери, подписываясь на эти темы положения дверей.

Три файла конфигурации OpenHAB (элементы, карта сайта и правила), прикрепленные на этом этапе, необходимы для того, чтобы все работало. Они определяют элементы контактов, с которыми сценарий опроса взаимодействует через интерфейс REST. Также есть пример скрипта для управления лампочкой zigbee через OpenHAB.

//www.youtube.com/embed/tWKPcBOn1KM

Скрипты и файлы конфигурации.

sitemap.txt rules.txt items.txt demo_1_general.sh polling.php


Шаг 6. Вывод:свет

Из-за порядка, в котором я рассмотрел файлы конфигурации, предыдущие шаги в значительной степени предоставили все необходимое для управления «подключенной лампочкой» как через физический интерфейс, так и через интерфейс OpenHAB. Источником света может быть любой источник света, поддерживаемый концентратором Wink. В настоящее время я тестировал это с помощью лампы Cree Connected Bulb и лампочек GE Wink. Оба работают как положено. Я просто брошу сюда это видео, которое лучше показывает, как датчик освещенности и кнопки управляют интеллектуальной лампочкой.

//www.youtube.com/embed/KSDUEfro3Vo

Шаг 7:Результат:устройство открывания гаражных ворот

Файлы конфигурации, представленные на шаге 5, включают большинство необходимых элементов OpenHAB для управления гаражными воротами. Но вам все еще нужно что-то, чтобы действительно открывать и закрывать дверь гаража. Для этого я модифицирую части предыдущего Instructable. Я сделал устройство открывания гаражных ворот из следующих компонентов:

  • Клон Arduino (10 долларов США)
  • Шилд Ethernet (7 долларов США)
  • Рид-реле (2 доллара США)
  • Запасной пульт для гаражных ворот (22 доллара США).

Arduino управляет герконовым реле, размыкая и закрывая сухие контакты. Кнопка от устройства открывания двери запасного гаража подключена к сухому контакту герконового реле. Подключите контакт 5 и GND от Arduino к двум контактам катушки (два внешних контакта) язычкового реле, а контакты внутреннего реле к кнопке на пульте дистанционного управления воротами гаража.

Arduino подписывается на тему MQTT и ждет команды открытия / закрытия. Когда он видит эту тему, он на мгновение включает герконовое реле, закрывая «кнопку» на пульте дистанционного управления запасной гаражной дверью. Эскиз Arduino прилагается ниже. Кроме того, добавьте в свой файл правил "garage_monitor_rules.txt". Это необходимо в дополнение к правилам, прилагаемым к шагу 5. Если вы не используете метод ультразвукового датчика, который я использовал, вам нужно будет изменить эту часть в соответствии с вашей модификацией.

//www.youtube.com/embed/CqbRosfqM3c

Если ваша гаражная дверь довольно тихая или вам нужно какое-то звуковое объявление в другой части дома, когда дверь гаража открывается, добавленное выше правило может воспроизводить аудиофайл. Вы можете услышать это в первом демонстрационном видео примерно через тридцать минут.

//www.youtube.com/embed/pdKfJtnpNzs


garage_monitor_rules.txt grage_opener.ino


Шаг 8:Другие мысли

Решения, принятые в этом проекте, отражают инструменты, с которыми мне комфортно, части, которые у меня есть под рукой, и мои приоритеты в отношении того, как я хочу, чтобы все работало. Вероятно, у вас другой набор инструментов, и у вас легко доступны разные аппаратные компоненты. У вас, вероятно, также есть разные идеи относительно того, как должна работать домашняя автоматизация.

При использовании MQTT и OpenHAB есть большая гибкость, и вам не нужно делать что-то в точности так, как это делал я. Контроллер, используемый для управления домом модели, может быть разновидностью Arduino, Raspberry Pi или даже Sparkcore. Датчики DIY могут быть Arduino или автономным ESP8266. Единственное ограничение заключается в том, что данные датчика необходимо каким-то образом опубликовать в брокере MQTT. Если у вас есть USB-накопитель Z-wave в установке OpenHAB, вы можете использовать OpenHAB в качестве моста Z-wave для MQTT и использовать датчики Z-волны для обнаружения дверей.

Даже датчики открытия / закрытия Wink можно было сделать иначе. Если у вас нет root-прав на Wink Hub, вы можете использовать Wink API, чтобы получить статус датчика и опубликовать его в OpenHAB, или опубликовать их напрямую через MQTT. Это требует использования Wink Server, но снимает ограничения корневого концентратора.

Итак, есть много способов сделать что-то по-другому. Я предпочитаю использовать оборудование с наименьшим общим знаменателем, поэтому Arduino и картонные коробки.

Код

  • smarthome_yun.ino
  • smarthome_ethernet.ino
  • energy_monitor_yun.ino
smarthome_yun.ino Обычный текст
 // Эрик Цай // 2015-04-13 // Код Arduino Yun для управления физическим интерфейсом умного дома // Измените имена тем MQTT в соответствии с вашим использованием // Измените IP-адрес брокера MQTT // new yun includes # include  #include  #include  // старый Ethernet включает при использовании Ethernet Shield / * # include  #include  #include  * / # include  // Настройка экрана Ethernet / * IP-адрес ip (192, 168, 2, 36); byte mac [] ={0x90, 0xA2, 0xDA, 0x0D, 0x43, 0x13}; byte server [ ] ={192, 168, 1, 101}; EthernetClient ethClient; PubSubClient client (server, 1883, callback, ethClient); * / unsigned long keepalivetime =0; unsigned long MQTT_reconnect =0; // использовать yunclient для подключения к сети; // эквивалент Ethernet clientPubSubClient client ("192.168.1.101", 1883, callback, yun); bool conn_ok; // использовать светодиод для индикации состояния соединения MQTT int ledPin =4; // включение индикаторов int statusPin =7; // указываем состояние соединения MQTT // сервоуправление servo1Pin =3; // входная дверьint servo2Pin =5; // дверь гаража servo3Pin =6; // счетчик потребления энергии Servo servo1; // doorServo servo2; // гаражные воротаServo servo3; // energyint button1 =8; // кнопка над входной дверьюint button2 =9; // кнопка над воротами гаража // работа сервопривода:целевые позиции сервопривода servo1_target =5; // дверь закрыта servo2_target =5; // гараж, закрытый servo3_target =180; // энергия, 180 - это "0" ватт, двигатель установлен в обратном направлении int servo1_pos_cur =5; int servo2_pos_cur =5; int servo3_pos_cur =180; // 180 - это "0" ватт, двигатель установлен в обратном направлении int servo1Opened =5; int servo1Closed =130; int servo2Opened =5; int servo2Closed =150; unsigned long servo1_time =0; unsigned long servo2_time =0; unsigned long servo3_time =0; / / debounce на кнопках, чтобы не спамить публикациюunsigned long button1_db =0; unsigned long button2_db =0; int button =0; int callback_flag =0; char buff_message [12]; // --------- -------------------------------------------------- ---- // обратный вызов MQTT // здесь реагируем на сообщения MQTT // -------------------------------- ------------------------------- void callback (char * topic, byte * payload, unsigned int length) {// преобразование тему в внутр. int mytopic =atoi (тема); //Serial.print(mytopic); // конвертируем полезную нагрузку в int payload [length] ='\ 0'; // добавляем возврат строки, чтобы atof мог правильно разбирать float mymsg =atof ((const char *) payload); // светодиод if (mytopic ==2822) {if (mymsg ==1) {digitalWrite (ledPin, HIGH); } если (mymsg ==0) {digitalWrite (ledPin, LOW); }} // сервопривод 1, входная дверь if (mytopic ==2832) {if (mymsg ==1) // открыт {//Serial.println("servo1 open "); servo1_target =servo1Opened; } if (mymsg ==0) // закрыто {//Serial.println("servo1 closed "); servo1_target =servo1Closed; } //Serial.println(servo1_target); } / * // сигнал второй гаражной двери "закрыто" =выкл =послано 1 "открыто" =включено =послано 0 * / // сервопривод 2, дверь гаража if (mytopic ==2842) {if (mymsg ==1) / / открыл {servo2_target =servo2Opened; } if (mymsg ==0) // закрыто {servo2_target =servo2Closed; } // callback_flag =1; // servo3_target =mymsg; } // сервопривод 3, счетчик энергии if (mytopic ==2852) {// message =ватт // привязка ватт к максимальному и минимальному счетчику if (mymsg> 6000) {mymsg =6000; } если (mymsg <0) {mymsg =0; } //bias meter from 180 degrees to 0 degrees //180 deg to 0 deg =0 watt to 6000 watts, for example //set max watts to what makes sense for you. servo3_target =180-((1-((6000-mymsg)/6000))*180)-25; callback_flag=1; }}//end callbackvoid setup() { pinMode(ledPin, OUTPUT); //LED indicating light on pinMode(statusPin, OUTPUT); pinMode(button1, INPUT_PULLUP); //use pull-up resistor, invert logic pinMode(button2, INPUT_PULLUP); //use pull-up resistor, invert logic digitalWrite(ledPin, HIGH); //yun bridge Bridge.begin(); //connect to MQTT broker client.connect("yun smarthome"); client.publish("watch", "Smart Home Connected!"); keepalivetime=millis(); //Wire.onReceive (receiveEvent); MQTT_reconnect =millis(); //client.subscribe("#"); //test subscribe client.subscribe("2822"); //LED client.subscribe("2832"); //servo 1 topic client.subscribe("2842"); //servo 2 topic client.subscribe("2852"); //servo 3 topic digitalWrite(ledPin, LOW); //servo servo1.attach(servo1Pin); servo1.write(90); servo2.attach(servo2Pin); servo2.write(90); servo3.attach(servo3Pin); servo3.write(5);} // end of setupvoid loop() { client.loop(); //MQTT processing needs this to run //For servo positioning, don't want to move too fast. //Must crawl from current position to target position //but also avoid using "delay" cmd, that just freezes up microcontroller //servo 1 if ((millis() - servo1_time)> 20) { if (servo1_pos_cur> servo1_target) { servo1_pos_cur =servo1_pos_cur - 1; } if (servo1_pos_cur  20) { if (servo2_pos_cur> servo2_target) { servo2_pos_cur =servo2_pos_cur - 1; } if (servo2_pos_cur  20) { if (servo3_pos_cur> servo3_target) { servo3_pos_cur =servo3_pos_cur - 1; } if (servo3_pos_cur 3000) || (button1_db> millis())) { button1_db=millis(); client.publish("2862", "button1 yaya"); } } //button 2 button=digitalRead(button2); if (button==0) //inverted logic { if ( ((millis() - button2_db)>3000) || (button2_db> millis())) { button2_db=millis(); client.publish("2872", "button2 yaya"); } } //check network connection to MQTT broker every 60 seconds. //reconnect if no longer connected if ((millis() - MQTT_reconnect)> 60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(statusPin, HIGH); //Serial.println("MQTT connected OK"); } else { digitalWrite(statusPin, LOW); //Serial.println("MQTT NOT connected OK"); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); задержка (5000); while (client.connect("smarthouse") !=1) { digitalWrite(statusPin, LOW); //Serial.println("Error connecting to MQTT"); задержка (4000); } digitalWrite(statusPin, HIGH); } //Serial.println("reconnected to MQTT"); MQTT_reconnect =millis(); client.publish("watch","smart home heartbeat!"); }//end Mosquitto connection check} // end of loop
smarthome_ethernet.inoPlain text
// Eric Tsai// 2015-04-1// Arduino Uno w/ Ethernet, code for controlling physical smart home interface// Modify MQTT topic names to match your use// Modify MQTT broker IP address#include #include #include #include //Ethernetbyte mac[] ={ 0x90, 0xA2, 0xDA, 0x0D, 0x43, 0x13 };byte server[] ={ 192, 168, 1, 101 };EthernetClient ethClient;PubSubClient client(server, 1883, callback, ethClient);unsigned long keepalivetime=0;unsigned long MQTT_reconnect=0;bool conn_ok;//use LED for indicating MQTT connection status.int ledPin =4; //indicate lights onint statusPin =7; //indicate MQTT conn status//servo controlint servo1Pin =3; //front doorint servo2Pin =5; //garage doorint servo3Pin =6; //energy usage meterServo servo1; //doorServo servo2; //garage doorServo servo3; //energy//servo operation:target positions for servosint servo1_target =5; //door, closedint servo2_target =5; //garage, closedint servo3_target =180; //energy, 180 is "0" watts, motor mounted backwardsint servo1_pos_cur =5;int servo2_pos_cur =5;int servo3_pos_cur =180; // 180 is "0" watts, motor mounted backwardsint servo1Opened =5;int servo1Closed =120;int servo2Opened =5;int servo2Closed =150;unsigned long servo1_time =0;unsigned long servo2_time =0;unsigned long servo3_time =0;//---------------------------------------------------------------// MQTT call back// react to MQTT messages here//---------------------------------------------------------------void callback(char* topic, byte* payload, unsigned int length) { Serial.println("received MQTT"); //convert topic to int. int mytopic =atoi (topic); //Serial.print(mytopic); //convert payload to int payload[length] ='\0'; //add a line return so atof can parse correctly float mymsg =atof( (const char *) payload); //print MQTT message Serial.println(""); Serial.print("("); Serial.print(mytopic); Serial.print(", "); Serial.print(mymsg); Serial.println(")"); //led if (mytopic ==2822) { if (mymsg ==1) { digitalWrite(ledPin, HIGH); } if (mymsg ==0) { digitalWrite(ledPin, LOW); } } //servo 1, front door if (mytopic ==2832) { if (mymsg ==1) //opened { Serial.println("servo1 opened"); servo1_target =servo1Opened; } if (mymsg ==0) //closed { Serial.println("servo1 closed"); servo1_target =servo1Closed; } Serial.println(servo1_target); } /* //second garage door signal "closed" =off =send 1 "open" =on =send 0 */ //servo 2, garage door if (mytopic ==2842) { if (mymsg ==1) //opened { servo2_target =servo2Opened; } if (mymsg ==0) //closed { servo2_target =servo2Closed; } } //servo 3, energy meter if (mytopic ==2852) { //message =watts //error check if (mymsg> 6000) { mymsg =6000; } if (mymsg <0) { mymsg =0; } //bias meter from 180 degrees to 0 degrees //180 deg to 0 deg =0 watt to 6000 watts, for example //set max watts to what makes sense for you. servo3_target =180-((1-((6000-mymsg)/6000))*180); //servo3_target =mymsg; }}//end callbackvoid setup() { //ethernet //Ethernet.begin(mac, ip); //Wire.begin (MY_ADDRESS); Serial.begin (9600); Serial.println("starting"); pinMode(ledPin, OUTPUT); //LED indicating light on pinMode(statusPin, OUTPUT); digitalWrite(ledPin, HIGH); //wait for IP address while (Ethernet.begin(mac) !=1) { Serial.println("Error getting IP address via DHCP, trying again..."); задержка (5000); } Serial.println("ethernet OK"); keepalivetime=millis(); while (client.connect("smarthouse") !=1) { Serial.println("Error connecting to MQTT"); //delay(3000); задержка (4000); } MQTT_reconnect =millis(); Serial.println("setup complete"); client.publish("smarthouse","hello world"); //test publish //client.subscribe("#"); //test subscribe client.subscribe("2822"); //LED client.subscribe("2832"); //servo 1 topic client.subscribe("2842"); //servo 2 topic client.subscribe("2852"); //servo 2 topic digitalWrite(ledPin, LOW); //servo servo1.attach(servo1Pin); servo1.write(90); servo2.attach(servo2Pin); servo2.write(90); servo3.attach(servo3Pin); servo3.write(5);} // end of setupvoid loop() { client.loop(); //MQTT processing needs this to run //For servo positioning, don't want to move too fast. //Must crawl from current position to target position //but also avoid using "delay" cmd, that just freezes up microcontroller //servo 1 if ((millis() - servo1_time)> 20) { if (servo1_pos_cur> servo1_target) { servo1_pos_cur =servo1_pos_cur - 1; } if (servo1_pos_cur  20) { if (servo2_pos_cur> servo2_target) { servo2_pos_cur =servo2_pos_cur - 1; } if (servo2_pos_cur  20) { if (servo3_pos_cur> servo3_target) { servo3_pos_cur =servo3_pos_cur - 1; } if (servo3_pos_cur  60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(statusPin, HIGH); Serial.println("MQTT connected OK"); } else { digitalWrite(statusPin, LOW); Serial.println("MQTT NOT connected OK"); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); задержка (5000); while (client.connect("smarthouse") !=1) { digitalWrite(statusPin, LOW); Serial.println("Error connecting to MQTT"); задержка (4000); } digitalWrite(statusPin, HIGH); } //Serial.println("reconnected to MQTT"); MQTT_reconnect =millis(); client.publish("smarthouse","heartbeat every minute!"); }//end Mosquitto connection check} // end of loop
energy_monitor_yun.inoPlain text
/*Eric Tsai2015-04-22Arduino Yun code for publishing energy use to MQTT brokerModify the "PubSubClient client" for your broker IP address*/#include #include #include #include "EmonLib.h" // OpenEnergy Monitor project libraryint LED =3;EnergyMonitor emon1; // open energy monitorunsigned long MQTT_reconnect=0;unsigned long read_energy=0;double Irms;bool conn_ok;YunClient yun; //equivalent of ethernet client//really shouldn't need call back, but just in case it's needed.void callback(char* topic, byte* payload, unsigned int length) { digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(500); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW}//use yunclient to bridge to networkPubSubClient client("192.168.1.101", 1883, callback, yun);//**********************************************************************void setup(){ // initialize digital pin 13 as an output. pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW Bridge.begin(); client.connect("yun_energy"); client.publish("watch", "Energy Monitor Connected!"); client.subscribe("yun_energy"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(3000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW emon1.current(5, 60); // Current:input pin, calibration.}//**********************************************************************void loop(){ char buff_message[12]; //message buffer for MQTT publish float value; client.loop(); //run this every loop to maintain MQTT connection Irms =emon1.calcIrms(1480); // Calculate Irms only, 1480 means read Irms. //publish current every 10 seconds. if (millis() - read_energy> 10000) { //amps value =Irms; dtostrf (value, 4, 5, buff_message); client.publish("2853", buff_message); read_energy =millis(); //watts value =Irms*115; dtostrf (value, 4, 5, buff_message); client.publish("2852", buff_message); } //maintain MQTT connection if ((millis() - MQTT_reconnect)> 60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); задержка (5000); while (client.connect("yun_energy") !=1) { delay(4000); } digitalWrite(LED, HIGH); client.publish("watch", "Energy Monitor reconnected"); } MQTT_reconnect =millis(); }//end Mosquitto connection check }

Схема


Производственный процесс

  1. Домашний тест на беременность
  2. С# интерфейс
  3. Java-интерфейс
  4. Приложения домашней автоматизации
  5. МАЛИНОВАЯ АВТОМАТИЗАЦИЯ ДОМА
  6. Labman Automation
  7. Интернет вещей и домашняя автоматизация:что нас ждет в будущем?
  8. С# — Интерфейсы
  9. Автоматизация в индустрии 4.0
  10. Понимание автоматизации печати