Go Down

Topic: Problemas con efectos de luces para belen (Read 2652 times) previous topic - next topic

elpilas

Dec 08, 2017, 09:22 pm Last Edit: Dec 08, 2017, 10:51 pm by elpilas
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]

surbyte

#1
Dec 08, 2017, 10:43 pm Last Edit: Dec 08, 2017, 10:44 pm by surbyte
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

noter

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.

surbyte

#3
Dec 09, 2017, 04:37 am Last Edit: Dec 09, 2017, 04:38 am by surbyte
Yo puse las etiquetas, no el autor del hilo.

elpilas

#4
Dec 09, 2017, 09:07 am Last Edit: Dec 09, 2017, 09:16 am by elpilas
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.

surbyte

Bueno me da gusto. Verás que cuando retomes estarás con mejores armas.

ENGRAL

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 !!!!



elpilas

#7
Dec 11, 2017, 09:54 pm Last Edit: Dec 11, 2017, 10:02 pm by elpilas
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);
}]

elpilas

#8
Dec 11, 2017, 10:02 pm Last Edit: Dec 11, 2017, 10:16 pm by elpilas
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.

ENGRAL

#9
Dec 13, 2017, 11:34 am Last Edit: Dec 13, 2017, 01:16 pm by ENGRAL
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.

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 !!!


.

surbyte

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!!!

ENGRAL

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 !!!!

surbyte

#12
Dec 13, 2017, 05:44 pm Last Edit: Dec 13, 2017, 05:49 pm by surbyte
No hace falta busca AC Phase control circuit en el buscador. A ese sitio te voy a remitir.
En documentación también hay comentrios al respecto.


noter

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.

elpilas

#14
Dec 15, 2017, 12:55 pm Last Edit: Dec 15, 2017, 01:34 pm by elpilas
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.

Go Up