Mi controlador

Tema en 'Mi Controlador' iniciado por Manureal21, 1 Sep 2013.

  1. Manureal21

    Manureal21

    Mensajes:
    1
    Registrado:
    1 Sep 2013
    Ubicación:
    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.