domingo, 23 de dezembro de 2012

Automação Residencial com Arduino na Prática - Parte 2 (Interface OSC)


Neste post vou descrever o processo de configuração para a comunicação entre o dispositivo móvel de comando (Iphone/Ipad/Ipod/Android) e o Arduino que é o núcleo da central de Automação.

Para estabelecer essa comunicação utilizaremos  o protocolo OSC (Open Sound Control) que é uma evolução do protocolo MIDI adaptada para transporte via TCPIP.

Mais informações sobre o protocolo OSC podem ser obtidas aqui.

As principais vantagens de usar esse protocolo são as seguintes:
  • Apresenta resposta rápida aos comandos
  • Biblioteca ARDOSC disponível para Arduino
  • Disponibilidade de ferramenta simples para o desenvolvimento de interfaces gráficas customizadas para Iphone, Ipad, Ipod, e Android chamada TouchOSC Editor. Com essa ferramenta, não é necessário conhecer nada de programação IOS para desenvolver interfaces gráficas de comando para automação.

A biblioteca recotanaARDOSC trabalha em conjunto com a biblioteca Ethernet oficial do Arduino, sendo assim qualquer shield ethernet baseado no chip W5100 deve funcionar sem problemas.

A versão da Lib ARDOSC indicada no link acima é compatível com a IDE 1.0 do Arduino, sendo que recomendo utilizarem essa versão.

A biblioteca ARDOSC torna bastante simples a configuração da comunicação OSC no Arduino, pois além das definições de interface de comunicação, temos apenas que definir quais são as rotinas que devem ser executadas para cada comando OSC recebido.

Para executar esta demonstração de comunicação OSC , serão necessários os seguintes componentes:
  • Arduino
  • Shield Ethernet
  • 2 leds
  • 2 resistores de 1K
  • 2 chaves tactil
  • fios para conexão
  • protoboard
  • Roteador WiFi (pode ser o existente na sua rede residencial)
  • dispositivo móvel (Iphone,Ipad,Ipod ou Android)

A idéia básica é ligar e desligar 2 leds conectados ao arduino, a partir da tela de um dispositivo móvel (Iphone, Ipad, Ipod ou Android). Além disso poderemos também controlar os leds a partir de duas chaves conectadas diretamente no Arduino, sendo que neste caso o status dos Leds deverão ser atualizados na tela do dispositivo móvel.


1o Passo  (Criar a interface gráfica de comando no TouchOSC Editor)

Neste primeiro passo criaremos uma tela customizada para o dispositivo de controle, que pode ser um IPhone,Ipad,Ipod ou Android. Para isso utilizaremos o aplicativo TouchOSC Editor que está disponível aqui .

Depois de baixar e instalar a versão do aplicativo TouchOSC Editor compatível com o seu sistema operacional, abra o aplicativo.

Na janela abaixo, selecione as opções de “Layout Size“ e ”Layout Orientation” confome seu dispositivo móvel .

Adicionar legenda

Obs: O campo "Page Name" não é importante neste teste, porém ele pode ser utilizado num sistema de automação mais elaborado para identificar o ambiente controlado pelos comandos da página. (ex: cozinha. sala, dormitórios, etc). Toda vez que for selecionada uma página diferente, um comando OSC será enviado para o Arduino com o "Page Name" correspondente a página selecionada. Essa informação poderá ser utilizada no Arduino para devolver para o celular o status das lâmpadas daquela página .

Clicando na aba cinza com o botão direito do mouse, podemos adicionar outras páginas a nossa interface e cada página pode conter botões de comandos diferentes, semelhante as telas que mostrei no primeiro post deste tema. 
Podemos assim dividir a casa em setores, onde cada página contem os comandos de um setor da residência.

Para inserir os controles na página, clique com o botão direito do mouse na parte preta da tela e selecione o tipo de controle desejado. (neste caso use o ”toggle button”)

Surgirá um objeto do tipo ”toggle button” na tela que poderá se dimensionado confome desejado.


  • Defina um nome para o togge button no campo "Name"
  • Selecione a cor desejada para o botão em Color  
  • Desmarque a opção auto em OSC e na caixa logo abaixo digite o commando OSC que deseja associar a esse botão (neste caso vamos usar  "/ard/led1"  (sem aspas))
  • Defina Value Range como (From=0  e To=1) * 
* (esses são os valores de argumento que serão enviados com o comando OSC ”/ard/led1” quando o botão mudar de estado)
Neste caso:
Botão desligado: envia 0
Botão acionado: envia 1


Para criar o segundo segundo botão de controle, clicar novamente com o botão direito do mouse na parte preta da tela e selecionar ”toggle button”
















Configurar o Segundo toggle buttom conforme figura acima:

Uma vez finalizado clique em ”save “, escolha onde quer salvar e dê um nome para o layout .

Existem vários outros tipos de objetos de comando que podem ser utilizados, inclusive labels que podem identificar os botões e incrementar o aspecto visual da interface, porém neste exemplo vamos criar apenas os dois toggle buttons necessários para a nossa demostração.

Para disponibilizar o layout que criamos e transferir para o dispositivo móvel, basta clicar em ”Sync” no TouchOSC Editor e em seguida executar no Iphone, Ipad ou Ipod o procedimento descrito abaixo .


2o passo   (Instalar e configurar o TouchOSC no dispositivo móvel)


Baixar o TouchOsc para seu dispositivo móvel na apple store ou na Google Play.


Ao executar o TouchOSC pela primeira vez aparecerá a janela abaixo:




Selecione a primeira opção “OSC: Not Configured” 

  • Posicione a opção Enabled em ON.
  • Indique em Host o IP definido para o seu Arduino.
  •  Em Port (outgoing) indique a porta definida para serverPort no código do Arduino.
  • Em Port (incoming) indique a porta definida para destPort no código do Arduino.

O campo Local IP Address é o IP atribuido atualmente ao dispositivo móvel. Ele é informado automaticamente pelo aplicativo TouchOSC.


  • Toque em TouchOSC no canto superior esquerdo da tela para retornar ao menu inicial (tela abaixo).





As opções MIDI Mobilizer e CoreMIDI podem ficar em Disabled.

Para adicionar ao dispositivo móvel o novo layout que criamos no TouchOSC Editor, toque em Layout (Simple) e então na tela abaixo clique em Add.




Neste momento deverá aparecer uma tela semelhante a esta abaixo, porém indicando que um host foi encontrado. (será indicado o nome do seu PC onde está o layout que criamos).




Importante: o PC e o dispositivo móvel deverão estar conectados na mesma rede para que seja possível transferir o layout.


Toque no host que foi encontrado e o layout será transferido para o dispositivo móvel.


Toque então em Layout e selecione o novo layout que foi transferido.

Depois toque em Done.

O layout novo que criamos será apresentado na tela e já estará pronto para usar.


Mais detalhes sobre esta configuração podem ser obtidos na documentação do TouchOSC que pode ser consultada aqui.

Para layouts customizados para dispositivos Android, consultar a documentação aqui.

3o Passo  (montar o circuito no Arduino e carregar o código)

Bem agora só falta montar os componentes adicionais e carregar o código no Arduino para ele interpretar as mensagens OSC e controlar os LEDs.

A montagem dos componentes no Arduino deverá ser executada conforme foto abaixo:



A seguir temos o código arduino que utilizaremos nesta demonstração onde comentei cada linha para facilitar o entendimento:




O código acima permite controlarmos os 2 leds do circuito a partir da tela do celular.

Na primeira parte do código, temos as definições da interface Ethernet e portas utilizadas pelo protocol OSC.

 Notem que temos as portas serverPortdestPort.

  • Serverport é a porta que o Arduino receberá as mensagens OSC que o dispositivo móvel (Iphone/Ipad/Ipod/Android) envia.
  • DestPort é a porta que o arduino vai usar para enviar mensagens OSC para o dispositivo móvel (Iphone/Ipad/Ipod/Android).

O arduino poderá enviar mensagens OSC para o dispositivo móvel quando for necessário atualizar o status dos LEDs. Isso acontecerá quando eles forem ligados ou desligados a partir das chaves tactil conectadas no Arduino.

No cenário real de automação essas chaves estarão nos módulos remotos (MA02, Comando, Dimmer ou IR/RGB) que terão comunicação ZIBEE com o módulo central através dos XBees.
Este tema será abordado no próximo post (parte 3).

No método "setup", fazemos a associação dos comandos OSC com as rotinas que deverão ser executadas para cada um deles.


  server.addCallback("/ard/led1",&func1);  //define que a rotina "func1" sera executada para o comando OSC "/ard/led1"
  server.addCallback("/ard/led2",&func2);  //define que a rotina "func2" sera executada para o comando OSC "/ard/led2"

No método "setup" também são configurados os modos de operação das portas dos leds e ativados os resistores de PullUps internos para as portas das chaves.

Finalmente no método loop temos leituras das chaves e as rotinas específicas para cada comando OSC.

Os comandos OSC podem conter valores dos seguintes tipos:

- Int32
- Float
- String

No nosso exemplo vamos receber argumentos Float por isso utilizaremos (int)_mes->getArgFloat(0)

Basicamente uma mensagem OSC tem as seguintes informações:
  • OSCAdr (identificação do comando que se quer enviar)
  • destIP  (endereço IP do destino da mensagem)
  • destPort  (porta utilizada para envio da mensagem)
  • Arg (argumento associado ao OSCAdr que pode ser do tipo Int32, Float ou String)

Para montar e enviar uma mensagem OSC no Arduino, usamos as seguintes linhas de comando:

OSCMessage txMes;  //cria uma nova mensagem OSC
txMes.setAddress(destIP,destPort);  //define endereço IP e porta do destino da mensagem OSC
txMes.beginMessage("/ard/led1");  //define comando OSC

txMes.addArgFloat(!state);  //define argumento Float que sera enviado 
client.send(&txMes);  //envia mensagem OSC 


Para adicionar argumentos na mensagem OSC podemos usar as seguintes opções:

txMes.addArgInt32(int);
txMes.addArgFloat(float);
txMes.addArgString(string);

Abaixo temos um diagrama com as associações entre os parâmetros inseridos no TouchOSC e o código no Arduino:



Abaixo um video demonstrando o funcionamento do que foi apresentado nesta parte 2 do tópico Automação Residencial com Arduino na Prática .



Em caso de dúvidas, fiquem a vontade para fazer perguntas, tanto nos comentários como por email.

Na parte 3 falaremos sobre comunicação ZIGBee usando módulos XBee.

Até lá. 

Um Feliz Natal a todos



157 comentários:

  1. Esse código funciona com o Android

    ResponderExcluir
  2. Sim funciona, basta você carregar o mesmo layout personalizado no seu Android . Veja o link que coloquei neste post para usuários Android

    ResponderExcluir
    Respostas
    1. vc tem este codigo para disponibilizar

      Excluir
    2. Amigão!! você tem o touchOSC.APK pra me enviar???
      não estou consegundo baixar
      bira.lima10@gmail.com
      Abraço!!

      Excluir
  3. esse link aqui ? http://hexler.net/software/touchosc ....tem como coolocar senha no inicio da aplicação nao? vc vai dar continuidade nesse post nao?

    ResponderExcluir
    Respostas
    1. O link é este :
      http://www.circuitbentobox.com/note/how-to-custom-layouts-in-touchosc-for-android

      Não testei pois não tenho Android, de qualquer forma você pode testar usando os layouts que já vem no aplicativo para android. Basta editar os botões colocando o comando OSC adequado : ex: /ard/led2

      Estou montando a parte 3 do post que será publicada em breve. Aguarde

      Excluir
  4. pelo que eu observei tb não tem como funcionar se vc não tiver na rede local do roteador, tem como funcionar fora do alcance do roteador?

    ResponderExcluir
    Respostas
    1. Na verdade é possível o controle de qualquer lugar do planeta que tenha conexão internet.
      Basta você configurar no seu roteador para que ele faça o NAT da porta externa (no caso do exemplo deste POST porta 8000) para o IP interno associado ao Arduino.
      Eu pretendo dedicar uma parte futura deste post só para explicar como fazer isso, inclusive quando o IP da conexão for dinâmico.

      Excluir
    2. Cara estou ansioso por essa explicação! se ja tiver feito por favor manda o link! ;) !

      Excluir
  5. tem como vc fazer um tutorial explicando como que faz pro android nao nao entendi quase nada, coloquei pra traduzir mas mesmo assim nao entendi....srsr

    ResponderExcluir
    Respostas
    1. Desculpe mas no momento não tenho um celular Android para testar e montar o tutorial. Se eu conseguir um celular emprestado farei o tutorial.

      Excluir
  6. eu conseguir fazer ate a etapa 6 que ele pede pra pegar o LayoutEncoder do programa feito no touchos e copiar esse LayoutEncoder para o programa vts e substituir o que tiver entres as aspas

    .line 16
    const-string v
    "" ---> o que tiver dentro dessas aspas eu substituo pelo codigo que eu acabei de copiar do LayoutEncoder... É isso mesmo não é?
    depois disso eu faço oq? salvo e o que mais?
    desde já muito obrigado...abrass

    ResponderExcluir
  7. Como nunca fiz o processo no Android , não sei te dizer o que está errado. Você pode testar seu projeto usando os layouts prontos que já vem no programa para Android.

    ResponderExcluir
  8. Boa tarde!

    Parabéns pelos posts, excelente! aguardo a parte 3.

    Uma pergunta, eu não conhecia o protocolo OSC, neste caso para usar esta interface, não é necessário servidor para hospedar a pagina? para poder usar de qualquer lugar, etc.?

    Desculpa se perguntei besteira.

    José Carlos
    Estudante de Eng. de Controle e Automação





    ResponderExcluir
    Respostas
    1. José Carlos, não é necessário servidor pois a aplicação que roda no celular comunica diretamente com o Arduino da central de automação. Esse arduino tem um endereço IP que quando mapeado corretamente no roteador onde está conectado, fica acessível pelo celular de qualquer conexão a internet.

      Excluir
  9. Instalei o aplicativo no meu smartphone android porém não encontrei a opção de editar os botões(layouts).

    Você teria outra solução?

    ResponderExcluir
    Respostas
    1. A edição não e feito no Smartphone. A edição e feito no pc e carregado no seu android depois de pronta. No celular vc apenas configura o IP do arduino, portas de comunicação entrada e saida e escolhe qual aplicação vai ser usada. Todo o resto e feito no PC, como foi explicado acima.

      Excluir
    2. Para o pessoal do Android a Hexler disponibilizou a versão 1.9.0 do TouchOsc para Android que permite a edição dos layouts.
      Vejam em http://hexler.net/blog/post/touchosc-1.9.0-for-android-and-ios-out-today.

      Excluir
  10. Para quem está tentando utilizar no android fica minha experiência, você edita layouts, importa, porém não importa o que você faça, o "range" para os faders sempre será 0 e 1, ou seja, não vi uma saida para utilizar dimmer.

    ResponderExcluir
    Respostas
    1. Veja a nova versão do TouchOSC e TouchOSC editor que permite editar os layouts agora também para Android.

      Excluir
  11. É possível também configurar via bluetooth o nome dos módulos escravos com aplicativo android:
    https://dl.dropbox.com/u/101922388/BluetoothSanUSB/BT4SanUSB.apk
    Video em https://www.youtube.com/watch?v=V65-Vt91rug . Os programas e tutorial para arduino estão disponíveis no link: https://dl.dropbox.com/u/101922388/ModemBluetooth19200.zip

    ResponderExcluir
  12. Este comentário foi removido pelo autor.

    ResponderExcluir
  13. Muito interessante o projeto, mas gostaria do código do arduino onde posso baixar ?

    ResponderExcluir
    Respostas
    1. Me passa um email solicitando que envio ele para você:
      jllorenzo@terra.com.br

      Excluir
    2. Olá José! Poderia enviar para o meu? daniel-victorss@hotmail.com

      Excluir
    3. ola josé, vc poderia me enviar? josenunesjr@hotmail.com

      Excluir
  14. Digitei todo código do Arduino que você tem no blog no Sketch, mas não roda. Aparece o seguinte erro: "a function-definition is not allowed here before'{' token". Podes me ajudar?

    ResponderExcluir
    Respostas
    1. Tem algum erro de digitação causando erro de sintaxe.
      Me solicite via email que lhe envio o arquivo.
      jlllorenzo@terra.com.br

      Excluir
    2. cara me envia to como o mesmo problema. email:wilsonguilherme1999@gmail.com

      Excluir
  15. O problema com o erro na compilação descobri, precisava declarar as funções fora do loop, porém ainda não consegui fazer o código funcionar no arduino, os leds ficam acesos direto, e quando aperto os botões eles só ficam mais fortes, não apagam. Você mudou algo no código para funcionar como no vídeo?

    ResponderExcluir
    Respostas
    1. Prezado Anderson,
      conseguiu funcionar o código.
      tambemestou com problemas de compilação e comunicação com o arduino.
      já faz um mês que estou tentando diversas formas de controlar o arduino via ethernet mas até agora não consegui nem uma piscadinha no led

      Excluir
  16. Quando sai a proxima parte? O Blog está demorando um pouco para ser atualizado... Uma pena!

    ResponderExcluir
    Respostas
    1. Ralph o grande problema é sempre o tempo. Mas em breve pretendo fazer um novo post detalhando a comunicação XBee.

      Excluir
  17. Duvida - No IP Destino onde seria o IPhone/Android etc, teria alguma forma de utilizar através da WAN? para isso teria que ter um servidor de destino fixo que interpreta-se os commndos da rede externa(internet) e envia-se para o arduino que esta na rede local. Entendo que este projeto somente funcionar na rede local, correto?

    []s

    Luiz

    ResponderExcluir
    Respostas
    1. Você pode enviar comandos via celular estando fora da sua rede. Basta no lugar do IP de destino nas configs do touchOSC colocar o seu dominio (por exemplo: amigao.dyndns.org), ai você cria uma conta free no dyndns e no seu roteador configura para ele atualizar o dyndns sempre que seu ip mudar.
      Além disso no seu roteador precisa configurar para que os pacotes que chegarem na porta 10000 sejam encaminhados para o IP do arduino .

      Excluir
    2. e no codigo arduino ? o que devo mexer ?

      Excluir
  18. Prezado José, o post foi muito bem elaborado e me ajudou muito para criar a aplicação OSC, importar para o iphone e configurar na rede.
    porém, não consigo compilar o código e comunicar com arduino :(
    tenho certeza que alguem com experiencia resolveria nosso problema em poucos minutos e já estou a algumas semanas tentando funcionar os leds conforme demonstrado no video.
    Nosso amigo Anderson retirou as funções do LOOP e declarou em SETUP. também tentei dessa forma e nada.
    também tentei o exemplo que vem na biblioteca OSC "simpletoogleled" para simplesmente acender e apagar o led e também sem sucesso.
    acho que poderia nos ajudar publicando o código em formato txt, que aceite a compilação do Arduino.

    ResponderExcluir
    Respostas
    1. Procure utilizar a IDE 1.0.1 do Arduino. A biblioteca ARDOSC é excelente mas não é atualizada com frequencia, então normalmente as ultimas IDEs tem problemas. Se tiver dificuldade ainda me solicita por email que eu passo o código em arquivo. jlllorenzo@terra.com.br

      Excluir
  19. José Luiz, bom dia. Em primeiro lugar meus parabens, assisti um palestra sua em um evento TDC2011 pela web. Segui o passo a passo deste seu tutorial mas não obtive sucesso. Uma pois acho que estou falhando na configuração da porta em meu roteador (TP-link WR740N) e outra o dispositivo Android que tenho é um Mini PC (UG802 1.6 de processador e Android 4.2) que está ligado na mesma rede ethernet de meu arduino. Para realmente utilizar a porta criado penso eu que tenho que estar um aparelho externo a minha rede. Me corrija se estiver errado.
    O dispositivo montado na protoboard fica com os leds piscando mas sem controle nenhum.
    Conto com a ajuda de todos. Obrigado

    ResponderExcluir
    Respostas
    1. Não precisa estar externo a sua rede não. É até mais fácil quando está na mesma rede pois temos menos pontos de falha. Teoricamente o MiniPC deve rodar o TouchOSC sem problemas. Você já tentou a nova versão do TouchOSC para Android 1.9.0 ? Ela permite carregar layouts customizados.

      veja em : http://hexler.net/blog/post/touchosc-1.9.0-for-android-and-ios-out-today

      Excluir
  20. ola boa noite, o codigo ta dando erro, acredito que seja por causa da versao do progama do arduino (1.0.5)

    ResponderExcluir
  21. Como o tiago, creio que o problema seja versão de software do arduino. Na verdade usei tb 1.0.4 mas tb sem sucesso. O José Lorenzo usou 1.0.1.
    Tentei tb o exemplo do toggle LED contido na library do ArdOSC, trocando todos os dados com atenção mas também sem sucesso. To batendo cabeça...

    ResponderExcluir
  22. Olá galera, para quem não conseguiu compilar o código, segue o link para o arquivo testado na versão 1.5.2 do arduino, e a biblioteca OSC, só não testei a comunicação pois não tenho ainda o Shiel Ethernet (comprarei em breve, rsrs).

    https://www.dropbox.com/sh/wl5tlbqg0487xal/O2j0GkaLSP

    Obs: Copiem a pasta OSC e colem na pasta libraries do arduino.

    Espero ter ajudado. Deem um retorno com o resultado.

    ResponderExcluir
    Respostas
    1. A biblioteca ARDOSC tem alguns bugs com a IDE 1.5.x . Recomendo usar a 1.0.1

      Excluir
    2. Funcionou lindamente aqui!!! Muito obrigado!!! Versão 1.0.5

      Excluir
  23. Funcionou aqui. Apenas está com um problema para desligar pelo botão. Pra ligar funciona. Ainda estou tentando identificar o problema. Ajudou muito!

    ResponderExcluir
  24. Amigos também estou tendo problemas, segui todos os passos não deu erro de compilação e nada mas nao comunica o ipad com o arduino

    ResponderExcluir
    Respostas
    1. Existem alguns shields ethernet não oficiais que apresentam problemas.

      Excluir
  25. Tente mudar a porta, por exemplo para 12000 para ver se a comunicação acontece.

    ResponderExcluir
  26. Funcionou perfeitamente. Lendo as dicas enviadas pelos colaboradores aqui, fiz os ajustes necessários, e tudo ocorreu tranquilo. Atualizei a biblioteca do Ethernet, e fui tudo tranquilo. Nesta noite tive problemas, mas era o roteador, que após abrir a porta para controle via internet, ele não comunicava mais com o arduino, apesar de tudo configurado corretamente e os leds RX e TX estarem indicando o tráfego de comunicação. Somente após o reset físico no roteador, e que tudo se normalizou.
    Parabéns ao dono do projeto e aos colaboradores.

    ResponderExcluir
  27. Foi fundamental o conteúdo postado por José Matos. O arquivo https://www.dropbox.com/sh/wl5tlbqg0487xal/O2j0GkaLSP.
    Valeu José. A diferença de versão estava me matando aqui. Os nomes dos comandos da biblioteca do ethernet, mudaram e ai da uma dor de cabeça, não compila, no link este probleminha foi resolvido e roda tranquilo.

    ResponderExcluir
    Respostas
    1. Ainda utilizo a IDE 1.0.1 pois acho ela mais estável com a lib ArdOSC

      Excluir
  28. Caro José Luiz. Muito bom o seu trabalho. Funcionou perfeito. Porém eu não consegui fazer com que o Touch receba os status das portas do Arduino. Por exemplo, se eu aciono ela em manual, ela não ascende não indica no Tousch. O que vc acha q possa estar acontecendo?

    ResponderExcluir
  29. Muito Obrigado por nos ajudar nesta questão do ARDOSC, porem ainda não descobri como controlar a intensidade de um Led utilizando as postas PWM do arduino. Tentei ler os argumentos que chegam do Fader do TouchOSC que vai 0-255, mas quando imprimo esses valores na serial, chegam apenas 0. Consegui fazer isso com outra biblioteca (OSCClass), mas com essa ainda não consegui!

    ResponderExcluir
  30. boa noite não estou conseguindo retirar a biblioteca recotanaARDOSC poderia me ajudar desde já obrigado.

    ResponderExcluir
  31. Bom dia José Luiz, eu te mandei um e-mail sobre esse projeto. Por favor, assim que puder entre em contato comigo via e-mail.

    Grato pela atenção

    Thiago Justen

    ResponderExcluir
  32. Este comentário foi removido pelo autor.

    ResponderExcluir
  33. Muito bom o trabalho José Luiz!
    Para dar mais uma opção para o pessoal tem um programa para controlar as saidas do arduino pelo computador em Real-Timer. Já vem tudo na pasta manual e o cógigo de upload no arduino. Se quiserem baixar esse é o site:https://sites.google.com/site/meteintecnologia/home

    ResponderExcluir
  34. Este comentário foi removido pelo autor.

    ResponderExcluir
  35. Galera to com esse erro ake agora:

    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp: In member function 'void W5100Class::init()':
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp:28: error: 'delay' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp:30: error: 'SPI' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp: In static member function 'static uint8_t W5100Class::write(uint16_t, uint8_t)':
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp:133: error: 'SPI' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp: In static member function 'static uint16_t W5100Class::write(uint16_t, const uint8_t*, uint16_t)':
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp:146: error: 'SPI' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp: In static member function 'static uint8_t W5100Class::read(uint16_t)':
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp:159: error: 'SPI' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp: In static member function 'static uint16_t W5100Class::read(uint16_t, uint8_t*, uint16_t)':
    C:\Program Files (x86)\Arduino\libraries\Ethernet\utility\w5100.cpp:172: error: 'SPI' was not declared in this scope


    Alguém pode me ajudar?

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Adicione o cabeçalho SPI.h ao código (#include SPI.h).
      Estava com o mesmo problema. Funcionou na versão 1.0.5 da IDE.
      Abraço e boa sorte!

      Excluir
  36. Este comentário foi removido pelo autor.

    ResponderExcluir
  37. Parabéns pelo post! Quando você irá publicar a parte 3?

    ResponderExcluir
  38. Galera, alguém conseguiu comunicação com o Arduino com um IP externo (pelo 3G do celular por exemplo). Grato, se alguém puder ajudar.

    ResponderExcluir
  39. Boa noite José, consegui utilizar seu tutorial para desenvolver o codigo para testar com meu ethernet shield, mais não estou conseguindo monitorar os botões. Eu consigo ativar o led pelo botão no arduino e pelo touch osc, mas quando eu ativo pelo botão o status não é atualizado no aplicativo.. o que pode ser ? Posso enviar meu codigo..

    ResponderExcluir
  40. Muito bom e bem explicado...Espero ansioso a 3 parte, tem alguma previsão de quando pretende postar? Desde já agradeço e parabéns.

    ResponderExcluir
  41. Olá! O ip da central de automação deve ser o gatwey padrao ou eu posso escolher? nao estou conseguindo rodar. O sketch compila mas nao funciona, creio que seja algo com os ip's (nao sou mto bom em redes)

    ResponderExcluir
  42. Ola pessoal! Parabéns José Luiz Sanchez Lorenzo, muito bom o post, aguardando o próximo. gostaria de reforçar o que você já havia comentado anteriormente, a versão 1.0.1 é a que melhor se adéqua a essa biblioteca. Alguns posts atrás comentavam sobre o problema de monitoramento dos botoes no app touch osc, tambem tive esse problema, mas o que aconteceu foi que eu não tinha alterado o IP na linha byte destIP[] = {192, 168, 0, 137};, que deve ser o mesmo do iPhone, iPad... no meu caso apos isso funcionou perfeitamente.

    ResponderExcluir
  43. Parabéns pelos posts, excelente!
    Tem um previsão para parte 3.

    Quero saber sobre comunicação ZIGBee.

    ResponderExcluir
  44. Parabens pelo post amigo, seus projetos são muito bons.Estou estudando a parte dos Xbee e queria fazer semelhante ao seu projeto, sera que você pode disponibilizar como você faz a comunicação do arduino com Xbees

    ResponderExcluir
  45. Bom dia... Parabéns pelo projeto... Montei todo o código e funcionou, estou tendo dificuldade pra acionar uma lampada AC, voce poderia me passar o codigo se possível... Não estou utilizando a comunicação xbee... Obrigado...

    ResponderExcluir
  46. Este comentário foi removido pelo autor.

    ResponderExcluir
  47. Este comentário foi removido pelo autor.

    ResponderExcluir
  48. amigo será que você poderia disponibilizar o código fonte ao meu email taison.andrei@gmail.com obrigado!

    ResponderExcluir
  49. Boa noite.
    Através desse código, o meu Arduino não está reconhecendo a biblioteca ArdOSC.

    Está aparecendo o seguinte erro: "Variable or field 'func 1' declared void"

    O que posso fazer para resolver?
    Obrigado.

    ResponderExcluir
  50. Tem como enviar codigo arduino pra mim por favor

    elimariobr@yahoo.com.br

    ResponderExcluir
  51. Boa noite,

    Estou quebrando a cabeça a mais de 4 merses, tentando fazer rodar com um shield que comprei wifi, mas não vai se maneira alguma, será que você já testou ele com o wifly ?

    Abraços

    ResponderExcluir
  52. O TouchOSC só tem pago? nao tem free para Android?

    ResponderExcluir
  53. Show, quando sairá a parte 3, estamos ansiosos rs...

    ResponderExcluir
  54. Fiz um teste usando um encoder incremental da spark fun e um fader no touch osc para dimmerizar um led e ocorreu td certo! Agora minha duvida... Touch osc nao usa UDP? Como faço para enviar meus pacotes por 3g para meu arduino conectado ao roteador per ethernet shield

    ResponderExcluir
  55. Amigo, montei tudo conforme mencionado, consigo conexão normal, mas acontece o seguinte:
    1- Pelos botões só consigo acender os leds, não apagam.
    2- Pelo TouchOSC, só consigo apagar os leds, se eu tentar acender, tenho que ficar pressionando o botão no Ipad, ai ele fica aceso, se eu parar de pressionar ele apaga.

    ResponderExcluir
  56. Amigo achei muito instrutivo. Ao inves de LED estou utilizando reles, mas não consigo mudar o estado pelas switches, somente pelo OSC. Com um code mais simples consigo mudar o estado via switches. Agradeço se puder me ajudar. Estou usando o esquema eletrico e code deste site: http://blog.filipeflop.com/modulos/controle-modulo-rele-arduino.html
    //Porta ligada ao pino IN1 do modulo
    int porta_rele1 = 7;
    //Porta ligada ao pino IN2 do modulo
    int porta_rele2 = 8;
    //Porta ligada ao botao 1
    int porta_botao1 = 2;
    //Porta ligada ao botao 2
    int porta_botao2 = 3;

    //Armazena o estado do rele - 0 (LOW) ou 1 (HIGH)
    int estadorele1 = 1;
    int estadorele2 = 1;
    //Armazena o valor lido dos botoes
    int leitura1 = 0;
    int leitura2 = 0;

    void setup()
    {
    //Define pinos para o rele como saida
    pinMode(porta_rele1, OUTPUT);
    pinMode(porta_rele2, OUTPUT);
    //Define pinos dos botoes como entrada
    pinMode(porta_botao1, INPUT);
    pinMode(porta_botao2, INPUT);
    //Estado inicial dos reles - desligados
    digitalWrite(porta_rele1, HIGH);
    digitalWrite(porta_rele2, HIGH);
    }

    void loop()
    {
    //Verifica o acionamento do botao 1
    leitura1 = digitalRead(porta_botao1);
    if (leitura1 != 0)
    {
    while(digitalRead(porta_botao1) != 0)
    {
    delay(100);
    }
    //Inverte o estado da porta
    estadorele1 = !estadorele1;
    //Comandos para o rele 1
    digitalWrite(porta_rele1, estadorele1);
    }

    //Verifica o acionamento do botao 2
    leitura2 = digitalRead(porta_botao2);
    if (leitura2 != 0)
    {
    while(digitalRead(porta_botao2) != 0)
    {
    delay(100);
    }
    //Inverte o estado da porta
    estadorele2 = !estadorele2;
    //Comandos para o rele 2
    digitalWrite(porta_rele2, estadorele2);
    }
    }

    ResponderExcluir
    Respostas
    1. Boa tarde!

      Estou com o mesmo problema amigo conseguiu resolver ?

      Excluir
  57. Como faço para enviar o código para o arduino ?

    ResponderExcluir
  58. Amigo eu ví seu post e gostei muito, estou tentando fazer em casa só que para seis led's e não está funcionando.
    Será que você poderia me ajudar? Mais tarde eu envio o código que consegui compilar.
    Meu hardware é:
    1 tablet Tab 3 samsung Android 4,2
    1 Mega
    1 W5100

    ResponderExcluir
  59. #include
    #include
    #include
    byte myMac[] ={0xDE, 0xAD, 0xBE, 0xEF, 0xFE,0xED};
    byte myIp[] ={192,168,0,90};
    byte destIp[] ={192,168,0,1};
    int serverPort = 8000;
    int destPort = 9000;

    //Lâmpadas dos cômodos

    int quarto = 13;
    int sala = 12;
    int cozinha = 11;
    int copa = 10;
    int banheiro = 9;
    int escritorio = 8;

    // Botões dos cômodos

    int bot1 = 7;
    int bot2 = 6;
    int bot3 = 5;
    int bot4 = 4;
    int bot5 = 3;
    int bot6 = 2;
    OSCServer server;
    OSCClient client;

    void setup(){
    Ethernet.begin(myMac,myIp);
    server.begin(serverPort);
    server.addCallback("/ard/quarto",&func1);
    server.addCallback("/ard/sala",&func2);
    server.addCallback("/ard/cozinha",&func3);
    server.addCallback("/ard/copa",&func4);
    server.addCallback("/ard/banheiro",&func5);
    server.addCallback("/ard/escritorio",&func6);

    // Saídas

    pinMode(quarto,OUTPUT);
    pinMode(sala,OUTPUT);
    pinMode(cozinha,OUTPUT);
    pinMode(copa,OUTPUT);
    pinMode(banheiro,OUTPUT);
    pinMode(escritorio,OUTPUT);


    //Entradas

    digitalWrite(bot1,HIGH);
    digitalWrite(bot2,HIGH);
    digitalWrite(bot3,HIGH);
    digitalWrite(bot4,HIGH);
    digitalWrite(bot5,HIGH);
    digitalWrite(bot6,HIGH);

    }

    void loop (){
    if(server.aviableCheck()>0){

    if(digitalRead(bot1)==LOW){
    int state=digitalRead(quarto);
    OSCMessage txMes;
    txMes.setAddress(destIp,destPort);
    txMes.beginMessage("/ard/quarto");
    txMes.addArgFloat(!state);
    client.send(&txMes);
    digitalWrite(quarto,!state);
    delay(300);
    }

    else if(digitalRead(bot2)==LOW){ //colocação do argumento "else"
    int state=digitalRead(sala);
    OSCMessage txMes;
    txMes.setAddress(destIp,destPort);
    txMes.beginMessage("/ard/sala");
    txMes.addArgFloat(!state);
    client.send(&txMes);
    digitalWrite(sala,!state);
    delay(300);
    }


    else if(digitalRead(bot3)==LOW){
    int state=digitalRead(cozinha);
    OSCMessage txMes;
    txMes.setAddress(destIp,destPort);
    txMes.beginMessage("/ard/cozinha");
    txMes.addArgFloat(!state);
    client.send(&txMes);
    digitalWrite(cozinha,!state);
    delay(300);
    }


    else if(digitalRead(bot4)==LOW){
    int state=digitalRead(copa);
    OSCMessage txMes;
    txMes.setAddress(destIp,destPort);
    txMes.beginMessage("/ard/copa");
    txMes.addArgFloat(!state);
    client.send(&txMes);
    digitalWrite(copa,!state);
    delay(300);
    }


    else if(digitalRead(bot5)==LOW){
    int state=digitalRead(banheiro);
    OSCMessage txMes;
    txMes.setAddress(destIp,destPort);
    txMes.beginMessage("/ard/banheiro");
    txMes.addArgFloat(!state);
    client.send(&txMes);
    digitalWrite(banheiro,!state);
    delay(300);
    }

    else if(digitalRead(bot6)==LOW){
    int state=digitalRead(escritorio);
    OSCMessage txMes;
    txMes.setAddress(destIp,destPort);
    txMes.beginMessage("/ard/escritorio");
    txMes.addArgFloat(!state);
    client.send(&txMes);
    digitalWrite(escritorio ,!state);
    delay(300);
    }
    }
    }
    void func1(OSCMessage*_mes){
    int value=(int)_mes->getArgFloat(0);
    digitalWrite(quarto,value);
    }

    void func2(OSCMessage*_mes){
    int value=(int)_mes->getArgFloat(0);
    digitalWrite(sala,value);
    }

    void func3(OSCMessage*_mes){
    int value=(int)_mes->getArgFloat(0);
    digitalWrite(cozinha,value);
    }

    void func4(OSCMessage*_mes){
    int value=(int)_mes->getArgFloat(0);
    digitalWrite(copa,value);
    }

    void func5(OSCMessage*_mes){
    int value=(int)_mes->getArgFloat(0);
    digitalWrite(banheiro,value);
    }

    void func6(OSCMessage*_mes){
    int value=(int)_mes->getArgFloat(0);
    digitalWrite(escritorio,value);
    }

    Não está funcionando.





    ResponderExcluir
  60. E ai José, tudo bem??
    gostaria de saber, se este software está disponivel para win8...
    Obrigado.

    ResponderExcluir
    Respostas
    1. e também se tem como eu usar sem a opção do botão, pq quero fazer aqui na minha casa, e vou fazer em paralelo com o interruptor, teria como tirar essa opção do botão? como ficaria?!
      Obrigado.

      Excluir
    2. Amigo o bacana do botão é que ele nos fornece o status do ponto de luz,
      Por exemplo, fiz meu TCC com as seguintes opções:
      * Automático, acionamento pelo tablet.
      *Semi-automático, acionamento pelo push button (não deixa de ser manual porém está diretamente ligado no software dando o feedback no tablet).
      *Manual, acionamento via interruptor paralelo (esse não tem ligação nenhuma com o sotware, ou seja, se todos os dispositivos falharem, rede ou até mesmo se sua placa queimar ele funciona porque esta ligado com reles paralelamente).

      E agradeço o Luiz por abrir um leque de ideas (brainstorm) e por ter respondido a alguns e-mails

      Excluir
    3. Fernando,
      Poderia me mandar o teu código por email? Estou tentando montar um projeto como este com interruptor e não com push button mas estou com dificuldades.
      Se puder enviar eu agradeço.
      Abraço
      coelho_84@yahoo.com.br

      Excluir
    4. Boa dia Fernando!!

      Se puder enviar eu agradeço.
      Abraços!!!

      daniel-victorss@hotmail.com

      Excluir
  61. Boa tarde!
    Alguém poderia enviar o código pr meu e-mail?
    jonasreis@gmail.com

    ResponderExcluir
  62. Boa noite,
    Eu montei no protoboard um exemplo de acionamento remoto, quando estou dentro da minha rede, ou seja, compartilhando o mesmo roteador, consigo enviar e receber dados do arduino através da W5100, porém quando mudo para 3G ou uso outra rede no meu celular, eu só consigo enviar dados para o Arduíno, mas fico sem o feedback. Você tem uma solução para esse problema?

    Grato

    Julio

    ResponderExcluir
  63. Este comentário foi removido pelo autor.

    ResponderExcluir
  64. Bom dia, preciso de ajuda!
    Baixei o programa Touch 1.6 32bits para o PC, e para o smartphone 1.9.1 (Única versão / Android).
    Quando vou fazer a associação demora a carregar e no fim aparece uma mensagem de erro, como não conseguisse acessar o IP do PC.
    Alguem me ajuda?

    ResponderExcluir
    Respostas
    1. Você tem que fazer o dwonload pelo smart fone (tem opção de add )tmb, ou então via cabo

      Excluir
  65. Este comentário foi removido pelo autor.

    ResponderExcluir
  66. Amigo, poderia me mandar o código?
    rodrigomiranda@outlook.com

    ResponderExcluir
  67. Boa noite pessoal!

    Estou tendo um problema que nao consigo resolver...

    Estou fazendo um teste... e ele nao esta funcionando como deveria

    No arduino tenho apenas um led e, no projeto touchosc coloquei 2 toggle buttons.
    O problema é que os dois botoes estão controlando o led.
    Já coloquei um terceiro botão sem alterar nada nele e, ainda assim ele ligava e desligava o led que apenas um botão deveria faze-lo.

    Vou postar meu código para vcs verem:

    ////////////////////////////////////////
    #include
    #include
    #include //inclui blibioteca ArdOSC

    byte myMac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //define MAC para shield Ethernet
    byte myIp[] = { 192, 168, 1, 100 }; //define IP da central automação
    byte destIp[] = { 192, 168, 1, 134 };
    int serverPort = 8000; //define a porta de recepção do comando OSC
    int destPort = 9000; //define a porta de envio do comando OSC
    int relePin = 7; //define a porta do arduino associada ao led
    int sw1Pin = A1;
    int flag=0;

    OSCServer server; //inicializa o servidor OSC (serviço que trata a recepção de mensagem OSC)
    OSCClient client; //inicializa o cliente OSC (serviço que trata o envio de mensagem OSC)

    void setup(){
    Ethernet.begin(myMac ,myIp); //inicializa a interface ethernet
    server.begin(serverPort); //inicializa o servidor OSC definindo a porta de RX
    //set callback function & oscaddress
    server.addCallback("/ard/led1",&func1); //define que a rotina "func1" será executada para o comando OSC "/ard/ledPin"
    pinMode(relePin, OUTPUT); //define a porta digital 9 (ledPin) do Arduino como saida
    digitalWrite(sw1Pin, HIGH);
    }

    void loop(){

    if(server.aviableCheck() > 0 ){ //verifica se existe alguma mensagem OSC disponível para leitura

    if (digitalRead(sw1Pin) == LOW) {
    int state = digitalRead(relePin);
    OSCMessage txMes;
    txMes.setAddress(destIp,destPort);
    txMes.beginMessage("/ard/led1");
    txMes.addArgFloat(!state);
    client.send(&txMes);
    digitalWrite(relePin, !state);
    delay(300);
    }
    }
    }


    void func1(OSCMessage *_mes) {
    int value = (int)_mes->getArgFloat(0);
    digitalWrite(relePin, value);
    }
    /////////////////////////////////////////////

    Se vcs puderem me ajudar eu ficaria muito agradecido :-)

    Att.

    ResponderExcluir
  68. Boa noite,
    Andei pesquisando placas de arduino e achei essa. Será que essa dá certo?

    http://produto.mercadolivre.com.br/MLB-640062616-arduino-ethernet-shield-w5100-com-slot-para-sd-card-_JM
    É Uma placa ethernet Shield W5100.

    ResponderExcluir
  69. No lugar de um push button ter um botão ON/OFF (interruptor)... alguém tem esse código?

    Obrigado,
    Leandro

    ResponderExcluir
  70. Olá, achei muito interessante o artigo, parabéns, mas tenho um projeto, que usa o shield WiFi CC3000 para fazer a conexão, mas não estou obtendo êxito, vc poderia me ajudar?

    ResponderExcluir
  71. Olá!!! É possível enviar uma mesma mensagem para dispositivos com Ip diferentes com apenas um comando? Da forma que eu fiz o Arduina demora muito para enviar a mesma mensagem:
    if((results.value) == BOTAO[8])
    {
    OSCMessage txMes; //Cria uma nova menssagem
    txMes.setAddress(destIP, destPort); //define endereço e porta de destino da mensagem OSC
    txMes.beginMessage("/ard/ledPin8"); //define comando OSC
    txMes.addArgFloat(!j[1]); // define novo estado da luz que sera enviado no argumento OSC para o celular
    client.send(&txMes);
    OSCMessage txMes1; //Cria uma nova menssagem
    txMes1.setAddress(destIP1, destPort); //define endereço e porta de destino da mensagem OSC
    txMes1.beginMessage("/ard/ledPin8"); //define comando OSC
    txMes1.addArgFloat(!j[1]); // define novo estado da luz que sera enviado no argumento OSC para o celular
    client.send(&txMes1);
    digitalWrite(17,j[1]);
    j[1]=!j[1];
    }
    else
    if((results.value) == BOTAO[9])
    {
    OSCMessage txMes; //Cria uma nova menssagem
    txMes.setAddress(destIP, destPort); //define endereço e porta de destino da mensagem OSC
    txMes.beginMessage("/ard/ledPin9"); //define comando OSC
    txMes.addArgFloat(!j[2]); // define novo estado da luz que sera enviado no argumento OSC para o celular
    client.send(&txMes);
    OSCMessage txMes1; //Cria uma nova menssagem
    txMes1.setAddress(destIP1, destPort); //define endereço e porta de destino da mensagem OSC
    txMes1.beginMessage("/ard/ledPin9"); //define comando OSC
    txMes1.addArgFloat(!j[2]); // define novo estado da luz que sera enviado no argumento OSC para o celular
    client.send(&txMes1);
    digitalWrite(18,j[2]);
    j[2]=!j[2];
    }

    ResponderExcluir
  72. Amigos,
    Pq o meu sempre da esse erro:
    In file included from C:\Users\FABRICIO\Documents\Arduino\libraries\ArdOSC/OSCCommon/OSCClient.h:21:0,
    from C:\Users\FABRICIO\Documents\Arduino\libraries\ArdOSC/ArdOSC.h:55,
    from Arduino_android.ino:3:
    C:\Users\FABRICIO\Documents\Arduino\libraries\ArdOSC/OSCCommon/OSCEncoder.h:27:33: error: 'OSCMessage::OSCMessage' is not a type
    int16_t encode( OSCMessage::OSCMessage *mes ,uint8_t *_binData );

    ResponderExcluir
    Respostas
    1. Amigo, qual a versão do Arduino que você está usando. Eu uso o Arduino 1.0. Segue o link do site oficial: http://arduino.googlecode.com/files/arduino-1.0-windows.zip

      Excluir
  73. Galera preciso usar a versão 1.6 para compilar e geram erros. Na 1.0 funciona perfeitamente mas geram erros em outros programas que tenho. Se alguém puder ajudar.....
    In file included from C:\Program Files (x86)\Arduino\libraries\ArdOSC/ArdOSC.h:56:0,
    from Comunica__o_correta_osc.ino:3:
    C:\Program Files (x86)\Arduino\libraries\ArdOSC/OSCCommon/OSCServer.h:31:5: error: 'OSCDecoder::OSCDecoder' names the constructor, not the type
    OSCDecoder::OSCDecoder _decoder;
    ^
    C:\Program Files (x86)\Arduino\libraries\ArdOSC/OSCCommon/OSCServer.h:32:5: error: 'Pattern::Pattern' names the constructor, not the type
    Pattern::Pattern _adrMatch;
    ^
    Erro compilando.

    ResponderExcluir
  74. Boa noite!

    José Luiz não estou conseguindo colocar interrupção externa no programa abaixo. Estou até disposto a pagar. Entre em contato dimersonricardo@hotmail.com

    /*#include
    #include

    #include

    byte myMac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    byte myIp[] = { 192, 168, 6, 1 }; // IP da central minha casa
    byte destIP[] = { 192, 168, 6, 215 }; // IP do meu celular

    int serverPort = 8000;

    int destPort=9000;

    int pino8 = 8; //define a porta do arduino
    int pino9 = 9; //Define a porta do arduino
    int flag=0;
    int flag2=0;

    OSCServer server;
    OSCClient client;


    void setup(){

    // Serial.begin(19200);

    Ethernet.begin(myMac ,myIp); // Estabelece comunicação via rede
    server.begin(serverPort);

    //set callback function
    server.addCallback("/ard/pino8",&func1); //define que a rotina "func1" será executada para o comando OSC "/ard/ino8"
    server.addCallback("/ard/pino9",&func2); //define que a rotina "func1" será executada para o comando OSC "/ard/pino9"
    pinMode(pino8, OUTPUT); //define a porta digital 8 do Arduino como saida
    pinMode(pino9, OUTPUT); //defkne a porta digital 9 como saida

    }

    void loop(){
    if(server.aviableCheck()>0){
    // Verifica se existe alguma mensagem a ser lida enviada do OSC
    }
    }


    void func1(OSCMessage *_mes){
    int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/pino8"
    digitalWrite(pino8,value);


    //Cria msg OSC
    OSCMessage txMes; //cria uma nova menssagem OSC

    //set destination ip address & port no
    txMes.setAddress(_mes->getIpAddress(),destPort); //define o endereço e porta do destino da mensagem OSC
    txMes.beginMessage("/ard/pino8"); //define comando OSC
    txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID

    if(flag==1){
    flag=0;
    digitalWrite(pino8, LOW);
    }


    else {
    flag=1;
    digitalWrite(pino8, HIGH);

    }



    txMes.addArgInt32(flag);

    //send osc message
    client.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
    }

    void func2(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
    int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2"
    digitalWrite(pino9,value); //muda estado da porta digital 9 conforme argumento OSC recebido

    //create new osc message
    OSCMessage txMes; //cria uma nova menssagem OSC

    //set destination ip address & port no
    txMes.setAddress(_mes->getIpAddress(),destPort); //define o endereço e porta do destino da mensagem OSC
    txMes.beginMessage("/ard/pino9"); //define comando OSC
    txMes.addArgFloat(flag2); //define no estado do led 2 que será enviado no argumento OSC para ANDROID

    if(flag2==1){
    flag2=0;
    digitalWrite(pino9, HIGH);
    }
    else{
    flag2=1;
    digitalWrite(pino9, LOW);
    }
    }*/

    ResponderExcluir
  75. Este comentário foi removido pelo autor.

    ResponderExcluir
  76. como conectar 2 celulares, consigo acender os leds pelos dois, mas o status aparece em um so,quando pressiona o botão, quando ligado por outro celular não aparece o status

    #include
    #include //inclui blibioteca Ethernet
    #include //inclui blibioteca ArdOSC


    byte myMac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //define MAC para shield Ethernet
    byte myIP[]={192,168,0,10}; //define IP da central automação
    byte destIP[]={192,168,0,131}; //define IP do dispositivo de comando OSC
    int serverPort=8000; //define a porta de recepção do comando OSC
    int destPort=9000; //define a porta de envio do comando OSC
    int led1Pin=8; //define a porta do arduino associada ao led 1 (vermelho)
    int led2Pin=9; //define a porta do arduino associada ao led 2 (verde)
    int sw1Pin=6; //define a porta do arduino associada ao botão 1 (esquerdo)
    int sw2Pin=7; //define a porta do arduino associada ao botão 2 (direito)

    o ip do outro é 192.168.0.134
    ip do toush automatico

    ResponderExcluir
    Respostas
    1. Você terá que preservar os IPs dos dois celulares e enviar as mensagens OSC para atualizar os dois.

      Excluir
    2. Bom dia José. me ajuda ai.
      Meu sistema já esta funcionando.
      Porém quero enviar um comando para o arduíno através da barra de endereços.
      como ficaria a sintexe?

      ip: 192.168.0.100
      porta: 2100

      comando que quero enviar: /ping

      http://192.168.0.100:2100 ??????????

      não sei como continua a informação, como seria a parte das ??????????

      Excluir
  77. o sistema só atualiza quando o app esta aberto se eu ligo o led pelo Button e depois abro a app não consta que o led esta acesso

    como fazer pra atualizar o status constante mente ou por um tempo

    ResponderExcluir
    Respostas
    1. Guilherme,

      É só você criar um botão "refresh" no touchOSC e programar o Arduino para enviar o status dos leds para o celular quando receber o comando refresh.

      atenciosamente

      José Luiz Sanchez Lorenzo

      Excluir
    2. José Luiz,
      Interessante sua ideia, mas como proceder com um sistema composto de 44 botões, onde dois arduinos mega se comunicam via serial, e os status no touchOSC são enviados para dois celulares? O arduino máster enviaria 88 mensagens e tornaria o loop bastante lento.

      Excluir
  78. Amigo teria como me enviar o codigo para acender as luzes de casa com rele
    la seria 7 cômodos, sendo eles: Quarto 1, Quarto 2, Sala , Copa, Cozinha, Escritorio e varanda.

    Estou com um arduino atmega 2560 e uma placa ethernet 5100

    se puder me enviar por email te agradeço: lcjunior17@hotmail.com

    ResponderExcluir
  79. Bom dia amigo, sucesso e aprendi muito com seu blog, porem ainda aguardo a configuração pela web,

    ResponderExcluir
  80. Sou novato na área do arduino e Gostaria de agradecer ao José Luiz Sanches Lorenzo e ao autor do blog pelas preciosas dicas! Estou utilizando o sistema android e segui todos os passos que estão ai. O TouchOSC muda um pouco mas é basicamente as mesmas configurações.

    Tive alguns problemas e acredito que alguns tiveram o mesmo problema de erro.
    No começo do código adicionei:

    #include SPI.h //com os sinais de menor e maior <>

    Depois no loop tem a linha:

    txMes.setAddress(destIP, destPort);

    No "destIP" , o IP está maiúsculo quando somente o "I" é maiúsculo.
    Ficando assim:

    txMes.setAddress(destIp, destPort);

    Verificar que são duas linhas com o mesmo erro.

    Novamente agradeço pela dedicação do autor do blog e ao José Luiz Sanches Lorenzo.



    ResponderExcluir
    Respostas
    1. Diego use a vers arduino correta ou outro codigo para a versao arduino 1.0.5
      https://www.youtube.com/watch?v=M5f928M_-W0 funciona direitinho

      Excluir
  81. Sera que alguem pode tirar uma duvida? estou usando um arduino mega, se eu ao invés de usar a porta dig 8 e 9 , usar as portas 38 e 40 vai funcionar?

    ResponderExcluir
  82. TENHO UMA DÚVIDA QUANDO TENTO ADICIONAR MAIS UM LED OU FUNÇÃO DA ERRO, VCS PODERIAM ME AJUDAR OQUE EU FAÇO RÁPIDO PRECISO URGENTE.............

    ResponderExcluir
    Respostas
    1. Amigo, cola o seu codigo aqui para verificar

      Excluir
  83. Boa noite pessoal, tambem sou iniciante no ramo da programação tenho bastante esperiencia com eletronica, porem consegui fazer o layout no meu celular, mas estou confuso com o código e a biblioteca, já tentei de tudo mas sempre da algum erro, poderiam por gentileza me ajudar me dando o link correto do Código+Biblioteca, Grato por enquanto abraços

    ResponderExcluir
  84. Parabens pelo Tuto..

    li tds os posts e nao vi nenhum problema similar ao meu.. ve se consegue uma maozinha.. hehe

    Consegui conectar normalmente o smartphone e a shield.. ok!

    porem so 1 led responde: mas... ele nao liga e desliga, ele pisca quando eu dou o comando no celular..
    ja troquei portas, ja troquei componentes, ja refiz app e continua com o bug..

    e os botoes nao funcionam.. retirei e fiz por jump.. e nada..

    cod. é o postado..

    algum help???

    Valeu...

    ResponderExcluir
  85. Amigo estou com um grande problema com destPort
    ( Acender_dois_leds:52: error: 'destIP' was not declared in this scope )
    Ela esta declarada exatamente como esta no seu ai em cima. oque poderia ser.

    ResponderExcluir
  86. Ufa, consegui fazer tudo, mas to usando o programa QuickOSC, é mais simples e não permite receber msg. OSC, porem é gratuito. Voce poderia nos ensinar a configurar via internet. Obrigado Jose Luiz!

    ResponderExcluir
  87. Bom dia pessoal, consegui fazer ligar duas lampadas aqui agora estou querendo ligar minha TV com os comandos OSC, então sei que tenho que gravar os códigos dos botões do controles em um sd Card e fazer o arduino ler e enviar por um Led IR, mas não faço idéia por onde começar, alguem tem algo desenvolvido que possa me ajudar, grato abraço.

    ResponderExcluir
    Respostas
    1. segue meu programa, le e escreve no mesmo
      pino 3 send
      pino 11 recv

      [code]
      #include

      int RECV_PIN = 11;

      IRrecv irrecv(RECV_PIN);

      decode_results results;

      IRsend irsend;

      void setup()
      {
      Serial.begin(9600);
      irrecv.enableIRIn(); // Start the receiver

      }
      String leStringSerial(){
      String conteudo = "";
      char caractere;

      while(Serial.available() > 0) {
      caractere = Serial.read();
      if (caractere !='\n'){
      conteudo.concat(caractere);
      }

      delay(10);
      }

      Serial.print("Recebi: ");
      Serial.println(conteudo);
      return conteudo;
      }

      void loop() {

      if (irrecv.decode(&results)) {
      Serial.println(results.value, HEX);
      irrecv.resume(); // Receive the next value
      irrecv.enableIRIn();
      }
      if (Serial.available() > 0){
      String recebido = leStringSerial();

      if(recebido == "tv01"){irsend.sendNEC(0x20DF10EF, 32);}//on
      if(recebido == "tv02"){irsend.sendNEC(0x20DFD02F, 32);}//imput
      if(recebido == "tv03"){irsend.sendNEC(0x20DFF00F, 32);}//tv

      if(recebido == "tv04"){irsend.sendNEC(0x20DF8877, 32);}//1
      if(recebido == "tv05"){irsend.sendNEC(0x20DF48B7, 32);}//2
      if(recebido == "tv06"){irsend.sendNEC(0x20DFC837, 32);}//3

      if(recebido == "tv07"){irsend.sendNEC(0x20DF28D7, 32);}//4
      if(recebido == "tv08"){irsend.sendNEC(0x20DFA857, 32);}//5
      if(recebido == "tv09"){irsend.sendNEC(0x20DF6897, 32);}//6

      if(recebido == "tv10"){irsend.sendNEC(0x20DFE817, 32);}//7
      if(recebido == "tv11"){irsend.sendNEC(0x20DF18E7, 32);}//8
      if(recebido == "tv12"){irsend.sendNEC(0x20DF9867, 32);}//9

      if(recebido == "tv13"){irsend.sendNEC(0x20DF08F7, 32);}//0

      if(recebido == "tv14"){irsend.sendNEC(0x20DF40BF, 32);}//volume +
      if(recebido == "tv15"){irsend.sendNEC(0x20DFC03F, 32);}//volume -
      if(recebido == "tv16"){irsend.sendNEC(0x20DF00FF, 32);}//canal +
      if(recebido == "tv17"){irsend.sendNEC(0x20DF807F, 32);}//canal -
      if(recebido == "tv18"){irsend.sendNEC(0x20DF3EC1, 32);}//smart
      if(recebido == "tv19"){irsend.sendNEC(0x20DF02FD, 32);}//^
      if(recebido == "tv20"){irsend.sendNEC(0x20DFE01F, 32);}//<
      if(recebido == "tv21"){irsend.sendNEC(0x20DF22DD, 32);}//ok
      if(recebido == "tv22"){irsend.sendNEC(0x20DF609F, 32);}//>
      if(recebido == "tv23"){irsend.sendNEC(0x20DF827D, 32);}//-
      if(recebido == "tv24"){irsend.sendNEC(0x20DFDA25, 32);}//exit





      if(recebido == "rd01"){irsend.sendRC5(0xC7F, 12);}//TUNER
      if(recebido == "rd02"){irsend.sendRC5(0x4BF, 12);}//TAPE
      if(recebido == "rd03"){irsend.sendRC5(0x83F, 12);}//TV
      if(recebido == "rd04"){irsend.sendRC5(0x93F, 12);}//V-CD

      if(recebido == "rd05"){irsend.sendRC5(0xD3F, 12);}//CD
      if(recebido == "rd06"){irsend.sendRC5(0x5FF, 12);}//DCC
      if(recebido == "rd07"){irsend.sendRC5(0x97F, 12);}//VCR1
      if(recebido == "rd08"){irsend.sendRC5(0x9BF, 12);}//VCR2

      if(recebido == "rd09"){irsend.sendRC5(0x40D, 12);}//MUTE
      if(recebido == "rd10"){irsend.sendRC5(0x98C, 12);}//POWER
      if(recebido == "rd11"){irsend.sendRC5(0xC11, 12);}//VOLUME +
      if(recebido == "rd12"){irsend.sendRC5(0xC10, 12);}//VOLUME -
      if(recebido == "rd13"){irsend.sendRC5(0x45E, 12);}//TUNNER +
      if(recebido == "rd14"){irsend.sendRC5(0x45F, 12);}//TUNNER -

      irrecv.enableIRIn();
      delay(10);
      }

      }




      [/code]

      Excluir
  88. Este comentário foi removido pelo autor.

    ResponderExcluir
  89. OLA AMIGO É POSSÍVEL A UTILIZAÇÃO DE MAIS DE UMA PESSOA EM UM MESMO AMBIENTE COM DISPOSITIVOS DIFERENTE, E SE EXISTE ALGUM SISTEMA DE PROTEÇÃO COM LOGIN E SENHA DE USUÁRIO??

    ResponderExcluir
  90. BOA TARDE, muito bom trabalho você esta de parabéns.
    Gostaria de saber como farei para controlar com mais de 2 celulares ? se for possível mande a resposta com uma explicação. obrigado !

    ResponderExcluir
  91. Otimo blog

    boa noite poderia me mandar o codigo do arduino meu email é jajferreira@icloud.com

    ResponderExcluir
  92. projeto muito legal!
    o aplicativo touch osc pode ser baixado diretamente do dispositivo movel , celular ?

    ResponderExcluir
  93. boa tarde , sou novo em Arduíno poderia enviar esse código fonte pro meu e-mail ? jsb.barbosa1234@gmail.com

    ResponderExcluir
    Respostas
    1. Poderia enviar pra mim por favor? Luciano__lcoa@hotmail.com

      Excluir
  94. Tentei realizar esse projeto, porém ta ocorrendo um erro do qual não consegui corrigir.
    Erro Abaixo:
    'class OSCServer' has no member named 'aviableCheck'

    ResponderExcluir
  95. Alguém poderia me fornecer o código completo?

    ResponderExcluir
    Respostas
    1. acredito que o erro e que voce ta usando a ide 1.7, tem que ser a 1.0... As ides mais modernas do arduino dão pau mesmo no aplicativo

      Excluir
  96. Parabéns pelo conjunto da Obra. Por gentileza, você poderia me indicar onde eu consigo o seu terceiro artigo ou parte três sobre o assunto "Na parte 3 falaremos sobre comunicação ZIGBee usando módulos XBee".
    meu email: atturano@gmail.com

    Muito Obrigado

    ResponderExcluir
  97. Boa noite a todos

    Como faço para controlar a tv pelo touchOSC , com arduino +Child Ethernet+ ir remote? Fiz todos os códigos mais a tv nao liga. Se alguem poder me ajudar eu agradeço

    ResponderExcluir
  98. Boa noite a todos

    Como faço para controlar a tv pelo touchOSC , com arduino +Child Ethernet+ ir remote? Fiz todos os códigos mais a tv nao liga. Se alguem poder me ajudar eu agradeço

    ResponderExcluir
  99. Boa noite a todos

    Como faço para controlar a tv pelo touchOSC , com arduino +Child Ethernet+ ir remote? Fiz todos os códigos mais a tv nao liga. Se alguem poder me ajudar eu agradeço

    ResponderExcluir
  100. Olá, parabéns pelo post. Você poderia por gentileza enviar o código por e mail? Se sim meu e mail é leleandros@yahoo.com.br. Dês de já obrigado!

    ResponderExcluir
  101. vc poderia me passa o codigo
    jozielmelo@gmail.com

    ResponderExcluir