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

Interface de automação residencial física

Componentes e suprimentos

TowerPro Servo
× 1
Dobradiças pequenas
× 1
Botões
× 1
Arduino Yun
× 1
Transformador de corrente 100A
× 1
resistores e capacitores
× 7

Sobre este projeto


Veja os dois vídeos abaixo para uma explicação rápida deste projeto.

Interface de automação residencial física Interface com controle do mundo real
Uma interface transmite informações e permite ao usuário controlar as coisas. A maioria das plataformas de automação residencial conta com uma “interface virtual”. Você pega um smartphone e abre o aplicativo para ver o que está acontecendo com sua casa e liga e desliga as luzes. Isso funciona bem quando você está ausente. Mas olhar para uma representação virtual e analisar as informações no visor dá trabalho. Requer foco e não parece intuitivo.

Eu queria fazer uma “interface física” - uma pequena casa modelo que imita fisicamente as coisas que eu quero saber da minha casa real. Portanto, quando a porta da garagem for aberta, quero que a porta da garagem no modelo também abra. Esta casa modelo poderia ficar na minha mesa de centro, e posso dar uma olhada para ver se a porta da garagem foi deixada aberta antes de ir para a cama. Ou posso ter isso na minha mesa no trabalho, conectado à minha casa via VPN. Quando estou no trabalho, posso dar uma olhada para ver se a porta da frente foi deixada aberta. Essa interface física pode ser tão criativa ou tão utilitária quanto eu a considero.

Então, nas etapas a seguir, irei
  1. Construa uma casa modelo para mostrar coisas como a posição da porta, o uso de energia e se uma luz foi deixada acesa.
  2. Construir um monitor de energia usando a biblioteca Open Energy Monitor Arduino e alimentar informações de uso de energia para a casa modelo e para o OpenHAB
  3. Fornece algumas maneiras de enviar a posição da porta / janela para a casa modelo. Mostre como os dados do sensor de contato Wink Hub e Wink "Tripper" podem ser utilizados em um sistema de automação residencial DIY.
  4. Use o Wink e o Arduino para realizar saídas, como abrir / fechar a porta da garagem ou acender e apagar as luzes.

A casa modelo tem alguns servos e LEDs conectados a um controlador Arduino. Este controlador assina mensagens MQTT que indicam as posições das portas e o uso de energia e aciona os servos de acordo. Mesma ideia com o LED que indica se uma luz está ligada ou desligada. Existem algumas opções para obter essas informações do sensor para o broker MQTT, portanto, detalharei isso nas etapas posteriores. No meio de tudo isso está um Raspberry Pi executando um corretor MQTT (Mosquitto) e OpenHAB. Embora o OpenHAB não seja necessário para executar a casa modelo, é necessário fornecer a interface para o aplicativo de smartphone e permitir monitoramento e atuação remotos. Só porque quero uma interface física não significa que estou pronto para descartar a virtual.







A casa modelo também possui dois botões. Um dos botões liga / desliga a lâmpada zigbee. O outro botão abre e fecha a porta da garagem (na casa REAL).




Parte 1:construção da casa

1) Construir casa modelo

2) Opções de controle, fiação e código

Parte 2:Entradas (Sensores)

3) Sensor:monitor de energia

4) Sensor:opção de nó de sensor DIY

5) Sensor:Wink Hub e sensor de contato Tripper

Parte 3:Saídas

6) Luzes

7) Abridor de porta de garagem



Etapa 1:construção da casa modelo


Não pretendo que esta etapa seja prescritiva. Sou bastante maduro quando se trata de artes e ofícios, então vou apenas mostrar como construí minha casa modelo. Você vai querer construí-lo para se parecer com a sua própria casa e refletir as coisas que lhe interessam. Muito espaço para criatividade aqui. Alguns dos componentes nesta imagem (como o transformador de corrente) serão usados ​​em etapas posteriores.


Componentes :
  • (1) Caixa. Depende de você quão grande e quais proporções.
  • (3) Servo Tower Pro SG90 http://www.dx.com/p/towerpro-sg90-9g-mini-servo-w ...
  • (2) dobradiças pequenas http://www.homedepot.com/p/Stanley-National-Hardw ...
  • (algum) material adesivo. Eu usei adesivos duplos de ganchos 3M.
  • Arduino Yun ou Arduino Uno com escudo Ethernet.
  • Botõeshttp://www.radioshack.com/mini-spst-1-5-amp-moment ...
  • Coisas espalhadas pela casa




Telhado

Cortei uma das abas laterais da caixa e fixei-a na outra aba lateral (ainda presa) para formar um telhado. Usei uma pequena caixa para fornecer uma estrutura para o ângulo reto, e depois apoiei melhor com uma peça de Lego. Você provavelmente pode usar tudo o que tiver em casa para fazer esse ângulo certo.

Portas / janelas

Faça os orifícios para as portas que você deseja mostrar. Prenda uma ou duas dobradiças na porta com fita adesiva dupla e prenda na casa. Eu sei, nada sofisticado, então fique à vontade para improvisar com o que você tem pela casa. Usei adesivos de espuma de dupla face 3M, do tipo que vem com ganchos. Também usei essas fitas adesivas de espuma para montar os servo motores. Para a porta da garagem, o braço do servo motor move a porta da garagem aberta e a gravidade fecha a porta da garagem. Para a porta da frente, precisei prender uma corda na porta com dobradiças para que o braço do servo possa abri-la. A peça de Lego amarela que você vê está lá para compensar o servo da dobradiça.
//www.youtube.com/embed/z-xyVXUSqNM
Medidor de energia

Nada chique. Apenas corte uma coisa parecida com uma flecha e prenda-a ao braço do servo. Corte uma forma que pareça vagamente arbustiva e marque-a com uma escala de quilowatts, e ajuste o servo motor com fricção na caixa com o arbusto no meio.

Acima do servo de consumo de energia, coloquei um LED vermelho.

Também tenho dois botões para controlar as luzes e a porta da garagem. Estes são botões momentâneos. Os botões são rosqueados com uma porca na parte externa para prendê-los contra a parede da caixa de papelão. Do outro lado estão os contatos de metal para os fios serem soldados.

Etapa 2:Construção da casa - Fios e código


Fiação

Aqui está o diagrama de fiação. Eu fiz uma grande bagunça com a fiação dentro da caixa. Se você preferir apenas saber quais fios estão em quais pinos:
  • LED de pino de status:7
  • LED indicador de iluminação:4
  • Servo 1 (porta da frente):3
  • Servo 2 (porta da garagem):5
  • Servo 3 (arbusto de uso de energia):6
  • Botão 1 (luzes ligadas / desligadas):8
  • Botão 2 (abertura / fechamento da porta da garagem):9

Opções do controlador

Você pode usar aquilo com que se sentir confortável e o que tiver em mãos. Uma opção menos cara (US $ 20) é usar um clone do Arduino Uno e um escudo ethernet. Comecei com isso, mas isso me prendeu ao cabo Ethernet. Então, mudei para um Arduino Yun ($ 65). Muito mais caro, mas também me deu a liberdade de usar wi-fi. O Yun foi realmente fácil de usar. Você basicamente:
  1. Conecte o Yun ao seu roteador via Ethernet
  2. Navegue até a página da web do Yun
  3. Configure senhas e IP estático em seu roteador
  4. Baixe o esboço de Yun

Abaixo estão os esboços do Arduino Uno e do Arduino Yun. Eles são muito semelhantes e, exceto pela ponte Ethernet usada no Yun, você pode copiar o código do Yun para o Uno. Depois de fazer a mudança para o Yun, adicionei os dois botões de controle. Como resultado, o esboço do Uno não tem esses botões.

O vídeo na primeira etapa mostra o Arduino Yun. Aqui está um vídeo usando o Uno e o escudo Ethernet. Quando este vídeo foi feito, eu ainda não tinha instalado os dois botões, mas todo o resto funciona da mesma forma.
//www.youtube.com/embed/7i6McpbU3Gs


smarthome_ethernet.ino smarthome_yun.ino


Etapa 3:Sensor:Monitor de energia


Agora que temos uma interface física capaz de exibir o uso de energia, precisamos construir um nó sensor para ler o consumo de energia da casa e publicar esse consumo para o corretor MQTT. Existem algumas maneiras de fazer isso. Estou usando um Arduino Yun. É o método menos complicado, mas não o menos caro. Se quiser, você pode usar um Arduino Uno, escudo ethernet e um roteador sem fio para atuar como uma ponte wi-fi. Ou você pode usar um Pi com o pacote Open Energy Monitor. Vou apenas cobrir o método Yun.

Estou usando um transformador de corrente de $ 7 do ebay. Você pode encontrar a versão 100A do Yhdc SCT-013-000 aqui. Conecte-o de acordo com o diagrama de fiação acima e carregue o esboço do Arduino Yun na parte inferior desta etapa. Certifique-se de modificar o código com o endereço IP do broker MQTT. Esta página da biblioteca Open Energy Monitor é uma boa referência. Aqui estão os valores ideais dos componentes.
  • Resistor de carga =33 ohm
  • Resistor divisor de tensão =10k ohm
  • Capacitor =10uF

A imagem do meu monitor de energia realmente não corresponde ao diagrama do circuito porque eu não tinha esses componentes exatos em mãos. Tive de usar dois resistores de 68 ohms em paralelo porque não tinha o resistor de carga de 33 ohms. E eu não tinha um capacitor de 10uF para o circuito retificador, então usei dois capacitores de 22uF. A capacitância equivalente em série é próxima o suficiente.

Conecte o transformador de corrente em uma das fases de entrada de sua casa. Eu só tive um único transformador 100A, então estou monitorando apenas uma das fases. Eventualmente, gostaria de obter mais transformadores para monitorar a outra perna da energia de entrada e também os circuitos ramificados. Usando um amperímetro real, minha configuração DIY sempre leu 1 ampere acima do amperímetro em diferentes leituras de amplificador (veja a 5ª imagem acima). Bastante simples questão de apenas subtrair aquele amplificador extra.




OpenHAB

Uma vez que temos os dados chegando, podemos também exibi-los no OpenHAB para que os dados possam ser representados graficamente. Aqui está a configuração relevante do OpenHAB.

Definição do item
 

Numere itm_smarthome_energy_amps "Energia (amperes) [% .1f]" {mqtt ="<[mymosquitto:2853:state:default]"}

Numere itm_smarthome_energy_watts "Energia (Watts) [ % .1f] "{mqtt =" <[mymosquitto:2852:state:default] "}


Mapa do site
 

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

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

Text item =itm_smarthome_energy_watts

Chart item =itm_smarthome_energy_watts period =h refresh =5000} // Frame de uso de energia

} // Text label ="Energy"


Persistência

Como estamos usando gráficos, precisamos definir algum tipo de estratégia de persistência para o uso de energia. RRD4J é mais fácil de usar, então aqui está o que eu tenho para "/openhab/configurations/persistence/rrd4j.persist".
 

Estratégias {
// para gráficos rrd, precisamos de uma estratégia cron everyMinute:"0 * * * *?"}

Itens {DemoSwitch, NoOfLights, Window_GF_Toilet, Heating * :estratégia =everyChange, everyMinute, restoreOnStartup // vamos armazenar apenas os valores de temperatura em rrd Temperature *, Weather_Chart *:strategy =everyMinute, restoreOnStartup itm_smarthome_energy_watts:strategy =everyUpdate}


Tela do monitor de energia
energy_monitor_yun.ino

Etapa 4:sensor:nós de sensores sem fio DIY


Existem algumas opções para sensores de abertura / fechamento sem fio.

Em um de meus projetos anteriores, usei um transceptor sem fio de $ 5 para enviar dados do sensor por um gateway MQTT. Ainda estou usando este projeto para obter o status da porta da garagem para o OpenHAB e, no vídeo de demonstração, é assim que a porta da garagem da casa modelo reflete meu status real da porta da garagem. O código detalhado e o circuito podem ser encontrados nesta etapa se você quiser usá-los. É meio feio, mas fica na garagem, onde ninguém vai notar.

Há também um sensor de luz que estou usando para indicar se uma luz foi deixada acesa. Isso também é daquele Instructable anterior detalhado nesta etapa. É parte do sensor Uber que usa um resistor de foto para enviar informações de brilho sem fio de volta para o OpenHAB. Nesse caso, estou simplesmente assinando o tópico MQTT que indica o nível de luz.

Também fiz um sensor reed switch alimentado por bateria que usa o mesmo transceptor sem fio e gateway do Instructable anterior. No entanto, não é muito bonito. Eu realmente não posso usar isso em uma porta ou janela interna por razões estéticas. Então, para superar esse problema, estou usando sensores de switch de palheta de nível de consumidor mais bonitos da Wink. O que nos leva à próxima etapa.
//www.youtube.com/embed/uiD-HLezygI//www.youtube.com/embed/VKniJzIVHsI

Etapa 5:Sensor:Wink Hub


Aconteceu nesta postagem de blog de um usuário antigo do Wink Hub que encontrou uma maneira de fazer o root no hub para obter acesso a um exploit de PHP. Este exploit permite que você execute um utilitário "aprontest" para controlar coisas que foram emparelhadas com o Wink Hub. Usando esse método, consegui controlar as luzes da interface do OpenHAB.

O benefício mais interessante de fazer o root do Wink Hub é que ele dá a você local controle sobre as luzes e o status do sensor sem precisar acessar o servidor Wink. O Wink Hub e Wink API sempre precisam ir à internet para entrar em contato com o servidor Wink para fazer o controle de iluminação ou obter o status do sensor. Agora, com esse exploit do PHP, as operações de iluminação e sensor podem ser mantidas em sua LAN local. Isso é ótimo.

Incluí um script PHP na parte inferior desta etapa. Se você não consegue abrir este arquivo, tente este link. Este script é executado no Raspberry Pi e consulta o Wink Hub para obter o status de duas chaves de palheta Wink Tripper. Este status é enviado ao OpenHAB por meio da API REST. O OpenHAB publicará tópicos MQTT para essas posições de porta. O controlador da casa modelo então abre ou fecha as portas assinando esses tópicos de posição de porta.

Os três arquivos de configuração do OpenHAB (itens, mapa do site e regras) anexados nesta etapa são necessários para fazer tudo funcionar. Eles definem os itens de contato com os quais o script de pesquisa interage por meio da interface REST. Há também um script de exemplo para controlar a lâmpada zigbee via OpenHAB.
//www.youtube.com/embed/tWKPcBOn1KM
Scripts e arquivos de configuração.

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


Etapa 6:Saída:Luzes


Por causa da ordem em que cobri os arquivos de configuração, as etapas anteriores forneceram praticamente tudo o que era necessário para controlar uma "lâmpada conectada" por meio da interface física e da interface OpenHAB. As luzes podem ser qualquer luz suportada pelo hub Wink. Atualmente, testei isso com a lâmpada Cree Connected e as luzes GE Wink. Ambos funcionam conforme o esperado. Vou lançar aqui este vídeo que mostra melhor como o sensor de luz e os botões controlam a lâmpada inteligente.
//www.youtube.com/embed/KSDUEfro3Vo

Etapa 7:Saída:abridor de porta de garagem


Os arquivos de configuração fornecidos na Etapa 5 incluem a maioria dos itens OpenHAB necessários para controlar uma porta de garagem. Mas você ainda precisa de algo para realmente abrir e fechar a porta da garagem. Para isso, estou modificando partes de um Instructable anterior. Eu fiz um abridor de porta de garagem com estes componentes:
  • Clone do Arduino ($ 10)
  • blindagem Ethernet ($ 7)
  • Reed Relay ($ 2)
  • Controle remoto sobressalente para porta de garagem ($ 22)

O Arduino controla um relé de palheta abrindo e fechando os contatos secos. O botão do controle remoto da porta da garagem está conectado ao contato seco do relé de palheta. Conecte o pino 5 e o GND do Arduino aos dois pinos da bobina (dois pinos externos) do relé de palheta e os pinos do relé interno ao botão no controle remoto da porta da garagem.

O Arduino se inscreve em um tópico MQTT e aguarda o comando abrir / fechar. Ao ver este tópico, ele energiza o relé de palheta momentaneamente, fechando o "botão" no controle remoto sobressalente da porta da garagem. O esboço do Arduino está anexado abaixo. Além disso, adicione "garage_monitor_rules.txt" ao seu arquivo de regras. Isso é necessário além das regras anexadas na Etapa 5. Se você não usar o método de sensor ultrassônico que usei, esta é a parte que você precisa alterar para se adequar à sua modificação.
//www.youtube.com/embed/CqbRosfqM3c
Se a porta da sua garagem for bastante silenciosa ou se você quiser algum tipo de anúncio de áudio em outra parte da casa para quando a porta da garagem se abrir, a regra adicionada acima pode reproduzir um arquivo de áudio. Você pode ouvi-lo no primeiro vídeo de demonstração, cerca de um minuto e meia.
//www.youtube.com/embed/pdKfJtnpNzs


garagem_monitor_rules.txt grage_opener.ino


Etapa 8:Outros pensamentos


As decisões tomadas neste projeto refletem as ferramentas com as quais me sinto confortável, as peças que tenho em mãos e minhas prioridades de como quero que as coisas funcionem. Você provavelmente tem um conjunto diferente de ferramentas e diferentes componentes de hardware prontamente disponíveis. Você provavelmente também tem ideias diferentes sobre como a automação residencial deve funcionar.

Há muita flexibilidade ao usar MQTT e OpenHAB, e você não precisa fazer as coisas exatamente como eu fiz. O controlador usado para controlar a casa modelo pode ser algum sabor do Arduino, um Raspberry Pi ou mesmo um Sparkcore. Os sensores DIY podem ser um Arduino ou um ESP8266 autônomo. A única restrição é que os dados do sensor precisam ser publicados no broker MQTT de alguma forma. Se você tiver um stick de onda Z USB na instalação do OpenHAB, poderá usar o OpenHAB como uma onda Z para a ponte MQTT e utilizar sensores de onda Z para detecção de porta.

Até mesmo os sensores de abertura / fechamento Wink poderiam ser feitos de forma diferente. Se você não fizer root no Wink Hub, poderá usar a API Wink para obter o status do sensor e publicá-lo no OpenHAB ou publicá-lo diretamente via MQTT. Isso requer o uso do Wink Server, mas remove a restrição de um hub com raiz.

Então, há muitas maneiras de fazer as coisas de maneira diferente. Minha tendência é usar hardware com o menor denominador comum, como Arduino e caixas de papelão.

Código

  • smarthome_yun.ino
  • smarthome_ethernet.ino
  • energy_monitor_yun.ino
smarthome_yun.ino Texto simples
 // Eric Tsai // 2015-04-13 // Código Arduino Yun para controlar a interface de casa inteligente física // Modificar nomes de tópicos MQTT para corresponder ao seu uso // Modificar endereço IP do corretor MQTT // novo yun inclui # incluir  #include  #include  // ethernet antigo inclui ao usar o escudo ethernet / * # include  #include  #include  * / # include  // Ethernet shield setup / * IPAddress ip (192, 168, 2, 36); byte mac [] ={0x90, 0xA2, 0xDA, 0x0D, 0x43, 0x13}; servidor de bytes [ ] ={192, 168, 1, 101}; EthernetClient ethClient; PubSubClient client (servidor, 1883, callback, ethClient); * / unsigned long keepalivetime =0; unsigned long MQTT_reconnect =0; // use yunclient para fazer a ponte para networkYunClient yun; // equivalente a ethernet clientPubSubClient client ("192.168.1.101", 1883, callback, yun); bool conn_ok; // usar LED para indicar o status da conexão MQTT.int ledPin =4; // indica luzes onint statusPin =7; // indica o status de conexão MQTT // servo controlint servo1Pin =3; // front doorint servo2Pin =5; // portão da garagem servo3Pin =6; // medidor de consumo de energiaServo servo1; // doorServo servo2; // porta da garagemServo servo3; // botão energético1 =8; // botão sobre a porta frontal button2 =9; // botão sobre a porta da garagem // operação do servo:posições alvo para servosint servo1_target =5; // porta, closedint servo2_target =5; // garagem, closedint servo3_target =180; // energia, 180 é "0" watts, motor montado para trásint servo1_pos_cur =5; int servo2_pos_cur =5; int servo3_pos_cur =180; // 180 é "0" watts, motor montado para trásint servo1Opened =5; int servo1Closed =130; int servo2Opened =5; int servo2Closed =150; longo sem sinal servo1_time =0; sem sinal longo servo2_time =0; sem sinal longo servo3_time =0; / / debounce nos botões, para que você não envie spam publishunsigned long button1_db =0; unsigned long button2_db =0; int button =0; int callback_flag =0; char buff_message [12]; // --------- -------------------------------------------------- ---- // Retorno de chamada MQTT // reage às mensagens MQTT aqui // -------------------------------- ------------------------------- void callback (char * topic, byte * payload, unsigned int length) {// converter tópico para int. int mytopic =atoi (tópico); //Serial.print(mytopic); // converter carga útil em carga útil interna [comprimento] ='\ 0'; // adiciona um retorno de linha para que atof possa analisar corretamente float mymsg =atof ((const char *) payload); // led if (mytopic ==2822) {if (mymsg ==1) {digitalWrite (ledPin, HIGH); } if (mymsg ==0) {digitalWrite (ledPin, LOW); }} // servo 1, porta da frente if (mytopic ==2832) {if (mymsg ==1) // abriu {//Serial.println("servo1 open "); servo1_target =servo1Opened; } if (mymsg ==0) // fechado {//Serial.println("servo1 fechado "); servo1_target =servo1Closed; } //Serial.println(servo1_target); } / * // segundo sinal de porta de garagem "fechado" =desligado =enviar 1 "aberto" =ligado =enviar 0 * / // servo 2, porta de garagem if (mytopic ==2842) {if (mymsg ==1) / / abriu {servo2_target =servo2Opened; } if (mymsg ==0) // fechado {servo2_target =servo2Closed; } // callback_flag =1; // servo3_target =mymsg; } // servo 3, medidor de energia if (mytopic ==2852) {// mensagem =watts // limite de watts ao medidor max &min if (mymsg> 6000) {mymsg =6000; } if (mymsg <0) {mymsg =0; } // medidor de polarização de 180 graus a 0 graus // 180 graus a 0 graus =0 watts a 6000 watts, por exemplo // definir o máximo de watts para o que faz sentido para você. servo3_target =180 - ((1 - ((6000-mymsg) / 6000)) * 180) -25; callback_flag =1; }} // fim da configuração do callbackvoid () {pinMode (ledPin, OUTPUT); //LED indicating light on pinMode(statusPin, OUTPUT); pinMode(button1, INPUT_PULLUP); //use pull-up resistor, invert logic pinMode(button2, INPUT_PULLUP); //use pull-up resistor, invert logic digitalWrite(ledPin, HIGH); //yun bridge Bridge.begin(); //connect to MQTT broker client.connect("yun smarthome"); client.publish("watch", "Smart Home Connected!"); keepalivetime=millis(); //Wire.onReceive (receiveEvent); MQTT_reconnect =millis(); //client.subscribe("#"); //test subscribe client.subscribe("2822"); //LED client.subscribe("2832"); //servo 1 topic client.subscribe("2842"); //servo 2 topic client.subscribe("2852"); //servo 3 topic digitalWrite(ledPin, LOW); //servo servo1.attach(servo1Pin); servo1.write(90); servo2.attach(servo2Pin); servo2.write(90); servo3.attach(servo3Pin); servo3.write(5);} // end of setupvoid loop() { client.loop(); //MQTT processing needs this to run //For servo positioning, don't want to move too fast. //Must crawl from current position to target position //but also avoid using "delay" cmd, that just freezes up microcontroller //servo 1 if ((millis() - servo1_time)> 20) { if (servo1_pos_cur> servo1_target) { servo1_pos_cur =servo1_pos_cur - 1; } if (servo1_pos_cur  20) { if (servo2_pos_cur> servo2_target) { servo2_pos_cur =servo2_pos_cur - 1; } if (servo2_pos_cur  20) { if (servo3_pos_cur> servo3_target) { servo3_pos_cur =servo3_pos_cur - 1; } if (servo3_pos_cur 3000) || (button1_db> millis())) { button1_db=millis(); client.publish("2862", "button1 yaya"); } } //button 2 button=digitalRead(button2); if (button==0) //inverted logic { if ( ((millis() - button2_db)>3000) || (button2_db> millis())) { button2_db=millis(); client.publish("2872", "button2 yaya"); } } //check network connection to MQTT broker every 60 seconds. //reconnect if no longer connected if ((millis() - MQTT_reconnect)> 60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(statusPin, HIGH); //Serial.println("MQTT connected OK"); } else { digitalWrite(statusPin, LOW); //Serial.println("MQTT NOT connected OK"); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); atraso (5000); while (client.connect("smarthouse") !=1) { digitalWrite(statusPin, LOW); //Serial.println("Error connecting to MQTT"); atraso (4000); } digitalWrite(statusPin, HIGH); } //Serial.println("reconnected to MQTT"); MQTT_reconnect =millis(); client.publish("watch","smart home heartbeat!"); }//end Mosquitto connection check} // end of loop
smarthome_ethernet.inoPlain text
// Eric Tsai// 2015-04-1// Arduino Uno w/ Ethernet, code for controlling physical smart home interface// Modify MQTT topic names to match your use// Modify MQTT broker IP address#include #include #include #include //Ethernetbyte mac[] ={ 0x90, 0xA2, 0xDA, 0x0D, 0x43, 0x13 };byte server[] ={ 192, 168, 1, 101 };EthernetClient ethClient;PubSubClient client(server, 1883, callback, ethClient);unsigned long keepalivetime=0;unsigned long MQTT_reconnect=0;bool conn_ok;//use LED for indicating MQTT connection status.int ledPin =4; //indicate lights onint statusPin =7; //indicate MQTT conn status//servo controlint servo1Pin =3; //front doorint servo2Pin =5; //garage doorint servo3Pin =6; //energy usage meterServo servo1; //doorServo servo2; //garage doorServo servo3; //energy//servo operation:target positions for servosint servo1_target =5; //door, closedint servo2_target =5; //garage, closedint servo3_target =180; //energy, 180 is "0" watts, motor mounted backwardsint servo1_pos_cur =5;int servo2_pos_cur =5;int servo3_pos_cur =180; // 180 is "0" watts, motor mounted backwardsint servo1Opened =5;int servo1Closed =120;int servo2Opened =5;int servo2Closed =150;unsigned long servo1_time =0;unsigned long servo2_time =0;unsigned long servo3_time =0;//---------------------------------------------------------------// MQTT call back// react to MQTT messages here//---------------------------------------------------------------void callback(char* topic, byte* payload, unsigned int length) { Serial.println("received MQTT"); //convert topic to int. int mytopic =atoi (topic); //Serial.print(mytopic); //convert payload to int payload[length] ='\0'; //add a line return so atof can parse correctly float mymsg =atof( (const char *) payload); //print MQTT message Serial.println(""); Serial.print("("); Serial.print(mytopic); Serial.print(", "); Serial.print(mymsg); Serial.println(")"); //led if (mytopic ==2822) { if (mymsg ==1) { digitalWrite(ledPin, HIGH); } if (mymsg ==0) { digitalWrite(ledPin, LOW); } } //servo 1, front door if (mytopic ==2832) { if (mymsg ==1) //opened { Serial.println("servo1 opened"); servo1_target =servo1Opened; } if (mymsg ==0) //closed { Serial.println("servo1 closed"); servo1_target =servo1Closed; } Serial.println(servo1_target); } /* //second garage door signal "closed" =off =send 1 "open" =on =send 0 */ //servo 2, garage door if (mytopic ==2842) { if (mymsg ==1) //opened { servo2_target =servo2Opened; } if (mymsg ==0) //closed { servo2_target =servo2Closed; } } //servo 3, energy meter if (mytopic ==2852) { //message =watts //error check if (mymsg> 6000) { mymsg =6000; } if (mymsg <0) { mymsg =0; } //bias meter from 180 degrees to 0 degrees //180 deg to 0 deg =0 watt to 6000 watts, for example //set max watts to what makes sense for you. servo3_target =180-((1-((6000-mymsg)/6000))*180); //servo3_target =mymsg; }}//end callbackvoid setup() { //ethernet //Ethernet.begin(mac, ip); //Wire.begin (MY_ADDRESS); Serial.begin (9600); Serial.println("starting"); pinMode(ledPin, OUTPUT); //LED indicating light on pinMode(statusPin, OUTPUT); digitalWrite(ledPin, HIGH); //wait for IP address while (Ethernet.begin(mac) !=1) { Serial.println("Error getting IP address via DHCP, trying again..."); atraso (5000); } Serial.println("ethernet OK"); keepalivetime=millis(); while (client.connect("smarthouse") !=1) { Serial.println("Error connecting to MQTT"); //delay(3000); atraso (4000); } MQTT_reconnect =millis(); Serial.println("setup complete"); client.publish("smarthouse","hello world"); //test publish //client.subscribe("#"); //test subscribe client.subscribe("2822"); //LED client.subscribe("2832"); //servo 1 topic client.subscribe("2842"); //servo 2 topic client.subscribe("2852"); //servo 2 topic digitalWrite(ledPin, LOW); //servo servo1.attach(servo1Pin); servo1.write(90); servo2.attach(servo2Pin); servo2.write(90); servo3.attach(servo3Pin); servo3.write(5);} // end of setupvoid loop() { client.loop(); //MQTT processing needs this to run //For servo positioning, don't want to move too fast. //Must crawl from current position to target position //but also avoid using "delay" cmd, that just freezes up microcontroller //servo 1 if ((millis() - servo1_time)> 20) { if (servo1_pos_cur> servo1_target) { servo1_pos_cur =servo1_pos_cur - 1; } if (servo1_pos_cur  20) { if (servo2_pos_cur> servo2_target) { servo2_pos_cur =servo2_pos_cur - 1; } if (servo2_pos_cur  20) { if (servo3_pos_cur> servo3_target) { servo3_pos_cur =servo3_pos_cur - 1; } if (servo3_pos_cur  60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(statusPin, HIGH); Serial.println("MQTT connected OK"); } else { digitalWrite(statusPin, LOW); Serial.println("MQTT NOT connected OK"); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); atraso (5000); while (client.connect("smarthouse") !=1) { digitalWrite(statusPin, LOW); Serial.println("Error connecting to MQTT"); atraso (4000); } digitalWrite(statusPin, HIGH); } //Serial.println("reconnected to MQTT"); MQTT_reconnect =millis(); client.publish("smarthouse","heartbeat every minute!"); }//end Mosquitto connection check} // end of loop
energy_monitor_yun.inoPlain text
/*Eric Tsai2015-04-22Arduino Yun code for publishing energy use to MQTT brokerModify the "PubSubClient client" for your broker IP address*/#include #include #include #include "EmonLib.h" // OpenEnergy Monitor project libraryint LED =3;EnergyMonitor emon1; // open energy monitorunsigned long MQTT_reconnect=0;unsigned long read_energy=0;double Irms;bool conn_ok;YunClient yun; //equivalent of ethernet client//really shouldn't need call back, but just in case it's needed.void callback(char* topic, byte* payload, unsigned int length) { digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(500); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW}//use yunclient to bridge to networkPubSubClient client("192.168.1.101", 1883, callback, yun);//**********************************************************************void setup(){ // initialize digital pin 13 as an output. pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW Bridge.begin(); client.connect("yun_energy"); client.publish("watch", "Energy Monitor Connected!"); client.subscribe("yun_energy"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(3000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW emon1.current(5, 60); // Current:input pin, calibration.}//**********************************************************************void loop(){ char buff_message[12]; //message buffer for MQTT publish float value; client.loop(); //run this every loop to maintain MQTT connection Irms =emon1.calcIrms(1480); // Calculate Irms only, 1480 means read Irms. //publish current every 10 seconds. if (millis() - read_energy> 10000) { //amps value =Irms; dtostrf (value, 4, 5, buff_message); client.publish("2853", buff_message); read_energy =millis(); //watts value =Irms*115; dtostrf (value, 4, 5, buff_message); client.publish("2852", buff_message); } //maintain MQTT connection if ((millis() - MQTT_reconnect)> 60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); atraso (5000); while (client.connect("yun_energy") !=1) { delay(4000); } digitalWrite(LED, HIGH); client.publish("watch", "Energy Monitor reconnected"); } MQTT_reconnect =millis(); }//end Mosquitto connection check }

Esquemas


Processo de manufatura

  1. Teste de gravidez em casa
  2. Interface C#
  3. Interface Java
  4. Aplicações de automação residencial
  5. RASPBERRY PI HOME AUTOMATION
  6. Labman Automation
  7. IoT e automação residencial:O que o futuro reserva?
  8. C# - Interfaces
  9. Automação na indústria 4.0
  10. Entendendo a Automação de Imprensa