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

Построение ИК-моста с помощью SmartThings ThingShield

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

Arduino UNO
× 1
SmartThings Shield для Arduino
× 1
Светодиод ИК-излучения
× 1
Диод ИК-приемника
× 1
Резистор 100 Ом (необязательно)
× 1

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

Введение

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

Сведения об Arduino и ThingShield

SmartThings ThingShield упрощает создание прототипов SmartThings с использованием Arduino. Шилд подключается напрямую к UNO, подключаясь к концентратору SmartThings через протокол Zigbee. Переключатель на щите позволяет выбирать между использованием контактов 0,1 или 2,3 для связи с Arduino. ThingShield уже резервирует использование контакта 6.

Для получения дополнительной информации о начале работы с Arudino:http://arduino.cc/en/Guide/Introduction

Шаг 1. Вам понадобится

  • (x1) SmartThings Arduino ThingShield
  • (x1) Arduino Uno
  • (x1) ИК-приемник
  • (x1) ИК-излучающий светодиод
  • (x1) резистор 100 Ом (опционально)


Шаг 2. Загрузите ИК-библиотеку

Проект основан на чудесной библиотеке Arduino, разработанной Кеном Ширриффом. https://github.com/shirriff/Arduino-IRremote

Установите библиотеку библиотеки Arduino обычным способом.

http://arduino.cc/en/Guide/Libraries

После установки нам нужно изменить IRRemoteInt.h, чтобы использовать таймер на выводе 9. В этом примере мы используем вывод 3 для связи с ThingShield.


Шаг 3. Эскиз Arduino

Затем загрузите эскиз на плату Arduino (см. Раздел кода).


Шаг 4. Сборка

Сборка проста и понятна. Сначала подключите ThingShield поверх Arduino. Хотя на схеме ниже показан только Arduino, расположение выводов такое же, как и при прикрепленном щите.

Для ИК-приемника подключите соответствующие контакты к земле и 5 В. Затем прикрепите контакт данных к контакту 11 Arduino. Подключите светодиод, излучающий ИК-излучение, к контакту 9 и заземлению. Резистор на 100 Ом не является обязательным в этой конструкции, поскольку светодиод, вероятно, может справиться с максимальным током от Arduino, поскольку он быстро мигает для отправки сигналов. При постоянном включении такой же ток, скорее всего, приведет к сгоранию светодиода.


Шаг 5. Создание настраиваемого типа устройства SmartThings

Затем в IDE SmartThings мы создаем новый тип устройства для нашего ThingShield.

Перейдите в раздел «Мои типы устройств», нажмите «Новое SmartDevice» справа.

Для создания нового SmartDevice требуется два шага. Сначала дайте новому типу устройства имя вверху «Ir Bridge». Обратите внимание, что мы будем ссылаться на имя нашего SmartDevice в нашем коде SmartApp позже.

Нам нужно определить атрибуты (переменные) и команды (функции) устройства. В этом руководстве мы создадим атрибуты и команды для двух программируемых кнопок и кнопки записи. Добавьте каждый из показанных атрибутов и команд. Выберите «Создать», чтобы продолжить кодирование устройства.

Затем скопируйте определение устройства в окно кода в IDE (см. Раздел кода). Нажмите кнопку «Сохранить» вверху, а затем нажмите «Опубликовать», чтобы устройство стало вам доступно.


Шаг 6. Обновление ThingShield до нового типа устройства

Обязательно добавьте свой ThingShield в концентратор SmartThings, если он еще не настроен. Чтобы выполнить сопряжение устройства, подключите ThingShield к Arudino и включите его. Удерживайте кнопку «Switch» на щите в течение 6 секунд. В приложении для смартфона SmartThings нажмите кнопку «Добавить». Нажмите физическую кнопку «переключатель» еще раз, и вы увидите, что концентратор идентифицирует ThingShield.

Вернувшись в среду IDE, перейдите к Arduino ThingShield, щелкнув «устройства» на главном экране. Выберите свое устройство из списка и нажмите кнопку «Редактировать» внизу страницы. В раскрывающемся меню «Тип» выберите созданный вами новый тип SmartDevice. Полезно давать устройствам понятные названия ярлыков, когда вам нужно будет выбрать их позже. Нажмите "Обновить", чтобы настроить устройство на новый тип устройства.

Обратите внимание:при публикации обновлений для ваших пользовательских типов устройств в будущем вы захотите вернуться, чтобы убедиться, что ваши физические устройства остались связанными с правильным типом устройства после опубликованного обновления.


Шаг 7. Написание приложения SmartThings

У нас в проекте есть еще один фрагмент кода - сам SmartApp. Перейдите в «Мои SmartApps» и запустите «New SmartApp», нажав кнопку справа. Дайте ему имя, описание и категорию («Мои приложения»). Нажмите «Создать», чтобы продолжить кодирование приложения.

Скопируйте код smartApp (см. Раздел кода). Выберите «Сохранить», а затем нажмите «Опубликовать», чтобы сделать SmartApp доступным в вашем приложении Smartthings для iOS или Android (скоро).

Обратите внимание, что мы ссылаемся на тип SmartDevice по имени как «IrBridge» без исходного пробела, который мы изначально использовали в имени «Ir Bridge»:

 ввод "irDevice", "device.IrBridge" 

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


Шаг 8. Включите SmartApp

В приложении для смартфона SmartThings свяжите новое приложение SmartApp с нашим новым ИК-устройством и выберите переключатели, которыми вы хотите управлять. Затем нажмите «установить».

Чтобы запрограммировать каждую из кнопок в приложении, перейдите к сведениям о плитке, щелкнув шестеренку в углу плитки. Нажмите большую кнопку записи - она ​​станет красной, чтобы показать, что вы находитесь в режиме записи. Затем щелкните плитку (Воспроизведение / Пауза или B), которой вы хотите управлять - она ​​станет желтой. Направьте свой пульт на ThingShield и нажмите кнопку, которую хотите узнать. ThingShield теперь отправит этот код в облако SmartThings и свяжет его с кнопкой, которую вы выбрали в SmartApp. Новая запрограммированная кнопка станет зеленой, а кнопка записи снова станет белой.

В следующий раз, когда вы нажмете эту кнопку на пульте дистанционного управления, вы переключите переключатель, связанный с кнопкой в ​​SmartApp.

Код

  • Эскиз Arduino
  • Определение устройства
  • код smartApp
Скетч Arduino C / C ++
 // ******************************************* ******************************* /// @ файл /// @brief /// Arduino SmartThings IR Shield / / ************************************************ *************************** # include  // TODO необходимо установить из-за какого-то странного компоновщика языка проводов, должен мы поглощаем всю эту библиотеку в smartthings # include  #include  // ************************** ************************************************* // Определения контактов | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // VVVVVVVVVVVVVVVVVVVV VVVVVVVV // ****************************************** ********************************* # определить PIN_LED 13 # определить PIN_RECV 11 # определить PIN_THING_RX 3 # определить PIN_THING_TX 2 // *********************************************** ***************************** // Глобальные переменные | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // VVVVVVVVVVVVVVVVVVVV VVVVVVVV // ****************************************** ********************************* SmartThingsCallout_t messageCallout; // вызов функции пересылки decalarationSmartThings smartthing (PIN_THING_RX, PIN_THING_TX, messageCallout); // constructorbool isDebugEnabled; // включить или отключить отладку в этом примере int stateLED; // состояние для отслеживания последнего установленного значения LEDIRrecv irrecv (PIN_RECV); IRsend irsend; decode_results results; // ************************** ************************************************* // Функции API | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // VVVVVVVVVVVVVVVVVVVV VVVVVVVVV // ****************************************** ********************************* void setup () {// установка состояния глобальных переменных по умолчанию isDebugEnabled =true; stateLED =0; // соответствует состоянию аппаратных выводов, установленных ниже // настройка аппаратных выводов pinMode (PIN_LED, OUTPUT); // определяем PIN_LED как выход digitalWrite (PIN_LED, LOW); // установить значение LOW (выкл.) для соответствия stateLED =0 if (isDebugEnabled) {// настроить последовательный порт отладки Serial.begin (9600); // установка последовательного порта со скоростью 9600 бод Serial.println ("setup .."); // распечатываем 'setup ..' при запуске} irrecv.enableIRIn (); // Запускаем приемник} // ***************************************** ********************************** void loop () {// запускаем логику smartthing.run (); если (irrecv.decode (&результаты)) {синий (); irrecv.resume (); // Получение следующего значения Serial.println (results.value, HEX); // дамп (&результаты); // ПРИМЕР:smartthing.send ("HEX, XXXCODE"); String irCmd; if (results.decode_type ==NEC) {irCmd =String (results.value, HEX) + "," + "NEC" + String (results.bits, DEC) + ":" + String (results.value, HEX); } else if (results.decode_type ==SONY) {irCmd =String (results.value, HEX) + "," + "SNY" + String (results.bits, DEC) + ":" + String (results.value, HEX); } else if (results.decode_type ==RC5) {irCmd =String (results.value, HEX) + "," + "RC5" + String (results.bits, DEC) + ":" + String (results.value, HEX); } else if (results.decode_type ==RC6) {irCmd =String (results.value, HEX) + "," + "RC6" + String (results.bits, DEC) + ":" + String (results.value, HEX); } else {irCmd =String (results.value, HEX) + "," + "RAW" + String (results.bits, DEC) + ":"; } Serial.println (irCmd); smartthing.send (irCmd); irCmd =""; }} // ******************************************** ****************************** void messageCallout (String message) {smartthing.shieldSetLED (0, 0, 0); // если включена отладка, распечатать полученное сообщение if (isDebugEnabled) {Serial.print ("Rx:'"); Serial.print (сообщение); Serial.println ("'"); } Тип строки =message.substring (0,3); int startCode =сообщение.indexOf (':'); Строка lenStr =message.substring (3, startCode); Строка codeStr =message.substring (startCode + 1); беззнаковый длинный код; // превращаем шестнадцатеричную строку в длинную беззнаковую if (type! ="RAW") code =stringToNum (codeStr, 16); // не будет работать для RAW int len ​​=stringToNum (lenStr, 10); // Для каждого типа - NEC, SON, PAN, JVC, RC5, RC6 и т.д ... первые 3 if (type =="NEC") {Serial.println ("NEC-SEND"); Serial.println (len); Serial.println (код, HEX); irsend.sendNEC (код, лен); irrecv.enableIRIn (); } else if (type =="SNY") {irsend.sendSony (code, len); irrecv.enableIRIn (); } else if (type =="RC5") {irsend.sendRC5 (code, len); irrecv.enableIRIn (); } else if (type =="RC6") {irsend.sendRC6 (code, len); irrecv.enableIRIn (); }} // Выгружает структуру decode_results. // Вызовите это после IRrecv ::decode () // void *, чтобы обойти проблему компилятора // void dump (void * v) {// decode_results * results =(decode_results *) vvoid dump (decode_results * результаты) {int count =results-> rawlen; if (results-> decode_type ==UNKNOWN) {Serial.print ("Неизвестная кодировка:"); } else if (results-> decode_type ==NEC) {Serial.print ("Декодированный NEC:"); } else if (results-> decode_type ==SONY) {Serial.print ("Декодированный SONY:"); } else if (results-> decode_type ==RC5) {Serial.print ("Декодированный RC5:"); } else if (results-> decode_type ==RC6) {Serial.print ("Декодированный RC6:"); } else if (results-> decode_type ==PANASONIC) {Serial.print ("Декодированный PANASONIC - Адрес:"); Serial.print (результаты-> panasonicAddress, HEX); Serial.print ("Значение:"); } else if (results-> decode_type ==JVC) {Serial.print ("Декодированный JVC:"); } Serial.print (результаты-> значение, HEX); Serial.print ("("); Serial.print (результаты-> биты, DEC); Serial.println ("биты)"); Serial.print ("Raw ("); Serial.print (count, DEC); Serial.print ("):"); for (int i =0; i  rawbuf [i] * USECPERTICK, DEC); } else {Serial.print (- (int) results-> rawbuf [i] * USECPERTICK, DEC); } Serial.print (""); } Serial.println ("");} // ************************************* ************************************** // Локальные функции | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // VVVVVVVVVVVVVVVVVVVV VVVVVVVVV // ****************************************** ********************************* unsigned long stringToNum (String s, int base) // 10 для десятичного числа, 16 для шестнадцатеричного {unsigned long i =0; беззнаковое длинное значение =0; беззнаковое длинное место =s.length (); char c; беззнаковый длинный знак =1; for (я; я  ='0' &&c <='9') // от 0 до 9 {значение + =(c - '0') * экспонента (основание, место); } else if (c> ='A' &&((c - 'A' + 10)  ='a' &&(c - 'a' + 10)  
Определение устройства Groovy
 / ** * Smart Ir * * Автор:[email protected] * Дата:06.03.2013 * / metadata {// Симулятор метаданных имитатора {} // Плитки определений плиток пользовательского интерфейса {standardTile ("recStatus", "device.recStatus", ширина:2, высота:2, canChangeIcon:true, canChangeBackground:true) {состояние "выключено", метка:'запись', действие:"запись", backgroundColor:"#ffffff" состояние "включено" , label:'record', action:"record", backgroundColor:"# ff0000"} // это второстепенная плитка // set, unset, prog - зеленый, белый, желтый standardTile ("buttonA", "device.buttonAStatus ", ширина:1, высота:1, canChangeIcon:true, canChangeBackground:true) {состояние" не задано ", метка:'', действие:" buttonA ", значок:" st.custom.buttons.play-pause ", backgroundColor :"#cccccc" // серое состояние "prog", метка:'', действие:"buttonA", значок:"st.custom.buttons.play-pause", backgroundColor:"# FDE910" // желтый статус "установлен ", label:'', action:" buttonA ", icon:" st.custom.buttons.play-pause ", backgroundColor:" # 79b821 "// green} // set, unset, prog - зеленый, белый, y ellow standardTile ("buttonB", "device.buttonBStatus", width:1, height:1, canChangeIcon:true, canChangeBackground:true) {состояние "unset", label:'', action:"buttonB", icon:"st .custom.buttons.b ", backgroundColor:" #cccccc "// серое состояние" prog ", label:'', action:" buttonB ", icon:" st.custom.buttons.b ", backgroundColor:" # FDE910 "// желтое состояние" set ", label:'', action:" buttonB ", icon:" st.custom.buttons.b ", backgroundColor:" # 79b821 "// зеленый} // возможные основные плитки main ([ "buttonA", "buttonB"]) // это массив для деталей нескольких плиток (["recStatus", "buttonA", "buttonB"])}} // Разбираем входящие сообщения устройства для генерации eventsdef parse (String description) {log.trace "parse:" def value =zigbee.parse (description) ?. text def codeParts =value.split (/, /) log.trace "code:$ {codeParts [0]}" // [0] - шестнадцатеричное, [1] - это повторная // отправка [1], первые три символа - это тип, за которым следует код if (device.currentValue ("recStatus") =="on") // в режиме записи {log .trace "запись включена" if (device.cur rentValue ("lastButton")! ="") {log.trace "активна последняя кнопка" def buttonStatus ="$ {device.currentValue (" lastButton ")} Статус"; def buttonHex ="$ {device.currentValue (" lastButton ")} Hex"; def buttonCode ="Код $ {device.currentValue (" lastButton ")}"; def result =[createEvent (name:buttonStatus, value:"set", isStateChange:true) // превращаем кнопку в зеленый цвет, createEvent (name:buttonHex, value:codeParts [0], isStateChange:true) // сохраняем код, createEvent (name:buttonCode, value:codeParts [1], isStateChange:true) // сохраняем код, createEvent (name:"recStatus", value:"off", isStateChange:true), createEvent (name:"lastButton", value:"", isStateChange:true) // сбросить последнюю кнопку] вернуть результат} else {log.trace "кнопка не выбрана"}} else {// если нет // проверить, соответствует ли она любым кнопкам if (codeParts [ 0] ==device.currentValue ("buttonAHex")) {// отправляем событие, связанное с buttonA def result =createEvent (name:"button", value:"A", isStateChange:true) log.debug "Parse вернулся $ {result? .descriptionText} "return result} else if (codeParts [0] ==device.currentValue (" buttonBHex ")) {// отправляем событие, связанное с buttonB def result =createEvent (name:" button ", value:"B", isStateChange:true) log.debug "Parse возвратил $ {result? .DescriptionText}" ret urn result}} def result =createEvent (name:null, value:"") return result} def record () {// переход в режим записи log.debug "RecordMode меняется с $ {device.currentValue (" recStatus ")}" clearLast () // очистить последнюю кнопку // включить / выключить атрибут if (device.currentValue ("recStatus") =="on") {sendEvent (name:"recStatus", value:"off", isStateChange:true ) // цвет плитки изменится на белый} else {sendEvent (name:"recStatus", value:"on", isStateChange:true) // цвет плитки изменится на красный}} def buttonA () {log.debug "Кнопка A нажата" if (device.currentValue ("recStatus") =="on") // если в режиме записи, установить кнопку как программируемую {clearLast () log.debug "Перевести buttonA в режим программирования" // установить для атрибута lastTile значение tileA // сделать его желтым sendEvent (name:"buttonAStatus", value:"prog", isStateChange:true) sendEvent (name:"lastButton", value:"buttonA", isStateChange:true)} else if (device.currentValue (" buttonAStatus ") ==" set ") // если он установлен, отправить сохраненный код {log.debug" Отправить buttonA Code "// отправить удаленный код для бластера zigbee.smartShield (текст:"$ {device.currentValue (" buttonACode ")}"). format ()} else {log.debug "кнопка в настоящее время $ {device.currentValue (" buttonAStatus ")} "}} def buttonB () {clearLast () log.debug" КнопкаB нажата "if (device.currentValue (" recStatus ") ==" on ") // если в режиме записи, установить кнопку для программирования {log.debug «Перевести кнопку в режим программирования» // установить для атрибута lastTile значение tileA // сделать его желтым sendEvent (name:«buttonBStatus», значение:«prog», isStateChange:true) sendEvent (name:«lastButton», значение:«buttonB ", isStateChange:true)} else if (device.currentValue (" buttonBStatus ") ==" set ") // если он установлен, отправить сохраненный код {log.debug" Отправить buttonB Code "// отправить удаленный код на бластер zigbee.smartShield (текст:"$ {device.currentValue (" buttonBCode ")}"). format ()} else if (device.currentValue ("buttonBStatus") =="unset") {log.debug "кнопка в настоящее время не установлено "}} def clearLast () {if (device.currentValue (" lastButton ")! =" ") {sendEvent (name:" $ {device.current Value ("lastButton")} ", value:" unset ", isStateChange:true) sendEvent (name:" lastButton ", значение:" ", isStateChange:true)}} 
код smartApp Groovy
 / ** * ИК-приемник * * Автор:[email protected] * Дата:31.03.2013 * / preferences {section («Выберите ИК-устройство ...») {введите «irDevice», «устройство .IrBridge "} раздел (" Кнопка A включает или выключает ... ") {ввод" switch1 "," capacity.switch ", title:" This light ", required:false} section (" Кнопка B включает или выключает ... ") {ввод" переключатель2 "," возможность.switch ", заголовок:" Этот свет ", требуется:false}} def installed () {log.debug" Установлен с настройками:$ {settings} "subscribe (irDevice , "button.B", handleB) подписаться (irDevice, "button.A", handleA)} def updated () {log.debug "Обновлено с настройками:$ {settings}" unsubscribe () подписаться (irDevice, "button. B ", handleB) subscribe (irDevice," button.A ", handleA)} def handleA (evt) {log.debug" получил кнопку A "if (switch1.currentValue (" switch ") ==" on ") {switch1 .off ()} else {switch1.on ()}} def handleB (evt) {log.debug "полученная кнопка B" if (switch2.currentValue ("switch") =="on") {switch2.off () } else {switch2.on ()}} 

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

  1. Создание роботов с Raspberry Pi и Python
  2. Создание сегвея с Raspberry Pi
  3. Что мне делать с данными ?!
  4. Захват капель воды с помощью Arduino
  5. Мониторинг CO2 с помощью датчика K30
  6. Слепоглухое общение с 1Sheeld / Arduino
  7. Управление монетоприемником с помощью Arduino
  8. Arduino с Bluetooth для управления светодиодом!
  9. Узнавайте температуру своего дома откуда угодно с помощью Arduino Cloud!
  10. Создание будущего опыта сотрудников с помощью интеллектуальной автоматизации