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:
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.