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.
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...
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!