Arduino Forum

International => Español => Software => Topic started by: elpilas on Dec 08, 2017, 09:22 pm

Title: Problemas con efectos de luces para belen
Post by: elpilas on Dec 08, 2017, 09:22 pm
Buenas noches,bueno antes de nada agradecer vuestra ayuda y desearos unas felices fiestas.

El tema que nos ocupa supongo que no tendrá demasiada complicación para los expertos del foro pero como digo en el enunciado soy neófito en programación y en arduino.
He buscado y empollado manuales de Internet y buscado por todos lados y la verdad es que he encontrado cosas por separado que al juntarlas no terminan de funcionar.
el lío esta en que tengo un proyecto para un belén,se que a algunos os dará la risa tonta,pero para los peques me hacia ilusión,después de buscar por Internet equipos que hicieran los efectos decidí intentarlo con arduino debido al elevado costo de los controladores para esos menesteres.
La cuestión es que los efectos de anochecer y atardecer los tengo conseguidos,incluso retocados para una tercera salida ,que no estaba originalmente en el código que localice,y que he suavizado en tiempo alargando las transiciones.
Por otro lado,están los efectos de las estrellas y de las fogatas que si bien separando los códigos funcionan correctamente, al unirlos en un solo programa dejan de hacerlo como me gustaría, es decir,quiero que las luces de las estrellas funcionaran con una cadencia y que la lumbre de las fogatas a otra distinta. no se si el tema esta en que no separo correctamente las funciones o no están bien descritas o por que no se puede hacer.
En definitiva me gustaría que funcionasen ambas funciones simultáneamente en un mismo programa.
¿Como habría que hacerlo para que esto fuese como lo describo?
A continuación os pongo el programa para los efecto de estrellas y fuegos:

Code: [Select]
int estrellas1 = 2;    // led blanco
int estrellas2 = 3;   // led blanco
int estrellas3 = 4;   // led blanco
int llama1 = 5;    // led rojo
int llama2 = 6;   // led naranja
int llama3 = 7;   // led naranja
int llama11 = 8;    // led rojo
int llama12 = 9;   // led naranja
int llama13 = 10;   // led naranja
void setup() {

   pinMode(estrellas1, OUTPUT);
   pinMode(estrellas2, OUTPUT);
   pinMode(estrellas3, OUTPUT);
   pinMode(llama1, OUTPUT);
   pinMode(llama2, OUTPUT);
   pinMode(llama3, OUTPUT);
   pinMode(llama11, OUTPUT);
   pinMode(llama12, OUTPUT);
   pinMode(llama13, OUTPUT);

}

void loop() {
 { void estrellas();
   void llamas();
 }
 { void estrellas();
 analogWrite(estrellas1, random(5,200));
 analogWrite(estrellas2, random(50,255));
 analogWrite(estrellas3, random(10,150));
 delay(random(1,200));}
 delay(10);
 { void llamas();
 analogWrite(llama1, random(10,220));
 analogWrite(llama2, random(30,255));
 analogWrite(llama3, random(10,255));
 analogWrite(llama11, random(20,240));
 analogWrite(llama12, random(15,250));
 analogWrite(llama13, random(40,150));
 delay(random(1,50));}

}

[code]
[/code]
Title: Re: neofito en arduino necesita ayuda
Post by: surbyte on Dec 08, 2017, 10:43 pm
Si copias y pegas nunca aprendes.
Tomas un libro, sigues los 2 o 3 capitulos iniciales y te puedes manejar mas o menos bien.
O vas a Documentación y buscas las clases de Youtube y lo mismo.

Ahrora te lo resuelvo pero tenlo presente para la próxima.

Code: [Select]
int estrellas1 = 2;    // led blanco
int estrellas2 = 3;   // led blanco
int estrellas3 = 4;   // led blanco
int llama1 = 5;    // led rojo
int llama2 = 6;   // led naranja
int llama3 = 7;   // led naranja
int llama11 = 8;    // led rojo
int llama12 = 9;   // led naranja
int llama13 = 10;   // led naranja

void setup() {
    pinMode(estrellas1, OUTPUT);
    pinMode(estrellas2, OUTPUT);
    pinMode(estrellas3, OUTPUT);
    pinMode(llama1, OUTPUT);
    pinMode(llama2, OUTPUT);
    pinMode(llama3, OUTPUT);
    pinMode(llama11, OUTPUT);
    pinMode(llama12, OUTPUT);
    pinMode(llama13, OUTPUT);
}

void loop() {
  void estrellas();
  void llamas();
}

void estrellas() {
  analogWrite(estrellas1, random(5,200));
  analogWrite(estrellas2, random(50,255));
  analogWrite(estrellas3, random(10,150));
  delay(random(1,200));
  delay(10);
}

void llamas() {
  analogWrite(llama1, random(10,220));
  analogWrite(llama2, random(30,255));
  analogWrite(llama3, random(10,255));
  analogWrite(llama11, random(20,240));
  analogWrite(llama12, random(15,250));
  analogWrite(llama13, random(40,150));
  delay(random(1,50));
}


NOTA: te envié privado, edita tu hilo según las normas del foro
Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 09, 2017, 01:13 am
En vista de que al menos te has molestado en editar tu mensaje para poner etiquetas, intentaré poner mi granito de arena al código que ya propuso surbyte. Sólo he sustituido los delays por millis para que el delay de una función no influya en el tiempo de la otra. Otra pequeña licencia ha sido utilizar variables estáticas en lugar de globales (así no tengo que echar mucha imaginación para inventarme distintos nombres para las variables de cada función :))).
Code: [Select]

const int estrellas1 = 2;    // led blanco
const int estrellas2 = 3;   // led blanco
const int estrellas3 = 4;   // led blanco
const int llama1 = 5;    // led rojo
const int llama2 = 6;   // led naranja
const int llama3 = 7;   // led naranja
const int llama11 = 8;    // led rojo
const int llama12 = 9;   // led naranja
const int llama13 = 10;   // led naranja

void setup() {
    pinMode(estrellas1, OUTPUT);
    pinMode(estrellas2, OUTPUT);
    pinMode(estrellas3, OUTPUT);
    pinMode(llama1, OUTPUT);
    pinMode(llama2, OUTPUT);
    pinMode(llama3, OUTPUT);
    pinMode(llama11, OUTPUT);
    pinMode(llama12, OUTPUT);
    pinMode(llama13, OUTPUT);
}

void loop() {
  estrellas();
  llamas();
}

void estrellas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(estrellas1, random(5,200));
    analogWrite(estrellas2, random(50,255));
    analogWrite(estrellas3, random(10,150));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,200);
  }
}

void llamas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(llama1, random(10,220));
    analogWrite(llama2, random(30,255));
    analogWrite(llama3, random(10,255));
    analogWrite(llama11, random(20,240));
    analogWrite(llama12, random(15,250));
    analogWrite(llama13, random(40,150));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,50);
  }
}


Así tendremos, además, el enésimo ejemplo sobre cómo se usa millis, que es algo en lo que muchos se atascan.
Saludos.
Title: Re: Problemas con efectos de luces para belen
Post by: surbyte on Dec 09, 2017, 04:37 am
Yo puse las etiquetas, no el autor del hilo.
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 09, 2017, 09:07 am
Buenos días, antes de nada pedir perdón nuevamente, y agradecer a los dos vuestros consejos y aportaciones.
A surbyte, decirle que tras su privado si edite el mensaje origibal, tanto código como encabezamiento, aunque tu ya habías editado en tu post. A demás seguí tu consejo y estoy siguiendo los tutos del  hilo que me pasaste.

Gracias de nuevo y perdón por lo ocurrido intentare que no vuelva a pasar.
Title: Re: Problemas con efectos de luces para belen
Post by: surbyte on Dec 09, 2017, 11:28 pm
Bueno me da gusto. Verás que cuando retomes estarás con mejores armas.
Title: Re: Problemas con efectos de luces para belen
Post by: ENGRAL on Dec 10, 2017, 08:08 pm
Para elpilas


En primer lugar, te felicito por tu demostrada afición, sigue adelante y disfrutaras de ARDUINO.

En segundo lugar te rogaría,  si pudieras explicar que solución has dado para el efecto anochecer .
Enciendes lamparas a 220 v. ??



Saludos  y bienvenido al club !!!!


Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 11, 2017, 09:54 pm
Code: [Select]


int dia = 3;    // LED blanco cielo pin d03
int noche=5;   // LED azul cielo pin d05
int casa1=6;    // LED de casa arabe pin d06
int transicion=7;   //LED rojo atardecer
int casa2=9;    // LED de casa pequeña pin d09
int casa3=10;   // LED de casa grande pin d10
int portal=11;  // LED del portal de belen d11

void setup()  {
  // nada
}

void loop()  {
  // hacerse de día:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
    if  (fadeValue<255)
    {digitalWrite(transicion,HIGH);}
      else
    {digitalWrite(transicion,LOW);}
    analogWrite(noche,255-fadeValue);
    analogWrite(dia, fadeValue);
    delay(300);

    if (fadeValue<70)
      {digitalWrite (casa1,HIGH);}
      else
      {digitalWrite (casa1,LOW);}
     if (fadeValue<65)
      {digitalWrite (casa2,HIGH);}
      else
      {digitalWrite (casa2,LOW);} 
     if (fadeValue<40)
      {digitalWrite (casa3,HIGH);}
      else
      {digitalWrite (casa3,LOW);}
     if (fadeValue<80)
      {digitalWrite (portal,HIGH);}
      else
      {digitalWrite (portal,LOW);}     
    delay(150);                       
  }
  delay (120000);
  // hacerse de noche:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(dia, fadeValue);
    if (fadeValue>0)
       {digitalWrite(transicion,HIGH);}
       else
       {digitalWrite(transicion,LOW);}
    analogWrite(noche,255-fadeValue);
    delay (300);

    analogWrite(noche,255-fadeValue);
    if (fadeValue<110)
      {digitalWrite (casa1,HIGH);}
      else
      {digitalWrite (casa1,LOW);}
     if (fadeValue<105)
      {digitalWrite (casa2,HIGH);}
      else
      {digitalWrite (casa2,LOW);} 
     if (fadeValue<80)
      {digitalWrite (casa3,HIGH);}
      else
      {digitalWrite (casa3,LOW);}
     if (fadeValue<120)
      {digitalWrite (portal,HIGH);}
      else
      {digitalWrite (portal,LOW);}     
    delay(150);                           
  }
  delay (120000);
}]
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 11, 2017, 10:02 pm
Hola, buenas noches,perdón por la tardanza en responder....el curro y los peques que no me dejan.
Los efectos de luces van todos montados en leds,de momento y hasta no tenerlo todo atado solo monto 1 en cada salida, pero para gobernar las tiras de leds que tenia pensado, montare mosfet IRF 540. Al código que encontré en Internet, le he añadido una nueva salida para meter el color rojo y así darle mas realismo a las transiciones.
Estoy empezando en esto y llevo 2 días a piñón empollando vídeos y tutos de arduino,las modificaciones hechas han sido a base de cabezazos pero creo que funcionaran bien. 
Este es el programa en cuestion. Le he añadido " transion " para introducir el color rojo en el montaje final.

Ahora lo que no me aclaro es como es como montar el programa de llamas y estrellas acoplado a este de ciclo dia/noche y no morir en el intento.

He leido en otro post que no se puede utilizar for con milli por lo que ya me pierdo a la hora de hacer el fader de las luces.

Alguna idea a mi nivel? alguna sugerencia de por donde pueden ir los tiros para poder estrujarme la sesera ?

Gracias y un saludo
P.D. Perdon por el mensaje de arriba..... me he liao.
Title: Re: Problemas con efectos de luces para belen
Post by: ENGRAL on Dec 13, 2017, 11:34 am
Hola  elpilas

Gracias por la respuesta .Yo tambien  estoy buscando soluciones practicas  para efectos fader con corriente a 220v.

Si encuentro algo, ya te lo enviare.

De momento, te aconsejare que utilices el MOSFET IRL 520 ,he montado varias instalaciones con el. Tiene una salida de 9 Amperios (podrias alimentar teoricamente  mas de 400 leds !!) ademas su "gate" es para nivel de conexión con Arduino          (fijate letra " L " : los " F " son mas "duros").

Tambien te envio un enlace a un youtube que te puede orientar  https://youtu.be/LKVxxGBuww4 (https://youtu.be/LKVxxGBuww4).

Por otra parte:
No te has olvidado de declarar en setup como output las salidas: dia,noche, casa1, etc ?.?
A mi no se me enciende nada en la prueba !!!

Te envio esta rectificacion de novato a novato !.!.!  :)  :) ?.?.?
 Fijate en las anotaciones que he hecho

Code: [Select]

/*
 *
 * FORO BELEN 2.3
 *  Dec 11, 2017, 08:54 pm Last Edit: Dec 11, 2017, 09:02 pm by elpilas
 *
 */

int dia = 3;    // LED blanco cielo pin d03
int noche = 7;   // LED azul cielo pin d05
int casa1 = 8;    // LED de casa arabe pin d06
int transicion = 9;   //LED rojo atardecer
int casa2 = 10;    // LED de casa pequeña pin d09
int casa3 = 11;   // LED de casa grande pin d10
int portal = 12;  // LED del portal de belen d11

void setup()
 {            //Aqui he añadido una rutina que te permite saber que titulo tienes cargado                   
// ==========================
Serial.begin(9600); 
Serial.println(F(" < FORO BELEN 2.3 >")); 
Serial.println(F(""));  // Espacio en blanco
// ===========================
pinMode(dia, OUTPUT);
pinMode(noche, OUTPUT);
pinMode(casa1, OUTPUT);
pinMode(transicion, OUTPUT);
pinMode(casa2, OUTPUT);
pinMode(casa3, OUTPUT);
pinMode(portal, OUTPUT);
}
                          // He reducido todos los"delay" para dar mas velocidad al codigo
void loop()  {
 
  // hacerse de día:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
 
// Estas inclusiones te permitiran ver por el monitor serial la evolucion del conteo

 Serial.print("FADE VALUE =");
  Serial.println(fadeValue);
   
 if  (fadeValue<255)
  {
      digitalWrite(transicion,HIGH);
  }
      else
  {
      digitalWrite(transicion,LOW);
  }
    analogWrite(noche,255-fadeValue);
    analogWrite(dia, fadeValue);
    delay(30);

    if (fadeValue<70)
      {digitalWrite (casa1,HIGH);}
      else
      {digitalWrite (casa1,LOW);}
     if (fadeValue<65)
      {digitalWrite (casa2,HIGH);}
      else
      {digitalWrite (casa2,LOW);}
     if (fadeValue<40)
      {digitalWrite (casa3,HIGH);}
      else
      {digitalWrite (casa3,LOW);}
     if (fadeValue<80)
      {digitalWrite (portal,HIGH);}
      else
      {digitalWrite (portal,LOW);}     
    delay(50);                       
  }
  delay (1000);
  // hacerse de noche:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    Serial.print("FADE VALUE =");
  Serial.println(fadeValue);
    analogWrite(dia, fadeValue);
    if (fadeValue>0)
       {digitalWrite(transicion,HIGH);}
       else
       {digitalWrite(transicion,LOW);}
    analogWrite(noche,255-fadeValue);
    delay (30);

    analogWrite(noche,255-fadeValue);
    if (fadeValue<110)
      {digitalWrite (casa1,HIGH);}
      else
      {digitalWrite (casa1,LOW);}
     if (fadeValue<105)
      {digitalWrite (casa2,HIGH);}
      else
      {digitalWrite (casa2,LOW);}
     if (fadeValue<80)
      {digitalWrite (casa3,HIGH);}
      else
      {digitalWrite (casa3,LOW);}
     if (fadeValue<120)
      {digitalWrite (portal,HIGH);}
      else
      {digitalWrite (portal,LOW);}     
    delay(15);                           
  }
  delay (1000);
}
   

 

Suerte y que no decaiga la fiesta !!!


.
Title: Re: Problemas con efectos de luces para belen
Post by: surbyte on Dec 13, 2017, 02:59 pm
Sinceramente me pierdo al intentar ayudarlos. No se si este hilo es de luces LED o de lámparas. Son dos cosas diferentes que pueden tener similitudes en partes del código pero el ataque es distinto.
Me quedo siempre con el control de luces leds ya que las lámparas exigen control de fase, y sincronismo con cruce por cero.
Espero respuestas y les daremos una mano porque se nos acerca Navidad y esto debe estar listo!!!
Title: Re: Problemas con efectos de luces para belen
Post by: ENGRAL on Dec 13, 2017, 05:00 pm
Hola surbyte y elpilas

Tal vez me he colado  en este hilo, al pregutar a elpilas, si estaba utilizando lamparas de 220v. para "efecto amanecer".

Veo por su respuestas, que no debe conocer nada para mi consulta.

surbyte :

If eres tan amable nos das un empujon  a el y a mi, else te envio un nuevo post con mi peticion sobre regulacion  a 220v con sistema de "cruce por cero" a TRIAC .

Un saludo !!!!
Title: Re: Problemas con efectos de luces para belen
Post by: surbyte on Dec 13, 2017, 05:44 pm
No hace falta busca AC Phase control circuit (https://playground.arduino.cc/Main/ACPhaseControl) en el buscador. A ese sitio te voy a remitir.
En documentación también hay comentrios al respecto.

Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 13, 2017, 11:12 pm
Hola, buenas noches,perdón por la tardanza en responder....el curro y los peques que no me dejan.
Los efectos de luces van todos montados en leds,de momento y hasta no tenerlo todo atado solo monto 1 en cada salida, pero para gobernar las tiras de leds que tenia pensado, montare mosfet IRF 540. Al código que encontré en Internet, le he añadido una nueva salida para meter el color rojo y así darle mas realismo a las transiciones.
Bien. Queda entonces claro que no hay corriente alterna que manejar en este caso.
Ahora lo que no me aclaro es como es como montar el programa de llamas y estrellas acoplado a este de ciclo dia/noche y no morir en el intento.
¿Pero van a ser uno o dos arduinos? Porque los códigos de amanecer/anochecer y los de llamas y estrellas repiten algunos pines iguales.
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 15, 2017, 12:55 pm
Buenos días, estoy fuera trabajando y no he podido mirar ni hacer nada, así que una vez mas pido perdón. Esta tarde cuando llegue a casa me pondré manos a la obra. Antes de nada gracias por vuestra inestimable ayuda. Seria 1 solo arduino mega; hay pines repetidos porque en principio eran dos codigos independientes los cuales quería integrar en uno solo pero como comentaba antes al compañero, después de reubicar los pines de salida y unificar los codigos,  los efectos de estrellas y llamas dejaban de funcionar.
Por otra parte, los delay tan bestiales (120000), son los que me da el tiempo de los ciclos día y noche, y los de 300 y150, hacen que las transiciones no sean tan bruscas, duran aproximadamente 1 minuto y 15 segundos. Con el conjunto del código un ciclo completo dura unos 7 minutos aproximadamente, tiempo suficiente para disfrutar tanto de la noche con sus fuegos y estrellas como del día con su cascada.
Por cierto, en cuanto al control de los leds, había pensado un previo con un bc337 o similar.

Un saludo y muchas gracias.
Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 15, 2017, 06:11 pm
Bien. Comienza al menos poniendo los dos programas con los pines definitivos e intentaremos unificarlos (porque nos has despertado el espíritu navideño y eso :) ), a condición de que posteriormente nos muestres un vídeo con el resultado.
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 15, 2017, 08:28 pm
Bueno pues los códigos son los mostrados con anterioridad:

El primero es el modificado por noter, es el encargado de los efectos de las estrellas y las fogatas.

Code: [Select]

const int estrellas1 = 2;    // led blanco
const int estrellas2 = 3;   // led blanco
const int llama1 = 5;    // led rojo
const int llama2 = 6;   // led naranja
const int llama3 = 7;   // led naranja
const int llama11 = 8;    // led rojo


void setup() {
    pinMode(estrellas1, OUTPUT);
    pinMode(estrellas2, OUTPUT);
    pinMode(llama1, OUTPUT);
    pinMode(llama2, OUTPUT);
    pinMode(llama3, OUTPUT);
    pinMode(llama11, OUTPUT);

}

void loop() {
  estrellas();
  llamas();
}

void estrellas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(estrellas1, random(5,200));
    analogWrite(estrellas2, random(50,255));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,200);
  }
}

void llamas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(llama1, random(10,220));
    analogWrite(llama2, random(30,255));
    analogWrite(llama3, random(10,255));
    analogWrite(llama11, random(20,240));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,50);
  }
}


El segundo es el encargado de realizar los ciclos día/noche.

Code: [Select]


int dia = 4;    // LED blanco cielo pin d04
int noche=9;   // LED azul cielo pin d09
int casa1=11;    // LED de casa arabe pin d11
int transicion=10;   //LED rojo atardecer
int casa2=12;    // LED de casa pequeña pin d12
int casa3=13;   // LED de casa grande pin d13


void setup()  {
  // nada
}

void loop()  {
  // hacerse de día:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
    if  (fadeValue<255)
    {digitalWrite(transicion,HIGH);}
      else
    {digitalWrite(transicion,LOW);}
    analogWrite(noche,255-fadeValue);
    analogWrite(dia, fadeValue);
    delay(300);

    if (fadeValue<70)
      {digitalWrite (casa1,HIGH);}
      else
      {digitalWrite (casa1,LOW);}
     if (fadeValue<65)
      {digitalWrite (casa2,HIGH);}
      else
      {digitalWrite (casa2,LOW);}  
     if (fadeValue<40)
      {digitalWrite (casa3,HIGH);}
      else
      {digitalWrite (casa3,LOW);}
    
    delay(150);                        
  }
  delay (120000);
  // hacerse de noche:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(dia, fadeValue);
    if (fadeValue>0)
       {digitalWrite(transicion,HIGH);}
       else
       {digitalWrite(transicion,LOW);}
    analogWrite(noche,255-fadeValue);
    delay (300);

    analogWrite(noche,255-fadeValue);
    if (fadeValue<110)
      {digitalWrite (casa1,HIGH);}
      else
      {digitalWrite (casa1,LOW);}
     if (fadeValue<105)
      {digitalWrite (casa2,HIGH);}
      else
      {digitalWrite (casa2,LOW);}  
     if (fadeValue<80)
      {digitalWrite (casa3,HIGH);}
      else
      {digitalWrite (casa3,LOW);}
      
    delay(150);                            
  }
  delay (120000);
}


En cuanto al video no hay problema,nada mas tenga el montaje hecho lo subo.

Y si alguno se viene por sevilla lo mismo cae hasta un polvoroncito con su correspondiente copa de anís.

Muchas gracias
Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 16, 2017, 10:28 am
No he podido probarlo, y me gustaría comentarlo un poco para que tenga utilidad; pero para que vayas masticando algo:
Code: [Select]

const int estrellas1 = 2;    // led blanco
const int estrellas2 = 3;   // led blanco
const int estrellas3 = 4;   // led blanco
const int llama1 = 5;    // led rojo
const int llama2 = 6;   // led naranja
const int llama3 = 7;   // led naranja
const int llama11 = 8;    // led rojo
const int llama12 = 9;   // led naranja
const int llama13 = 10;   // led naranja

void setup() {
    pinMode(estrellas1, OUTPUT);
    pinMode(estrellas2, OUTPUT);
    pinMode(estrellas3, OUTPUT);
    pinMode(llama1, OUTPUT);
    pinMode(llama2, OUTPUT);
    pinMode(llama3, OUTPUT);
    pinMode(llama11, OUTPUT);
    pinMode(llama12, OUTPUT);
    pinMode(llama13, OUTPUT);
}

void loop() {
  estrellas();
  llamas();
}

void estrellas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) > siguienteDestello) {
    analogWrite(estrellas1, random(5,200));
    analogWrite(estrellas2, random(50,255));
    analogWrite(estrellas3, random(10,150));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,200);
  }
}

void llamas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) > siguienteDestello) {
    analogWrite(llama1, random(10,220));
    analogWrite(llama2, random(30,255));
    analogWrite(llama3, random(10,255));
    analogWrite(llama11, random(20,240));
    analogWrite(llama12, random(15,250));
    analogWrite(llama13, random(40,150));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,50);
  }
}

Ya me comentarás si hace algo o no ;).
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 16, 2017, 11:34 am
Buenos días, noter, este ultimo código que mandaste si funciona por si solo, de hecho es el que tu me modificaste anteriormente introduciendo en el "millis". El problema viene cuando lo unes al de ciclos día/noche ya que las cadencias del código de estrellas/llamas se relentizan perdiendo su parpadeo original.  Por eso tal y como me pediste, en mi anterior post puse los dos códigos separados, en primer lugar el que tu modificaste,  es decir, este ultimo que has mandado nuevamente  y en segundo lugar el de ciclos día/noche rectificando ambos para adaptarlo, en las salidas necesarias, a un arduino mega.

Gracias
Title: Re: Problemas con efectos de luces para belen
Post by: IgnoranteAbsoluto on Dec 16, 2017, 12:43 pm
Entiendo que las estrellas y las fogatas han de estar "activas" mientras sea de noche. Y que las luces de las casas estén encendidas de noche y apagadas de día. Entiendo que en la transición de la noche al día han de ir apagándose las casas "escalonadamente". Y en la transición del día a la noche las casas se han de encender "escalonadamente".

Pero lo que no tengo claro es qué quieres que hagan las estrellas y las fogatas en las transiciones de noche a día y de día a noche. Así como para qué son las salidas dia, noche y transicion (tal vez las tengas sólo para depurar el programa o tal vez tienen un cometido que no he entendido).

¿Podrías aclararme más detalladamente qué es lo que quieres que haga todo en conjunto?
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 16, 2017, 03:25 pm
Buenos días, voy a intentar aclarar que hace el programa en su conjunto a ver si podéis echarme una manilla.
Al conectar la alimentación de arduino el programa arranca en transición noche/día, en el cual solo están activas las salidas día, noche y transición (en Faded todas ellas) simulando el amanecer. Una vez transcurridos 1' y 15" aproximadamente se termina esa transición quedándose activa solo la salida "día". Pasados 2' comienza la transición día/noche activándose nuevamente las otras dos salidas ( día, que ya estaba, transición y noche, que se hacen activas),  pasados nuevamente 1' y 15" se apagan las salidas transición y día quedándose activa solamente la salida noche. En este periodo de transición día/noche es cuando gradualmente se encienden las estrellas, fogatas y luces de las casas. Pasados de nuevo 2' el programa entra otra vez en transición noche /día finalizando así un ciclo completo. Las estrellas, fogatas y casas están encendidas en la parte del ciclo correspondiente a "noche" y en parte de las dos transiciones, noche/día y día/noche.
Las salidas, día, noche y transición son salidas activas que van a gobernar las tiras de leds de los colores correspondientes con un driver bc337 y un MOSFET irf 530/540.
Eso es lo que quiero que haga.
Uniendo los programas las cadencias de las estrellas y llamas varian dando lugar a un efecto irreal, muy alejado de como actúa el programa en solitario.

Muchas gracias por el interes
Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 16, 2017, 06:31 pm
Perdona, porque me pilló que iba a salir justo y con las prisas adjunté el mismo código de la última vez, sin el amanecer/anochecer.
Este era el código que te quise poner:

Code: [Select]
const int estrellas1 = 2;    // led blanco
const int estrellas2 = 3;   // led blanco
const int dia = 4;    // LED blanco cielo pin d04
const int llama1 = 5;    // led rojo
const int llama2 = 6;   // led naranja
const int llama3 = 7;   // led naranja
const int llama11 = 8;    // led rojo
const int noche=9;   // LED azul cielo pin d09
const int transicion=10;   //LED rojo atardecer
const int casa1=11;    // LED de casa arabe pin d11
const int casa2=12;    // LED de casa pequeña pin d12
const int casa3=13;   // LED de casa grande pin d13

int fadeValue=0;

void setup() {
// iniciamos todos los analógicos apagados
for(int i=2; i<=10; i++) {
analogWrite(i, 0);
}

// Como vamos a iniciar amaneciendo, empezamos con las casas encendidas.
// Al ser también pines PWM, podríamos definir un brillo diferente para
// cada casa con analogWrite en lugar de digitalWrite

for(int i=10; i<=13; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
}
}

void loop() {
ciclodia();
estrellas();
llamas();
}

void ciclodia()  {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=450;
  enum {amaneciendo, dia, anocheciendo, noche} static estado=amaneciendo;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    ultimoDestello += siguienteDestello;
  switch (estado) {
      case amaneciendo:
        fadeValue++;
    analogWrite(noche,255-fadeValue);
    analogWrite(dia, fadeValue);
        if (fadeValue==70) {
        digitalWrite(casa1, LOW);
        }
        else if(fadeValue==65){
            digitalWrite(casa2, LOW);
        }
        else if(fadeValue==40){
            digitalWrite(casa3, LOW);
        }
        else if(fadeValue==255){
            digitalWrite(transicion, LOW);
            estado=dia;
            siguienteDestello = 120000;
        }
        break;
      case dia:
        estado = anocheciendo;
        siguienteDestello=450;
        digitalWrite(transicion, HIGH);
        break;
      case anocheciendo:
        fadeValue--;
    analogWrite(noche,255-fadeValue);
    analogWrite(dia, fadeValue);
        if (fadeValue==110) {
        digitalWrite(casa1, HIGH);
        }
        else if(fadeValue==105){
            digitalWrite(casa2, HIGH);
        }
        else if(fadeValue==80){
            digitalWrite(casa3, HIGH);
        }
        else if(fadeValue==0){
        digitalWrite(transicion, LOW);
            estado=noche;
            siguienteDestello = 120000;
        }
        break;
      case noche:
        estado = amaneciendo;
        siguienteDestello=450;
        digitalWrite(transicion, HIGH);
        break;
    }
  }
}

void estrellas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(estrellas1, random(5,200));
    analogWrite(estrellas2, random(50,255));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,200);
  }
}

void llamas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(llama1, random(10,220));
    analogWrite(llama2, random(30,255));
    analogWrite(llama3, random(10,255));
    analogWrite(llama11, random(20,240));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,50);
  }
}

Te vuelvo a decir lo mismo; que no está probado, así que seguramente tendrá cosas que corregir, pero será a buen seguro buen punto de partida.
Por ejemplo, las estrellas y las llamas están constantemente encendidas, así que habrá que decidir cómo se comportarán durante el amanecer/anochecer.
Ya me contarás.
Saludos.
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 17, 2017, 03:47 pm
Buenas tardes,antes de nada volver a agradeceros la atención y ayuda que me estáis prestando.He montado el circuito al completo con todos sus leds para ver como se comporta el conjunto y os voy a relatar como se actua el código :

Al conectar la alimentación del arduino parpadea 2 veces la salida de la casa 3 y a continuación se activan las salidas: llamas 1,2,3 y 4;estrellas 1 y 2;casas 1,2 y 3;y transición.

Las salidas " llamas " y " estrellas " como bien apuntaba el amigo noter están siempre activas independientemente del punto en que se encuentre el código bien sea día o noche,desde que se conecta la alimentación de la placa no se desactivan nunca .

Por otra parte, las salidas día y noche no se activan nunca,están siempre apagadas.

Otra cosa curiosa es que " transición" entra y sale de forma brusca, es decir, no hay faded en esa salida.

Así que a investigar toca a ver hasta donde puedo llegar.

Gracias y un saludo
Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 17, 2017, 05:32 pm
De lo que comentas, casi todo era lo esperado, menos una cosa. Que "transición" entre y salga de forma brusca se explica porque, al igual que las casas, lo estamos tratando como pin de salida digital (y escribimos HIGH/LOW con digitalWrite). Por ello recomendaba en el comentario ponerlos también como analógicos, para poder definir distintos brillos para cada casa, aunque luego sean fijos y no "centelleantes".
Lo que me mosquea más es que las salidas día y noche estén siempre apagadas, pues estoy casi seguro de que se les está enviando valor analógico ascendente/descendente durante las transiciones.
Vamos a hacer una cosa. Vamos a asignar a "transición" el mismo valor que a "día" a ver si hace o no fade, y dirimir si es problema de soft o de hard.
¡Vale! Acabo de descubrir un desafortunado fallo. He llamadao igual al pin del led dia que a uno de los ciclos. Prueba ahora y me comentas el nuevo comportamiento. Está un poco acelerado el ciclo día/noche, para poder evaluarlo más rápido, pero eso sería fácilmente corregible.

Code: [Select]

const int estrellas1 = 2;    // led blanco
const int estrellas2 = 3;   // led blanco
const int dia = 4;    // LED blanco cielo pin d04
const int llama1 = 5;    // led rojo
const int llama2 = 6;   // led naranja
const int llama3 = 7;   // led naranja
const int llama11 = 8;    // led rojo
const int noche=9;   // LED azul cielo pin d09
const int transicion=10;   //LED rojo atardecer
const int casa1=11;    // LED de casa arabe pin d11
const int casa2=12;    // LED de casa pequeña pin d12
const int casa3=13;   // LED de casa grande pin d13

int fadeValue=0;

void setup() {
// iniciamos todos los analógicos apagados
for(int i=2; i<=9; i++) {
analogWrite(i, 0);
}

// Como vamos a iniciar amaneciendo, empezamos con las casas encendidas.
// Al ser también pines PWM, podríamos definir un brillo diferente para
// cada casa con analogWrite en lugar de analogWrite

for(int i=10; i<=13; i++){
    analogWrite(i, 255); // Analógicas también, pero encendidas al inicio.
}
}

void loop() {
ciclodia();
estrellas();
llamas();
}

void ciclodia()  {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=100;
  enum {amaneciendo, diurno, anocheciendo, nocturno} static estado=amaneciendo;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    ultimoDestello += siguienteDestello;
  switch (estado) {
      case amaneciendo:
        fadeValue++;
      analogWrite(noche,255-fadeValue);
      analogWrite(dia, fadeValue);
          analogWrite(transicion, fadeValue);
        if (fadeValue==70) {
        analogWrite(casa1, 0);
        }
        else if(fadeValue==65){
            analogWrite(casa2, 0);
        }
        else if(fadeValue==40){
            analogWrite(casa3, 0);
        }
        else if(fadeValue==255){
            //analogWrite(transicion, 0);
            estado=diurno;
            siguienteDestello = 12000;
        }
        break;
      case diurno:
        estado = anocheciendo;
        siguienteDestello=100;
        //analogWrite(transicion, 255);
        break;
      case anocheciendo:
        fadeValue--;
      analogWrite(noche,255-fadeValue);
      analogWrite(dia, fadeValue);
          analogWrite(transicion, fadeValue);
        if (fadeValue==110) {
        analogWrite(casa1, 255);
        }
        else if(fadeValue==105){
            analogWrite(casa2, 255);
        }
        else if(fadeValue==80){
            analogWrite(casa3, 255);
        }
        else if(fadeValue==0){
        //analogWrite(transicion, 0);
            estado=nocturno;
            siguienteDestello = 12000;
        }
        break;
      case nocturno:
        estado = amaneciendo;
        siguienteDestello=100;
        //analogWrite(transicion, 255);
        break;
    }
  }
}

void estrellas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(estrellas1, random(5,200));
    analogWrite(estrellas2, random(50,255));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,200);
  }
}

void llamas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(llama1, random(10,220));
    analogWrite(llama2, random(30,255));
    analogWrite(llama3, random(10,255));
    analogWrite(llama11, random(20,240));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,50);
  }
}
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 17, 2017, 06:15 pm
Buenas de nuevo,bueno te explico como se comporta ahora.

Al conectar la alimentación pasan a nivel alto las tres salidas,día,noche y transición.
Transcurrido un tiempo ,de manera gradual se apaga la salida noche quedándose activas las salidas transición y día. Sin llegar a apagarse estas dos ultimas salidas, vuelve a conectarse la salida noche estando otra vez las tres activas. Después de un tiempo comienzan a apagarse de forma gradual las salidas transición y día quedándose a nivel alto solo la salida noche y comenzando un nuevo ciclo.
En definitiva, mientras que están conectadas las salidas transición y día se enciende y apaga 2 veces la salida noche y la salida día en ningún momento esta activa por si sola.
Por un lado esta encendida solo la salida noche en una parte del ciclo y por otra están encendidas a la vez día y transición en otra parte del ciclo.
Los apagados y encendidos ahora mismo si se hacen de manera gradual en todas las salidas
Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 17, 2017, 10:27 pm
Pues hay algo que no me cuadra. Pongo nueva versión esencialmente igual, pero con unas constantes definidas arriba para cambiar fácilmente los parámetros de temporización. No he entendido mucho el cómo se está comportando actualmente en cada ciclo. Nada más conectar, debería iniciar amaneciendo, es decir, "noche" disminuyendo de 255 a 0 y "dia" creciendo de 0 a 255. Prueba a ver el código como está, y después comenta en el loop las llamadas a estrellas() y llamas() y deja sólo la llamada a ciclodia() y me dices cómo hacen las iluminaciones correspondientes. Actualmente "transición" debería comportarse como un espejo de "día".
Code: [Select]

const int DURACION_DIA=12000; // AUMENTAR PARA ALARGAR DURACIÓN DÍA
const int DURACION_NOCHE=12000; // AUMENTAR PARA ALARGAR DURACIÓN NOCHE
const int LAPSO_TRANSICION=50; // AUMENTAR PARA HACER EL AMANECER/ANOCHECER MÁS LENTO

const int estrellas1 = 2;    // led blanco
const int estrellas2 = 3;   // led blanco
const int dia = 4;    // LED blanco cielo pin d04
const int llama1 = 5;    // led rojo
const int llama2 = 6;   // led naranja
const int llama3 = 7;   // led naranja
const int llama11 = 8;    // led rojo
const int noche=9;   // LED azul cielo pin d09
const int transicion=10;   //LED rojo atardecer
const int casa1=11;    // LED de casa arabe pin d11
const int casa2=12;    // LED de casa pequeña pin d12
const int casa3=13;   // LED de casa grande pin d13

int fadeValue=0;

void setup() {
// iniciamos todos los analógicos apagados
for(int i=2; i<9; i++) {
analogWrite(i, 0);
}

// Como vamos a iniciar amaneciendo, empezamos con las casas encendidas.
// Al ser también pines PWM, podríamos definir un brillo diferente para
// cada casa con analogWrite en lugar de analogWrite

for(int i=9; i<=13; i++){
    analogWrite(i, 255); // Analógicas también, pero encendidas al inicio.
}
}

void loop() {
ciclodia();
estrellas();
llamas();
}

void ciclodia()  {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=LAPSO_TRANSICION;
  enum {amaneciendo, diurno, anocheciendo, nocturno} static estado=amaneciendo;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    ultimoDestello += siguienteDestello;
  switch (estado) {
      case amaneciendo:
        fadeValue++;
      analogWrite(noche,255-fadeValue);
      analogWrite(dia, fadeValue);
          analogWrite(transicion, fadeValue);
        if (fadeValue==70) {
        analogWrite(casa1, 0);
        }
        else if(fadeValue==65){
            analogWrite(casa2, 0);
        }
        else if(fadeValue==40){
            analogWrite(casa3, 0);
        }
        else if(fadeValue==255){
            //analogWrite(transicion, 0);
            estado=diurno;
            siguienteDestello = DURACION_DIA;
        }
        break;
      case diurno:
        estado = anocheciendo;
        siguienteDestello=LAPSO_TRANSICION;
        //analogWrite(transicion, 255);
        break;
      case anocheciendo:
        fadeValue--;
      analogWrite(noche,255-fadeValue);
      analogWrite(dia, fadeValue);
          analogWrite(transicion, fadeValue);
        if (fadeValue==110) {
        analogWrite(casa1, 255);
        }
        else if(fadeValue==105){
            analogWrite(casa2, 255);
        }
        else if(fadeValue==80){
            analogWrite(casa3, 255);
        }
        else if(fadeValue==0){
        //analogWrite(transicion, 0);
            estado=nocturno;
            siguienteDestello = DURACION_NOCHE;
        }
        break;
      case nocturno:
        estado = amaneciendo;
        siguienteDestello=LAPSO_TRANSICION;
        //analogWrite(transicion, 255);
        break;
    }
  }
}

void estrellas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(estrellas1, random(5,200));
    analogWrite(estrellas2, random(50,255));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,200);
  }
}

void llamas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(llama1, random(10,220));
    analogWrite(llama2, random(30,255));
    analogWrite(llama3, random(10,255));
    analogWrite(llama11, random(20,240));
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,50);
  }
}


Deberías ir pensando también cómo quieres que se comporten las hogueras y las estrellas de día, y durante el amanecer o anochecer.
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 17, 2017, 10:48 pm
Se pueden subir videos directamente al hilo?
Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 17, 2017, 10:50 pm
No. Deberías subirlos a youtube y poner un vínculo.
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 17, 2017, 11:29 pm
Vamos a ver si puedo explicarme que es lo que hace el codigo:

Comineza amaneciendo con " noche" activa e inmediatamente despues se activan "transicion y dia " de manera gradual. A demas se activan nada mas conectar la alimentacion las casas.

Cuando empiezan a encerder " transicion y dia" las casa comienzan a apagarse de manera gradual.

Pasado un tiempo "noche" se apaga quedandose activas "dia y transicion"

Transcurrido un tiempo "noche" comienza a encenderse otra vez sin que se hayan apagado "transicion y dia"(en este punto "transicion" tendria que haberse apagado hace un rato y haberse quedado solo "dia").
pasado un tiempo,"transicion y dia" se pagan quedandose solo "noche".

En esta parte del ciclo las casa comienzan a encenderse y permanecen encendidas hasta que llega el amanecer nuevamente.

Las llamas y las estrellas estan siempre encendidas,las he comentado y el ciclo dia / noche se comporta de la misma manera que si estuvieran activas.

En cuanto a cuando tendrian que activarse/desactivarse estrellas y fuego,pues el mismo intervalo que casas: anochecer/noche/amanecer.

Espero haberme explicado correctamente.
Title: Re: Problemas con efectos de luces para belen
Post by: IgnoranteAbsoluto on Dec 18, 2017, 12:06 am
Aquí tienen mi propuesta. Ya sé que va a ser un poco complicada de entender, pero no tengo tiempo de explicarla con detalle, sobre todo el uso de las clases y la herencia. Algo de las clases y máquinas de estado lo explico en unas respuestas del post alarma temporizada en un mismo led al presionar un botón (http://forum.arduino.cc/index.php?topic=457984.msg3345618).

He usado las clases y la herencia para definir tres tipos de objetos que heredan de ObjetoLED. Estrella Fogata y Casa. Cada una de las tres clases controla un tipo de elemento. Y todos los elementos son controlados por otra clase, DiaNoche, que se encarga de controlar el día, la noche, el anochecer y el atardecer. Para facilitar el control por parte de DiaNoche de todos los elementos, son todos tratados por igual como ObjetoLED mediante el paso de la referencia del array objetos[ ] que contiene referencia a todos ellos.

Se pueden definir y añadir al array objetos[] tantos elementos como se quiera (siempre que se tengan pines disponibles).

DiaNoche controla también los LED de "día", "noche" y "transición". Internamente controla "la luz del Sol" cuyo valor es 0 cuando es de noche y 255 cuando es de día. Obviamente en la transición del anochecer o el amanecer irá adquiriendo valores entre el 0 y el 255. Uno de los parámetros de cada objeto es luzSolApagado y es el valor que ha de tener "la luz del Sol" para saber en qué momento de las trancisiones se  han de apagar o de encender cada uno.

Las casas se encienden y se apagan, sin más, al anochecer y al amanecer. No "parpadean".

Las estrellas y las fogatas "parpadean" cuando están encendidas. El tiempo de encendido y la intensidad son aleatorios entre unos márgenes que se establecen individualmente para cada una de ellas. Recomiendo poner valores de tiempos pequeños para las fogatas y un poco más grandes para las estrellas.

Las fogatas se encienden y apagan "bruscamente", como las casas. Mientras que las estrellas se encienden y se apagan poco a poco según anochece o amanece.

Se puede configurar el tiempo que dura "el día" y el de "la noche" por separado, con lo que pueden ser diferentes (se supone que en invierno los días son más cortos). También se puede configurar el tiempo que dura el anochecer y el amanecer (estos comparten el valor, así que no pueden ser diferentes).

Espero que esto sirva. Siento no tener tiempo para explicarlo mejor.

Adjunto el código.
Title: Re: Problemas con efectos de luces para belen
Post by: noter on Dec 18, 2017, 12:21 am
Me parece un muy buen enfoque el que has planteado, IgnoranteAbsoluto. No lo he revisado a fondo, pero las clases están inteligentemente enfocadas. Sinceramente, no opté por tu vía porque había un poco de prisa ya, y el código está prácticamente hilvanado. Pondré a continuación las últimas modificaciones:
Code: [Select]

const int DURACION_DIA=12000; // AUMENTAR PARA ALARGAR DURACIÓN DÍA
const int DURACION_NOCHE=12000; // AUMENTAR PARA ALARGAR DURACIÓN NOCHE
const int LAPSO_TRANSICION=50; // AUMENTAR PARA HACER EL AMANECER/ANOCHECER MÁS LENTO

const int estrellas1 = 2;    // led blanco
const int estrellas2 = 3;   // led blanco
const int dia = 4;    // LED blanco cielo pin d04
const int llama1 = 5;    // led rojo
const int llama2 = 6;   // led naranja
const int llama3 = 7;   // led naranja
const int llama11 = 8;    // led rojo
const int noche=9;   // LED azul cielo pin d09
const int transicion=10;   //LED rojo atardecer
const int casa1=11;    // LED de casa arabe pin d11
const int casa2=12;    // LED de casa pequeña pin d12
const int casa3=13;   // LED de casa grande pin d13

int fadeValue=0;
int fadeInverso=255;

void setup() {
// iniciamos todos los analógicos apagados
for(int i=2; i<9; i++) {
analogWrite(i, 0);
}

// Como vamos a iniciar amaneciendo, empezamos con las casas encendidas.
// Al ser también pines PWM, podríamos definir un brillo diferente para
// cada casa con analogWrite en lugar de analogWrite

for(int i=9; i<=13; i++){
    analogWrite(i, 255); // Analógicas también, pero encendidas al inicio.
}
}

void loop() {
ciclodia();
estrellas();
llamas();
}

void ciclodia()  {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=LAPSO_TRANSICION;
  enum {amaneciendo, diurno, anocheciendo, nocturno} static estado=amaneciendo;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    ultimoDestello += siguienteDestello;
  switch (estado) {
      case amaneciendo:
        fadeValue++;
          fadeInverso = 255-fadeValue;
      analogWrite(noche, fadeInverso);
      analogWrite(dia, fadeValue);
          analogWrite(transicion, fadeInverso);
        if (fadeValue==70) {
        analogWrite(casa1, 0);
        }
        else if(fadeValue==65){
            analogWrite(casa2, 0);
        }
        else if(fadeValue==40){
            analogWrite(casa3, 0);
        }
        else if(fadeValue==255){
            estado=diurno;
            siguienteDestello = DURACION_DIA;
        }
        break;
      case diurno:
        estado = anocheciendo;
        siguienteDestello=LAPSO_TRANSICION;
        break;
      case anocheciendo:
        fadeValue--;
          fadeInverso = 255-fadeValue;
      analogWrite(noche, fadeInverso);
      analogWrite(dia, fadeValue);
          analogWrite(transicion, fadeValue);
        if (fadeValue==110) {
        analogWrite(casa1, 255);
        }
        else if(fadeValue==105){
            analogWrite(casa2, 255);
        }
        else if(fadeValue==80){
            analogWrite(casa3, 255);
        }
        else if(fadeValue==0){
            estado = nocturno;
            siguienteDestello = DURACION_NOCHE;
        }
        break;
      case nocturno:
        estado = amaneciendo;
        siguienteDestello = LAPSO_TRANSICION;
        break;
    }
  }
}

void estrellas() {
  static unsigned long ultimoDestello = 0;
  static unsigned long siguienteDestello = 0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(estrellas1, map(random(5,200), 0, 255, 0, fadeInverso) );
    analogWrite(estrellas2, map(random(50,225), 0, 255, 0, fadeInverso) );
    ultimoDestello += siguienteDestello;
    siguienteDestello = random(1,200);
  }
}

void llamas() {
  static unsigned long ultimoDestello=0;
  static unsigned long siguienteDestello=0;
  if ((millis()-ultimoDestello) >= siguienteDestello) {
    analogWrite(llama1, map(random(10,220), 0, 255, 0, fadeInverso) );
    analogWrite(llama2, map(random(30,255), 0, 255, 0, fadeInverso) );
    analogWrite(llama3, map(random(10,255), 0, 255, 0, fadeInverso) );
    analogWrite(llama11, map(random(20,240), 0, 255, 0, fadeInverso) );
    ultimoDestello+=siguienteDestello;
    siguienteDestello = random(1,50);
  }
}

No obstante, animo a @elpilas a que pruebe ambos códigos, y continuar a partir del que le parezca más próximo a sus fines.
Title: Re: Problemas con efectos de luces para belen
Post by: elpilas on Dec 18, 2017, 08:42 pm
Buenas noches,antes de nada agradeceros a todos los que de una u otra forma me habéis ayudado,en especial al compañero noter por su paciencia conmigo.
En cuanto a los códigos.... no se cual empleare al final, la verdad es que da igual ya que ambos funcionan a la perfección tal y como necesito.
Ahora me pondré con las compras de los materiales y el montaje.Voy tarde,lo se, pero no quería liarme con eso hasta no tener listo lo del código.Gracias a vosotros por fin esta listo

En cuanto lo termine subiré vídeo con los resultados.

Gracias de nuevo.

Saludos