Foto Pisciotta

PISCIOTTA

Soluções Inteligentes



Projetos


Conheça meus projetos

DIY - Faça você mesmo




Luminária Automática para Aquário


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.

Oportunidades de Melhoria

  • Desenvolver aplicativo Android para controle via Bluetooth
  • Implementar controle de LEDs de outras cores: Azul, Verde e Vermelho
  • Implementar controle de altas temperaturas através de sensor e mini-ventilador
  • Melhorar aplicativo para permitir configuração de diferentes horários de funcionamento utilizando a memória do chip DS1302
  • Projetar e confeccionar placa de circuito impresso
  • Disponibilizar para venda

Fique de olho. Em breve mais atualizações...