efecto dia y noche en acuario

Van varias preguntas y no te hemos respondido ninguna.

al estar tantas horas, conectados los MOSFET seria conveniente instalarles a cada uno un disipador de aluminio ?

No importa el tiempo que este funcionando. Un dispositivo no necesita horas a menos que por programa tu lo fuerces a situaciones donde la disipación cambie. Como no tengo esa respuesta diré o supondré que siempre es igual. Tu ponlo a funcionar en luego de un par de minutos (solo por dar un tiempo de calentamiento) siente como esta el MOSFET. Caliente no significa que debas ponerle disipador. Ahora si lo tocas y no puedes sostener tus dedos entonces si conviene usar disipador.

Respuesta a post#19

if ( fecha.hour() == 2 && fecha.minute() == 0 ){  // si hora = ___ y minutos = ____ restablece valores de
    evento_inicio = true;       // variables de control en verdadero
    evento_fin = true;

en esa consulta comparas la hora usando fecha.hour() con las 2 AM y los minutos con 0

El problema es que eso se ejectua MUCHAS VECES durante todo ese largo minuto. Pero si, dice que a las 2:00 se active evento_inicio y qeu evento_fin tmb o sea.. algo no esta bien.

Como no has puesto que hacen evento_inico que supongo debieran encender las luces y evento_fin debieran apagarlas, supongo que ha sido un error de código. La idea es que evento_inicio se ponga en true com esta y evento_fin este en la rutina de activación de las luces o de las tiras led y que luego de recibir la orden cambien evento_inicio = false.

Este código no esta bien porque esto se repite con cada ciclo asi que por mas que apagues los flags (evento_inicio o evento_fin) se reactivarán con cada ciclo.

Respueta a post#21

for (BRILLO = 0; BRILLO < 256; BRILLO++){   // bucle incrementa BRILLO
  analogWrite(MOSFET, BRILLO);           // PWM en pin 3 con valor de BRILLO
  delay(25);                       // demora de 25 mseg.
  }

Esto es un ciclo que va de 0 a 255 y no responde a lo que pides que es aumentar el brillo por hora. Primero debes definir cuanto brillo aumentará por hora. Porque tienes 24 horas y 256 niveles asi que ese es tu primer desafío. Luego no puedes usar un ciclo for sino un incremento dado por una variable de tiempo que tu determinarás. puede ser por minuto, cada 2 minutos o cada X segundos.

Lo que veo al final del post#22 es que estas cometiendo algunos errores de como encarar la cosa. Si pones todo en un ciclo el cambio será vertiginoso y eso no creo que sea la idea.

Veamos este último código

if ( fecha.hour() == 12 && fecha.minute() == 57 ){ // si hora = __ y minutos = __
    if ( evento_inicio == true ){     // si evento_inicio es verdadero
    for (BRILLO = 0; BRILLO < 256; BRILLO++){  // bucle incrementa BRILLO
  analogWrite(TRIAC1, BRILLO);        // PWM en pin 3 con valor de BRILLO
    }
      analogWrite(TRIAC1, HIGH);       // activa modulo de triac con nivel alto <=== ESTA DE MAS
      analogWrite(TRIAC2, LOW);       // activa modulo de triac con nivel alto  <=== ESTA DE MAS 
     
      evento_inicio = false;        // carga valor falso en variable de control   
    }             // para evitar ingresar mas de una vez
  }

Si tienes un ciclo for para que luego dejas un comando como analogWrite(TRIAC1, HIGH);

analogWrite requiere un pin como TRIAC y un valor entre 0 y 255 no un true/false como HIGH o LOW. Asi que elimina esas dos líneas. Seria en todo caso

analogWrite(TRIAC1, 255);
analogWrite(TRIAC2, HIGH);

pero nunca analogWrite(TRIAC1, HIGH);

pero repito, es superfluo o al menos lo es para TRIAC1 porque ya lo dejaste en 255.

Dime si se entiende?

ok gracias por responder , voy a desglosarlo y a analizar todas tus respuestas , tanto movimiento y pregunta a sido gracias al puente , en las semanas normales no tengo mucho tiempo , pero lo dicho poco a poco voy a empaparme de tus respuestas

Bueno, te ayudo en lo mas importante. Dime en cuanto tiempo quieres que amanezca y en cuanto oscurezca.

Digamos que dices 1 hora = 60 min = 60 * 60 seg = 3600 seg

Si tienes 256 pasos entonces 3600/256 = aprox 14 segundos no importa si no es perfecto

Entonces cada 14 segundos logras que pase de 0 a brillo total o de esa situación a oscuridad. Cómo lo haces?

No como lo estas programando o si pero con leve variante.

Tomaré tu código y lo modificaré de acuerdo a estas dos posiciones. Amanecer y Oscurecer, pondré el lapso de tiempo como una constante para que tu lo modifiques a tu gusto tmb.

Esta es una versión simple de como debería ser. Prueba a ver si funciona

#include    // incluye libreria para el manejo del modulo RTC
#define  STEP_AMANECER 14000

RTC_DS3231 rtc;     // crea objeto del tipo RTC_DS3231

bool evento_inicio = true;  // variable de control para inicio de evento con valor true
bool evento_fin = true;   // variable de control para finalizacion de evento con valor true
int BRILLO;       // variable para almacenar valores PWM
unsigned long tbrillo;

# define TRIAC1  3     // constante TRIAC con valor 3 que corresponde a pin digital 3
# define TRIAC2  5     // constante TRIAC con valor 5 que corresponde a pin digital 5

// donde se encuentra conectado el modulo de rele
void setup () {
pinMode(TRIAC1, OUTPUT);   // pin 3 como salida
pinMode(TRIAC2, OUTPUT);   // pin 5 como salida

if (! rtc.begin()) {       // si falla la inicializacion del modulo
while (1);         // bucle infinito que detiene ejecucion del programa
}
}

void loop () {
DateTime fecha = rtc.now();        // funcion que devuelve fecha y horario en formato
int hora = fecha.hour();
int minuto = minuto();

// DateTime y asigna a variable fecha
if ( hora == 12 && minuto == 57 ) { // si hora = __ y minutos = __
evento_inicio = true;
}
if (evento_inicio)
amanecer();


if ( hora == 12 && minuto == 58 ){ // si hora = __ y minutos = __
if ( evento_fin == true ){        // si evento_fin es verdadero
analogWrite(TRIAC1,   0);        // desactiva modulo de triac con nivel bajo
analogWrite(TRIAC2, 255);        // desactiva modulo de triac con nivel bajo
evento_inicio = false;       // carga valor falso en variable de control
}             // para evitar ingresar mas de una vez
}
}

void amanecer() {
if (millis() - tbrillo > STEP_AMANECER) {
if (BRILLO ++ > 255) {
   BRILLO = 255;
}
analogWrite(TRIAC1, BRILLO);        // PWM en pin 3 con valor de BRILLO
tbrillo = millis();
}
analogWrite(TRIAC2, 0);       // activa modulo de triac con nivel alto
}

hola gracias ,mi intención podría ser : empieza a amanecer a las 6 (0 valor ) hasta las 12 que es el máximo (256 valor) y a partir de las 12 ( 256 valor) hasta las 18:00 (0 valor)

1 hora= 60 min=60*60 seg=3600 segH x 6H=21000 seg/256 valor = 84,375seg /60 =1,4 minutos.

osea a mi entender cada 1,4 minutos debería de incrementar una décima el valor

Bueno, cambia esto

#define  STEP_AMANECER 14000 es para 14 segundos = 14 * 1000

en tu caso pon

#define  STEP_AMANECER 1.4*60*1000

hola , cuando le doy a verificar me sale este error , :

estado de salida 1 'minuto' no se puede utilizar como función

esta traducido

Captura.PNG|717x746

Creo que va así

int minuto = fecha.minute();

Vamos taper!! ánimo, hay cosas que son instintivamente simples y otras no tanto.

Ya te respondió @krnlpanic pero debieras observar que tienes un objeto fecha definido como

DateTime fecha = rtc.now();

Y luego de ahi se desprenden fecha.hour() y fecha.minute()

Si lo miras ahora podrás observar como tiene cierta lógica.

con este cambio si se deja cargar el codigo voy a probar a ver

hola , e estado realizando pruebas con este trozo de código, y veo que y funciona, pero cuando sube la intensidad cada 1.4 minutos , se apaga unos 5 segundos el led lo e calculado con un cronometro , pero entre el apagado y el momento que esta encendido si que esta 1.4 minutos. Esto es en amanecer , ahora tendré que hacer lo mismo con atardecer, este paso deberá ser al contrario o sea menos menos (--) ? y despues con el efecto noche?

gracias

#define  STEP_AMANECER 1.4*60*1000
#define  STEP_ATARDECER 1.4*60*1000
#define  STEP_NOCHE 1.4*60*1000

Si se apaga es porque hay algo mal programado. Dejame verlo.

NOTA: Recuerda que aunque sea una sola línea de código siempre debe ir con etiquetas para códigos. Edita por favor.

lo siento no hay forma no lo saco :angry: :angry: :angry:, no puedo abusar mas de ustedes, voy a utilizar la primera versión un triac para cada tira de leds programados para que enciendan a diferete horario y mas o menos hacen la función de efecto día y noche , gracias a todos los que me habéis ayudado

Este es el problema?

ola , e estado realizando pruebas con este trozo de código, y veo que y funciona, pero cuando sube la intensidad cada 1.4 minutos , se apaga unos 5 segundos el led lo e calculado con un cronometro , pero entre el apagado y el momento que esta encendido si que esta 1.4 minutos.

no, el problema es el no saber,

Bueno. Tranquilo @taper.
Mira te diré algo, hay gente que no da ganas de ayudar y otras que hacen todo el esfuerzo. Tal vez arranquen mal (por su desconocimiento) y no sepan expresarse. Recuerda que los que te responden son siempre gente que tiene alguna experiencia y no todos somos tolerantes (me incluyo, yo tengo mis días).
Asi que no saber no debe avergonzarte. Vergúenza debe darle a alquel que viene y pide que le hagan el trabajo.

Te propongo lo mismo que le he dicho a muchos.
Presiona RESET sin olvidar todo lo que ya tienes y recomencemos.
Dime donde has quedado estancado y trabajamos desde ahi paso a paso.
Te parece?

ok

hola e estado haciendo mas pruebas : e puesto en programación a 6 horas este trozo de código y continua apagando-se el led a cada momento que hace el cambio de subir la intensidad, pero ahora esta 1 minuto encendido y 5 segundos a pagado + o - , calculado con el cronometro del tlf , antes con una programación de unos 5 minutos estaba encendido 1.4 minutos y 5 segundos apagado, pero me e dado cuenta que en la misma placa del TRIAC lleva un diodo que indica que esta encendido , pues cuando se apaga el led programado el led de la placa del triac no se apaga continua siempre encendido , pero cuando empieza la programacion si que esta casi apagado osea luce muy tenue como la programacion poco a poco va subiendo de intensidad

este trozo de código que significa? para que sirve? que función realiza'

void amanecer() {
if (millis() - tbrillo > STEP_AMANECER) {
if (BRILLO ++ > 255) {
   BRILLO = 255;
}
analogWrite(TRIAC1, BRILLO);        // PWM en pin 3 con valor de BRILLO
tbrillo = millis();
}
analogWrite(TRIAC2, 0);       // activa modulo de triac con nivel alto

Esa porción de código o procedimiento lo que hace es esto.

usa una variable llamada tbrillo que es del tipo unsigned long. Dicha variable luego de activar el TRIAC1 con el nivel de brillo corresondiente analogWrite(TRIAC1, BRILLO); se actualiza con el valor actual de millis() para esperar al próximo momento de cambiar por un nuevo nivel de brillo. El famoso step. Ademas se asegura que TRIAC2 este apagado.

Si el BRILLo supera 255 lo pone en ese valor.

Nada mas. Todo eso ocurre cuando es llamado amanecer() y si se cumple la condición

if (millis() - tbrillo > STEP_AMANECER) {

es decir cada STEP_AMANECER milisegundos.

estoy en ello , a demas me e apuntado a un pequeño cursillo..