Olá Gabriel.
Ano passado eu estava projetando o controlador para o meu aquário, com as seguintes funcionalidades:
- Controle de temperatura (leitura da temperatura, liga/desliga coolers, liga/desliga aquecedor);
- Controle de PH (com aviso de PH fora do valor estipulado);
- Controle de iluminação Luz do Dia com led;
- Controle de iluminação Luz Noturna (Lua) com led;
O projeto não saiu do papel, mas o programa está quase completo.
Para a
luz do dia fiz o seguinte: liga e desliga na hora que eu configurar, mas para não dar um "choque" de luz/escuro nos peixes eu fiz um fade para ir acendendo e desligando aos poucos. O tempo do fade também é configurável.
Por exemplo: Se estiver programado para ligar as 9:00 da manhã e o fade estiver em 0:30 (meia hora), significa que vai ligar as 9:00 bem fraquinho e ir aumentando até que as 09:30 esteja em força total. Quanto menor o fade mais rápido ocorre esta evolução de brilho.
Para a
luz noturna pensei num led azul que iria estar mais brilhante ou menos brilhante de acordo com o dia da semana dentro do mês. Obviamente que não seria 100% igual ao ciclo lunar, mas iria trazer uma ideia bem aproximada. A ideia é que quando fosse lua cheia a luz ficasse o mais forte possível e quando fosse lua nova ficasse o mais fraco possível.
Inicialmente eu projetei pensando numa tela de LCD e alguns botões para configurar, mas depois vi que há umas telas touch screen que podem ser utilizadas, o que facilita muito a montagem do circuito.
Abaixo segue o código-fonte que controla a iluminação (não contém o o fonte para configurar os parâmetros).
Variáveis globais[font=monospace]#define pinoLuz 1 // Pino de saida (liga/desliga luz)
#define pinoAquecedor 13 // Pino de saida (liga/desliga aquecedor)
#define pinoResfriador 14 // Pino de saida (liga/desligar resfriador)
#define pinoLua 15 // Pino de saida (liga/desliga luz)
// Controle de iluminacao
int horaIni = 10; // Padrao inicial 08:00
int minutoIni = 0;
int horaFim = 22; // Padrao inicial 22:00
int minutoFim = 0;
int horaFade = 1; // Padrao inicial 01:00
int minutoFade = 0;
boolean luzLigada = 0; // Controla se a luz esta ligada
int tempoFade = 0; // Tempo do fade (transformada em minutos)
int brilho = 0; // Intensidade do brilho (de 0 a 255)
int brilhoLua = 0; // Intensidade do brilho da lua (de 0 a 255)[/font]
Dentro do bloco SETUP [font=monospace]// Inicializacao dos pinos
pinMode(pinoLuz, OUTPUT);
pinMode(pinoLua, OUTPUT);
// Funcao que retorna o ultimo dia do mes. Utilizada para calcular o "brilho da Lua"
int lastDay() {
int ultimo_dia = 31;
time_t T;
T = now();
int ANO = year();
int MES = month();
int DIA = day();
if (((ANO % 4) == 0) && (MES == 2)) {
ultimo_dia = 29;
} else if (MES == 2) {
ultimo_dia = 28;
}
else if ((MES == 4) || (MES == 6) || (MES == 9) || (MES == 11)) {
ultimo_dia = 30;
}
else {
ultimo_dia = 31;
}
return ultimo_dia;
}[/font]
Dentro do bloco LOOP [font=monospace]if ((hour() >= horaIni) && (minute() >= minutoIni)) {
luzLigada = 1; // Ligar Luz
lcd.setCursor(0, 3);
lcd.print("DIA (");
lcd.print(horaIni);
lcd.print(":");
lcd.print(minutoIni);
lcd.print(" - ");
lcd.print(horaFim);
lcd.print(":");
lcd.print(minutoFim);
lcd.print(")");
}
if ((hour() >= horaFim) && (minute() >= minutoFim)) {
luzLigada = 0; // Desligar Luz
pinoLuz == LOW;
brilho = 0;
lcd.setCursor(0, 4);
lcd.print("NOITE");
}
if (luzLigada) {
tempoFade = ((horaFade * 60) + minutoFade);
if ((((horaIni * 60) + minutoIni) + tempoFade) > ((hour() * 60) + minute() )) { // Fade aumentando
brilho = trunc(((((hour() * 60) + minute()) - ((horaIni * 60) + minutoIni)) / tempoFade) * 255);
}
else if (((((horaFim * 60) + minutoFim) - tempoFade) < ((hour() * 60) + minute() ))) { // Fade diminuindo
brilho = trunc(((((horaFim * 60) + minutoFim) - ((hour() * 60) + minute())) / tempoFade) * 255);
}
else { // Sem fade. Luz total
brilho = 255;
}
analogWrite(pinoLuz, brilho);
}
// Brilho da Lua
brilhoLua = trunc((day()/lastDay()) * 255);
if (brilhoLua > 0) {
pinoLua == HIGH;
analogWrite(pinoLua, brilho);
}
else {
pinoLua == LOW;
}[/font]
Espero que te ajude.
Se tiver alguma dúvida quanto ao código ou a minha ideia é só avisar.
Pessoal, o código-fonte é Open Source!