Open top menu
sábado, junho 01, 2013

No post de hoje vou apresentar a montagem da primeira parte de um hardware para automação e monitoramento de aquários, inicialmente será monitorado alguns parametros como temperatura e horários de controle da luminosidade, mas futuramente pretendo ler outros parametros e monitoração remota.

Veja a nova versão do Aquadroid 2.0 publicado em http://www.automacaolivre.com.br/2015/03/aquadroid-20-automacao-de-aquarios-com.html.






Funcionalidades
  • LCD para monitoramento local.
  • Teclado para acesso as funcionalidades.
  • Leitura de temperatura.
  • Relógio.
  • Timer pré-programado para iluminação.
  • Acionamento local de saídas (bomba, termostato, iluminação e saída auxiliar).
  • Acionamento local para iluminação RGB.
  • Preparação de caixa e conexões para evolução do projeto.

Funcionalidades previstas
  • Leitura de PH.
  • Monitoramento remoto.
  • Integração ao site www.aquadroid.com.br para registro de leitura de parametros diários.
  • Acesso as funcionalidades remotamente pelo site www.aquadroid.com.br.
  • Envio de SMS/Email com alertas de parametros pré-determinados.
  • Alimentador pré-programado.
  • Monitoramento por camera.


Lista de componentes primeira parte

1 - Arduino Mega.
1 - Aquadroid Shield (detalhes montagem abaixo).
1 - LCD 20x4.
1 - RTC Arduino Shield (Real Time Clock).
1 - KeyPad numérico 12 teclasx7 pinos.
1 - Buzzer.
1 - Sensor temperatura ds18b20.
2 - Metros de fita de led RGB.
1 - Resistor 4K7 1/8w.
1 - Fonte 12V x 3A industrial.

1 - Caixa plástica para o projeto.
4 - Tomadas fêmea para saidas (bomba, termostado, saida 1 e 2).
1 - Tomada macho para alimentação do sistema.
4 - Pares de conectores macho / fêmea DIM 5 pinos.
1 - Par de conectores macho / fêmea NBC.
1 - Chave liga/desliga.
1 - Porta fusível com fusível para painel.
1 - Rabicho para alimentação.

Parafusos e cabos para montagem do projeto.


Montagem do Aquadroid Shield




Funcionalidades do shield:
  • Regulador de tensão 9V.
  • Regulador de tensão 5V.
  • 4 Relé Shield.
  • Driver RGB.

Lista de Componentes:

4 - Relés 12V 15A 1 polo 2 posições.
4 - Transistores BC548 ou equivalente
3 - Transistores TIP120
1 - Regulador de tensão LM7809.
1 - Regulador de tensão LM7805.
4 - Leds 5mm.
4 - Diodos 1N4004.
8 - Resistores 1K 1/8W  (marrom preto vermelho).
3 - Resistores 220R 1/8W  (vermelho vermelho marrom).
7 - Bornes de encaixe TC 3 Vias.
4 - Bornes de encaixe TC 2 Vias.
1- Placa de fenolite cobreada face simples 10cm x 15cm.

Confecção da placa de circuito impresso

Layout impresso em papel sulfite na impressora laser, será usado o processo de transferência témica do tonner para a placa de circuito impresso.


Verificando alinhamento dos componentes com layout da placa.


Para facilitar a remoção do papel após a transferência, eu coloco uns 15 minutos dentro da agua.


Papel removido, agora é colocar no percloreto de ferro para corrosão.


Placa corroída, furando a placa.


Placa pronta para início da montagem.


Começo com os jumpers, resistores e diodos, acho mais fácil para alinhar virando a placa para soldagem.


Finalizando a montagem.


Realizando um teste após a montagem



Layout da placa


Download do arquivo aquadroid shield no formato ExpressPCB para confecção da placa no processo de transferência térmica.


Diagrama de conexões




Espelhos para caixa


Frente


Fundo



Versão para impressão

Arquivo para download ImpressaoCaixaAquadroid.jpg.


Fotos da montagem

Layout para corte da frente e fundo da caixa.


Fixando o layout na placa frontal da caixa para corte.


Cortando com a dremel.


Janelas para o LCD e Keypad cortados.


Frente e fundo cortados e montados, com espelhos impressos em papel autoadesivo com qualidade fotográfica.


Detalhe da fixação dos componentes.


Componentes para montagem.


Fonte, arduino e controladora alinhados dentro da caixa.


Perspectiva da montagem.


LCD conectado no flat cabe.


LCD conectando no arduino.


Keypad conectado no arduino


Buzzer com os terminais soldados.


RTC com os teminais soldados.




Conexões realizadas.


Efetuando primeiros testes.


Testes realizados com sucesso.


Placas, fonte e painel frontal conectados.


Iniciando a montagem do painel traseiro.


Ligações do painel traseiro.


Conector de alimentação para fonte chaveada.


Ligações para os conectores de luz RGB e sensor de temperatura.


Ligações do painel traseiro finalizadas.


Vista superior


Vista Frontal


Montando conector do sensor de temperatura.


Conectando resistor 4K7 entre pinos V+ (vermelho) e sinal(amarelo) do sensor de temperatura.


 Resistor com termoretrátil.

Resistor soldado entre o V+ e sinal do sensor de temperatura.





Código fonte
/*
Controlado Aquadroid
Sergio de Miranda e Castro Mokshin
29/05/2013

*/

//Bibliotecas utilizadas
#include
#include
#include
#include
#include //Biblioteca adicionada manualmente na pasta arduino-1.0.4\libraries
#include
#include
#include


#define BUFSIZ 100

//Constantes de Entrada
#define PIN_BLUE 7
#define PIN_RED 8
#define PIN_GREEN 9

#define PIN_SAIDA_TERMO 31
#define PIN_SAIDA_BOMBA 33
#define PIN_SAIDA_LUZ 35
#define PIN_SAIDA_AUX1 37

#define PIN_SAIDA_BUZZ 41

#define PIN_ENTRADA_NIVEL_B 39
#define PIN_ENTRADA_NIVEL_A 41

#define PIN_ENTRADA_TEMP 6


//Constantes para configuração do RTC
#define HORAS 2
#define MINUTOS 1
#define SEGUNDOS 0
#define DIASEMANA 3
#define DIAMES 4
#define MES 5
#define ANO 6

OneWire ds(PIN_ENTRADA_TEMP);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


//KeyPad
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'}
};

//123 colunas
//4567 linhas


byte colPins[COLS] = {30, 32, 34};
byte rowPins[ROWS] = {22, 24, 26, 28};


Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



char clientline[BUFSIZ];
char comando[BUFSIZ];
char comando_teclado[BUFSIZ];
int index;
int tamanhocomando;

boolean inicioComando1;
boolean inicioComando2;
boolean inicioFuncaoTeclado;
boolean inicioComandoTeclado;
boolean fimComando;
boolean recebendoComandoWeb;
int indiceentrada;

int HoraConfirmada;
int QtdHoraConfirmada;

int Segundo;

boolean modoAutomatico;

void setup() {

Wire.begin(); // join i2c bus
Serial.begin(9600); //

// ds1307setup();

wdt_enable(WDTO_8S);


HoraConfirmada = 0;
QtdHoraConfirmada = 0;

pinMode(PIN_ENTRADA_NIVEL_B, INPUT);
pinMode(PIN_ENTRADA_NIVEL_A, INPUT);
pinMode(PIN_SAIDA_BOMBA, OUTPUT);
pinMode(PIN_SAIDA_TERMO, OUTPUT);
pinMode(PIN_SAIDA_AUX1, OUTPUT);
pinMode(PIN_SAIDA_LUZ, OUTPUT);
pinMode(PIN_SAIDA_BUZZ, OUTPUT);
digitalWrite(PIN_SAIDA_BOMBA, LOW);
digitalWrite(PIN_SAIDA_TERMO, LOW);
digitalWrite(PIN_SAIDA_AUX1, LOW);
digitalWrite(PIN_SAIDA_LUZ, LOW);
digitalWrite(PIN_SAIDA_BUZZ, LOW);

inicioComando1 = false;
inicioFuncaoTeclado = false;
inicioComandoTeclado = false;
inicioComando2 = false;
fimComando = false;
recebendoComandoWeb = false;
indiceentrada = 0;

modoAutomatico = true;

Segundo = 0;

delay(500);
lcd.begin(20, 4);
lcd.print("Aquadroid ");
lcd.setCursor(0, 1);
lcd.print("Iniciando Sistema ");
lcd.setCursor(0, 2);
lcd.print(" ");
delay(2000);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" ");
BuzzerConfirma();
}


void loop()
{
wdt_reset();
AguardaComandosTeclado();
ModoAutomatico();
if(Segundo == 0 )
{
LeituraTemperatura();
}
PrintData();
}


void LeituraTemperatura(){

byte i;
byte present = 0;
byte data[12];
byte addr[8];
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
if ( !ds.search(addr)) {
ds.reset_search();
}
ds.reset();
ds.select(addr);

ds.write(0x44,1);
delay(800);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}

LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000;
if (SignBit)
{
TReading = (TReading ^ 0xffff) + 1;
}
Tc_100 = (6 * TReading) + TReading / 4;

Whole = Tc_100 / 100;
Fract = Tc_100 % 100;

if (SignBit)
{
Serial.print("-");
}
Serial.print(Whole);
Serial.print(".");
if (Fract < 10)
{
Serial.print("0");
}
Serial.print(Fract);

Serial.print("\n");

lcd.setCursor(15, 0);
lcd.print(Whole);
lcd.print(".");
lcd.print(Fract);


}

int ConfirmaTrocaHora(int hora)
{

if(HoraConfirmada == hora)
{
QtdHoraConfirmada = 0;
return hora;
}
else
{
QtdHoraConfirmada++;
}

if(QtdHoraConfirmada>=4)
{
HoraConfirmada = hora;
}

return HoraConfirmada;
}

void ModoAutomatico(){

lcd.setCursor(13, 0);
if (modoAutomatico == true){

digitalWrite(PIN_SAIDA_BOMBA, HIGH);
digitalWrite(PIN_SAIDA_TERMO, HIGH);

lcd.print("A");
int rtc[7];
ds1307get(rtc,true);

int hora = ConfirmaTrocaHora(rtc[HORAS]);

if (hora >= 7 && hora < 19){
digitalWrite(PIN_SAIDA_LUZ, HIGH);
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 0);
}
else if (hora >= 19 && hora < 20){
digitalWrite(PIN_SAIDA_LUZ, LOW);
analogWrite(PIN_RED, 255);
analogWrite(PIN_GREEN, 255);
analogWrite(PIN_BLUE, 255);
}
else if (hora >= 20 && hora < 21){
digitalWrite(PIN_SAIDA_LUZ, LOW);
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 255);
}
else if (hora >= 21 && hora < 22){
digitalWrite(PIN_SAIDA_LUZ, LOW);
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 50);
}
else if (hora >= 22){
digitalWrite(PIN_SAIDA_LUZ, LOW);
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 0);
}
}
else{
lcd.print("M");
}
}

void AguardaComandosTeclado()
{
char key = keypad.getKey();
if (key != NO_KEY){
BuzzerClica();
lcd.setCursor(0, 1);
lcd.print("Selecione uma funcao");
lcd.setCursor(0, 2);

Serial.print("KEY: ");
Serial.println(key);

if( inicioComandoTeclado == true )
{
Serial.println("Executado comando");

if(key == '#')
{
BuzzerCancela();
ComandoCancelado();
Serial.println("Comando Cancelado");
}
else if (key == '*')
{
index++;
clientline[index] = 'F';
// clientline[index] = 0;
Serial.println(clientline);
DisparaComando();
ComandoExecutado();
Serial.println("Comando Executado");
Serial.println(clientline);
BuzzerConfirma();
}
else
{
index++;
clientline[index] = key;
Serial.print("Armazenando buffer: ");
Serial.println(key);
Serial.println(clientline);

}

}
else
{
inicioComandoTeclado = true;
index = 0;
tamanhocomando = 0;
memset( &clientline, 0, BUFSIZ ); //clear inString memory

Serial.println("Executado menu");
inicioFuncaoTeclado = true;
switch (key) {
case '1':
clientline[index] = 'I';
index++;
clientline[index] = 'L';
index++;
clientline[index] = 'R';
lcd.print("Luz Vermelha 0..250 ");
break;
case '2':
clientline[index] = 'I';
index++;
clientline[index] = 'L';
index++;
clientline[index] = 'G';
lcd.print("Luz Verde 0..250 ");
break;
case '3':
clientline[index] = 'I';
index++;
clientline[index] = 'L';
index++;
clientline[index] = 'B';
lcd.print("Luz Azul 0..250 ");
break;
case '4':
clientline[index] = 'I';
index++;
clientline[index] = 'S';
index++;
clientline[index] = '4';
lcd.print("Bomba 1:ON = 0:OFF ");
break;
case '5':
clientline[index] = 'I';
index++;
clientline[index] = 'S';
index++;
clientline[index] = '3';
lcd.print("Termo 1:ON = 0:OFF ");
break;
case '6':
clientline[index] = 'I';
index++;
clientline[index] = 'S';
index++;
clientline[index] = '2';
lcd.print("LUZ 1:ON = 0:OFF ");
break;
case '7':
clientline[index] = 'I';
index++;
clientline[index] = 'S';
index++;
clientline[index] = '1';
lcd.print("Saida 1 1:ON = 0:OFF ");
break;
case '8':
clientline[index] = 'I';
index++;
clientline[index] = 'M';
index++;
clientline[index] = 'A';
lcd.print("Auto 1:ON = 0:OFF ");
Serial3.print("C\r");
break;
case '9':
lcd.print("Nao programado ");
break;
case '#':
ComandoCancelado();
break;
case '*':
ComandoCancelado();
break;
}
}
}
}

void ComandoCancelado()
{
lcd.setCursor(0, 1);
lcd.print("Comando cancelado ");

lcd.setCursor(0, 2);
lcd.print(" ");

lcd.setCursor(0, 2);
lcd.print(" ");
inicioFuncaoTeclado = false;
inicioComandoTeclado = false;

}


void ComandoExecutado()
{
lcd.setCursor(0, 1);
lcd.print("Comando executado ");

lcd.setCursor(0, 2);
lcd.print(" ");

lcd.setCursor(0, 2);
lcd.print(" ");
inicioFuncaoTeclado = false;
inicioComandoTeclado = false;

}

void DisparaComando()
{
boolean iniciocomando = false;
for (int i = 0; i









Observações:




  1. Manter o arquivo ds1307.ino na pasta com o arquivo principal do programa, ele contém uma biblioteca com funções do RTC. Download do código fonte.

  2. Procedimento para ajuste do horário: Deve ser descomentado do método setup() a chamada //ds1307setup(), definir o horário nas variáveis do método void ds1307setup(void) no arquivo ds1307.ino, compilar, gravar no Arduino, comentar, compilar e gravar novamento no Arduino.

  3. Na minha versão utilizada da IDE do arduino não veio com a library Keypad, a mesma foi adicionada manualmente em libraries dentro da pasta da IDE do arduino (reiniciar IDE). Download Libraries.

  4. É necessário um delay de pelo menos 750ms para envio e retorno pela conexão wire do sensor de temperatura, nessa versão a temperatura é atualizada a cada 60 segundos, exatamente no segundo 0.

  5. Nesse projeto tive alguns problemas com o LCD, após alguns minutos ele simplesmente travava, mostrando uns caracteres estranhos, errados. Pesquisando na internet encontrei uma correção na librarie \libraries\liquidcrystal arquivo LiquidCrystal.h: deve alterar uint8_t _rw_pin para int8_t _rw_pin.

  6. Está funcionando, mas falta refatorar alguns trechos do código (vários), fica para depois.....


Funcionamento do menu de opções









Sequência de comandos para acionamento do menu de opções:



Acender luz vermelha

1 -> [0..250] para intensidade da luz -> # para confirmar o comando.



Acender luz verde

2 -> [0..250] para intensidade da luz -> # para confirmar o comando.




Acender luz azul

3 -> [0..250] para intensidade da luz -> # para confirmar o comando.




Acionar bomba

4 -> [0 Desli ou 1 Lig] -> # para confirmar o comando.




Acionar termostato

5 -> [0 Desli ou 1 Lig] -> # para confirmar o comando.




Acionar luz fluorescente (saida auxiliar 2)

6 -> [0 Desli ou 1 Lig] -> # para confirmar o comando.




Acionar saida auxiliar 1

7 -> [0 Desli ou 1 Lig] -> # para confirmar o comando.




Acionar modo automático / manual

8 -> [0 Manual ou 1 Automatico] -> # para confirmar o comando.



9-> não usado.



* -> cancela o comando.



#-> confirma o comando.



Mudar para o modo manual antes de usar as funções de 1 a 6, o modo automático trava o funcionamento das saídas de acordo com a programação do método void ModoAutomatico().



Vídeo de testes em bancada do Aquadroid 2.0




Tagged
Different Themes
Written by Lovely

Aenean quis feugiat elit. Quisque ultricies sollicitudin ante ut venenatis. Nulla dapibus placerat faucibus. Aenean quis leo non neque ultrices scelerisque. Nullam nec vulputate velit. Etiam fermentum turpis at magna tristique interdum.

19 comentários:

  1. Sérgio, parabéns pela iniciativa de compartilhar esse conhecimento. O projeto e o objetivo são muito bons.

    ResponderExcluir
    Respostas
    1. Obrigado Clézio, o projeto não está finalizado, mas tem ajudado muito no me aquário com o monitoramento e temporizador da iluminação.

      Excluir
  2. Sergio,

    Parabens, ficou muito bom.
    Eu tb tava com uma ideia de fazer uma intervenção com Arduino no meu aquario (q eu to terminando de montar). Pensei em algo bem mais simples do q isso. Sou programador, então a parte do código fonte é a parte mais fácil pra mim, o meu problema é com a eletronica. Vou tentar me inspirar nesse teu projeto pra fazer o meu. Vou tentar fazer mais simples, com protoboard mesmo. Pensei em:
    1. Medir temperatura
    2. medir PH, Amonia, nível da agua, e oq der mais pra medir
    3. LCD pra mostrar isso tudo
    4. fazer uma integração com Android, como os lembretes de TPA por exemplo, e alguns alertas

    Seilá, alguma coisa assim. Se eu tiver alguma dúvida técnica, posso postar aqui?

    abração, e parabens

    ResponderExcluir
  3. Sérgio,

    Sabe onde posso encontrar uma caixa dessa para montar uma para meu aquário?

    ResponderExcluir
  4. Sergio muito bom, esse projeto estava a procura de um assim. No meu caso seria para uso em um terrário com plantas. Gostaria de utilizar para controle da temperatura/umidade, luzes e acionamento de nebulização. Você teria alguma ideia que pudesse me ajudar? Obrigado

    ResponderExcluir
  5. Sergio, parabéns pelo projeto, muito bom.
    Estou montando um aquário e tenho um Arduino Uno, gostaria de fazer o controle de temperatura, PH e ligar e desligar a luminária em determinado horário.

    Quais os componentes básicos que você indica?

    ResponderExcluir
    Respostas
    1. Obrigado Thiago,
      Temperatura e timer de luminosidade não terá problemas, mas PH é um pouco mais complicado, estou realizando uns testes com um sensor que importei, mas estou tendo uns problemas de calibração. Voce pode começar com um Arduino Uno, mas ele é limitado qto as IOs, dessa forma, inicialmente poderia montar um projeto com UNO, LCD, TEMP e RELE Shield para iluminação no modo automático, não seria possível colocar um teclado. Voce precisa adequar o programa acima com essas funcionalidades no UNO.

      Excluir
  6. boa tarde qual modelo do arduino indica adquiri pois pretendendo adicionar sonda de ph orp e temp

    ResponderExcluir
    Respostas
    1. Francisco, Boa Tarde!
      O ideial é adquirir um Arduino Mega, como ele tem mais IOs, você pode controlar e monitorar mais parâmetros.

      Excluir
  7. Boa tarde, estou tentando criar um controlador de aquário utilizando o Arduíno, porem tive um problema para controlar a iluminação.
    O problema é o seguinte, quando simulo o acender e apagar sem a iluminação conectada consigo deixar rodando sem problemas, mas quando conecto a iluminação parece que ao acender ou apagar algum tipo de ruido faz com que o Arduíno trave.
    Utilizo um modulo rele para o acionamento e a iluminação é de lampadas T8.
    Você teve algum problema parecido? Saberia dizer como solucionar esse problema?
    Obrigado.

    ResponderExcluir
    Respostas
    1. Maxwell, Boa Noite!

      Eu uso lâmpadas T8 em 2 aquários e nunca tive problemas.

      É muito difícil, mas é possível você ter problemas de interferência quando a fiação da lâmpada / reator fica próxima da alimentação / IOs do arduíno. É o caso? Geralmente está mais para ser um problema na fiação do seu circuito. Nos seus testes os cabos estão bem afastados e não são muito longos? Tente usar um cabo com malha para evitar a interferência.

      Ao invés de ligar a T8, tente ligar uma lâmpada incandescente e veja se o mesmo problema ocorre.

      Excluir
    2. Teria como me passar um email seu? Ai mando uma foto do sistema para você ter uma idéia. Acredito que possa ser esse tipo de interferencia sim.

      Excluir
  8. Parabéns pelo projeto, vou automatizar meu aquário e estou pensando em reproduzir seu projeto. Você já colocou o medidor de ph?

    ResponderExcluir
    Respostas
    1. Vinicius,
      Eu comprei o sensor de PH da sparkfun, calibrei, mais tive alguns problemas de leitura no aquário, acabei focando em outras projetos e deixei um pouco de lado, mas pretendo brevemente resolver esse problema.

      Excluir
  9. ótimo projeto, muito bem explicado, realmente atento aos detalhes está de parabéns, irei implementá-lo para o aquário marinho do meu irmão. No entanto, gostaria de saber se consigo faze-lo com um arduino uno ou duemilenove, você acha possível?

    Parabéns e continue neste caminho, todos agradecem!

    ResponderExcluir
  10. Bom dia Sérgio!

    Gostei muito do seu post. Desde criança sempre gostei de eletrônica, fazia coleção das revistas saber eletrônica e be-a-bá da eletrônica. Há algum tempo comecei com o arduino e já montei algumas coisinhas muito básicas. Importei todos os meus componentes no dx.com, demorou um pouco, mas chegaram... Agora quero investir num projeto também de automação de aquário e quem sabe outras coisas mais. Tenho duas filhas pequenas e pretendo fazer algumas coisas para entretê-las.. Se tiver algumas idéias pra compartilhar, agradeceria. Mas o que queria realmente dizer e acho que vai servir pra muita gente que está começando e ainda não possui um arduino é um site, maravilhoso lançado pela autodesk onde você pode montar seu projeto, simular o funcionamento e até confeccionar a placa PCB. Achei fantástico. Aqui vai o endereço : http://123d.circuits.io/

    Abs.

    ResponderExcluir
  11. Parabéns, muito bem trabalho e parabéns mais pela boa vontade e sanar as duvidas de todo com atenção e boa vantade!

    ResponderExcluir