Mi controlador: "acuarduino!!!"

  • Iniciador del tema Iniciador del tema Anakin
  • Fecha de inicio Fecha de inicio
Registrado
7 Oct 2012
Mensajes
3
Ubicación
Cordoba
Provincia
EL CARPIO
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 :yb665[1]:, 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.
 
Buenas.
Quizás no hayas levantado muchos comentarios puesto que es un foro de marino y el poner un acuario dulce pues no le pega mucho.
De todas formas en lo referente a Arduino creo que no habrá problema en echarte una mano con las dudas que tengas.
Y cuidado que si te pasas mucho por este foro pronto pondrás un acuario marino jejeje :wbyim59[1

En cuanto a la ethernet cuando la tengas ves probando los ejemplos que vienen con la librería y podrás ir adaptado lo que necesites.
No es muy commplejo aunque hay que saber como funciona un cliente y un servidor HHTP para no liarse mucho.

Salu2
 
No te creas que ya me lo he pensado, porque tengo una nano sin utilizar, y... quizas mas adelante...

Saludos...
 
Muy bonito y ordenado. Tal vez intentaría proteger esas regletas de conexiones por la condensación en la pantalla.
Buen proyecto!
 
Aunque hace mucho tiempo del post, este código me vendrá de perlas para mi proyecto, Gracias.
Saludos
 
Atrás
Arriba