Go Down

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

noter

#30
Dec 18, 2017, 12:21 am Last Edit: Dec 18, 2017, 12:27 am by noter Reason: Pequeña corrección
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.

elpilas

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

Go Up