Go Down

Topic: efecto dia y noche en acuario  (Read 2599 times) previous topic - next topic

taper

ya tengo los reles en casa , voy a empezar a trastear ...ya voy poniendo avances

taper

bueno pues retomo el tema , despues de tanto tiempo,  estoy haciendo pruebas con el modulo IRF520

surbyte


taper

hola , este es el código que a mi me funciona , con las pruebas que estoy realizando ,  con 2 IRF520N  uno actua en el efecto dia y el otro en el efecto noche los cuales controlan :
 el primer IRF520N :
5 tramos de 40cm de tira de led blanco frio 3528
1 tramo de 40cm  de tira de led UV
 
el segundo IRF520N:
1 tramo de tira led azul 3528

 al estar tantas horas, conectados los MOSFET seria conveniente instalarles  a cada uno un disipador de aluminio  ?
Code: [Select]


#include <RTClib.h>   // incluye libreria para el manejo del modulo RTC

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

# 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
              // DateTime y asigna a variable fecha
 if ( fecha.hour() == 19 && fecha.minute() == 7 ){ // si hora = __ y minutos = __
    if ( evento_inicio == true ){     // si evento_inicio es verdadero
      digitalWrite(TRIAC1, HIGH);       // activa modulo de triac con nivel alto
      digitalWrite(TRIAC2, LOW);       // activa modulo de triac con nivel alto
     
      evento_inicio = false;        // carga valor falso en variable de control   
    }             // para evitar ingresar mas de una vez
  }

 if ( fecha.hour() == 19 && fecha.minute() == 8 ){ // si hora = __ y minutos = __
    if ( evento_fin == true ){        // si evento_fin es verdadero
      digitalWrite(TRIAC1, LOW);        // desactiva modulo de triac con nivel bajo
      digitalWrite(TRIAC2, HIGH);        // desactiva modulo de triac con nivel bajo
     
     
      evento_inicio = false;       // carga valor falso en variable de control
    }             // para evitar ingresar mas de una vez
 }

if ( fecha.hour() == 19 && fecha.minute() == 9 ){ // si hora = __ y minutos = __
    if ( evento_fin == true ){        // si evento_fin es verdadero
      digitalWrite(TRIAC1, LOW);        // desactiva modulo de triac con nivel bajo
      digitalWrite(TRIAC2, LOW);        // desactiva modulo de triac con nivel bajo
     
     
      evento_fin = false;       // carga valor falso en variable de control
    }             // para evitar ingresar mas de una vez
 }
 
 delay(1000);           // demora de 1 segundo

  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;
  }
}



taper

este trozo de código que significa ? que a las 2 de la noche se reinicia?  
si es asi apagara tira de led azul ?o continuara hasta la programacion de efecto dia  y haga el cambio de luz.
 se podria poner que se reinicie a las 24:00 ?
o realmente no afecta en nada
Code: [Select]

  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;



taper

#20
Oct 10, 2020, 09:42 pm Last Edit: Oct 10, 2020, 09:52 pm by taper
mi banco de pruebas




taper

muy bien ahora que funciona , podría   hacer que cuando encienda las lamparas  enciendan a mínimo y cada hora que pase que suba un poco la intensidad  hasta llegar al máximo  y  al contrario  osea efecto amanecer, día y atardecer ,anochecer, y e encontrado este ejemplo código que realiza una cosa parecida , sube y baja la intensidad de una bombilla
  con un IRF520N también ,lo que veo es que esta trabajando con las salidas analogWrite por que?
se podría modificar para que realice esta acción?



Code: [Select]
#define MOSFET 3 // constante MOSFET con valor 3, pin SIG del modulo
int BRILLO; // variable para almacenar valores PWM

void setup(){
  pinMode(MOSFET, OUTPUT); // pin 3 como salida   
}

void loop(){
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.
  }

for (BRILLO = 255; BRILLO >= 0; BRILLO--){ // bucle decrementa BRILLO
  analogWrite(MOSFET, BRILLO);    // PWM en pin 3 con valor de BRILLO
  delay(25);    // demora de 25 mseg.   
  }
}




taper

hola , e  incluido este trozo de codigo
Code: [Select]
for (BRILLO = 0; BRILLO < 256; BRILLO++){ // bucle incrementa BRILLO
  analogWrite(MOSFET, BRILLO);    // PWM en pin 3 con valor de BRILLO

 e cambiado todas las salidas a analogWrite y realiza las operaciones pero:
enciende el primer led , pero a minimo incluso el led que lleva el modulo YRF 520N  casi no se ve, y no incrementa la intensidad del led .
 realiza el cambio de luz programado y el segundo YRF520N  enciende pero tambien lel led a minimo  y el led del modulo a minimo

este el digo:
Code: [Select]


#include <RTClib.h>   // incluye libreria para el manejo del modulo RTC

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

# 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
              // DateTime y asigna a variable fecha
 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
      analogWrite(TRIAC2, LOW);       // activa modulo de triac con nivel alto
     
      evento_inicio = false;        // carga valor falso en variable de control   
    }             // para evitar ingresar mas de una vez
  }

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

if ( fecha.hour() == 12 && fecha.minute() == 59 ){ // si hora = __ y minutos = __
    if ( evento_fin == true ){        // si evento_fin es verdadero
      analogWrite(TRIAC1, LOW);        // desactiva modulo de triac con nivel bajo
      analogWrite(TRIAC2, LOW);        // desactiva modulo de triac con nivel bajo
     
     
      evento_fin = false;       // carga valor falso en variable de control
    }             // para evitar ingresar mas de una vez
 }
 
 delay(1000);           // demora de 1 segundo

  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;
  }
}



surbyte

Van varias preguntas y no te hemos respondido ninguna.

Quote
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

Code: [Select]
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
Code: [Select]
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

Code: [Select]
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
Code: [Select]
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
Code: [Select]
analogWrite(TRIAC1, 255);
analogWrite(TRIAC2, HIGH);


pero nunca
Code: [Select]
analogWrite(TRIAC1, HIGH);

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

Dime si se entiende?


taper

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

surbyte

#25
Oct 14, 2020, 01:14 am Last Edit: Oct 14, 2020, 01:14 am by surbyte
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

Code: [Select]
#include <RTClib.h>   // 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
}




taper

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  

surbyte

Bueno, cambia esto

Code: [Select]
#define  STEP_AMANECER 14000 es para 14 segundos = 14 * 1000

en tu caso pon

Code: [Select]
#define  STEP_AMANECER 1.4*60*1000

taper

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

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

 esta traducido 


krnlpanic

Creo que va así



Code: [Select]
int minuto = fecha.minute();

Go Up