Conheça meus projetos
DIY - Faça você mesmo
Automatize a iluminação do seu aquário e não assuste seus peixes com transições bruscas.
1443 Acessos
-
16 Curtidas - Dificuldade postado 21 de Abril de 2017 - atualizado 21 de Abril de 2017
Autor: Alex Pisciotta
Montei um aquário! Muito legal! Alimentar os peixes é algo prazeroso, mas nem sempre você está disponível exatamente na hora de ligar ou desligar a iluminação do seu aquário, certo?. Que tal tornar automática a tarefa de controlar a iluminação?
Outro ponto importante, e todos os que possuem aquário já devem ter observado: como os peixes se assustam ao ligar a iluminação de forma abrupta.
É fato! Os peixes sempre se assustam! Essas foram as motivações para o início deste projeto simples mas útil ao aquariofilista. Vou mostrar aqui algo simples, que cumpre o propósito, um protótipo, e depois vou aperfeiçoar e, quem sabe, transformar em um produto disponível em minha loja.
Fiz este projeto para Ligar a Luminária automaticamente às 6:15 e desligar às 20:00, utilizando PWM para suavizar as transições. Também é possível ligar ou desligar a iluminação por um botão de pressão, para que você possa fazer a manutenção do seu aquário a qualquer horário.
Já implementei também uma funcionalidade que permite o comando via porta serial. Dessa forma você pode ligar ou desligar as luzes do aquário utilizando o Bluetooth do celular (o aplicativo Android está em desenvolvimento).
Assista ao vídeo demonstrando o funcionamento da luminária quando comandada pelo botão.
Para o protótipo utilizo um Arduino/Genuino UNO, um RTC ("Real Time Clock" ou Relógio de Tempo Real) DS1302 com bateria, um transistor BC337, um botão "push-bottom" e dois resistores, como pode ser observado na foto e no esquema abaixo.
O CI DS1302 da Maxim Integrated controla segundos, minutos, horas (podendo trabalhar com o padrão de 24h ou 12 horas AM e PM), ano, mês, dia do mês e dia da semana. Veja mais sobre esse componente clicando aqui, aonde preparei um artigo específico sobre ele.
O microcontrolador monitora o status do botão, a porta de comunicação serial e o horário do relógio de tempo real, e envia o comando para ligar ou desligar as lâmpadas de acordo com as entradas. Nesta versão do software, o horário em que a iluminação deve estar acionada é entre 6:15 da manhã e 20h. Nos demais horários a iluminação fica desativada. A ação de ligar ou desligar a iluminação é realizada por uma porta PWM do microcontrolador ATMEGA328P, fazendo uma transição suave da iluminação para não estressar os peixes.
A luminária em si foi construída com 3 tiras de Fita LED Branco (dessas fitas de LED vendidas em rolo de 5m) fixadas em uma superfície retangular (ou quase) de PVC, e soldando as fiações elétricas para a alimentação. No meu caso, esse conjunto solicita uma corrente de apenas 220mA, facilmente suportada pelo transistor BC337. Esse transistor compatibiliza a tensão de alimentação dos LEDs (12V) aos 5V de saída do microcontrolador. A placa de PVC possui um recuo em um dos lados para não interferir no equipamento de filtragem e aquecimento.

O programa desenvolvido é mostrado a seguir, e utiliza uma biblioteca muito boa chamada VirtuabotixRTC, que permite a leitura dos valores do relógio DS1302 da Maxin, pois esse circuito integrado utiliza um protocolo de comunicação a 3 fios muito peculiar, que não é I2C, não é SPI, não é UART... Por isso precisa de um tratamento específico, feita por essa biblioteca.
// Programa : LuminariaAquario_Rev1
// 15/Abr/2017
// Escrito por Alex Pisciotta utilizando biblioteca VirtuabotixRTC
#include
// myRTC(clock, data, rst)
virtuabotixRTC myRTC(2, 4, 7);
int branco_aceso = 0;
int botao = 0;
const int ledpin_branco = 3;
const int botaopin = 8;
void setup()
{
Serial.begin(9600);
// Configura Data e Hora iniciais
// (segundos, minutos, hora, dia da semana, dia do mes, mes, ano)
myRTC.setDS1302Time(15, 15, 21, 2, 17, 04, 2017);
// Depois de carregado a primeira vez, comente a linha acima
// e regrave o programa no seu Arduino, caso contrário sempre
// que ele for reiniciado, esta data acima será resetada.
pinMode(botaopin, INPUT);
pinMode(ledpin_branco, OUTPUT);
myRTC.updateTime();
if((myRTC.hours>=20)||(myRTC.hours<6)){//Verifica o horário ao ligar para
analogWrite(ledpin_branco, 0);//Inicia Desligado se for de entre 20h e 6h
}else{
ligar_branco(); //Ou ligar se for durante o dia
}
}
void loop()
{
//Verifica Botão
botao = digitalRead(botaopin);
if(botao == HIGH){
if(branco_aceso==1){
desligar_branco();
}else{
ligar_branco();
}
};
// Lê a data e hora no DS1302
myRTC.updateTime();
//Se houver algo na serial, responde com data e hora
if(Serial.available()>0){
escreve_data();
if(Serial.read()=='l'){
ligar_branco();
}else{
desligar_branco();
}
}
Serial.flush();
//Se hora = 6:15 então liga lâmpadas
if(myRTC.hours==6 && myRTC.minutes==15 && branco_aceso==0){
ligar_branco();
}
//Se hora = 20:00 então desliga lâmpadas
if(myRTC.hours==20 && myRTC.minutes==0 && branco_aceso==1){
desligar_branco();
}
delay(300);
}
void ligar_branco(){
branco_aceso = 1;
for( int i=0; i<=255; i++){
//Incrementa Saída 3
analogWrite(ledpin_branco, i);
delay(100);
}
Serial.println("Ligado");
}
void desligar_branco(){
branco_aceso = 0;
for( int i=255; i>=0; i--){
//Decrementa Saída 3
analogWrite(ledpin_branco, i);
delay(100);
}
Serial.println("Desligado");
}
void escreve_data(){
dia_da_semana(myRTC.dayofweek);// Chama a rotina que imprime o dia da semana
Serial.print(", ");
Serial.print(myRTC.dayofmonth);// Dia do mês
Serial.print("/");
Serial.print(myRTC.month);// Mês
Serial.print("/");
Serial.print(myRTC.year);// Ano
Serial.print(" ");
if (myRTC.hours < 10)
{
Serial.print("0"); // Adiciona um 0 caso o valor da hora seja <10
}
Serial.print(myRTC.hours);
Serial.print(":");
if (myRTC.minutes < 10)
{
Serial.print("0"); // Adiciona um 0 caso o valor dos minutos seja <10
}
Serial.print(myRTC.minutes);
Serial.print(":");
if (myRTC.seconds < 10)
{
Serial.print("0");// Adiciona um 0 caso o valor dos segundos seja <10
}
Serial.println(myRTC.seconds);
delay( 1000);
}
void dia_da_semana(int dia)
{
switch (dia)
{
case 1:
Serial.print("Domingo");
break;
case 2:
Serial.print("Segunda-feira");
break;
case 3:
Serial.print("Terca-feira");
break;
case 4:
Serial.print("Quarta-feira");
break;
case 5:
Serial.print("Quinta-feira");
break;
case 6:
Serial.print("Sexta-feira");
break;
case 7:
Serial.print("Sabado");
break;
}
}
Protótipo Validado, funcionando no meu aquário, agora devo partir para o aperfeiçoamento.
Fique de olho. Em breve mais atualizações...