fare funzionare due sketch in uno

Buon giorno a tutti . Vorrei chiedervi la soluzione al mio problema , premetto che ho poca dimestichezza con il linguaggio C ,ho copiato lo sketch centralina alba tramonto e le canzoni natalizie con effetti e telecomando. Volevo utilizzare entrambi gli sketch con una sola scheda Arduino Mega e lo scopo è di voler inserire ad ogni fase del giorno cioè :
-tramonto comandare uno o due relè per il periodo della fase
-giorno fare suonare una canzone natalizia e cosi via

Lo sketch completo risulta compilato correttamente, come potete vedere dall'allegato, mio problema è quando vado ad eseguire il programma la centralina dell'alba tramonto ecc funziona mentre non avviene la ricezione del telecomando quindi relè e canzoni natalizie non funzionano.
Vorrei il vostro illuminato aiuto per il piacere di realizzare il presepe automatizzato per i miei nipoti.
Grazie

presepe_rele_musica_effetti_telec.ino (13.4 KB)

Ciao, quali sono i 2 sketch che dovresti unire?
Separatamente funzionavano?

Perchè usi pulsein() per leggere un IR invece della IRremote?
pulsein() blocca lo sketch per 1 sec in attesa di un impulso, nel tuo loop() ci sono troppi delay(), finchè non finiscono le melodie il tuo IR non è in ascolto

Ti consiglio di applicare prima lo sketch delle melodie e delle luci e inserire IRremote nel loop() sempre in ascolto

Il programma è bello lungo..difficile da dire subito, comunque credo che il problema sia quello accennato da Pablos: c'è solo una breve finestra in cui lo skecth relamente sta in ascolto dell'ir per cui probabilmente si perde il segnale.
Le uniche cose che mi vengono in mente sono:

  • mettere un interrupt sul pin dell'ir, in modo che quando sente un fronte sull'IO interrompe il main loop ed esegue la lettura dell'ir (però attenzione: mentre sei dentro l'interrupt non sono sicuro che funzioni come delay e pulseIn funzionino correttamente.. occorre verificare)

  • nel main loop, sostituire ai delay una funzione che oltre a fare il delay rimanga in ascolto dell'ir:

void DelayIR(unsigned long timedelay)
{
unsigned long inittime = mills();

while (mills() - inittime < timedelay)
{
ir();
}

}

Magari in questo modo i tempi non saranno precisissimi, ma non mi sembra l'applicazione sia molto critica su questo

Grazie per le vostre risposte. I due sketch singolarmente funzionano perfettamente .Ho usato anche IRremote ma ottengo lo stesso risultato.Per quanto riguarda il delay e ti riferisci al delay timestep sono necessari per la dissolvenza della prima fase alba e inizio del giorno.La ricezione mi serve anche per comandare dei rele che dovrebbero far accendere la luce fiamma cascata fontana ecc.tutto questo durante il tempo che avviene l'alba o il giorno o il tramonto o la sera.Quindi quel void DelayIR deve essere inserito in ogni passaggio di una fase e l'altra?
Grazie

Usando dei cicli di controllo realizzati con millis, al posto dei delay, avresti uno sketch senza blocchi (ma tocca scrivere piu codice, perche' ogni "delay" deve essere sostituito da un doppio ciclo if con set del tempo di millis all'istante di avvio e relative istruzioni di controllo dei tempi, piu ovviamente il flag che dica al ciclo cosa fare)

Caro Etern ,come ho dichiarato dall'inizio non sono tanto bravo con il linguaggio , per favore puoi essere più semplice vorrei capire meglio cioè devo al posto delaystep usare if riceve segnale e mettere millis come attesa ,ho capito bene o sbaglio se per cortesia puoi fare un esempio .Grazie per la vostra pazienza per sopportare noi piccoli profani

Uhm, no, e' un po piu complesso (ma fattibile) ...

In pratica, quando tu usi un'istruzione delay, ad esempio "delay(100)", lo sketch non fa altro che "fermarsi" per 100 millisecondi, quindi in quel tempo non fa niente altro ...

Se vuoi che lo sketch continui a funzionare anche mentre ci sono quei tempi di attesa, devi usare la funzione millis(), insieme a dei cicli if ... ovviamente, l'istruzione o le istruzioni che dipendono dal delay, saranno condizionate dal relativo ciclo if che lo sostituisce ... ad esempio, se usi

delay (100);
digitalWrite(pin, HIGH)

per accendere un'uscita dopo 100 millisecondi, per usare millis devi impostare una variabile con il valore di millis() nel momento in cui deve iniziare il ritardo, e poi controllare con un ciclo if se il tempo e' trascorso, ed eseguire le istruzioni quando e' trascorso (quindi servono anche una variabile, chiamala tempo, per impostarne il valore all'inizio, ed un flag, chiamalo stato, per sapere cosa fare) ...

Giusto come esempio di base (perche' se ti dico troppo poi Guglielmo mi sgrida ... scherzo :P) ... uno dei modi in cui potrebbe essere scritta ... (pseudocodice)

if (stato == 0) { //se il ritardo non e' ancora iniziato
   tempo = millis(); //setta variabile tempo
   stato = 1;} //setta flag per dire al ciclo che ora il ritardo e' iniziato
else if (stato == 1) { //se il ritardo e' iniziato
   if ((millis() - tempo) >= 100 { //quando i 100 ms sono passati
      ... istruzioni da eseguire dopo i 100 millisecondi ...  //esegui le istruzioni
      stato = 0; //resetta flag
   }
}

E' decisamente piu lunga e complessa che scrivere semplicemente delay(100) , lo so ... ma in questo modo, usando ovviamente diverse coppie di variabili per tempo e stato, e' possibile eseguire ritardi con tempi diversi contemporaneamente ed indipendentemente, ed allo stesso tempo all'interno del loop continuare a leggere ingressi, fare calcoli, attivare uscite, o altre operazioni, mentre con delay non si puo fare, perche' ad ogni singolo delay lo sketch si ferma completamente finche' non e' trascorso il tempo, bloccando anche tutto il resto ...

Grazie Etemenanki ,spero di poter risolvere il problema ora non resta che studiare bene le tue informazioni e renderli realizzabili. Chi lo doveva dire che alla mia età devo di nuovo studiare ma va bene cosi , anzi sono dieci mesi che ho acquistato Arduino e mi sto appassionando moltissimo.Spero che una volta corretto lo sketch potrai ancora aiutarmi.Di nuovo Grazie

Buongiorno a tutti , Ete ho preso in considerazione il tuo suggerimento e ho inserito nella prima parte dello sketch al posto del delay le due vaiabili una esisteva (timestep) e lo stato.Ma quando faccio la compilazione mi da errore dicendomi le parentesi non vanno prima del if. Non riesco a risolvere perchè tolgo rimetto non so cosa fare.Ti allego la prima parte con gli errori.Fammi capire cosa sbaglio e se il suggerimento è stato recepito da me.Grazie Giuseppe.

#include <Tone.h>
Tone tone1;
byte p5 = 32;
byte p4 =34;
byte p3= 36;
byte p2 = 38;
byte p6 = 40;
byte p7 = 42;
byte p8 = 44;
int RELAY_PIN1 = 2;
int RELAY_PIN2 = 7;
int RELAY_PIN3 = 12;
int RELAY_PIN4 = 22;
int RELAY_PIN5 = 24;
int RELAY_PIN6 = 26;
int RELAY_PIN7= 28;
int RELAY_PIN8 = 30;
byte contatore = 0;
byte current_pin = 0;
long test;
#define OCTAVE_OFFSET 0
int pinData= 11; // pin sensore ir
unsigned long time;
unsigned long lengthHeader;
unsigned long bit;
int byteValue;
unsigned stato;

int notes[] = { 0, NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};

#define isdigit(n) (n >= '0' && n <= '9')
#define pin_down 3
#define pin_sun 5
#define pin_sunset 6
#define pin_moon 9
#define pin_starsA 10

#define pin_pot A0

int oneminrome[4] = { 4194,22958,4195,28651 };
int oneminbtlm[4] = { 3668,25189,3668,27474 };
int timeStepOld = 0;
int timeStep = 0;

long timeCurr = 0;

byte fade[] = {255,250,245,240,235,230,225,220,215,210,205,200,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0}; // 52 step
byte curr = 0;

void setup() {
Serial.begin( 9600 );
pinMode( pin_down ,OUTPUT );
pinMode( pin_sun ,OUTPUT );
pinMode( pin_sunset,OUTPUT );
pinMode( pin_moon ,OUTPUT );
pinMode( pin_starsA,OUTPUT );
timeStep=millis();
pinMode( pin_pot, INPUT );

analogWrite( pin_down ,LOW );
analogWrite( pin_sun ,LOW );
analogWrite( pin_sunset,LOW );
analogWrite( pin_moon ,LOW );
analogWrite( pin_starsA,LOW );
tone1.begin(13);
pinMode (RELAY_PIN1,OUTPUT);
pinMode (RELAY_PIN2,OUTPUT);
pinMode (RELAY_PIN3,OUTPUT);
pinMode (RELAY_PIN4,OUTPUT);
pinMode (RELAY_PIN5,OUTPUT);
pinMode (RELAY_PIN6,OUTPUT);
pinMode (RELAY_PIN7,OUTPUT);
pinMode (RELAY_PIN8,OUTPUT);

digitalWrite (RELAY_PIN1,HIGH);
digitalWrite (RELAY_PIN2,HIGH);
digitalWrite (RELAY_PIN3,HIGH);
digitalWrite (RELAY_PIN4,HIGH);
digitalWrite (RELAY_PIN5,HIGH);
digitalWrite (RELAY_PIN6,HIGH);
digitalWrite (RELAY_PIN7,HIGH);
digitalWrite (RELAY_PIN8,HIGH);

Serial.println("-- START --");
}

void loop() {
timeStep=millis();
timeCurr = oneminrome[curr];

int pot = analogRead( pin_pot );
if ( 128 <= pot && pot <= 255 ) { timeCurr = (timeCurr * 2 ); } // two min
if ( 256 <= pot && pot <= 382 ) { timeCurr = (timeCurr * 5 ); } // five min
if ( 383 <= pot && pot <= 510 ) { timeCurr = (timeCurr * 10 ); } // ten min
if ( 511 <= pot && pot <= 637 ) { timeCurr = (timeCurr * 15 ); } // fifteen min
if ( 638 <= pot && pot <= 765 ) { timeCurr = (timeCurr * 20 ); } // twenty min
if ( 766 <= pot && pot <= 892 ) { timeCurr = (timeCurr * 25 ); } // twenty five min
if ( 893 <= pot && pot <= 1023 ) { timeCurr = (timeCurr * 30 ); } // thirty min
timeStep = (timeCurr/52);

//Serial.print("Selettore: "); Serial.println(pot);
Serial.print("Current: "); Serial.println(curr);
Serial.print("Time current: "); Serial.println(timeCurr);
Serial.print("Time single step: "); Serial.println(timeStep);

// down
if ( curr == 0 ) {
Serial.print("Fase: "); Serial.println("DOWN");
for ( int i=0; i<52; i++) {
analogWrite(pin_down, fade[(51-i)]);
analogWrite(pin_sun, 0 );
analogWrite(pin_sunset, 0 );
analogWrite(pin_moon, 0 );
analogWrite(pin_starsA, 0 );
if (stato == 0) { //se il ritardo non e' ancora iniziato
timeStep = millis(); //setta variabile tempo
stato = 1;} //setta flag per dire al ciclo che ora il ritardo e' iniziato
else if (stato == 1) { //se il ritardo e' iniziato
if ((millis() - timeStep) >= 806{ //quando i 100 ms sono passati
digitalWrite (RELAY_PIN3,HIGH);
digitalWrite (RELAY_PIN6,LOW);
digitalWrite (RELAY_PIN5,LOW); // ... istruzioni da eseguire dopo i 100 millisecondi ... //esegui le istruzioni
stato = 0; //resetta flag
}
}

}

}

Arduino:1.6.4 (Windows 7), Scheda:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Uso la libreria Tone nella cartella: C:\Users\Giuseppe\Documents\Arduino\libraries\Tone (legacy)

C:\Program Files\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -IC:\Program Files\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files\Arduino\hardware\arduino\avr\variants\mega -IC:\Users\Giuseppe\Documents\Arduino\libraries\Tone C:\Users\Giuseppe\AppData\Local\Temp\build7517881731082121046.tmp\sketch_oct22d.cpp -o C:\Users\Giuseppe\AppData\Local\Temp\build7517881731082121046.tmp\sketch_oct22d.cpp.o

sketch_oct22d.ino: In function 'void loop()':
sketch_oct22d.ino:127:36: error: expected ')' before '{' token
sketch_oct22d.ino:133:1: error: expected primary-expression before '}' token
sketch_oct22d.ino:133:1: error: expected ';' before '}' token
expected ')' before '{' token

Scusate ho risolto era un banale errore ci sono voluti due giorni per vederlo sono un ba...........
comunque vorrei sapere come ho scritto funziona.Grazie

Aiuto mi sto perdendo in un bicchiere d'acqua , sto provando con un solo sketch funzionante e ho sostituito il delay con millis() ma c'è un errore di sintassi che non riesco a corregere.Questo è lo sketch:


/**********************************************************

  • Centralina Alba-Tramonto per presepe
  • Created on 12 december 2014
  • Modified on 15 decebre 2014
  • by Mauro Alfieri
  • web: mauroalfieri.it
  • Twitter: @mauroalfieri
    /**********************************************************/

#define pin_down 3
#define pin_sun 5
#define pin_sunset 6
#define pin_moon 9
#define pin_starsA 10
#define pin_starsB 11
int RELAY_PIN3 = 12;
int RELAY_PIN5 = 24;
int RELAY_PIN6 = 26;
int oneminrome[4] = { 4194,22958,4195,28651 };
int oneminbtlm[4] = { 3668,25189,3668,27474 };
int timeStepOld = 0;
int timeStep = 0;

long timeCurr = 0;

byte fade[] = {255,250,245,240,235,230,225,220,215,210,205,200,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0}; // 52 step
byte curr = 0;

void setup() {
Serial.begin( 9600 );

pinMode( pin_down ,OUTPUT );
pinMode( pin_sun ,OUTPUT );
pinMode( pin_sunset,OUTPUT );
pinMode( pin_moon ,OUTPUT );
pinMode( pin_starsA,OUTPUT );
pinMode( pin_starsB,OUTPUT );
pinMode (RELAY_PIN3,OUTPUT);
pinMode (RELAY_PIN5,OUTPUT);
pinMode (RELAY_PIN6,OUTPUT);
analogWrite( pin_down ,LOW );
analogWrite( pin_sun ,LOW );
analogWrite( pin_sunset,LOW );
analogWrite( pin_moon ,LOW );
analogWrite( pin_starsA,LOW );
analogWrite( pin_starsB,LOW );
digitalWrite (RELAY_PIN3,HIGH);
digitalWrite (RELAY_PIN5,HIGH);
digitalWrite (RELAY_PIN6,HIGH);

Serial.println("-- START --");
}

void loop() {
timeCurr = oneminrome[curr];
timeStep = (timeCurr/52);

Serial.print("Current: "); Serial.println(curr);
Serial.print("Time current: "); Serial.println(timeCurr);
Serial.print("Time single step: "); Serial.println(timeStep);

// down

if ( curr == 0 ) {
Serial.print("Fase: "); Serial.println("DOWN");
for ( int i=0; i<52; i++) {
analogWrite(pin_down, fade[(51-i)]);
analogWrite(pin_sun, 0 );
analogWrite(pin_sunset, 0 );
analogWrite(pin_moon, fade );
analogWrite(pin_starsA, fade );
analogWrite(pin_starsB, fade );
* timeCurr=millis(); *

* if ((millis() - timeStep) >= 80 ){ //quando i 100 ms sono passati*

* digitalWrite (RELAY_PIN3,LOW);
digitalWrite (RELAY_PIN6,LOW);
digitalWrite (RELAY_PIN5,LOW);// ... istruzioni da eseguire dopo i 100 millisecondi ... //esegui le istruzioni*

* timeStepOld=timeStep;*
* }*
*} *
* }*
* } *

* // sun*
* if ( curr == 1 ) {*

* Serial.print("Fase: "); Serial.println("SUN");*
* for ( int i=0; i<52; i++) {*
analogWrite(pin_down, fade*);
if ( fade < 125) analogWrite(pin_sun, fade[(51-i)]2 );
analogWrite(pin_sunset, 0 );

* analogWrite(pin_moon, 0 );
analogWrite(pin_starsA, 0 );
analogWrite(pin_starsB, 0 );
_ timeCurr=millis();
if ((millis() - timeStep) >= 441 ){ //quando i 100 ms sono passati*_

* digitalWrite (RELAY_PIN3,HIGH);
digitalWrite (RELAY_PIN6,HIGH);
digitalWrite (RELAY_PIN5,HIGH);// ... istruzioni da eseguire dopo i 100 millisecondi ... //esegui le istruzioni*

* }*
_ timeStepOld = (timeStepOld52); // elapsed time_
_ timeCurr = (timeCurr - timeStepOld);*_

* }*
}
}
* // sunset*

* if ( curr == 2 ) {*
* Serial.print("Fase: "); Serial.println("SUNSET");*
* for ( int i=0; i<52; i++) {*
* analogWrite(pin_down, 0);
analogWrite(pin_sun, fade );
analogWrite(pin_sunset, fade[(51-i)] );
analogWrite(pin_moon, 0 );
analogWrite(pin_starsA, 0 );
analogWrite(pin_starsB, 0 );
_ timeCurr=millis(); *_

* if ((millis() - timeStep) >= 80 ){ //quando i 100 ms sono passati*
* digitalWrite (RELAY_PIN3,HIGH);
digitalWrite (RELAY_PIN6,HIGH);
digitalWrite (RELAY_PIN5,HIGH);// ... istruzioni da eseguire dopo i 100 millisecondi ... //esegui le istruzioni*

* }*
* timeStepOld = timeStep;*
* }*
* }*
* }*
* // moon*

* if ( curr == 3 ) {*
* Serial.print("Fase: "); Serial.println("MOON");*
* for ( int i=0; i<52; i++) {*
* analogWrite(pin_down, 0);
analogWrite(pin_sun, 0 );
analogWrite(pin_sunset, fade );
if ( fade < 125) analogWrite(pin_moon, fade[(51-i)]2 );
if ( fade < 125) analogWrite(pin_starsA, fade[(51-i)]2 );
if ( fade < 125) analogWrite(pin_starsB, fade[(51-i)]2 );
_ timeCurr=millis();
if ((millis() - timeStep) >= 441 ){ //quando i 100 ms sono passati_

digitalWrite (RELAY_PIN3,HIGH);

* digitalWrite (RELAY_PIN6,HIGH);
digitalWrite (RELAY_PIN5,HIGH);// ... istruzioni da eseguire dopo i 100 millisecondi ... //esegui le istruzioni*

* } *
_ timeStepOld = (timeStepOld52); // elapsed time
timeCurr = (timeCurr - timeStepOld); *_

* } *
* curr++;*
* if ( curr >= 4 ) { curr = 0; }*
}
}
}
questo è l'errore:
Arduino:1.6.4 (Windows 7), Scheda:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
C:\Program Files\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -IC:\Program Files\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files\Arduino\hardware\arduino\avr\variants\mega C:\Users\Giuseppe\AppData\Local\Temp\build1623999446390223797.tmp\sketch_oct26a.cpp -o C:\Users\Giuseppe\AppData\Local\Temp\build1623999446390223797.tmp\sketch_oct26a.cpp.o
sketch_oct26a.ino:91:3: error: expected unqualified-id before 'if'
expected unqualified-id before 'if'

Ce n'è più di uno di errori in quello sketch... Un bel pò di graffe chiuse in più sparse e poi confronti fra array (fade) e int... Ti ci ho dato una sistemata non ho guardato la logica, quella la devi controllare te, però almeno compila

/**********************************************************
 * Centralina Alba-Tramonto per presepe
 *
 * Created on 12 december 2014
 * Modified on 15 decebre 2014
 *
 * by Mauro Alfieri
 * web:    mauroalfieri.it
 * Twitter: @mauroalfieri
/**********************************************************/

#define pin_down   3
#define pin_sun    5
#define pin_sunset 6
#define pin_moon   9
#define pin_starsA 10
#define pin_starsB 11
const byte RELAY_PIN3 = 12;
const byte RELAY_PIN5 = 24;
const byte RELAY_PIN6 = 26;
int oneminrome[4] = { 4194, 22958, 4195, 28651 };
int oneminbtlm[4] = { 3668, 25189, 3668, 27474 };
int timeStepOld = 0;
int timeStep = 0;

long timeCurr = 0;

byte fade[]  = {255, 250, 245, 240, 235, 230, 225, 220, 215, 210, 205, 200, 195, 190, 185, 180, 175, 170, 165, 160, 155, 150, 145, 140, 135, 130, 125, 120, 115, 110, 105, 100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0}; // 52 step
byte curr   = 0;

void setup() {
  Serial.begin( 9600 );

  pinMode( pin_down  , OUTPUT );
  pinMode( pin_sun   , OUTPUT );
  pinMode( pin_sunset, OUTPUT );
  pinMode( pin_moon  , OUTPUT );
  pinMode( pin_starsA, OUTPUT );
  pinMode( pin_starsB, OUTPUT );
  pinMode (RELAY_PIN3, OUTPUT);
  pinMode (RELAY_PIN5, OUTPUT);
  pinMode (RELAY_PIN6, OUTPUT);
  analogWrite( pin_down  , LOW );
  analogWrite( pin_sun   , LOW );
  analogWrite( pin_sunset, LOW );
  analogWrite( pin_moon  , LOW );
  analogWrite( pin_starsA, LOW );
  analogWrite( pin_starsB, LOW );
  digitalWrite (RELAY_PIN3, HIGH);
  digitalWrite (RELAY_PIN5, HIGH);
  digitalWrite (RELAY_PIN6, HIGH);

  Serial.println("-- START --");
}

void loop() {
  timeCurr = oneminrome[curr];
  timeStep = (timeCurr / 52);

  Serial.print("Current: "); Serial.println(curr);
  Serial.print("Time current: "); Serial.println(timeCurr);
  Serial.print("Time single step: "); Serial.println(timeStep);

  // down

  if ( curr == 0 ) {
    Serial.print("Fase: "); Serial.println("DOWN");
    for ( byte i = 0; i < 52; i++) {
      analogWrite(pin_down,   fade[(51 - i)]);
      analogWrite(pin_sun,    0 );
      analogWrite(pin_sunset, 0 );
      analogWrite(pin_moon,   fade[i] );
      analogWrite(pin_starsA, fade[i] );
      analogWrite(pin_starsB, fade[i] );
      timeCurr = millis();

      if ((millis() - timeStep) >= 80 ) { //quando i 100 ms sono passati

        digitalWrite (RELAY_PIN3, LOW);
        digitalWrite (RELAY_PIN6, LOW);
        digitalWrite (RELAY_PIN5, LOW); // ... istruzioni da eseguire dopo i 100 millisecondi ...  //esegui le istruzioni

        timeStepOld = timeStep;
      }
    }
  }


// sun

if ( curr == 1 ) {

  Serial.print("Fase: "); Serial.println("SUN");
  for ( byte i = 0; i < 52; i++) {
    analogWrite(pin_down,   fade[i]);
    if ( fade[i] < 125) analogWrite(pin_sun,    fade[(51 - i)] * 2 );
    analogWrite(pin_sunset, 0 );
    analogWrite(pin_moon,   0 );
    analogWrite(pin_starsA, 0 );
    analogWrite(pin_starsB, 0 );
    timeCurr = millis();

    if ((millis() - timeStep) >= 441 ) { //quando i 100 ms sono passati
      digitalWrite (RELAY_PIN3, HIGH);
      digitalWrite (RELAY_PIN6, HIGH);
      digitalWrite (RELAY_PIN5, HIGH); // ... istruzioni da eseguire dopo i 100 millisecondi ...  //esegui le istruzioni

    }
    timeStepOld = (timeStepOld * 52); // elapsed time
    timeCurr = (timeCurr - timeStepOld);

  }
}

// sunset

if ( curr == 2 ) {
  Serial.print("Fase: "); Serial.println("SUNSET");
  for ( byte i = 0; i < 52; i++) {
    analogWrite(pin_down,   0);
    analogWrite(pin_sun,    fade[i] );
    analogWrite(pin_sunset, fade[(51 - i)] );
    analogWrite(pin_moon,   0 );
    analogWrite(pin_starsA, 0 );
    analogWrite(pin_starsB, 0 );
    timeCurr = millis();

    if ((millis() - timeStep) >= 80 ) { //quando i 100 ms sono passati
      digitalWrite (RELAY_PIN3, HIGH);
      digitalWrite (RELAY_PIN6, HIGH);
      digitalWrite (RELAY_PIN5, HIGH); // ... istruzioni da eseguire dopo i 100 millisecondi ...  //esegui le istruzioni

    }
    timeStepOld = timeStep;
  }
}

// moon

if ( curr == 3 ) {
  Serial.print("Fase: "); Serial.println("MOON");
  for ( byte i = 0; i < 52; i++) {
    analogWrite(pin_down,   0);
    analogWrite(pin_sun,    0 );
    analogWrite(pin_sunset, fade[i] );
    if ( fade[i] < 125) analogWrite(pin_moon,   fade[(51 - i)] * 2 );
    if ( fade[i] < 125) analogWrite(pin_starsA, fade[(51 - i)] * 2 );
    if ( fade[i] < 125) analogWrite(pin_starsB, fade[(51 - i)] * 2 );
    timeCurr = millis();
    if ((millis() - timeStep) >= 441 ) { //quando i 100 ms sono passati
      digitalWrite (RELAY_PIN3, HIGH);
      digitalWrite (RELAY_PIN6, HIGH);
      digitalWrite (RELAY_PIN5, HIGH); // ... istruzioni da eseguire dopo i 100 millisecondi ...  //esegui le istruzioni

    }
    timeStepOld = (timeStepOld * 52); // elapsed time
    timeCurr = (timeCurr - timeStepOld);

  }
  curr++;
  if ( curr >= 4 ) {
    curr = 0;
  }
}
}

Grazie Marinaio ,ma comunque non va.Vuol dire che userò due schede per far funzionare i due scketch.