Hola chicos. Este es mi primer post. He llegado a este foro porque Google me ha traido hasta aqui.
Comentaros que tengo un acuario tambien, pero en mi caso es de agua dulce
, espero que no sea un "problema".
Tambien lo tengo controlado por un arduino MEGA, aunque de momento solo controla, encendido progresivo de luces dia y noche y encendido del calentador.
En codigo de momento tengo casi añadido, control de ventilador de la tapa y guardado y lectura de datos de la EPROM.
En camino viene una tarjeta ethernet, que quiero conectar al arduino para monitorizar todos los sensores y para quizas poder modificar los parametros de temperatura y horario de luces. Tambien me gustaria añdir un mecanismo para alimentar los peces de manera remota o programada.
Por otra parte, para las luces utilizo unas tiras de LEDs, que hacen dimeado mediante transistores TIP141 que son bastantes mas baratos de los buckpuck y funcionan perfecto para el arduino, ya que trabaja de 0v a 5v.
Tengo muchas dudas en cuanto al codigo del ethernet, pero espero que podais ayudarme.
Aqui os dejo un video de mi instalacion actualmente y mi codigo.
https://www.youtube.com/watch?v=-zy73tMALxA[/video]
Agradecer a dukatus y fraidias su ayuda.
Comentaros que tengo un acuario tambien, pero en mi caso es de agua dulce
, espero que no sea un "problema".Tambien lo tengo controlado por un arduino MEGA, aunque de momento solo controla, encendido progresivo de luces dia y noche y encendido del calentador.
En codigo de momento tengo casi añadido, control de ventilador de la tapa y guardado y lectura de datos de la EPROM.
En camino viene una tarjeta ethernet, que quiero conectar al arduino para monitorizar todos los sensores y para quizas poder modificar los parametros de temperatura y horario de luces. Tambien me gustaria añdir un mecanismo para alimentar los peces de manera remota o programada.
Por otra parte, para las luces utilizo unas tiras de LEDs, que hacen dimeado mediante transistores TIP141 que son bastantes mas baratos de los buckpuck y funcionan perfecto para el arduino, ya que trabaja de 0v a 5v.
Tengo muchas dudas en cuanto al codigo del ethernet, pero espero que podais ayudarme.
Aqui os dejo un video de mi instalacion actualmente y mi codigo.
https://www.youtube.com/watch?v=-zy73tMALxA[/video]
/*
Estado: Aparece solo en la pantalla la temperatura del agua y la fecha/hora
Modificado para que quepa el ethernet encima del mega.
Pendiente: Añadir el codigo necesario para enviar le resto de informacion a la webserver
Primeras lineas de codigo del controlador de Acuario By Antonio David Torres
*/
// include the library code:
#include <Wire.h> // incluimos libreria wire
#include <OneWire.h> // incluimos libreria de cables
#include <DallasTemperature.h> // Incluimos libreria sensores
#include <EEPROM.h> // Librería para poder escribir en la eprom del arduino
#include <LiquidCrystal.h> // incluimos libreria LCD
#include "RelojDS1307.h" // Libreria del Reloj
// DEFINIMOS PINES DE SENSORES Y RELES
#define PIN_P_LUCES1 2 // AMARILLO LUCES 1
#define PIN_P_LUCES2 3 // VERDE LUCES 2
#define PIN_P_LUCES3 4 // AZUL LUZ NOCHE azul
#define PIN_P_TEMPER 5 // SENSORES TEMPERATURA
#define PIN_D_RELE_CALENTADOR 28 //PIN 28 DIGITAL CONECTADO A RELE 2
#define PIN_D_RELE_EXTRATORES 30 //PIN 30 DIGITAL CONECTADO A RELE 3
#define PIN_D_RELE_LUCES 34 //PIN 34 DIGITAL CONECTADO A RELE 1
#define PIN_D_PITO 36
#define MARGEN_TEMPERATURA 0.2
#define DIMEO_LUZ1 250
#define DIMEO_LUZ2 250
#define DIMEO_NOCHE 250
DeviceAddress AguaTermo, TapaTermo; // Direcciones de los sensores de temperatura
typedef struct Configuracio_struct
{
float TermoAcuario; //Temperatura Acuario
float TermoTapa; //Temperatura Tapa
int Luz1H_ON; //Hora de encendido de la luz Nº1
int Luz1M_ON; //Minutos de encendido de la luz Nº1
int Luz1H_OFF; //Hora de apagado de la luz Nº1
int Luz1M_OFF; //Minutos de apagado de la luz Nº1
int Luz2H_ON; //Hora de encendido de la luz Nº2
int Luz2M_ON; //Minutos de encendido de la luz Nº2
int Luz2H_OFF; //Hora de apagado de la luz Nº2
int Luz2M_OFF; //Minutos de apagado de la luz Nº2
int Luz3H_ON; //Hora de encendido de la luz Nº3
int Luz3M_ON; //Minutos de encendido de la luz Nº3
int Luz3H_OFF; //Hora de apagado de la luz Nº3
int Luz3M_OFF; //Minutos de apagado de la luz Nº3
} Stru_Configuracion;
void(* resetFunc) (void) = 0;
void Pito( int duracion );
void Alarma();
OneWire oneWire( PIN_P_TEMPER );
DallasTemperature sensors(&oneWire);
int Dimeo1, Dimeo2, Dimeo3;
LiquidCrystal lcd(23, 25, 27, 29, 31, 33, 35);
RelojDS1307Class Reloj; //Declaración de la variable del Reloj
Stru_Configuracion CFG; //Variable de la configuración
void SetRele( int Index, int Pin, boolean Estado )
{
int I = 8-Index;
digitalWrite( Pin, !Estado );
}
void setup()
{
pinMode( PIN_P_LUCES1, OUTPUT );
pinMode( PIN_P_LUCES2, OUTPUT );
pinMode( PIN_P_LUCES3, OUTPUT );
pinMode( PIN_D_RELE_LUCES, OUTPUT );
pinMode( PIN_P_TEMPER, INPUT );
pinMode( PIN_D_RELE_CALENTADOR, OUTPUT );
pinMode( PIN_D_RELE_EXTRATORES, OUTPUT );
pinMode( PIN_D_PITO, OUTPUT );
byte n;
for(n=28; n < 43; n = n + 2)
{
digitalWrite( n, HIGH);
}
Wire.begin();
Dimeo1 = 0; Dimeo2 = 0; Dimeo3 = 0;
CFG.TermoAcuario = 26; // AQUI PODEMOS MODIFICAR LOS VALORES QUE QUERAMOS.
CFG.TermoTapa = 30.0;
CFG.Luz1H_ON = 11;
CFG.Luz1M_ON = 0;
CFG.Luz2H_ON = 11;
CFG.Luz2M_ON = 30;
CFG.Luz1H_OFF = 22;
CFG.Luz1M_OFF = 0;
CFG.Luz2H_OFF = 22;
CFG.Luz2M_OFF = 30;
CFG.Luz3H_ON = 22;
CFG.Luz3M_ON = 30;
CFG.Luz3H_OFF = 23;
CFG.Luz3M_OFF = 0;
lcd.begin(16, 2); // Le decimos a la pantalla las dimensiones que tiene.
//Reloj.SetDateTime( 29, 8, 12, 0, 1, 00 ); // Quitar comentario para ajustar la hora.
/// LeerConfig();
IniciarTemperaturas(); //Iniciamos los sensores de temperatura.
}
void loop () // ***********Inicio del bucle del programa*********************
{
MirarTemperaturas(); //Miramos la temperaturas
horario_luces(); // LLAMADA A COMPROBAR HORARIO LUCES
fechahora();
}
/////////////////////// FIN DEL LOOP //////////////////
///////////////////////////////////////////////////////////////
//
// INICIAR LOS SENSORES DE TEMPERATURA Y ALARMAS
//
///////////////////////////////////////////////////////////////
void IniciarTemperaturas()
{
//Iniciamos el controlador del controlador/s DS18B20
sensors.begin();
//Compruebo que estén todos los sensores.
//Cuidado, ya que al llamar a “sensors.getAddress()”, lo que hacemos es definir que
//variable es cada sensor, por ejemplo definimos que el sensor Nº0 es DepoTermo.
if (sensors.getDeviceCount() < 2); //Serial.println( "Faltan sensores de temperatura");
if (!sensors.getAddress(AguaTermo, 0)); //Serial.println("Falta el sensores de temperatura del agua");
if (!sensors.getAddress(TapaTermo, 1)); //Serial.println("Falta el sensores de temperatura de la tapa");
sensors.setHighAlarmTemp( AguaTermo, 26.75 );
sensors.setLowAlarmTemp( AguaTermo, 26.25 );
sensors.setHighAlarmTemp( TapaTermo, 30.00 );
sensors.setLowAlarmTemp( TapaTermo, 29.50 );
}
///////////////////////////////////////////////////////////////
//
// MIRAR LAS TEMPERATURA
//
///////////////////////////////////////////////////////////////
void MirarTemperaturas()
{
float TemperaturaAcuario, TemperaturaTapa;
//Llamamos a la función requestTemperatures() de nuestro controlador de sensores
//para que se prepare a nuestra llamada de lectura.
sensors.requestTemperatures();
//llamamos a getTempC() pasándole la variable del sensor que queremos leer
// y esta función nos devolverá la temperatura de el sensor llamado.
TemperaturaAcuario = sensors.getTempC( AguaTermo ); // ACUARIO
TemperaturaTapa = sensors.getTempC( TapaTermo ); // TAPA
// LEE Y ESCRIBE LA TEMPERATURA DEL AGUA
// E INDICA SI EL CALENTADOR ESTA ON U OFF
lcd.begin(16, 2);
lcd.print("Calentador: "); // Escribe calentador en el LCD.
lcd.print(OFFON(digitalRead(PIN_D_RELE_CALENTADOR) ));
lcd.setCursor(0, 1); // Envia el cursor al comienzo de la segunda linea
lcd.print("Temp. Agua:"); // Imprime la temperatura.
lcd.print( TemperaturaAcuario );
if ((sensors.getTempC(AguaTermo) < (CFG.TermoAcuario-MARGEN_TEMPERATURA)))
SetRele( 2, PIN_D_RELE_CALENTADOR, HIGH );
if ((sensors.getTempC(AguaTermo) > (CFG.TermoAcuario+MARGEN_TEMPERATURA)))
SetRele( 2, PIN_D_RELE_CALENTADOR, LOW );
delay (4000);
// LEE LA TEMPERATURA DE LA TAPA Y ACTIVA O DESACTIVA LOS VENTILADORES
if ((sensors.getTempC(TapaTermo) > (CFG.TermoTapa+MARGEN_TEMPERATURA)) && digitalRead(PIN_D_RELE_EXTRATORES)) SetRele( 3, PIN_D_RELE_EXTRATORES, HIGH );
if ( (sensors.getTempC(TapaTermo) < (CFG.TermoTapa-MARGEN_TEMPERATURA)) && (!digitalRead(PIN_D_RELE_EXTRATORES))) SetRele( 3, PIN_D_RELE_EXTRATORES, LOW );
}
////////////////// COMPROBACION HORARIO LUCES /////////
void horario_luces ()
{
/////////// LUCES /////////////////////
// ENCIENDE LUZ Nº1 PRIMERA TIRA DE LEDS EN LA PRIMERA MEDIA HORA DE ENCENDIDO VA AUMENTANDO EL VALOR DIMEO1 HASTA 200///////////////
if(Reloj.IsLater( CFG.Luz1H_ON, CFG.Luz1M_ON ) && Reloj.IsPrevious( CFG.Luz1H_OFF, CFG.Luz1M_OFF ))
{
// Alimentar el transformador de la luz si no esta encendido
if (digitalRead(PIN_D_RELE_LUCES)) SetRele( 1, PIN_D_RELE_LUCES, HIGH );
if ( Dimeo1 < DIMEO_LUZ1 )
{
Dimeo1 += 2;
if (Dimeo1 > DIMEO_LUZ1) Dimeo1 = DIMEO_LUZ1;
// Si se a re-iniciado el sistema
if(Reloj.IsLater( CFG.Luz1H_ON, CFG.Luz1M_ON+35 ) && Reloj.IsPrevious( CFG.Luz1H_OFF, CFG.Luz1M_OFF )) Dimeo1 = DIMEO_LUZ1;
analogWrite( PIN_P_LUCES1, Dimeo1 );
}
}
// APAGA LUZ Nº1 PRIMERA TIRA DE LEDS EN LA PRIMERA MEDIA HORA DE DESDE SU APAGADO VA DISMINUYENDO EL VALOR DIMEO1 HASTA 0
if( Reloj.IsLater( CFG.Luz1H_OFF, CFG.Luz1M_OFF ) && (Dimeo1 > 0) )
{
Dimeo1 -= 2;
if (Dimeo1 < 0) Dimeo1 = 0;
// Si se a re-iniciado el sistema
if (Reloj.IsLater( CFG.Luz1H_OFF, CFG.Luz1M_OFF+35 )) Dimeo1 = 0;
analogWrite( PIN_P_LUCES1, Dimeo1 ); // APAGA LA TIRA DE LEDS 1
}
// ENCIENDE LUZ Nº2 /////////////////////////////////////////////////////////////////////////////////////////////////
if(Reloj.IsLater( CFG.Luz2H_ON, CFG.Luz2M_ON ) && Reloj.IsPrevious( CFG.Luz2H_OFF, CFG.Luz2M_OFF ))
{
// Alimentar el tramformador de la luz si no esta encendido
if (digitalRead(PIN_D_RELE_LUCES)) SetRele( 1, PIN_D_RELE_LUCES, HIGH );
if ( Dimeo2 < DIMEO_LUZ2 )
{
Dimeo2 += 2;
if (Dimeo2 > DIMEO_LUZ2) Dimeo2 = DIMEO_LUZ2;
// Si se a re-iniciado el sistema
if(Reloj.IsLater( CFG.Luz2H_ON, CFG.Luz2M_ON+35 ) && Reloj.IsPrevious( CFG.Luz2H_OFF, CFG.Luz2M_OFF )) Dimeo2 = DIMEO_LUZ2;
analogWrite( PIN_P_LUCES2, Dimeo2 );
}
}
// APAGA LUZ Nº2
if( Reloj.IsLater( CFG.Luz2H_OFF, CFG.Luz2M_OFF ) && (Dimeo2 > 0) )
{
Dimeo2 -= 2;
if (Dimeo2 < 0) Dimeo2 = 0;
// Si se a re-iniciado el sistema
if (Reloj.IsLater( CFG.Luz2H_OFF, CFG.Luz2M_OFF+35 )) Dimeo2 = 0;
analogWrite( PIN_P_LUCES2, Dimeo2 );
}
// ENCIENDE LUZ Nº3 /////////////////////////////////////////////////////////////////////////////////////////////////
if( Reloj.IsLater( CFG.Luz3H_ON, CFG.Luz3M_ON ) && Reloj.IsPrevious( CFG.Luz3H_OFF, CFG.Luz3M_OFF ))
{
// Alimentar el tramformador de la luz si no esta encendido
if (digitalRead(PIN_D_RELE_LUCES)) SetRele( 1, PIN_D_RELE_LUCES, HIGH);
if ( Dimeo3 < DIMEO_NOCHE )
{
Dimeo3 += 2;
if (Dimeo3 > DIMEO_NOCHE) Dimeo3 = DIMEO_NOCHE;
// Si se a ri-iniciado el sistema
if(Reloj.IsLater( CFG.Luz3H_ON, CFG.Luz3M_ON+35 ) && Reloj.IsPrevious( CFG.Luz3H_OFF, CFG.Luz3M_OFF )) Dimeo3 = DIMEO_NOCHE;
analogWrite( PIN_P_LUCES3, Dimeo3 );
}
}
// APAGA LUZ Nº 3
if( Reloj.IsLater( CFG.Luz3H_OFF, CFG.Luz3M_OFF ) && (Dimeo3 > 0) )
{
Dimeo3 -= 2;
if (Dimeo3 < 0) Dimeo3 = 0;
// Si se a ri-iniciado el sistema
if (Reloj.IsLater( CFG.Luz3H_OFF, CFG.Luz3M_OFF+35 )) Dimeo3 = 0;
analogWrite( PIN_P_LUCES3, Dimeo3 );
// Apagamos el tranformador de la luz
if ( Dimeo3 == 0 ) SetRele( 1, PIN_D_RELE_LUCES, LOW );
}
}
/////////////////////////////////////////////////////////////
//
///IMPRIME LA HORA Y LA FECHA EN LA PANTALLA.
//
///////////////////////////////////////////////////////////
void fechahora()
{
lcd.begin(16, 2);
lcd.print("Fecha "); // Imprime la palabra fecha
lcd.write( Reloj.Date()); // Imprime la variable fecha
lcd.setCursor(0, 1); // Envia el cursor al comienzo de la segunda linea
lcd.print ("Hora ");
lcd.write( Reloj.Time()); // Imprime la hora y la variable hora
delay (2000);
}
///////////////////////////////////////////////////////////////
//
// GENERA UN PITIDO DE AVISO
//
///////////////////////////////////////////////////////////////
void Pito( int duracion )
{
tone( PIN_D_PITO, 2048, duracion );
}
///////////////////////////////////////////////////////////////
//
// GENERA PITIDOS DE ALARMA
//
///////////////////////////////////////////////////////////////
void Alarma()
{
// Aqui pondriamos la instruccion para que nos avise, mediante twiter o correo o algo...
}
///////////////////////////////////////////////////////////////
//
// DEVUELVE ON o OFF
//
///////////////////////////////////////////////////////////////
char * OFFON( int Valor )
{
if (Valor == LOW)
{return "ON ";}
else
{return "OFF";}
}
///////////////////////////////////////////////////////////////
//
// GRAVA LA CONFIGURACION EN LA EPROM
//
///////////////////////////////////////////////////////////////
void SalvarConfig()
{
uint8_t Valor[sizeof(CFG)];
memcpy( &Valor, &CFG, sizeof(CFG));
for (int i = 0; i <= sizeof(Valor); i++)
EEPROM.write(i, Valor);
}
///////////////////////////////////////////////////////////////
//
// LEE LA CONFIGURACION DE LA EPROM
//
///////////////////////////////////////////////////////////////
void LeerConfig()
{
uint8_t Valor[sizeof(CFG)];
for (int i = 0; i <= sizeof(CFG); i++)
Valor = EEPROM.read(i);
memcpy( &CFG, &Valor, sizeof(CFG));
}
Agradecer a dukatus y fraidias su ayuda.
![Yb639[1] :yb639[1]: :yb639[1]:](http://www.todomarino.com/forum/images/smilies/col2/yb639[1].gif)
![Wbyim59[1] :wbyim59[1 :wbyim59[1](http://www.todomarino.com/forum/images/smilies/col2/wbyim59[1].gif)