Automatize a ilumina????o do seu aqu??rio e n??o assuste seus peixes com transi????es bruscas.
postado 21 de Abril de 2017 - atualizado 11 de Maio de 2018
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 t??o 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, e depois vou aperfei??oar para transformar em um produto dispon??vel em minha loja. Em breve!
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 <virtuabotixRTC.h>
// 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...