Go Down

Topic: Problema con rele (Read 12151 times) previous topic - next topic

Luis_AM3C

Hola,

      Lo que te dice e4bak es que lo que imprimes por serial lo obtienes usando now.hour(), mientras lo que usas en luces lo obtienes de hour, lo que deberias hacer es usar una sola de las dos formas:

Code: [Select]

//Utiliza solo una de estas dos formas
getDateDs1307(&second, &minute, &hour, &dayOfMonth, &month, &year);
DateTime now = RTC.now();


        Sin embargo si quieres que te funcione así tendrias que poner DateTime now; afuera para que se declare globalmente y lo puedas usar desde luces() y lluvia(). Y me acabo de dar cuenta que hour y minute las tienes dentro del setup, deberias colocarlos afuera para que sean globales y poder usarlas en loop(), luces() y lluvia().

        Lo otro es que sigas usando hour y minute, en primer lugar intenta mandarlas por serial para asegurarte que estan leyendo los valores correctamente, y una cosa que vi raro es que usas unas llaves adicionales que en principio no hacen nada pero te recomiendo quitar ya que tal vez puedan causar problemas.

        Te dejo los codigos modificados para que pruebes:

        Opcion 1: //Usando el objeto DateTime now declarado globalmente

Code: [Select]
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC; // Crea el objeto RTC

DateTime now;

//temperatura
int Temp = 0;
char Grados = 'º';
int Ana1 = A0;   //Entrada analogica de LM35

int rele = 8; //rele, luces1.
int rele1= 7; //rele, luces1.


void setup()
{
  Serial.begin(9600);

  pinMode(rele,OUTPUT);
  pinMode(rele1,OUTPUT);
  pinMode(13,OUTPUT);
 
  digitalWrite(13, HIGH);          //Activamos la retroiluminacion
 
    Wire.begin();
    RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

}
//control de las luces segun la hora:
void luces()
{
   if(now.hour() == 11 && now.minute() == 1)
  {
    digitalWrite (rele, HIGH);
  }
 
  if(now.hour() == 12 && now.minute() == 1)
  {
    digitalWrite (rele, LOW);
  }
}

void lluvia()
{
  if(now.hour() == 13 && now.minute() == 59)
  {
    digitalWrite (rele1, LOW);
  }
 
  if(now.hour() == 14 && now.minute() == 1)
  {
    digitalWrite (rele1,HIGH);
  }
}

void loop()
{

  now = RTC.now(); // Obtiene la fecha y hora del RTC
 
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
 
  //delay(1000); // La información se actualiza cada 1 seg.

  luces();

  lluvia();

   //temperatura//
    Temp = analogRead(Ana1);          //Leemos el valor de la entrada analogica
    Temp = map(Temp,0,1024,20,150);  //Escalamos la señal a grados centigrados

  //Mostramos los grados en el serial
  Serial.print("Grados: ");
  Serial.print(Temp);
  Serial.print(Grados);
  Serial.println("C");

  //delay(10000);                  //Al ser temperatura no hace falta leerlo tan seguido
  delay(1000); //Igual si quieres esperar en un lado 1 seg y en el otro 10seg, necesitas hacer la temporizacion sin delays.
}


        Opcion 2://Usando hour y minute sin las llaves extras y enviandolo por serial.

Code: [Select]
#include <LiquidCrystal.h>
#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68
#include <RTClib.h>

//RTC_DS1307 RTC; // Crea el objeto RTC

//temperatura
int Temp = 0;
char Grados = 'º';
int Ana1 = A0;   //Entrada analogica de LM35

int rele = 8; //rele, luces1.
int rele1= 7; //rele, luces1.

byte second, minute, hour, dayOfMonth, month, year;

// Convierte números normales decimales a BCD (binario decimal codificado)
byte decToBcd(byte val)
{
  return ((val/10*16) + (val%10));
}

// Convierte BCD (binario decimal codificado) a números normales decimales
byte bcdToDec(byte val)
{
  return ((val/16*10) + (val%16));
}
byte second, minute, hour, dayofweek, dayofmonth, month, year;
// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

// Establece la fecha y el tiempo del ds1307
void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  // Resetea el registro puntero
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // Alguno de estos necesitan enmascarar, ciertos bits son bits de control   

  *second     = bcdToDec(Wire.read()&0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read()&0x3f);
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}

void setup()
{
  Serial.begin(9600);

  pinMode(rele,OUTPUT);
  pinMode(rele1,OUTPUT);
  pinMode(13,OUTPUT);

  digitalWrite(13, HIGH);          //Activamos la retroiluminacion

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

  second = 0;
  minute = 59;
  hour = 13;
  dayOfMonth = 17;
  month = 1;
  year = 13;
  setDateDs1307(second, minute, hour, dayOfMonth, month, year);

}
//control de las luces segun la hora:
void luces()
{
  if(hour == 11 && minute == 1)
  {
    digitalWrite (rele, HIGH);
  }
  if(hour == 12 && minute == 1)
  {
    digitalWrite (rele, LOW);
  }
}

void lluvia()
{
  if(hour == 13 && minute == 59)
  {
    digitalWrite (rele1, LOW);
  }
  if(hour == 14 && minute == 1)
  {
    digitalWrite (rele1,HIGH);
  }
}


void loop()
{
  getDateDs1307(&second, &minute, &hour, &dayOfMonth, &month, &year);

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

  Serial.print(year, DEC);
  Serial.print('/');
  Serial.print(month, DEC);
  Serial.print('/');
  Serial.print(dayOfMonth, DEC);
  Serial.print(' ');
  Serial.print(hour, DEC);
  Serial.print(':');
  Serial.print(minute, DEC);
  Serial.print(':');
  Serial.print(second, DEC);
  Serial.println();
 
  //delay(1000); // La información se actualiza cada 1 seg.

  luces();

  lluvia();
 
  //temperatura//
  Temp = analogRead(Ana1);          //Leemos el valor de la entrada analogica
  Temp = map(Temp,0,1024,20,150);  //Escalamos la señal a grados centigrados

  //Mostramos los grados en el serial
  Serial.print("Grados: ");
  Serial.print(Temp);
  Serial.print(Grados);
  Serial.println("C");

  //delay(10000);                  //Al ser temperatura no hace falta leerlo tan seguido
 
  delay(1000); // El ciclo se repite cada segundo
  //Para poder hacer la temporizacion por separado de cada segmento del codigo leete lo de esperar sin usar delay.
}


        Por favor pruebalos ambos y me cuentas como te va.

        Una vez que te funcione eso, revisa lo de temporizar sin usar delay http://forum.arduino.cc/index.php?topic=53526.0

Saludos.

Luis A. Mata C.
Anaco-Venezuela

dboodb

#16
Jun 19, 2013, 12:12 pm Last Edit: Jun 19, 2013, 12:20 pm by dboodb Reason: 1
El primer código esta ok el segundo no, me muestra error.

Con el primer código:
El primero si yo cargo el código y el primer encendido de luces por ejemplo es a los 5 minutos y el apagado a los 6, y en lluvia a en encendido a los  8 y apagado a los 9 me encuentro con que solo cargar el código todos los relés se activan encendiendo luces y lluvia por lo que no respeta este encendido pero si el apagado, pasa igual con lluvia el encendido como ya esta pasa de largo hasta el apagado que si lo respeta.

Intentare ver que puedo hacer con esto... aunque no me explico por qu pasa, y si lo soluciono me pondré con lo de los milis que veo un poco por donde va.

Cabe decir que mi intencion es hacer lluvias cada hora durante el día.
Una vez terminado la secuencia de encendido apagado si creo un segundo void lluvia2 con una segunda hora de encendido y una segunda de apagado, el funcionamiento es correcto puesto que la función lluvia anterior dejo el relé en off.


Saludos y gracias por vuestro tiempo.

Luis_AM3C

Hola,

       Ninguno de los codigos los compile , me imgaino que tiene algun error de sintaxis.

       Si lo que deseas es que inicien apagados debes colocarlo en la inicializacion, es decir agregra dentro del setup lo siguiente:

Code: [Select]

digitalWrite (rele, LOW);
digitalWrite (rele1, LOW);


Saludos.

dboodb

Muchas gracias, a ver si mañana lo puedo modificar, saludos y gracias te dejo un +1!!!

dboodb

#19
Jun 21, 2013, 06:46 pm Last Edit: Jun 21, 2013, 06:58 pm by dboodb Reason: 1
Hola, gracias por ayudarme, puede enfocar esto ultimo que me mencionas y lo aplique al código que colgué, por que con ninguno de los tuyos lo conseguía.....

Ahora he conseguido que se encienda a la hora la función Lluvia, tantas veces como quiera al día, que era lo que pretendía. "por fin" pues no.....

El problema es que no se por que no hacen igual la función Luzdia o Niebla, sigo el mismo principio que con Lluvia....

A ver si tu que tienes mejores ideas sabes que pasa.
Muchas gracias


Code: [Select]


#include <LiquidCrystal_I2C.h>


#include <Wire.h>
#include <RTClib.h>


#define DS1307_I2C_ADDRESS 0x68


RTC_DS1307 RTC; // Crea el objeto RTC


LiquidCrystal_I2C lcd(0x27,20,4);

//temperatura
int Temp = 0;
int pDelay = 3500; //Retraso personalizado (Personal Delay)
int Ana1 = A0;   //Entrada analogica de LM35
char Grados = 'º';

int Luzdia = 22; //rele, Luces1.
int Lluvia= 23; //rele, Lluvia
int Niebla= 24; //rele, Niebla


// Convierte números normales decimales a BCD (binario decimal codificado)
byte decToBcd(byte val)
{
 return ((val/10*16) + (val%10));
}

// Convierte BCD (binario decimal codificado) a números normales decimales
byte bcdToDec(byte val)
{
 return ((val/16*10) + (val%16));
}


///////////////////////////////////////RTC///////////////

byte second, minute, hour, dayofweek, dayofmonth, month, year;
// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second,        // 0-59
                  byte minute,        // 0-59
                  byte hour,          // 1-23
                  byte dayOfMonth,    // 1-28/29/30/31
                  byte month,         // 1-12
                  byte year)          // 0-99
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}

// Establece la fecha y el tiempo del ds1307
void getDateDs1307(byte *second,
         byte *minute,
         byte *hour,
         byte *dayOfMonth,
         byte *month,
         byte *year)
{
 // Resetea el registro puntero
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.write(0);
 Wire.endTransmission();

 Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

 // Alguno de estos necesitan enmascarar, ciertos bits son bits de control  

 *second     = bcdToDec(Wire.read()&0x7f);
 *minute     = bcdToDec(Wire.read());
 *hour       = bcdToDec(Wire.read()&0x3f);
 *dayOfMonth = bcdToDec(Wire.read());
 *month      = bcdToDec(Wire.read());
 *year       = bcdToDec(Wire.read());
}

void setup()
{
   Serial.begin(9600);    

 pinMode(Luzdia,OUTPUT);
 pinMode(Lluvia,OUTPUT);
 pinMode(Niebla,OUTPUT);

 byte second, minute, hour, dayOfMonth, month, year;
 Wire.begin();
RTC.begin(); // Establece la velocidad de datos del RTC
 
////////////////////Porner en hora////////////


 second = 50;
 minute = 58;
 hour = 13;
   dayOfMonth = 17;
 month = 1;
 year = 13;
 setDateDs1307(second, minute, hour, dayOfMonth, month, year);
 

//////////////////////////////////////// HIGH Estado del los reles al cargar codigo

digitalWrite (Luzdia, HIGH);
digitalWrite (Lluvia,  HIGH);
digitalWrite (Niebla,  HIGH);



lcd.init();
 lcd.backlight();
 lcd.clear();
}


//////////////////////////////////////////////////

  void loop()
{
 byte second, minute, hour, dayOfMonth, month, year;
 getDateDs1307(&second, &minute, &hour, &dayOfMonth, &month, &year);

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

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();


lcd.clear();
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
delay(pDelay); // La información se actualiza cada 1 seg.
}



//////////////////////////////////////////////// Lluvias///////////////////////////////
{
 lcd.clear();
 lcd.setCursor(3,1);
 lcd.print("LLUVIA");
 lcd.print("  ");
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
 lcd.setCursor(11,1);
   lcd.print("- OFF");
}

if(hour == 13 && minute == 59 || hour == 14 && minute == 1  || hour == 14 && minute == 3  )
{
digitalWrite (Lluvia,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}

else

if(hour == 14 && minute == 0 || hour == 14 && minute == 2 || hour == 14 && minute == 4  )
{
digitalWrite (Lluvia, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF");
}

delay(pDelay);

//////////////////////////////////////////////// Luces dia ///////////////////////////////
{
 lcd.clear();
 lcd.setCursor(3,1);
 lcd.print("LUZ DIA");
 lcd.print("  ");
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
 lcd.setCursor(11,1);
   lcd.print("- OFF");
}

if(hour == 13 && minute == 0)
{
digitalWrite (Luzdia, LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}

else

if(hour == 14 && minute == 0)
{
digitalWrite (Luzdia, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF");  
}
delay(pDelay);


//////////////////////////////////////////////// Niebla ///////////////////////////////
{
 lcd.clear();
 lcd.setCursor(3,1);
 lcd.print("NIEBLA  - OFF");
 lcd.print("  ");
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
 lcd.setCursor(11,1);
   lcd.print("- OFF");
}

if(hour == 13 && minute == 0)
{
digitalWrite (Niebla, LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
else

if(hour == 14 && minute == 0)
{
digitalWrite (Niebla, HIGH);
lcd.setCursor(11,1);
   lcd.print("- ON");  
}
delay(pDelay);



///////////////////////////////////////////////////temperatura///////////////////////////
 

   Temp = analogRead(Ana1);          //Leemos el valor de la entrada analogica
 Temp = map(Temp,0,1024,20,150);  //Escalamos la señal a grados centigrados

 //Mostramos los grados en el serial
 Serial.print("Grados: ");
 Serial.print(Temp);
 Serial.print(Grados);
 Serial.println("C");




Luis_AM3C

Hola,

      En tu codigo tienes definido byte second, minute, hour, dayOfMonth, month, year; dentro del setup y dentro del loop, eso los hace variables diferentes y no se puede predecir cual sea el funcionamiento, empieza por borrar esas declaraciones de alli adentro y colocar una sola externa global al comienzo del codigo antes del setup.

       En el caso de la niebla pusiste tanto para preder como apagar lo mismo en el LCD lcd.print("- ON "); aunque eso solo afectaria el mensaje y no el relé.

       Y quita esas llaves { } adicionales en tu código  :smiley-sad-blue: :smiley-sad-blue: :smiley-sad-blue: :smiley-sad-blue:

Saudos.

dboodb

#21
Jun 21, 2013, 11:42 pm Last Edit: Jun 22, 2013, 12:19 pm by dboodb Reason: 1
Creeo que lo tengo,  compi, ya te dire!!!

dboodb

#22
Jun 30, 2013, 01:27 pm Last Edit: Jul 02, 2013, 02:08 pm by dboodb Reason: 1
Modificado:

dboodb

#23
Jun 30, 2013, 01:34 pm Last Edit: Jun 30, 2013, 10:40 pm by dboodb Reason: 1
Hola, hace días que no podía entrar. Todo bien?
Tengo un problema y es que solo se enciende a la hora , por ejemplo la luz se enciende a las 14:00  pero si yo cargo el codigo despue de esta hora no enciende hasta el dia siguiente a las 14:00.... lo intente con encendido if(hour >= 20 && minute >=  30  ) pero el apagado no lo hace o si lo hace cada vez que pasa por encendido hace un parpadeo el rele....

El otro problema que me he encontrado que a día de hoy 30 el código me pinta en el lcd la fecha de 00/06/2013 y le indico que es día 30....
También me he dado cuenta que en el serial pinta 06/13/2013 12:58:52, no entiendo si utilizar el código del reloj para escribir en el serial y en el lcd, me de escribe 2 fechas diferentes, no se por que ocurre.

He tenido que hacer un if por cada hora de activacion, me pregunto si se podria hacer mas simple!

dboodb


El problema de que se reinicie o inicie el programa entre las horas comprendidas y el encienda sin esperar a la hora de encendido del día siguiente está solucionado, ahora a ver qué pasa con lo otro...

dboodb

Y empezar con los milis!!!!

dboodb

#26
Jul 02, 2013, 02:29 pm Last Edit: Jul 02, 2013, 07:05 pm by dboodb Reason: 1
Hola, :( estoy estancado con el reloj, el codigo no funciona.

dboodb

#27
Jul 02, 2013, 02:30 pm Last Edit: Jul 02, 2013, 07:08 pm by dboodb Reason: 1
Este es el anterior que parecia que funciona pero el reloj no va bien.
Code: [Select]
[code] void loop()
{

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


DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();


lcd.clear();
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
delay(pDelay); // La información se actualiza cada 1 seg.

/// Lluvias

 lcd.clear();
 lcd.setCursor(3,1);
 lcd.print("LLUVIA");
 lcd.print("  ");
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
 lcd.setCursor(11,1);
   lcd.print("- OFF");
   
if(hour == 10 && minute == 1  )
{
digitalWrite (Lluvia,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}

else

if(hour == 10 && minute == 2 )

digitalWrite (Lluvia, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF");

/////
if(hour == 11 && minute == 1  )
{
digitalWrite (Lluvia,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}

else

if(hour == 11 && minute == 2 )

digitalWrite (Lluvia, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF");
   
////
if(hour == 12 && minute == 1  )
{
digitalWrite (Lluvia,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}

else

if(hour == 12 && minute == 2 )

digitalWrite (Lluvia, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF");

   
delay(pDelay);

////Luces dia

 lcd.clear();
 lcd.setCursor(3,1);
 lcd.print("LUZ DIA");
 lcd.print("  ");
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
 lcd.setCursor(11,1);
   lcd.print("- OFF");

if(hour >= 10 && minute >=  1  && hour <=  22 && minute <=  30)
{
digitalWrite (Luzdia,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
else

digitalWrite (Luzdia, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF ");

delay(pDelay);

///Niebla

 lcd.clear();
 lcd.setCursor(3,1);
 lcd.print("NIEBLA  - OFF");
 lcd.print("  ");
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
 lcd.setCursor(11,1);
   lcd.print("- OFF");

////
if(hour >= 22 && minute >=  1  && hour <=  22 && minute <=  16 )
{
digitalWrite (Niebla,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
else

digitalWrite (Niebla, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF ");

////
if(hour >= 22 && minute >=  1  && hour <=  22 && minute <=  15 )
{
digitalWrite (Niebla,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
else

digitalWrite (Niebla, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF ");

////
if(hour >= 23 && minute >=  1  && hour <=  23 && minute <=  15 )
{
digitalWrite (Niebla,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
else

digitalWrite (Niebla, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF ");

///
if(hour >= 24 && minute >=  1  && hour <=  24 && minute <=  15 )
{
digitalWrite (Niebla,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
else

digitalWrite (Niebla, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF ");

///
if(hour >= 1 && minute >=  1  && hour <=  1 && minute <=  15 )
{
digitalWrite (Niebla,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
else

digitalWrite (Niebla, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF ");

///
if(hour >= 2 && minute >=  1  && hour <=  2 && minute <=  15 )
{
digitalWrite (Niebla,LOW);
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
else

digitalWrite (Niebla, HIGH);
lcd.setCursor(11,1);
   lcd.print("- OFF ");


delay(pDelay);

///temperatura

 //Calcula la temperatura usando como referencia 5v
SenTemp1 = (5.0 * analogRead(0)*100.0)/1023.0;

Serial.println (SenTemp1); //escribe la temperatura en el serial
lcd.clear();
lcd.setCursor(0,0);
 lcd.print("TEM1:");
 lcd.print("  ");
 lcd.setCursor(12,0);
 lcd.print("C ");
 lcd.print("  ");
lcd.setCursor(6,0);
 lcd.print(SenTemp1);
 lcd.print("  ");
 lcd.clear();
   lcd.setCursor(0,1);
 lcd.print("CALENTADOR");
 lcd.print("  ");
 lcd.setCursor(0,2);
 lcd.print("VENTILADOR");
lcd.setCursor(11,1);
   lcd.print("- OFF");
lcd.setCursor(11,2);
   lcd.print("- OFF");
 lcd.setCursor(13,3);
 if (hour < 10) lcd.print("0");
 lcd.print(hour, DEC);
 lcd.print(":");  
 if (minute < 10) lcd.print("0");
 lcd.print(minute, DEC);
 lcd.setCursor(0,3);
 if (dayOfMonth < 10) lcd.print("0");
 lcd.print(dayOfMonth, DEC);
 lcd.print("/");
 if (month < 10) lcd.print("0");
 lcd.print(month, DEC);  
 lcd.print("/");
 lcd.print("20");  
 if (year < 10) lcd.print("0");
 lcd.print(year, DEC);
 lcd.print("  ");
 delay (pDelay);
 
///Calentador

if (SenTemp1 < 24) //Valor on
{
 digitalWrite(Calentador, LOW); //calentador on
lcd.setCursor(11,1);
   lcd.print("- ON ");
}
if (SenTemp1 > 25) //Valor off
 digitalWrite(Calentador, HIGH); // calentador off
lcd.setCursor(11,1);
   lcd.print("- OFF ");


////Ventiladore

if (SenTemp1 > 27)//
{
 digitalWrite(Ventilador, LOW); //venti on
lcd.setCursor(11,2);
   lcd.print("- ON ");
}
else
 digitalWrite(Ventilador, HIGH); //venti
lcd.setCursor(11,2);
   lcd.print("- OFF ");

delay (2000);
}

[/code]

dboodb

#28
Jul 02, 2013, 03:54 pm Last Edit: Jul 02, 2013, 07:53 pm by dboodb Reason: 1
Utilizando este código para comprobar el reloj, me marca bien en el serial, no se que ocurre....
Code: [Select]
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC; // Crea el objeto RTC

void setup () {
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin(); // Establece la velocidad de datos del RTC


///RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora

}

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

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

delay(1000); // La información se actualiza cada 1 seg.
}





Por lo que intentare hacer algo con este...

//Luz

if(now.hour() >= 18 && now.minute() >=  30 && now.hour() <=  20 && now.minute() <=  30)
{
digitalWrite (Luzdia,LOW);

}
else

digitalWrite (Lluzdia, HIGH);


delay(1000);

Lo que ocurre es que compara hora y minuto si enciende a las 18:30 se cierra a las 19:30 por que el minuto de cerrarse es 30 y le da igual si la hora que tendria que cerrar son las 20....

Luis_AM3C

Hola,

      Analiza mejor lo que estas escibiendo:

Code: [Select]
if(now.hour() >= 18 && now.minute() >=  30 && now.hour() <=  20 && now.minute() <=  30)

      Alli dice que si la hora esta entre 18 y 20, y el minuto esta entre 30 y 30 enciendelo. Osea que a las 18:31 se apaga porque no satisface la condición de los minutos.

      La condicion correcta es, si hora es 18 y minuto mayor o igual a 30, o hora es 19 (o mayor que 18 y menor que 20 si son varias horas), o hora es 20 y minuto menor o igual a 30.

Code: [Select]
if( (now.hour()==18 && now.minute()>= 30) || (now.hour()==19) || (now.hour()==20 && now.minute()<=30) )

      Espero esto te funcione, en caso de que tengas problemas lo mejor es probar tu codigo por etapas, probar el codigo del reloj solo, luego probar la lógica encendiendo unos leds, luego probar la circuiteria encendiendo los reles, y ya una vez que estes seguro que todo funciona por separado irlo uniendo.

Saludos.

Go Up