Logo Pisciotta

PISCIOTTA

Soluções Inteligentes

PROJETOS

Listar
Alguns dos projetos que eu desenvolvi e prototipei.

Aproveite, aprenda, relembre, curta, divulgue.

Controlador para Lumin??ria de Aqu??rio


Automatize a ilumina????o do seu aqu??rio e n??o assuste seus peixes com transi????es bruscas.

1667 Views - 33 Curtidas - Dificuldade

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.

Pr??ximos Passos

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