Mi controlador

Registrado
1 Sep 2013
Mensajes
1
Ubicación
Jaén
Provincia
Jaén
Hola compañeros, lo cierto es que si no fuera por toda la ayuda que proporcionáis no sería posible haber llevado a cabo el proyecto. El mio es bastante simple, ya que no tenía ni idea de programación, ni de electrónica, algo si de informática. La verdad es que me he atrancado probablemente en lo más sencillo, o haya alguna línea de código que sobre, o no sé. Si nos os importa me miráis el código y si me lo podéis optimizar o mejorar, os lo agradeceré. Mi problema es que no logro hacer funcionar la peristáltica. Realmente lo único que quiero es que el rele se abra durante 8 segundos y después se apague todas las noches a la misma hora. He probado infinidad de códigos y no me funcionan, no se si por el reloj, por ser segundos....., aunque la luz enciende y apaga a su hora. Bueno el código quiero echar a andar es este:


if(Reloj.IsLater(23, 58) && Reloj.IsPrevious(23, 59))
{
digitalWrite(PIN_D_RELE_ABONO, HIGH );
delay( 8 * 1000 );
digitalWrite(PIN_D_RELE_ABONO, LOW );
}


Y mi código completo que me funciona todo, otra cosa es que sobre algo, o que se pueda optimizar más, por lo que me podéis dar ideas es el siguiente:




#include <Wire.h>
#include <LiquidCrystal.h> // Librería de la Pantalla
#include "RelojDS1307.h" // Libreria del Reloj
#include "RTClib.h"
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
#include <SPI.h>




// IP Red Local:
byte mac[] = {
0x00, 0x0C, 0x29, 0x96, 0x9o, 0x84 };
IPAddress ip(192,168,0,15);


//Iniciando Puerto de Comunicaciones:
EthernetServer server(80);


//Definiciones de Pines


#define PIN_TEMPERATURA 7
#define PIN_D_RELE_CALENTADOR 22 // Rele 8
#define PIN_D_RELE_EXTRATORES 24 // Rele 7
#define PIN_D_RELE_PISO 26 // Rele 6
#define LUZ 28 // Rele 5
#define LUZLUNA 30 // Rele 4
int PIN_NIVEL= 32;
int PIN_D_RELE_NIVEL= 34; // Rele 3
#define PIN_D_RELE_ABONO 36 // Rele 2


int nivel;
int valor = 0;
int Pin_echo = 38;
int Pin_trig = 40;
int horas;
int minutos;
int segundos;
int tiempo;
//Definiciones de las direcciones de datos para el uso de OneWire


#define DS1307_I2C_ADDRESS 0x68
#define ONE_WIRE_BUS 6
#define MARGEN_TEMPERATURA 0.3


byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; //Constantes del RTC


typedef struct Configuracio_struct
{


float TermoAcuario; //Temperatura Acuario
float TermoTapa; //Temperatura Tapa


} Stru_Configuracion;


void(* resetFunc) (void) = 0;


DeviceAddress AguaTermo, TapaTermo, Cm; // Direcciones de los sensores de temperatura e ultrasonido


//Declaraciones de funciones (propias de las librerias anteriores)


OneWire oneWire( PIN_TEMPERATURA );
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
RelojDS1307Class Reloj; //Declaración de la variable del Reloj
RTC_DS1307 RTC; //Crea el objeto RTC
Stru_Configuracion CFG; //Variable de la configuración
long Old_Millis = 0;




void setup()
{

lcd.begin(16, 2); // Le decimos a la pantalla las dimensiones que tiene.
lcd.print("Iniciado Sistema");
lcd.setCursor(0, 1);
lcd.print("Acuario By Manu");
delay(3000);

pinMode( PIN_TEMPERATURA, INPUT );
digitalWrite (PIN_D_RELE_CALENTADOR, HIGH);
pinMode( PIN_D_RELE_CALENTADOR, OUTPUT );
pinMode(PIN_NIVEL, INPUT);
pinMode( PIN_D_RELE_NIVEL, OUTPUT );
digitalWrite (PIN_D_RELE_PISO, HIGH);
pinMode( PIN_D_RELE_PISO, OUTPUT );
digitalWrite ( PIN_D_RELE_EXTRATORES, HIGH );
pinMode( PIN_D_RELE_EXTRATORES, OUTPUT );
digitalWrite (LUZ, HIGH);
pinMode( LUZ, OUTPUT );
digitalWrite (LUZLUNA, HIGH);
pinMode( LUZLUNA, OUTPUT );
//digitalWrite(PIN_D_RELE_ABONO, HIGH );
pinMode( PIN_D_RELE_ABONO, OUTPUT );
pinMode(Pin_trig, OUTPUT);
pinMode(Pin_echo, INPUT);

Wire.begin(); //Establece la velocidad de datos del bus I2C
RTC.begin(); //Establece la velocidad de datos del RTC

CFG.TermoAcuario = 27.0;
CFG.TermoTapa = 28.0;

// Reloj.SetDateTime( 12, 8, 13, 13, 34, 00 );

//Iniciamos los sensores de temperatura.

sensors.begin();
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");


// Iniciar conexión de red:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("El servidor se encuentra en:");
Serial.println(Ethernet.localIP());


}




void loop()
{
if ( (millis() - Old_Millis) > 7000) // 7 segundos
{
Old_Millis = millis();

//getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

DateTime now = RTC.now(); //Obtiene la fecha y la hora del RTC

lcd.begin(16, 2);
lcd.print("Fecha "); // Print a message to the LCD.
lcd.write( Reloj.Date());
lcd.setCursor(0, 1);
lcd.print ("Hora ");lcd.write( Reloj.Time());
delay (3000);

// Mirar las temperaturas

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

int pulso, cm;
digitalWrite(Pin_trig, LOW);
delayMicroseconds(2);
digitalWrite(Pin_trig, HIGH);
delayMicroseconds(10);
digitalWrite(Pin_trig, LOW);
pulso = pulseIn(Pin_echo, HIGH); //Medición del ancho de pulso recibido en el pin Echo
cm = pulso / 29 / 2; // Convertimos ese pulso en una distancia y a cm
delay(500);

//Pintamos las temperatura


lcd.begin(16, 2);
lcd.print("Temp. Acuario:"); // Print a message to the LCD.
lcd.setCursor(0, 1);
lcd.print(TemperaturaAcuario );
lcd.print((char)223);
lcd.print ("C");
delay (4000);

lcd.begin(16, 2);
lcd.print("Temp. Tapa:"); // Print a message to the LCD.
lcd.setCursor(0, 1);
lcd.print(TemperaturaTapa );
lcd.print((char)223);
lcd.print ("C");
delay (4000);
lcd.clear();

//Pintamos la Distancia al Agua

lcd.begin(16, 2);
lcd.print("Distancia Agua: "); // Print a message to the LCD.
lcd.setCursor(0, 1);
lcd.print(cm);
lcd.print ( "Cm");
delay (4000);

//A continuación comprobaremos si se a activado alguna alarma de temperatura en nuestros sensores

if(TemperaturaAcuario < (CFG.TermoAcuario-MARGEN_TEMPERATURA))
{
digitalWrite (PIN_D_RELE_CALENTADOR, HIGH);

}

if(TemperaturaAcuario > (CFG.TermoAcuario+MARGEN_TEMPERATURA))
{
digitalWrite (PIN_D_RELE_CALENTADOR, LOW);
}


if(TemperaturaTapa > (CFG.TermoTapa+MARGEN_TEMPERATURA))
{
digitalWrite (PIN_D_RELE_PISO, HIGH);
}

if(TemperaturaTapa < (CFG.TermoTapa-MARGEN_TEMPERATURA))
{
digitalWrite (PIN_D_RELE_PISO, LOW);
}

if (TemperaturaAcuario > CFG.TermoTapa)
{
digitalWrite (PIN_D_RELE_EXTRATORES, HIGH);
}

if (TemperaturaAcuario < CFG.TermoTapa)
{
digitalWrite (PIN_D_RELE_EXTRATORES, LOW);
}



// Sonda Ultrasonidos


float Cm;


if (cm>7)
{
digitalWrite (PIN_D_RELE_NIVEL, HIGH);
}

else if (cm<6)
{
digitalWrite (PIN_D_RELE_NIVEL, LOW);
}
delay(2000);


//Configuracion del encedido y apagado de las luces. Luz de luna

if(Reloj.IsLater(13, 59) && Reloj.IsPrevious(23, 59))
{
digitalWrite(LUZ, HIGH);
digitalWrite(LUZLUNA, LOW);
}

else
{
digitalWrite(LUZ, LOW);
digitalWrite(LUZLUNA, HIGH);

}


if(Reloj.IsLater(23, 59) && Reloj.IsPrevious(00, 59))
{
digitalWrite(PIN_D_RELE_ABONO, HIGH );
delay( 8 * 1000 );
digitalWrite(PIN_D_RELE_ABONO, LOW );
}




// listar los Clientes entrantes
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("</head><title>");
client.println("Acuario By Manu");
client.println("</title></head>");
client.println("<meta http-equiv=\"refresh\" content=\"10\">");
client.println("<body>");
client.print("<h1 textalign=\"left\">");
client.print("Fecha: ");
client.print(Reloj.Date());
client.print("<br/>Hora: ");
client.print(Reloj.Time());
client.print("</h1>");
client.print("<center><p>");
client.print("Temperatura Acuario: ");
client.print(TemperaturaAcuario);
client.print(" &degC");
client.print("</p>");
client.print("<p>");
client.print("Temperatura Piso: ");
client.print(TemperaturaTapa);
client.print(" &degC");
client.print("<center><p>");
client.print("Distancia Agua: ");
client.print(cm);
client.print(" Cm");
client.print("</p>");
client.print("<p>");
client.print("</p> </center>");
client.println("<br />");
client.println("</body>");
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");
}
}
}



Muchas gracias de antemano. Saludos.
 
Atrás
Arriba