Como controlar luzes matiz philips de um arduino (e adicione um sensor de movimento)
A gama Philips Hue de luzes certamente não são baratos (existem algumas alternativas), Mas uma coisa que eu realmente aprecio é o bem documentado API
Conteúdo
Por que estamos fazendo isso? Como os sistemas de automação residencial pode ser bastante rígida e caro. Ao aprender como controlar a Hue de Arduino, você abre as portas para uma variedade de projetos de automação residencial personalizados feitos que simplesmente não pode ser derrotado por componentes off-the-shelf. Se cortar coisas juntos apenas não é sua coisa, tente estas 8 aplicações Hue fabulosas em vez de.
O Sistema de Hue
Vamos técnico para um pouco para que você saiba os sistemas subjacentes que você está trabalhando. luzes matiz criar uma rede de malha, usando um protocolo sem fio de curto alcance chamado ZigBee - especificamente, eles são certificadas ZigBee luz de ligação, o que significa que outros produtos ZLL também deve trabalhar junto com a Matiz (em teoria).Redes Mesh: O Futuro da ComunicaçãoRedes Mesh: O Futuro da Comunicaçãoredes mesh são quase invulnerável. Em uma rede mesh, não há pontos de estrangulamento através do qual todo o tráfego passa. Em vez disso, a informação é passada de um dispositivo para a próxima até que ele chegue ao seu destino.consulte Mais informação
Embora tecnicamente curto alcance, o recurso de rede de malha de ZigBee significa que cada nova lâmpada se estende a rede, transmitindo mensagens para outras lâmpadas. Isto significa que se você está tendo problemas para controlar uma luz no outro lado da casa, tente colocar uma outra luz entre os dois.
Zigbee é um grande protocolo, mas é muito diferente de uma rede de computadores com fio Wi-Fi ou, por isso precisamos do Hue Ponte Philips para se juntar os dois juntos. A ponte Hue funciona um firmware Linux de código aberto modificado, que transmite um servidor web básico.
É através da interação com este servidor web local que você pode descobrir o status atual das luzes, e controlá-los.
É um sistema bem simples, e maduro para projetos de DIY. Kudos para Philips para fazer essa coisa tão hackable.
Começando
Antes que você possa acessar a documentação da API, você precisará se registrar como um desenvolvedor. É gratuito, mas você precisa aceitar os termos e condições. Faça isso agora.
Qualquer pessoa familiarizada com serviços web padrão ou javascript deve ser capaz de trabalhar com a Matiz: todos os dados é passado e recebeu como pacotes JSON.O que é JSON? Visão geral de um leigoO que é JSON? Visão geral de um leigoSe você pretende ser um desenvolvedor web ou não, é uma boa idéia, pelo menos, saber o que é JSON, porque é importante, e por que ele é usado em todo o web.consulte Mais informação
Para ter um olhar para isso em ação, você precisa saber o endereço IP de sua ponte Hue. Há algumas maneiras de fazer isto:
- Olhe para a tabela de atribuição do endereço DHCP na interface de administração do roteador
- Executar um programa de mapeamento de rede como Home IP Scanner
- Experimente a ferramenta corretor Philips UPnP
- Ping “philips-hue.home”
Quando estiver pronto, vá em frente e digitá-lo na barra de endereços do navegador com debug / clip.html anexado ao URL. No meu caso, este foi:
http://192.168.1.216/depurar/grampo.html
Esta é uma ferramenta de depuração que lhe permite enviar e receber os pacotes JSON através de uma interface web simples. O primeiro passo é permitir que o perfil de desenvolvedor na ponte Hue em si - que está desativado por padrão por razões de segurança. Cole o seguinte no campo do corpo, deixe o URL como / Api /, e enviar um pedido POST, clicando no botão de pós:
{"tipo de dispositivo":"usuário de teste","nome de usuário":"newdeveloper"}
A primeira vez que você fizer isso, você verá um botão “link não pressionado” em algum lugar na resposta. Este é um recurso de segurança que requer cada novo aplicativo que você usa para ser fisicamente autorizado. Vá e encontrar o seu Bridge, pressione o botão e enviar o mesmo pedido novamente dentro de 30 segundos. Desta vez, você vai ter uma resposta diferente, eo usuário será autorizado. Se você gostaria de usar um nome de usuário diferente, leia a documentação da API sobre a criação de usuários. Por agora, este será suficiente.
Uma vez que o usuário é a instalação, a URL base que você deve interagir com se torna / Api / newdeveloper / . Você pode enviar um pedido GET para descobrir tudo o que seu Ponte sabe actualmente sobre as luzes connnected, alarmes, cenas e uma pequena log de aplicativos que têm sido utilizados. Aqui está uma amostra de algumas das informações de estado contido por uma única lâmpada.
"Estado": {"em": verdade,"bri": 254,"matiz": 14910,"Sentou": 144,"efeito": "Nenhum","xy": [0,4596,0,4105],"ct": 369,"alerta": "Nenhum","modo de cor": "ct","alcançável": falso},"tipo": "luz de cor estendida","nome": "quarto 1","modelid": "LCT001",
Note-se que o “On”: true Estado não realmente mostrar se a lâmpada está acesa ou só isso não- acordo com as configurações da ponte, ele devemos estar ligado. “Acessível”: false pode indicar tanto uma lâmpada que é muito longe, ou simplesmente desligado no interruptor de alimentação.
Um último exemplo, antes de integrar esta no Arduino: certificar-se de uma das suas luzes é visível e sobre, e que você sabe que número é. Alterar o URL para / Api / newdevelopers / luzes / 1 / estado (Alterando o número para a sua luz), e enviar uma solicitação PUT com os seguintes dados:
{"matiz": 50100,"Sentou":255,"bri":255}
Você deverá ver a sua luz reagir assim:
O que você tem feito é empurrar um novo estado para o bulbo. Você também pode adicionar “transitiontime”, que é um método de animação primitiva indicando quantos segundos você gostaria a mudança de estado a tomar.
A cor pode ser definida em um número de maneiras diferentes, mas, infelizmente, não há nenhuma maneira simples de enviar um valor RGB. No exemplo acima, enviamos matiz, Sentouuration, e brilho. Tente alterar o valor de tonalidade e enviar a solicitação PUT novamente.
Trabalhar em Arduino
Há uma biblioteca de Hue / Arduino existente chamado ArduinoHue que Philips-se vincular a na documentação da API, mas o problema com esta biblioteca é que ele se comunica através da ligação USB ao seu PC, que também precisa estar executando uma aplicação Python constantemente. eugh. Assim como você pode deixar seu computador executar toda a coisa nesse ponto, e cortar o Arduino inteiramente.
Video: Sensor de luz Com Apenas 3 Componentes
Em vez disso, eu vou lhe mostrar como controlar a Hue do Arduino usando um escudo Ethernet. Seu Arduino não precisa ser conectado a um computador, para que ele possa operar de forma independente em qualquer lugar você pode colocar um cabo Ethernet. Na verdade, ele também deve trabalhar com um escudo Wi-Fi, mas eu não tenho com quem brincar.
Se você gostaria de pular, o código de exemplo completo é incorporado abaixo, ou disponíveis aqui. Eu adaptei-o de um exemplo postado por Gilson Oguime. Se você nunca jogou com seu escudo Ethernet antes, você pode querer ter uma corrida rápida através do tutorial cliente web - Eu vou assumir algum nível de familiaridade com este, e não estará cobrindo o código usado para estabelecer uma rede IP etc. Nós também lhe mostrei como criar uma mini web-servidor com o escudo Ethernet.Dê seu projeto Arduino seu próprio mini-Webserver, com uma blindagem EthernetDê seu projeto Arduino seu próprio mini-Webserver, com uma blindagem EthernetUm tempo atrás, eu mostrei-lhe como configurar um sistema de controle de internet para o seu Arduino - mas tinha que ficar ligado a um computador através de USB, a fim de manter a conexão internet ....consulte Mais informação
/ * |
Conversando com Hue a partir de um Arduino |
Por James Bruce (MakeUseOf.com) |
Adaptado a partir do código por Gilson Oguime. https://github.com/oguime/Hue_W5100_HT6P20B/blob/master/Hue_W5100_HT6P20B.ino |
* / |
#incluir |
#incluir |
// constantes Hue |
char const hueHubIP [] = "192.168.1.216"- // hub IP Hue |
char const hueUsername [] = "newdeveloper"- // username Hue |
const int hueHubPort = 80- |
// PIR |
int pir = 2- |
booleano falso-activado = |
// variáveis Hue |
boolean hueOn- // on / off |
int hueBri- // valor de brilho |
longa hueHue- // valor de matiz |
Cordas hueCmd- // comando Hue |
tampão longa sem assinatura = 0- // buffer para o armazenamento de dados recebidos |
addr- longo sem sinal |
// Ethernet |
byte mac [] = {0x74,0x69,0x69,0x2D, 0x30,0x31} - // endereço MAC W5100 |
IPAddress ip (192,168,1,2) - // Arduino IP |
EthernetClient client- |
/ * |
Configuração |
* / |
void setup () |
{ |
Serial.begin (9600) - |
Ethernet.begin (mac, ip) - |
pinMode (pir, ENTRADA) - |
delay (2000) - |
Serial.println ("Pronto.") - |
} |
void loop () |
{ |
se (digitalRead (pir) == 1) { |
Serial.println ("ativado") - |
// Uma série de quatro comandos de exemplo, que cor desbota duas luzes entre o vermelho eo rosa. Leia-se sobre a API Hue |
// documentação para obter mais detalhes sobre os comandos exatos para ser usado, mas note que aspas deve ser escapado. |
comando String = "{"em": verdade,"matiz": 50100, "Sentou": 255, "bri ": 255, "transitiontime ":"+ String (aleatório (15,25)) +"}"- |
setHue (1, comando) - |
command = "{"em": verdade,"matiz": 65280, "Sentou": 255, "bri ": 255, "transitiontime ":"+ String (aleatório (15,25)) +"}"- |
setHue (2, comando) - |
command = "{"matiz": 65280, "Sentou": 255, "bri ": 255, "transitiontime ":"+ String (aleatório (15,25)) +"}"- |
setHue (1, comando) - |
command = "{"matiz": 50100, "Sentou": 255, "bri ": 255, "transitiontime ":"+ String (aleatório (15,25)) +"}"- |
setHue (2, comando) - |
// para que possamos acompanhar o estado |
activado = true- |
} |
outro{ |
activado = falso- |
Serial.println ("desativado") - |
// foi ativado, por isso, enviar um único comando off |
comando String = "{"em": False}"- |
setHue (1, comando) - |
setHue (2, comando) - |
} |
} |
/ * SetHue () é a nossa função de comando principal, que precisa ser passado um número de luz e um |
string de comando * devidamente formatado em formato JSON (basicamente uma matriz estilo javascript de variáveis |
* E os valores. Em seguida, ele faz uma solicitação PUT HTTP simples para a Ponte no IP especificado no início. |
* / |
boolean setHue (int lightNum, comando String) |
{ |
if (client.connect (hueHubIP, hueHubPort)) |
{ |
enquanto (client.connected ()) |
{ |
client.print ("PUT / api /") - |
client.print (hueUsername) - |
client.print ("/ Lights /") - |
client.print (lightNum) - // hueLight baseado em zero, adicione 1 |
client.println ("/ HTTP Estado / 1.1") - |
client.println ("mantenha vivo") - |
client.print ("Hospedeiro: ") - |
client.println (hueHubIP) - |
client.print ("Content-Length: ") - |
client.println (command.length ()) - |
client.println ("Content-Type: text / plain-charset = UTF-8") - |
client.println () - // linha em branco antes do corpo |
client.println (comando) - // comando Hue |
} |
client.stop () - |
voltar verdade- // comando executado |
} |
outro |
retornar falso-// comando falhou |
} |
/ * A função auxiliar no caso de sua lógica depende do estado atual da luz. |
* Este define uma série de variáveis globais que você pode verificar para descobrir se uma luz está ligado ou não |
* E com o matiz etc. Não precisava apenas para enviar comandos |
* / |
booleano getHue (int lightNum) |
{ |
if (client.connect (hueHubIP, hueHubPort)) |
{ |
client.print ("GET / api /") - |
client.print (hueUsername) - |
client.print ("/ Lights /") - |
client.print (lightNum) - |
client.println (" HTTP / 1.1") - |
client.print ("Hospedeiro: ") - |
client.println (hueHubIP) - |
client.println ("Content-type: application / json") - |
client.println ("mantenha vivo") - |
client.println () - |
enquanto (client.connected ()) |
{ |
se (client.available ()) |
{ |
client.findUntil (""em":", " 0") - |
hueOn = (client.readStringUntil ( ``) == "verdade") - // se a luz está acesa, definir variável para true |
client.findUntil (""bri ":", " 0") - |
hueBri = client.readStringUntil ( ``) toInt () -. // definir variável para Brilho |
client.findUntil (""matiz":", " 0") - |
Huehue = client.readStringUntil ( ``) toInt () -. // definir variável para Matiz valor |
break // Não capturando outros atributos de luz ainda |
} |
} |
client.stop () - |
retorno verdade- // capturado em, bri, matiz |
} |
outro |
retornar falso-// lendo erro em, bri, matiz |
} |
Criando Mudanças do Estado
Video: Automatização aquário com Arduino
A criação de um novo estado para empurrar para as lâmpadas é um caso simples de criar um novo Corda variável e escapar de todas as aspas duplas. Eu adicionei um aleatória() função de lá também para criar uma animação pouco dinâmico. Tente fazer a tonalidade variável aleatória demais para cores diferentes.
comando de cadeia = "{"em":verdade,"matiz": 50100, "Sentou": 255, "bri ": 255, "transitiontime ":"+Corda(aleatória(15,25))+"}"-
Enviando o comando
Para enviar realmente o comando, você tem uma função auxiliar chamada setHue () que leva o número de luz ea cadeia de comando como um argumento, assim:
setHue(1,comando)-
Tudo que faz é, então, ele se conecta à ponte, cospe o comando como um pedido PUT, juntamente com todos os outros disparates que a criação de uma solicitação HTTP envolve.
Video: Como fazer sensor de Luz com LDR
cliente.impressão("PUT / api /")-cliente.impressão(hueUsername)-cliente.impressão("/ Lights /")-cliente.impressão(lightNum)-cliente.println("/ HTTP Estado / 1.1")-cliente.println("mantenha vivo")-cliente.impressão("Hospedeiro: ")-cliente.println(hueHubIP)-cliente.impressão("Content-Length: ")-cliente.println(comando.comprimento())-cliente.println("Content-Type: text / plain-charset = UTF-8")-cliente.println()- // linha em branco antes do corpocliente.println(comando)- // comando Hue
Adicionando um sensor de movimento
Finalmente, um sensor de fio simples movimento HC-SR501 para digital I / O pino 2. Quando é detectado movimento, uma série de estados são empurrados para a ponte de 2 lâmpadas para criar uma animação lenta, dinâmico. Quando o sensor de movimento desativa, um único comando off é enviado para ambos. Idealmente, eles seriam revertidos para o estado em que estavam antes de o movimento foi detectado, mas a lógica não é tão inteligente - nós apenas estamos indo para transformá-los ligado e desligado.
limitações
Embora o código reconhecidamente unoptimized, leva quase um segundo para a interface de rede do Arduino para enviar uma única solicitação de comando. Eu testei o mesmo comando a partir de um Mac, usando a mesma conexão Ethernet, e foi capaz de dez a vinte vezes que a velocidade (aqui está o AppleScript no caso de você gostaria de testar). Consequentemente, qualquer tipo de animação rápido (eu estava tentando criar um efeito de vela bruxuleante) simplesmente não é possível a partir de um Arduino. Isto não deve ser um problema para a maioria dos projetos, apenas para animações de luz de alta velocidade, mas é bom estar ciente da limitação.
Também é difícil de analisar totalmente qualquer resposta JSON-lo a voltar a partir da Ponte simplesmente não há RAM suficiente no Arduino para armazenar todos os dados brutos. Por esta razão, você pode querer limitar-se principalmente para o envio.
Hack o Hue
Agora que você está armado com o conhecimento de como controlar Hue de forma totalmente independente, abre-se um mundo de Hue hacks de automação residencial. A verdadeira questão é: o que você vai fazer?