Control dia y noche

Hola comunidad, necesito una mano para un codigo que la verdad logro hacerlo funcionar como quiero, lo que necesito es un control de dia/noche para un terrario, la idea es que lea la hora del rtc, y la funcion seria la siguiente durante el trascurso de las 20pm y 7am esten prendidos los led azules,luego pasado ese tiempo progresivamente empiezen a encender los led blancos y progresivamente empiezen apagarse los led azules,luego entre las 8am y 19pm esten prendidos los leds blancos, llegado a las 19pm empiezen a encender los leds azules progresivamente y empiezen a apagarse los led blancos.

Nose si se me entiende la idea, la verdad no subo ningun codigo porque ninguno funciona como quiero, las salidas ahora para probar voy a utilizar un solo led, luego le hare un pmw.

PD: Led azules ---- Luz Luna
Led blancos ---- Luz Dia

No pretendo que me hagan el codigo solo que me den una mano....

Desde ya muchisimas gracias ....

Saludos.

Ante todo, hay unas normas en este foro que hay que leer para poder saber que se necesita para poder ayudarte.

Varias de las cosas que deberías colocar es:
.- Tu codigo.
.- Tu esquema
.- El Arduino que usas.
.- El reloj que usas.
.- Como controlas los Leds.
.- Usas alguna otra cosa?.

Cuando coloques la mayor informacion posible, podremos ayudarte de la mejor manera. Pero así que se puede hacer.

Olvida que el problema es tuyo y léelo desde nuestra perspectiva y me dices que se puede hacer con tu informacion.

Suponiendo que tienes reloj tiempo real y controlas los LED por PWM

void loop{

If > 20h y < 20h 5'' Then
Anochece()
end if

If > 7h y < 7h 5'' Then
Amanece()
end if

delay(1000)
}

Anochece() //en 254 segundos
ValorAzul=0
ValorBlanco=254
for i=0 to 254{
analogWrite(ledAzul, ValorAzul);
ValorAzul = ValorAzul + 1
analogWrite(ledBlanco, ValorBlanco);
ValorBlanco = ValorBlanco - 1
delay(1000)
}

Amanece()
Igual, pero al revés
}

Hola max_saeta tiene todala razon la verdad que no puse nada. Es un Arduino mega un reloj tiny rtc y el control de los led reguramente sea con algun trasistor por la corriente pero ahora para probar es un solo led de cada color a las salidas....

Hola Jopapa muchas gracias por ejemplo me dio una gran ayuda para realizar el siguiente codigo, solo es para prender un led gradualmente acierta hora, en teoria funciona despues le agregaria el otro led y que al encender uno apage el otro, pero el problema seria el siguiente: yo necesito que todo ese cambio gradual de encender uno y apagar otro sea en 45 minutos aprox pero si yo pongo un delay de 45 minutos estoy muerto, necesitaria introducir una funcion millis o algo sin que el programa se detenga ya que despues va a tener un senseo de temperatura y no puedo estar 45 sin poder sensar la temp. Este es el codigo:

#include <Wire.h> 
#include "RTClib.h"
RTC_DS1307 RTC;

int seconds_alarm = 10; // Segundos cuando se activa el led
int minutes_alarm = 56; // Minutos cuando se activa el led
int hour_alarm = 4; // Horas cuando se activa el led. Formato 24h


              int contador = 0; // variable
int pin = 10; // pin 10 que puede generar PWM
// -------------
void setup () {
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Comentar una vez establecida la hora)
pinMode(pin, OUTPUT);  // Establece el pin LedPin como salida 
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
}
void loop(){
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC); // Año
Serial.print('/');
Serial.print(now.month(), DEC); // Mes
Serial.print('/');
Serial.print(now.day(), DEC); // Dia
Serial.print(' ');
Serial.print(now.hour(), DEC); // Horas
Serial.print(':');
Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // Segundos
Serial.println();

        if (hour_alarm == now.hour() ) {
          if (minutes_alarm == now.minute() ) {
            if (seconds_alarm == now.second() ) {
              
              
              

 { for(contador = 0 ; contador <= 255; contador ++) // ciclo para ir subiendo el voltaje desde 0 a 5 voltios
{
analogWrite(pin, contador); // PWM
delay(1500);
}
delay(600);
}

Ay en el ejemplo puse un delay de 1500 para probar y funciona, pero como se sabe deteniendo el programa durante 6 min 37 seg (1,5seg x 255).

Espero se alla entendido mi inquietud
Desde ya muchas gracias

La solución es fácil, estudia el comando Millis. Viene un ejemplo en el IDE como BlinkWithoutDelay.

Y vas llamando a la función Amanece() o Anochece() cada x tiempo y sin bloquear el Arduino.

Saludos.

Yo como siempre practicando con todo tipo de idea que pueda realizar (que tenga los materiales para hacerlo). Escribí este sketch para ver si te funciona.

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

RTC_DS1307 RTC;

#define hora_ON	   	7
#define minuto_ON	 	0
#define segundo_ON	   	0

#define hora_OFF	   	19
#define minuto_OFF	 	0
#define segundo_OFF	0 	

#define pin_ON			9
#define pin_OFF		10
#define intervalo       15000UL


unsigned long tiempo_ON = 0;
unsigned long tiempo_OFF = 0;

int iluminacion_ON 	= 0;
int iluminacion_OFF = 0;
byte segundo = 0;
bool activar	=	false;
bool desactivar = 	false;
bool iniciado   = 	false;
// -------------

void setup () {
	Wire.begin(); // Inicia el puerto I2C
	RTC.begin(); // Inicia la comunicación con el RTC
	//RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
	Serial.begin(9600); // Establece la velocidad de datos del puerto serie
	pinMode(pin_ON, OUTPUT);
	pinMode(pin_OFF, OUTPUT);

}

void loop(){
	DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
	if(segundo!= now.second()){
		segundo = now.second();
		Serial.print(now.year(), DEC); // Año
		Serial.print('/');
		Serial.print(now.month(), DEC); // Mes
		Serial.print('/');
		Serial.print(now.day(), DEC); // Dia
		Serial.print(' ');
		Serial.print(now.hour(), DEC); // Horas
		Serial.print(':');
		Serial.print(now.minute(), DEC); // Minutos
		Serial.print(':');
		Serial.print(now.second(), DEC); // Segundos
		Serial.println();
	}    
	if (hora_ON == now.hour()  && minuto_ON == now.minute() && !activar ) {
    	activar = true;
    	iluminacion_ON = 0;
    }
    if (hora_OFF == now.hour()  && minuto_OFF == now.minute() && !desactivar ) {
    	desactivar = true;
    	iluminacion_OFF = 0;
    }


    if((millis()-tiempo_ON> intervalo) && activar){
    	analogWrite(pin_ON, iluminacion_ON);
    	analogWrite(pin_OFF, 255-iluminacion_ON);	
    	iluminacion_ON++;
    	if(iluminacion_ON>=255){
    		digitalWrite(pin_ON, HIGH);
    		digitalWrite(pin_OFF, LOW);
    		activar = false;
    	}
    	tiempo_ON = millis();
    }

    if((millis()-tiempo_OFF> intervalo) && desactivar && !activar){
    	analogWrite(pin_OFF, iluminacion_ON);
    	analogWrite(pin_ON, 255-iluminacion_ON);	
    	iluminacion_OFF++;
    	if(iluminacion_OFF>=255){
    		digitalWrite(pin_OFF, HIGH);
    		digitalWrite(pin_ON, HIGH);
    		desactivar = false;
    	}
    	tiempo_OFF = millis();
    }

}

Intervalo siempre debe ser mayor de 230 para sea mayor a un minuto. Si quieres que el tiempo de apagado de una y el encendido de otra dure una hora debes cambiar el valor de intervalo a 150000UL.

La hora debe ser en formato 24h, para ambos puntos.

Hola max_saeta muchas gracias por el trabajo no es lo que presiso pero me ayudara haber si logro sacar algo, lo que preciso que haga es asi: inicio el arduino segun la hora que sea (entre 20pm y 7am led azul y entre 8am y 19pm led blanco) enciende un led o el otro en esa hora que falta entre las 7AM y 8AM se empieza a apagar el led azul y encender el blanco y entre la hora de 19PM y 20PM empieza a apagarse el led blanco y a encender el led azul simulando asi amanecer y atardecer respectivamente...

Protheo exactamente eso hace.

Y la rutina dura una hora aprox, entre el cambio de de una luz a otra, revisa bien el codigo y veras que hace exactamente lo que acabas de explicar.

Hola max_saeta lo volvi a probar modificando el intervalo asi no esperar una hora, cuando cargo el arduino estan los dos leds apagados cuando llega a la hora ON enciende el led azul (pin off) y empieza a encender el led blanco (pin on) y empieza a apagarse el led azul, pero al llegar a la hora OFF se mantiene prendido el led blanco y jamas prende el azul, nose si estoy haciendo algo mal yo realmente o no me explique bien, voy a ver si lo resuelvo...

Muchas gracias

Pasame las modificaciones que le hiciste y las revisos.

max_saeta aca esta solo modifique el intervalo parano esperar una hora y asi probarlo

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

RTC_DS1307 RTC;

#define hora_ON	   	        20
#define minuto_ON	 	45
#define segundo_ON	   	0

#define hora_OFF	   	20
#define minuto_OFF	 	49
#define segundo_OFF	        0 	

#define pin_ON			9
#define pin_OFF		        10
#define intervalo       690UL


unsigned long tiempo_ON = 0;
unsigned long tiempo_OFF = 0;

int iluminacion_ON 	= 0;
int iluminacion_OFF = 0;
byte segundo = 0;
bool activar	=	false;
bool desactivar = 	false;
bool iniciado   = 	false;
// -------------

void setup () {
	Wire.begin(); // Inicia el puerto I2C
	RTC.begin(); // Inicia la comunicación con el RTC
	//RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
	Serial.begin(9600); // Establece la velocidad de datos del puerto serie
	pinMode(pin_ON, OUTPUT);
	pinMode(pin_OFF, OUTPUT);

}

void loop(){
	DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
	if(segundo!= now.second()){
		segundo = now.second();
		Serial.print(now.year(), DEC); // Año
		Serial.print('/');
		Serial.print(now.month(), DEC); // Mes
		Serial.print('/');
		Serial.print(now.day(), DEC); // Dia
		Serial.print(' ');
		Serial.print(now.hour(), DEC); // Horas
		Serial.print(':');
		Serial.print(now.minute(), DEC); // Minutos
		Serial.print(':');
		Serial.print(now.second(), DEC); // Segundos
		Serial.println();
	}    
	if (hora_ON == now.hour()  && minuto_ON == now.minute() && !activar ) {
    	activar = true;
    	iluminacion_ON = 0;
    }
    if (hora_OFF == now.hour()  && minuto_OFF == now.minute() && !desactivar ) {
    	desactivar = true;
    	iluminacion_OFF = 0;
    }


    if((millis()-tiempo_ON> intervalo) && activar){
    	analogWrite(pin_ON, iluminacion_ON);
    	analogWrite(pin_OFF, 255-iluminacion_ON);	
    	iluminacion_ON++;
    	if(iluminacion_ON>=255){
    		digitalWrite(pin_ON, HIGH);
    		digitalWrite(pin_OFF, LOW);
    		activar = false;
    	}
    	tiempo_ON = millis();
    }
}

Ya te digo cuando llego a las 20:49:00 no hizo nada se quedo prendido el blanco.

Una duda no tendria que tener el codigo aparte 6 define mas? osea esos 6 que hay para el led azul y otro 6 mas con diferente hora para hacer el anocher sino el cambio lo haria siempre a la misma hora

Claro que no va a desactivar le eliminaste del codigo:

if((millis()-tiempo_OFF> intervalo) && desactivar && !activar){
    	analogWrite(pin_OFF, iluminacion_ON);
    	analogWrite(pin_ON, 255-iluminacion_ON);	
    	iluminacion_OFF++;
    	if(iluminacion_OFF>=255){
    		digitalWrite(pin_OFF, HIGH);
    		digitalWrite(pin_ON, HIGH);
    		desactivar = false;
    	}
    	tiempo_OFF = millis();
    }

No lo copiaste completo.

Max_saeta bueno ahora lo copie completo, resulta que al llegar a la hora ON enciende elblanco y gradualmente el azul y luego empieza a aparse gradualmente el blanco pero a llegar alahora OFF dierctamente se apaga el azul y enciende el blanco sin ninguna graduancion. La verdad que estoy muy perdido.

Prueba este codigo:

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

RTC_DS1307 RTC;

#define hora_ON	   	    20
#define minuto_ON	 	52
#define segundo_ON	   	0

#define hora_OFF	   	20
#define minuto_OFF	 	47
#define segundo_OFF	    0 	

#define pin_ON			9          // Led Blanco
#define pin_OFF		    11         // Led Azul
#define intervalo       240UL


unsigned long tiempo_ON = 0;
unsigned long tiempo_OFF = 0;

int iluminacion_ON 	= 0;
int iluminacion_OFF = 0;
byte segundo = 0;
bool activar	=	false;
bool desactivar = 	false;
bool iniciado   = 	false;
// -------------



void iniciar(){
    DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
    int hora    =     now.hour();
    int minuto  =   now.minute();
    digitalWrite(pin_OFF,LOW);
    digitalWrite(pin_ON,LOW);
    if(hora>= hora_ON && hora < hora_OFF) {
        if(minuto >= minuto_ON && minuto < minuto_OFF) digitalWrite(pin_ON,HIGH);
        else digitalWrite(pin_OFF, HIGH);
    }
    else {
        digitalWrite(pin_OFF, HIGH);
    }
       
}

void setup () {
	Wire.begin(); // Inicia el puerto I2C
	RTC.begin(); // Inicia la comunicación con el RTC
	//RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
	Serial.begin(9600); // Establece la velocidad de datos del puerto serie
	pinMode(pin_ON, OUTPUT);
	pinMode(pin_OFF, OUTPUT);
    iniciar();

}

void loop(){
	DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
	if(segundo!= now.second()){
		segundo = now.second();
		Serial.print(now.year(), DEC); // Año
		Serial.print('/');
		Serial.print(now.month(), DEC); // Mes
		Serial.print('/');
		Serial.print(now.day(), DEC); // Dia
		Serial.print(' ');
		Serial.print(now.hour(), DEC); // Horas
		Serial.print(':');
		Serial.print(now.minute(), DEC); // Minutos
		Serial.print(':');
		Serial.print(now.second(), DEC); // Segundos
		Serial.println();
	}    
	if (hora_ON == now.hour()  && minuto_ON == now.minute() && !activar ) {
    	activar = true;
    	iluminacion_ON = 0;
    }
    if (hora_OFF == now.hour()  && minuto_OFF == now.minute() && !desactivar ) {
    	desactivar = true;
    	iluminacion_OFF = 0;
    }


    if((millis()-tiempo_ON> intervalo) && activar){
    	analogWrite(pin_ON, iluminacion_ON);
    	analogWrite(pin_OFF, 255-iluminacion_ON);	
    	iluminacion_ON++;
    	if(iluminacion_ON>=255){
    		digitalWrite(pin_ON, HIGH);
    		digitalWrite(pin_OFF, LOW);
    		activar = false;
    	}
    	tiempo_ON = millis();
    }

    if((millis()-tiempo_OFF> intervalo) && desactivar && !activar){
    	analogWrite(pin_OFF, iluminacion_OFF);
    	analogWrite(pin_ON, 255-iluminacion_OFF);	
    	iluminacion_OFF++;
    	if(iluminacion_OFF>=255){
    		digitalWrite(pin_OFF, HIGH);
    		digitalWrite(pin_ON, LOW);
    		desactivar = false;
    	}
    	tiempo_OFF = millis();
    }

}

:grin: :grin: :grin: Muchas gracias max_saeta por tu ayuda desintereza y por tu tiempo empleado para ayudarme, el codigo ahora si hace lo que necesito, solo tendria que agregarle una instruccion para que reconosca a que hora se enciende el arduino ( el rtc tiene bateria de respaldo) y segun que hora sea, enciende el led blanco o el azul,osea si lo enciendo entre las 20pm y 7am enciende el azul simulando la luz de luna y lo enciendo entre las 8am y 19pm enciende el led blanco simulando la luz de dia, porque ahora tal como esta el codigo siempre arranca con el led blanco (pin_ON 9) siempre en estado HIGH.

OK.
Recuerda que esta ayuda debe ser reciproca, asi que cuando tengas todo listo y funcionando deja aqui el proyecto para que otros puedan tenerlo de referencia.