Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construindo uma ponte de infravermelho com o SmartThings ThingShield

Componentes e suprimentos

Arduino UNO
× 1
SmartThings Shield para Arduino
× 1
LED emissor de IV
× 1
Diodo receptor IR
× 1
Resistor de 100 Ohm (opcional)
× 1

Sobre este projeto

Introdução


Um simples controle remoto de TV é capaz de muito mais mudanças de canal quando conectado à nuvem SmartThings. Com uma pequena contagem de peças e uma recompensa imediata, o projeto é uma boa maneira de explorar a plataforma.

Histórico do Arduino e do ThingShield


O SmartThings ThingShield facilita a construção de protótipos SmartThings usando o Arduino. A blindagem se conecta diretamente ao UNO que se conecta ao hub SmartThings por meio do protocolo Zigbee. Uma chave na blindagem permite escolher entre usar os pinos 0,1 ou 2,3 ​​para se comunicar com o Arduino. O ThingShield já reserva o uso do pino 6.


Para obter mais informações sobre como começar a usar o Arudino:http://arduino.cc/en/Guide/Introduction

Etapa 1:você precisará

  • (x1) SmartThings Arduino ThingShield
  • (x1) Arduino Uno
  • (x1) Receptor IR
  • (x1) LED emissor de infravermelho
  • (x1) Resistor de 100 Ohms (opcional)



Etapa 2:Baixe a Biblioteca de IR


O projeto depende de uma biblioteca Arduino maravilhosa desenvolvida por Ken Shirriff. https://github.com/shirriff/Arduino-IRremote

Instale a biblioteca da biblioteca do Arduino da maneira usual.

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

Uma vez instalado, precisamos modificar IRRemoteInt.h para usar o cronômetro no pino 9. Neste exemplo, usamos o pino 3 para comunicação com o ThingShield.



Etapa 3:esboço do Arduino


Em seguida, carregue o esboço para sua placa Arduino (consulte a seção de código).



Etapa 4:a construção


A construção é simples e direta. Primeiro conecte o ThingShield na parte superior do Arduino. Embora apenas o Arduino seja mostrado no diagrama abaixo, a localização dos pinos é a mesma com a blindagem conectada.

Para o receptor IR, conecte os pinos correspondentes ao aterramento e 5V. Em seguida, conecte o pino de dados ao pino 11 do Arduino. Conecte o LED emissor de infravermelho ao pino 9 e à terra. O resistor de 100 ohms é opcional neste projeto, pois o LED provavelmente pode lidar com a corrente máxima do Arduino, pois pisca rapidamente para enviar sinais. Deixado continuamente ligado, a mesma corrente provavelmente queimaria o LED.



Etapa 5:Criação de um tipo de dispositivo SmartThings personalizado


No IDE SmartThings, criamos em seguida um novo tipo de dispositivo para nosso ThingShield.

Vá para a seção “Meus tipos de dispositivo”, clique em “Novo SmartDevice” à direita.

A criação de um novo SmartDevice requer duas etapas. Primeiro, dê ao novo tipo de dispositivo um nome na parte superior "Ir Bridge". Observe que faremos referência ao nome de nosso SmartDevice em nosso código SmartApp posteriormente.

Precisamos definir os atributos (variáveis) e comandos (funções) do dispositivo. Para este tutorial, criaremos os atributos e comandos para dois botões programáveis ​​e um botão de gravação. Adicione cada um dos atributos e comandos mostrados. Selecione “Criar” para continuar codificando o dispositivo.

Em seguida, copie a definição do dispositivo para a janela de código no IDE (consulte a seção de código). Clique no botão “Salvar” na parte superior e, em seguida, clique em “Publicar” para disponibilizar o dispositivo para você.



Etapa 6:Atualizando o ThingShield para o seu novo tipo de dispositivo


Certifique-se de adicionar seu ThingShield ao hub SmartThings, se ainda não estiver configurado. Para emparelhar o dispositivo, conecte o ThingShield ao seu Arudino e ligue-o. Segure o botão “Switch” no escudo por 6 segundos. Com o aplicativo de smartphone SmartThings, selecione o botão Adicionar. Pressione o botão físico “switch” mais uma vez e você deverá ver o hub identificar o ThingShield.

De volta, no IDE, navegue até seu Arduino ThingShield clicando em “dispositivos” na tela inicial. Selecione seu dispositivo na lista e clique no botão “Editar” na parte inferior da página. No menu suspenso “Tipo”, escolha o novo tipo de SmartDevice que você criou. É útil dar aos dispositivos nomes de rótulos significativos quando você precisar selecioná-los mais tarde. Clique em atualizar para definir o dispositivo para o seu novo tipo de dispositivo.

Observe que, ao publicar atualizações para seus tipos de dispositivo personalizados no futuro, você vai querer voltar para confirmar se seus dispositivos físicos permaneceram associados ao tipo de dispositivo correto após uma atualização publicada.



Etapa 7:Escrevendo o aplicativo SmartThings


Temos mais um trecho de código no projeto - o próprio SmartApp. Navegue até “Meus SmartApps” e inicie um “Novo SmartApp” clicando no botão à direita. Dê um nome, uma descrição e uma categoria (“Meus aplicativos”). Clique em “Criar” para continuar codificando o aplicativo.

Copie o código smartApp (consulte a seção de código). Selecione “Salvar” e clique em “Publicar” para disponibilizar o SmartApp em seu aplicativo Smartthings iOS ou Android (em breve).

Observe que nos referimos ao tipo de SmartDevice pelo nome como “IrBridge” sem o espaço original que usamos originalmente no nome “Ir Bridge”:
 input "irDevice", "device.IrBridge" 

A linha nos permite mostrar apenas dispositivos do tipo “Ir Bridge” como opções para selecionar no SmartApp. O camelCasing usado é muito específico:Ao fazer referência a tipos de dispositivos em aplicativos inteligentes, os espaços são removidos do nome. O primeiro caractere e os caracteres que seguem originalmente um espaço são capitalizados. Todos os outros estão em letras minúsculas, independentemente da capitalização original.



Etapa 8:Habilite o SmartApp


No aplicativo de smartphone SmartThings, associe o novo SmartApp ao nosso novo dispositivo de IV e selecione os interruptores que deseja controlar. Em seguida, clique em “instalar”.

Para programar cada um dos botões do aplicativo, acesse os detalhes do bloco clicando na engrenagem no canto do bloco. Selecione o botão grande de gravação - ele ficará vermelho para mostrar que você está no modo de gravação. Em seguida, clique no bloco (Reproduzir / Pausar ou B) que deseja controlar - ele ficará amarelo. Aponte seu controle remoto para o ThingShield e pressione o botão que deseja aprender. O ThingShield irá agora enviar esse código para a nuvem SmartThings e associá-lo ao botão que você escolheu no SmartApp. O botão recém-programado ficará verde e o botão de gravação voltará a ficar branco.

Na próxima vez que você pressionar esse botão no controle remoto, alternará a chave associada ao botão no SmartApp.

Código

  • esboço do Arduino
  • Definição do dispositivo
  • código smartApp
Esboço do Arduino C / C ++
 // ********************************************* ********************************** /// @file /// @brief /// Arduino SmartThings IR Shield / / ************************************************** ***************************** # include  // TODO precisa ser definido devido a algum linker de linguagem de fio estranho, deve absorvemos toda esta biblioteca em coisas inteligentes # include  #include  // *************************** *************************************************** // Definições de pinos | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // VVVVVVVVVVVVVVVVVVVVV VVVVVVVVV // ******************************************** ************************************ # define PIN_LED 13 # define PIN_RECV 11 # define PIN_THING_RX 3 # define PIN_THING_TX 2 // ************************************************ ***************************** // Variáveis ​​globais | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // VVVVVVVVVVVVVVVVVVVVV VVVVVVVVV // ******************************************** *********************************** SmartThingsCallout_t messageCallout; // chamar a função encaminhar decalarationSmartThings smartthing (PIN_THING_RX, PIN_THING_TX, messageCallout); // constructorbool isDebugEnabled; // ativa ou desativa a depuração neste exemplo:stateLED; // estado para rastrear o último valor definido de LEDIRrecv irrecv (PIN_RECV); IRsend irsend; decode_results results; // **************************** *************************************************** // Funções API | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // VVVVVVVVVVVVVVVVVVVVV VVVVVVVVVV // **************************************** *********************************** void setup () {// configurar o estado padrão das variáveis ​​globais isDebugEnabled =true; stateLED =0; // corresponde ao estado do pino de hardware definido abaixo // configuração dos pinos de hardware pinMode (PIN_LED, OUTPUT); // define PIN_LED como uma saída digitalWrite (PIN_LED, LOW); // definir o valor como LOW (desligado) para corresponder a stateLED =0 if (isDebugEnabled) {// configurar a porta serial de depuração Serial.begin (9600); // configuração serial com uma taxa de transmissão de 9600 Serial.println ("setup .."); // imprime 'setup ..' no início} irrecv.enableIRIn (); // Iniciar o receptor} // ****************************************** ************************************ void loop () {// executar smartthing lógico smartthing.run (); if (irrecv.decode (&results)) {blue (); irrecv.resume (); // Recebe o próximo valor Serial.println (results.value, HEX); // despejar (&resultados); // EXEMPLO: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); // se a depuração estiver habilitada, imprime a mensagem recebida if (isDebugEnabled) {Serial.print ("Rx:'"); Serial.print (mensagem); Serial.println ("'"); } String type =message.substring (0,3); int startCode =message.indexOf (':'); String lenStr =message.substring (3, startCode); String codeStr =message.substring (startCode + 1); código longo sem sinal; // transforma a string hexadecimal em um longo sem sinal if (type! ="RAW") code =stringToNum (codeStr, 16); // não funcionará para RAW int len ​​=stringToNum (lenStr, 10); // Para cada tipo - NEC, SON, PAN, JVC, RC5, RC6, etc ... os 3 primeiros if (type =="NEC") {Serial.println ("NEC-SEND"); Serial.println (len); Serial.println (código, HEX); irsend.sendNEC (código, len); 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 (); }} // Despeja a estrutura decode_results.// Chame isso após IRrecv ::decode () // void * para contornar o problema do compilador // void dump (void * v) {// decode_results * results =(decode_results *) despejo vvoid (decode_results * results) {int count =results-> rawlen; if (resultados-> decode_type ==DESCONHECIDO) {Serial.print ("Codificação desconhecida:"); } else if (resultados-> decode_type ==NEC) {Serial.print ("NEC decodificado:"); } else if (resultados-> decode_type ==SONY) {Serial.print ("SONY decodificado:"); } else if (resultados-> decode_type ==RC5) {Serial.print ("Decodificado RC5:"); } else if (resultados-> decode_type ==RC6) {Serial.print ("Decodificado RC6:"); } else if (resultados-> decode_type ==PANASONIC) {Serial.print ("Decodificado PANASONIC - Endereço:"); Serial.print (resultados-> panasonicAddress, HEX); Serial.print ("Valor:"); } else if (resultados-> decode_type ==JVC) {Serial.print ("JVC decodificado:"); } Serial.print (resultados-> valor, HEX); Serial.print ("("); Serial.print (resultados-> bits, DEC); Serial.println ("bits)"); Serial.print ("Raw ("); Serial.print (contagem, DEC); Serial.print ("):"); para (int i =0; i  rawbuf [i] * USECPERTICK, DEC); } else {Serial.print (- (int) resultados-> rawbuf [i] * USECPERTICK, DEC); } Serial.print (""); } Serial.println ("");} // ************************************* **************************************** // Local Functions | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // VVVVVVVVVVVVVVVVVVVVV VVVVVVVVVV // **************************************** *********************************** string longa sem sinal (String s, int base) // 10 para decimal, 16 para hex {sem sinal longo i =0; valor longo sem sinal =0; lugar longo sem sinal =s.length (); char c; sinal longo sem sinal =1; para (i; i  ='0' &&c <='9') // 0 a 9 {valor + =(c - '0') * expoente (base, local); } else if (c> ='A' &&((c - 'A' + 10)  ='a' &&(c - 'a' + 10)  
Definição do dispositivo Groovy
 / ** * Smart Ir * * Autor:[email protected] * Data:06/03/2013 * / metadata {// Simulador de simulador de metadados {} // UI tiles tiles {standardTile ("recStatus", "device.recStatus", width:2, height:2, canChangeIcon:true, canChangeBackground:true) {state "off", label:'record', action:"record", backgroundColor:"#ffffff" state "on" , label:'record', action:"record", backgroundColor:"# ff0000"} // este é um bloco secundário // set, unset, prog - green, white, yellow standardTile ("buttonA", "device.buttonAStatus ", largura:1, altura:1, canChangeIcon:true, canChangeBackground:true) {state" unset ", label:'', action:" buttonA ", icon:" st.custom.buttons.play-pause ", backgroundColor :"#cccccc" // estado cinza "prog", rótulo:'', ação:"buttonA", ícone:"st.custom.buttons.play-pause", backgroundColor:"# FDE910" // estado amarelo "definido ", rótulo:'', ação:" buttonA ", ícone:" st.custom.buttons.play-pause ", backgroundColor:" # 79b821 "// verde} // definir, cancelar, prog - verde, branco, y ellow standardTile ("buttonB", "device.buttonBStatus", largura:1, altura:1, canChangeIcon:true, canChangeBackground:true) {state "unset", label:'', action:"buttonB", ícone:"st .custom.buttons.b ", backgroundColor:" #cccccc "// estado cinza" prog ", rótulo:'', ação:" buttonB ", ícone:" st.custom.buttons.b ", backgroundColor:" # FDE910 "// estado amarelo" set ", rótulo:'', ação:" buttonB ", ícone:" st.custom.buttons.b ", backgroundColor:" # 79b821 "// verde} // blocos principais possíveis main ([ "buttonA", "buttonB"]) // esta é uma matriz para vários detalhes de blocos (["recStatus", "buttonA", "buttonB"])}} // Analisa as mensagens de entrada do dispositivo para gerar a análise de configuração de eventos (descrição da string) {log.trace "parse:" def value =zigbee.parse (description) ?. text def codeParts =value.split (/, /) log.trace "code:$ {codeParts [0]}" // [0] é o hexadecimal, [1] é o reenvio // de [1], os três primeiros caracteres são o tipo, seguido pelo código if (device.currentValue ("recStatus") =="on") // no modo de registro {log .trace "registro habilitado" if (device.cur rentValue ("lastButton")! ="") {log.trace "o último botão está ativo" def buttonStatus ="$ {device.currentValue (" lastButton ")} Status"; def buttonHex ="$ {device.currentValue (" lastButton ")} Hex"; def buttonCode ="$ {device.currentValue (" lastButton ")} Código"; def result =[createEvent (name:buttonStatus, value:"set", isStateChange:true) // torna o botão verde, createEvent (name:buttonHex, value:codeParts [0], isStateChange:true) // armazena o código, createEvent (name:buttonCode, value:codeParts [1], isStateChange:true) // armazena o código, createEvent (name:"recStatus", value:"off", isStateChange:true), createEvent (name:"lastButton", valor:"", isStateChange:true) // redefinir o último botão] return result} else {log.trace "nenhum botão selecionado"}} else {// se não // verifique se ele corresponde a qualquer botão if (codeParts [ 0] ==device.currentValue ("buttonAHex")) {// enviar um evento relacionado a buttonA def result =createEvent (name:"button", valor:"A", isStateChange:true) log.debug "Análise retornada $ {result? .descriptionText} "return result} else if (codeParts [0] ==device.currentValue (" buttonBHex ")) {// enviar um evento relacionado a buttonB def result =createEvent (name:" button ", valor:"B", isStateChange:true) log.debug "Análise retornou $ {resultado? .DescriptionText}" ret urn result}} def result =createEvent (name:null, value:"") return result} def record () {// entrar no modo de registro log.debug "RecordMode mudando de $ {device.currentValue (" recStatus ")}" clearLast () // limpar o último botão // ativar / desativar o atributo if (device.currentValue ("recStatus") =="on") {sendEvent (name:"recStatus", valor:"off", isStateChange:true ) // cor do bloco muda para branco} else {sendEvent (nome:"recStatus", valor:"on", isStateChange:true) // cor do bloco muda para vermelho}} def buttonA () {log.debug "ButtonA pressionado" if (device.currentValue ("recStatus") =="on") // se estiver no modo de registro, defina o botão a ser programado {clearLast () log.debug "Coloque o botãoA no modo de programação" // defina o atributo lastTile para tileA // torne-o amarelo sendEvent (name:"buttonAStatus", valor:"prog", isStateChange:true) sendEvent (name:"lastButton", value:"buttonA", isStateChange:true)} else if (device.currentValue (" buttonAStatus ") ==" set ") // se estiver definido, envie o código armazenado {log.debug" Send buttonA Code "// envie o código remoto para o blaster zigbee.smartShield (text:"$ {device.currentValue (" buttonACode ")}"). format ()} else botão {log.debug "é atualmente $ {device.currentValue (" buttonAStatus ")} "}} def buttonB () {clearLast () log.debug" ButtonB pressionado "if (device.currentValue (" recStatus ") ==" on ") // se estiver no modo de gravação, defina o botão a ser programado {log.debug "Colocar botão no modo de programação" // definir o atributo lastTile para tileA // torná-lo amarelo sendEvent (nome:"buttonBStatus", valor:"prog", isStateChange:true) sendEvent (nome:"lastButton", valor:"buttonB ", isStateChange:true)} else if (device.currentValue (" buttonBStatus ") ==" set ") // se estiver definido, envie o código armazenado {log.debug" Send buttonB Code "// envie o código remoto para the blaster zigbee.smartShield (text:"$ {device.currentValue (" buttonBCode ")}"). format ()} else if (device.currentValue ("buttonBStatus") =="unset") botão {log.debug " atualmente não está definido "}} def clearLast () {if (device.currentValue (" lastButton ")! =" ") {sendEvent (name:" $ {device.current Value ("lastButton")} ", valor:" unset ", isStateChange:true) sendEvent (name:" lastButton ", value:" ", isStateChange:true)}} 
código smartApp Groovy
 / ** * Receptor de IV * * Autor:[email protected] * Data:31/03/2013 * / preferências {seção ("Escolha um dispositivo de IV ...") {input "irDevice", "dispositivo .IrBridge "} seção (" Botão A liga ou desliga ... ") {input" switch1 "," capacity.switch ", title:" Esta luz ", obrigatório:false} seção (" Botão B liga ou desliga ... ") {input" switch2 "," capacity.switch ", title:" This light ", required:false}} def installed () {log.debug" Installed with settings:$ {settings} "subscribe (irDevice , "button.B", handleB) subscribe (irDevice, "button.A", handleA)} def updated () {log.debug "Atualizado com configurações:$ {settings}" unsubscribe () subscribe (irDevice, "botão. B ", handleB) subscribe (irDevice," button.A ", handleA)} def handleA (evt) {log.debug" recebeu o botão A "if (switch1.currentValue (" switch ") ==" on ") {switch1 .off ()} else {switch1.on ()}} def handleB (evt) {log.debug "recebeu o botão B" if (switch2.currentValue ("switch") =="on") {switch2.off () } else {switch2.on ()}} 

Processo de manufatura

  1. Construindo robôs com Raspberry Pi e Python
  2. Construindo um segway com Raspberry Pi
  3. O que eu faço com os dados ?!
  4. Capturando as gotas de água com Arduino
  5. Monitoramento de CO2 com Sensor K30
  6. Comunicação para surdos-cegos com 1Sheeld / Arduino
  7. Aceitar moeda de controle com Arduino
  8. Arduino com Bluetooth para controlar um LED!
  9. Conheça a temperatura de sua casa de qualquer lugar com a nuvem Arduino!
  10. Construindo o futuro da experiência do funcionário com automação inteligente