Ajuda em projecto (home automation)

Boas a todos,

o que me trás aqui é a necessidade do vosso conhecimento e ideias, para que possa completar o projecto que de seguida explicarei com o menor dos problemas e ao menor preço possivel...

Basicamente será para home automation, o projecto vai-se dividir em 2 partes... o Modulo central e os módulos individuais, que irão sendo contruidos consoante o tempo/dinheiro disponivel.

O que eu procuro fazer, inicialmente, será controlar os interruptores de cada divisão através do computador/smartphone/internet para poder ligar/desligar e saber em que estado estão (e se possivel fazer dimming, mas não é requisito óbrigatório), do genero do que podem ver na imagem seguinte:

Também procuro controlar algumas das tomadas eléctricas retirar a energia delas antes de me deitar, nomeadamente onde tenho a tv, o dvd, o media player, computadores ou seja, controlar a sala, o quarto e o escritório pois na cozinha nao vejo muito interesse nisso.

Também conto em pôr sensores de temperatura, 1 por divisão, usando o DS18B20.
Procuro também ter a medição do gasto energético em casa usando algo deste género Link, mas penso que talvez seja possivel fazer o mesmo a um custo mais baixo, peço a vossa opinião.

Para conseguir o que pretendo, estou a fazer uma lista de material que irei precisar e toda a informação possivel para o concretizar (isto caso seja realmente possivel)

Para módulo central contava com o seguinte material:

Router TP-Link TL-WR741ND 22,5
Arduino mega 2560 + cabo USB 26,2
LCD1602 KEYPAD SHIELD for Arduino 12,5
XBee 1mW Chip Antenna - Series 2 13,95
Xbee shield 9,55

(valores em euros) Total: 84,70€

O porquê de eu ter escolhido um router e este em especifico está explicado neste link: Link

Por ter encontrado este link, julgo que o material acima será o indicado, mas caso esteja errado peço que me corrijam e me sugiram alternativas.

Para os módulos individuais:

XBee 1mW Chip Antenna - Series 2 (802.15.4) 13,95
SSR-25 DA Solid State Relay 25A 24-380VAC 3-32VDC 3,75
Non-isolated AC/DC Converter BP5045A5 3,7
Voltage Regulator 3,3v 0,75
Microcontrolador ATMEGA328-PU-ND 2,95

(valores em euros) Total: 25,10€

Não inclui os sensores de temperatura porque já os tenho.

Sei que irei precisar de uma board para interligar todos os componentes, mas não inclui na lista.

Julgo que não me estou a esquecer de nada, das informações que fui recolhendo, mas caso me esteja a esquecer peço que me digam por favor.

Agradeço a todos o tempo dispensado.
Abraços

PS. Quero agradecer desde já ao Bubulindo que me foi ajudando mediante a disponibilidade dele a chegar até aqui.

esse tema que vc tem foi vc que desenvolveu...tem como dispor o codigo fonte do site pra comunidade.

eu ainda nao desenvolvi... Foi tudo informação que fui adquirindo na internet...
Procuro a opinião dos mais experts para que possam dar as suas ideias e tambem que material posso/devo substituir que seja mais indicado e se possivel mais barato e tambem claro se for possivel concluido com o que tenho de momento

me refiro a imagem que vc colocou, vc ja tem esse site pronto ou tambem achou a imagem na net.

maks da uma vista de olhos aqui:

e aqui KIT demonstração HT12D e HT12E Holtek - YouTube

para fazeres uma comunicacao sem fios é o mais barato que encontras... tambem tenho a mesma ideia que tu e é assim que vou fazer... ja tenho o autor desse segundo site a ajudar me.

Ola, e desde já obrigado pela participação.

Sobre esses transmissores, lembra-te que poderás encontrar dificuldades, devido a possiveis interferências e devido ao facto de eles serem apenas transmissores, não consegues saber se a informação enviada chegou correctamente ao contrário do xbee, que para além de serem transmissores tambem são receptores... Não sei se tiveste isso em consideração ou não, e com isto não digo que não funcione, considera apenas uma observação...

Sobre os meus componentes, como a caixa por tras do interruptor (onde quero por o material) tem apenas 6cm de diâmetro e 2cm de profundidade, com este relay impossibilita a execução do mesmo, visto so o relay ocupa o espaço todo que tenho disponivel.
Alguem conhece outro relay que tenha dimensões mais reduzidas?
talvez este? http://search.digikey.com/scripts/DkSearch/dksus.dll?WT.z_header=search_go&lang=en&site=us&keywords=T9AS1D12-5&x=0&y=0
ou este? ​Váš parťák ve světě tvoření | HWKitchen.cz
encontrei tambem este http://ptrobotics.com/product.php?id_product=731 e este http://store.aztronics.com/index.php?route=product/product&product_id=215
nao sei qual o mais indicado... e já agora, qual a diferença ente 1 ou 2 circuitos?

Cumprimentos

Acho que estas a ver mal a coisa...
Para aquele projecto que te falei, aquilo usa um emissor e um receptor,nao sei se viste bem.
depois usa um encoder e um decoder,quanto as interferencias eu nao exprimentei.. mas falei com os autores dos dois links e garantiram me que nao faz intereferencias.

Quanto ao tamanho da placa tambem e reduzido mt mt mt reduzido da uma vista de olhos nos componentes e veras que sao minimos...so tens que os soldar em uma placa. que ficara mt mt reduzida.

No video é so para veres o funcionamento.. e as placas tao enormes existe mt espaço entre os componentes.

Estamos a falar de preço.....para o mesmo efeito que o xbee faz.ou melhor para o que queres fazer e eu tambem.

so uma das placas e que tem recepçao, pelo que percebi... mas posso estar errado :slight_smile:
uma pergunta... o que tu pretendes vai ter interface para poderes usar computador/smartphone/internet tal como eu quero?
eu nao tenho muita experi?ncia nisto, como ja deves ter percebido, e apenas me estou a basear nas informaçoes que vou recolhendo na net... :slight_smile:
esses transmissores/receptores sao wireless, assim como os routers?

Abraços

Vês o que te tinha dito?? :slight_smile:

Maks:
so uma das placas e que tem recepçao, pelo que percebi... mas posso estar errado :slight_smile:
uma pergunta... o que tu pretendes vai ter interface para poderes usar computador/smartphone/internet tal como eu quero?
eu nao tenho muita experi?ncia nisto, como ja deves ter percebido, e apenas me estou a basear nas informaçoes que vou recolhendo na net... :slight_smile:
esses transmissores/receptores sao wireless, assim como os routers?

Abraços

Isto é um transmissor RF radio frequencia e um receptor que trabalha na mesma frequencia. Isto opera por ondas de radio sem fios.
Isto é apenas a parte do hardware tal como o xbee também é.

Depois o interface fazes tu, junto com o arduino que é a parte do cerebro que da informacao para as placas funcionarem
Como te digo esta é a solucao mais economica, so precisas de uma placa emissora e de um encoder

depois poderas ter varias receptores cada um deles com um decoder...

Ve este video:.

Toma nota que o projecto ai esta desenhado em uma breadbord e parece muito grande mas quando isso tiver soldado em uma PCI ,(placa circuito impresso) fica muito pequeno.

Quanto aos preços:

cerca de 6 euros na parte emissora que trabalha junto do arduino ou protuino (mais barato) e so precisas de um emissor.

e cerca de 8 10 euros por cada placa receptora ja com rele de 5v.

Esses preços sao mais ao menos nao foge mt.

Os preços que indicas aqui são deveras interessantes...
Por favor ve a pm que te enviei..

Obrigado

Abraços

PS. Sim bubulindo tinhas razão. És o maior!!! :wink:

Olá pessoal...!

Vi este tópico no forum e resolvi partilhar convosco o meu projecto que tem o mesmo objectivo, mas toma uma abordagem diferente. Peço desculpa se este não é o sítio correto para publicar esta minha ideia, mas como o assunto é o mesmo achei que seria útil partilhar a minha ideia até porque também procuro opiniões e sugestões.

Em primeiro lugar devo dizer que sou técnico de informática e instalo paralelamente automatismo para instalações colectivas ou moradias, uso em geral o famoso KNX (http://www.knx.org/) no qual eu sou certificado, que na minha óptica é o melhor sistema de domótica que conheço. Em geral tenho alguma experiência na interligação entre microcontroladores e potência.

Como não nado em dinheiro, porque o KNX é bom, mas é um bocado carito, resolvi desenvolver com o arduino o meu próprio sistema de automação para casa. Comecei o projecto recentemente e ainda está muito verde, mas aqui vai o conceito.

Vou usar um arduino MEGA porque tem mais portas, uso os PINs 22 ao 51 (Números pares para Input's, números impares para Outputs (ver código)). Assim fico com 15 portas de output, que para uma moradia média é suficiente para controlar os circuitos de iluminação. As restantes portas digitais reservo-as para outras funcionalidadfes futuras, que já estão na cabeça, mas que por agora não vou implementar (por exemplo: usar as portas PWM para fazer dimming).

Então o meu conceito é o seguinte.

------------- Instalação electrica (interruptores) -------------------------------

Uma fonte de 5V colocada no meu quadro eléctrico (fácil de arranjar e barato), vai mandar a respectiva tensão para os interruptores lá de casa (Tenho uma instalação feita todo com telerruptores), pelo que o circuito de cada interruptor vai directo ao quadro eléctrico, mas se assim não fosse dava mais trabalho, mas podia-se facilmente adaptar a instalação para este principio.

Os retornos de cada interruptor ligam nas respectivas portas de input do Arduino... Fico logo com as portas Input do Arduino (as definidas no programa) a funcionar com os interruptores convencionais lá de casa (Como tenho uma instalação por telerruptor, tenho todo botões de campainha, mas se fosse ON/OFF dava na mesma). Resumindo primindo um interruptor lá de casa tenho um HIGH na porta de input soltando-o tenho um LOW...

------------- Instalação electrica (interface de potência) --------------------------

Aqui também não há nada de especial... basta usar uma ou duas cartas de relés para o Arduino (Convém serem isoladas opticamente). Cada relé controlará um circuito de potência da moradia.

No meu caso, como tenho tudo por telerruptor tenho duas hipoteses: Ou retiro os telerruptores e os relés actuam diretamente o circuito de potência, ou então ligo-os aos próprios telerruptores... tudo vai depender do espaço que tenho disponível no quadro eléctrico para albergar tudo isto.

------------- Funções do Arduino (Botões ) --------------------------

O programa que estou a desenvolver... ainda muito verde... vai ter inicialmente 4 tipos de funções sendo elas:

  • Botão de Pulse (Tipo campainha)

Este botão coloca a porta de saída em HIGH enquanto tiver pressionado, quando solto coloca-a em LOW, ou então podemos inverter a lógica se nos for útil para alguma coisa.

  • Botão On/Off (Toogle)

Este botão coloca a porta de saída em HIGH enquanto pressionado uma vez, quando pressionado uma segunda vez coloca em LOW.

  • Botão Timmer (Temporizado)

Este botão faz disparar uma rotina que colocará a porta no estado desejado após um determinado tempo definido. Isto é muito útil se quisermos um botão à saída de casa para desligar a casa toda.. clicamos e só passado o tempo que definirmos para aquele botão é que ele manda a baixo os circuitos...

  • Botão Cenário

Este para mim é o melhor..
Queremos ver um filme... tocamos no botão de cenário "Filme" e irá actuar uma série de saidas de modo a conseguirmos o cenário... por exemplo desliga a luz da sala, fecha a cortina (se tivermos cortinas dieléctricas), liga o sistema de som ... etc... Dá para ver a ideia...

------------- Funções do Arduino (Botões Futuros) --------------------------

De futuro irei colocar mais tipos de botões... Para STORES (Que agregarão duas saídas para fazer um inversor de Sobe e Desce), Botão de Dimming (para fazer variar o fluxo luminoso) e mais uns quantos...

------------- Funções do Arduino (Acesso remoto) --------------------------

Aqui, penso que a melhor opção é utilizar o SHIEL Ethernet, ligo-o à minha rede de casa e tenho tudo à mão... crio um interface HTML que dá tanto para Telemóvel como para qualquer computador com acesso à net...

Com um DDNS gratuito até posso aceder de qualquer parte à minha casa. No meu modesto entender acho que esta é a opção mais inteligente.. Comprei um SHIEL que já leva um cartão SD o que vai dar para mais umas brincadeiras.. por exemplo registo de eventos... Posso saber a que horas foram ligados determinados circuitos.. etc...

------------- Funções do Arduino (Expansibilidade do sistema) --------------------------

É só colocar mais uns Arduinos via RS485... e ajustar o código para tal...
(Exemplo: Tinkering with Electronics...: Arduino and RS485 (ENGLISH VERSION))
Literatura útil: http://www.i-micro.com/pdf/articulos/rs-485.pdf

------------- Funções do Arduino (Código) --------------------------

Isto está mesmo verde, só tenho a funcionar as funções Toogle e Pulse... mas é uma questão de mais umas horas de código e fica tudo pronto num instante...

/* *************************************************************** *
 *     Declaração e inicialização de variáveis e constantes        *
 * *************************************************************** */

//definição de um array que identifica as portas de Input e Output
const  int outputPin[]           = {23,25,27,29,31,33,35,37,39,41,43,45,47,49,51};
const  int inputPin[]            = {22,24,26,28,30,32,34,36,38,40,42,44,46,48,50};    

//Definição de variaveis e constantes para controlo de resalto (debounce)
const long debounceValue         = 300;  
       int counter[]             = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 
      long time[]                = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};      
   boolean inputCurrentState[]   = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};  //Controls de input state
   boolean outputPreviousState[] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};  //Controls de output state

//Outras constantes e variaveis
       int inputTotal            = 15;
       int inputKind[]           = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  // 0 = Pulse, 1 = TOOGLE, 2 = TIMMER, 3 = SCENARIO                                                   
       int inputTimmerControl[]  = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
       int inputScenarioControl[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   

/* *************************************************************** *
 *                  Funções de Tipos de Botões                     *
 * *************************************************************** */

//Pulso        (Campainha)
void pulseButton(int id)
{     
  digitalWrite(outputPin[id],digitalRead(inputPin[id]));
  inputCurrentState[id]=!inputCurrentState[id];
}


//Encravamento   (On/Off)
void toogleButton(int id)
{     
   if (millis()-time[id] > debounceValue)
   {
     time[id]=millis();
     digitalWrite(outputPin[id],!outputPreviousState[id]);
     outputPreviousState[id]=!outputPreviousState[id];
   }
}


//Temporizado
void timmerButton(int id)
{
  
}


//Cenário 
void sceneButton(int id)
{
  
}

/* *************************************************************** *
 *                      Arduino Initialization                     *
 * *************************************************************** */                    

void setup()
{
  
  //Inicialização da comunicação série
  Serial.begin(57600);

  //Inicialização das portas de entrada/saida e array de controlo de estado
  for (int id=0; id!=14; id++) 
  {
    pinMode(outputPin[id], OUTPUT);
    digitalWrite(outputPin[id], LOW);
    pinMode(inputPin[id], INPUT);
  }
  
}


/* *************************************************************** *
 *                    Arduino default run loop                     *
 * *************************************************************** */                    
void loop()
{
  
   //Verifica alterações no estado das portas de entrada de modo a atuar
   for (int n=0; n<inputTotal; n++)
   {
     if (digitalRead(inputPin[n]) != inputCurrentState[n])
     {
       switch (inputKind[n])
       {
         case 0:
            pulseButton(n);
         break;
         case 1:
            toogleButton(n);
         break;
         case 2:
            Serial.println("TIMER");
         break;
         case 3:
            Serial.println("SCENARIO");
         break;
         default:
         break;
       }
     }
     else
     {

     }
   }
}

O que acham?.. é viável ou muito utópico?... LOL!

Um pequeno reparo ao teu código... vai dando uma olhada no google por um termo chamado debounce ou vai-te preparando para gastares dinheiro em botões decentes.

Uma solucão (que admito, me agrada, apesar de nunca a ter implementado pessoalmente por falta de oportunidade), é criar uma funcão que lê as entradas das teclas de 30 em 30 ou até de 40 em 40 ms. Isso permite passar à frente de todo esse problema do debounce e ainda tira carga ao processador. É um dois em um.

Quanto ao post, não li completamente nem com muita atencão... mas volto cá para ver. :slight_smile:

Desde o inicio que estou ciente do problema do debounce, é um problema bem conhecido em sistema de comutação digital uma vez que fisicamente o interruptor não abre nem fecha imediatamente quando se pressiona... as palhetas ressaltam por breves milissegundos dando origem a HIGHs e LOWs que depois confundem o sistema, por isso o debounce já fora considerado no meu código... e testado...

A rotina que o controla é a seguinte:

void toogleButton(int id)
{     
   if (millis()-time[id] > debounceValue)
   {
     time[id]=millis();
     digitalWrite(outputPin[id],!outputPreviousState[id]);
     outputPreviousState[id]=!outputPreviousState[id];
   }
}

Tenho um array (um valor para cada porta) que é preenchido com um momento temporal quando se pressiona o botão em modo toogle (o debounce só trás problemas neste tipo de ligação.. um clique liga outro desliga)...

Depois tenho uma constante que chamei de debounce

const long debounceValue         = 300;

O que faço na função de toogle é:

Comparar a diferença entre o tempo actual (tempo em que a função é executada) e o valor de controlo no array. Se a diferença for maior que a constante debounceValue então quer dizer que já passou o tempo de segurança do debounce e assim passa a condição if.. e executa o código próprio para o efeito que não é mais do que:

Registar um novo valor ao array de controlo com o momento em que foi executada a função (para que não se repita)

time[id]=millis()

mudar o estado da porta para a sua negação (inverso)

DigitalWrite(outputPin[id],!outputPreviousState[id]);

e alterar o estado anterior para o actual de modo a que a próxima vez que seja executado faça o inverso.. e vice versa...

outputPreviousState[id]=!outputPreviousState[id];

Já agora...

Qual a estratégia que usei para poupar processamento:

A execução do loop principal é apenas um ciclo que compara o estado da porta de entrada, com o seu valor anterior que é controlado pelo array "inputCurrentState[n]".

if (digitalRead(inputPin[n]) != inputCurrentState[n])

Só depois de detectada uma alteração (que significa que um Input foi alterado), é que ele analisa que tipo de Input é (tipo de botão) e executa a respectiva função.

Resumindo... o Arduino, no seu estado normal está apenas a comparar um conjunto de 15 portas com um conjunto de 15 estados...

void loop()
{
  
   //Verifica alterações no estado das portas de entrada de modo a atuar
   for (int n=0; n<inputTotal; n++)
   {
     if (digitalRead(inputPin[n]) != inputCurrentState[n])
     {
       switch (inputKind[n])
       {
         case 0:
            pulseButton(n);
         break;
         case 1:
            toogleButton(n);
         break;
         case 2:
            Serial.println("TIMER");
         break;
         case 3:
            Serial.println("SCENARIO");
         break;
         default:
         break;
       }
     }
     else
     {

     }
   }
}

Não disse por mal.

Como tinha referido, olhei para o post à pressa e não dei pelo debounce lá no meio. Desculpa.

Se queres poupar processamento, podes evitar usar o digitalRead() e em vez de usares um vector de chars, usares um unsigned char para as entradas de cada porto. Com um pouco de sorte e trabalho, consegues agrupar todas as entradas num porto só e podes comparar bytes em vez de arrays. :wink:
Infelizmente, isto tira toda a "boniteza" do Arduino e tens de programar num nível abaixo e ter certas precaucões que o Arduino tem por ti (por defeito), mas torna o código mais rápido (se programado correctamente) e provavelmente mais pequeno.

Não entendi que tivesses dito por mal, até pelo contrário, compreendi... isto é mesmo assim é um forum para debater ideias, receber sugestões, etc.. Gosto que critiquem o meu trabalho, só assim se pode melhorar...

Vou ter em consideração a tua ideia, fazer um pouco de investigação e ainda, se calhar, vou dar a volta ao meu código para o melhorar em termos de processamento.

Um abraço...

Isto seria possivel fazer? ficaria assim? qual as dimensões?

isto é o que procuro fazer (relay-based XOR) o de baixo

Seria útil se explicasses a finalidade deste circuito... o que apresentas não me parece ser nada de especial, mas parece-me existirem formas mais fáceis de o fazer, a não ser que nas circunstâncias em que é instalado só possa ser feito desta forma.

Podes ser mais especifico SFF?

...(Pois... depois de eu escrever esta mensagem acrescentaste o link na tua... vou ver e já te respondo)

Basicamente será para controlar as luzes, usando o interruptor e um relay, sem ficar dependente de um deles...
ou seja se eu ligar o interruptor, posso desligar a luz pelo rele e vice versa