Come unire questi due sketch?

Ciao a tutti, è da qualche giorno che mi sto scervellando per cercare di capire come fare ad unire questi due sketch, attualmente installati su due arduini 2009 diversi, per far sì che possa utilizzare un solo arduino.

Si tratta un progettino per un presepe, composto da 8 casette ed un faro.
L’arduino n.1 si occupa delle case, e fa si che accende e spegne in maniera random e con tempo random un led per ogni casa:

long ledrandom;
long timerandom;



void setup() {                
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);  
  pinMode(4, OUTPUT);  
  pinMode(5, OUTPUT);  
  pinMode(6, OUTPUT);  
  pinMode(7, OUTPUT);  
  pinMode(8, OUTPUT);  
  pinMode(9, OUTPUT);  
  Serial.begin(9600);

  randomSeed(analogRead(0)); 
}

void loop() {
  ledrandom = random(2, 10);
  digitalWrite(ledrandom, HIGH);   // set the LED on
  timerandom = random(1000, 5000);
  ledrandom = random(2, 10);  // set the LED on
  delay(timerandom); 
digitalWrite(ledrandom, LOW);
  
}

Mentre l’arduino n.2 si occupa di simulare la luce di un faro:

int br = 0;    

void setup()  { 
  pinMode(9, OUTPUT);
} 

void loop()  { 
  for (int br=0; br <70; br=br+1){
  analogWrite(9, br);
  delay(40);
 
  } 
  
  
  for (int br=70; br <255; br=br+3){
  analogWrite(9, br);
  delay(5);
 
  }
  
  
  delay(300);
 
  for (int br=255; br>70; br=br-3){
  analogWrite(9, br);
  delay(5);
  
  } 
  
  for (int br=70; br>0; br=br-1){
  analogWrite(9, br);
  delay(40);
  
  }  
  
  
}

Il massimo sarebbe anche aggiungere un controllo “primario” della luminosità ambientale tramite fotoresistenza che se c’è luce ambientale sia il faro che le casette rimangono spente, mentre al buio si accende tutto automaticamente…
Mi aiutereste a capire come unire i due sketch?

Grazie infinite!

Innanzitutto inizia con il cambiare il pin 9 che è in comune ad entrambi gli sketch e sostituisci tutti i delay con millis. Ti consiglio di fare queste modifiche prima di unire gli sketch. Una volta che il tutto ti funziona come ti funziona attualmente, sei pronto per unirli.

Per quale motivo dovrei sostituire i delay con millis?

grazie

Per avere una sorta di contemporaneità dei due sketch. Altrimenti ad esempio nel primo sketch se hai il delay(timerandom) che aspetta per poi far spegnere la luce, significa che tutto il programma aspetta quindi il tuo faro non funzionarà. Cerca millis() vedi che ci sono moltissime discussioni.

Ecco…ho partorito! :slight_smile:
ho imparato ad usare la funzione millis, però non ho ancora abbandonato completamente la funzione delay…
in compenso ora funziona tutto in un’unico sketch, in aggiunta ho messo anche il comando per la fotoresistenza!!!

Potete vedere se c’è qualcosa che posso migliorare, per favore? graziee!!

long caso;
long timerandom;
long previousMills = 0;
int br = 0;
int photocellPin = 0;   
int photocellReading;

void setup(void) {     
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);  
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);  
  pinMode(6, OUTPUT);  
  pinMode(7, OUTPUT);  
  pinMode(8, OUTPUT);  
  pinMode(9, OUTPUT);  
 
}


void loop(void) {
  photocellReading = analogRead(photocellPin);  
  if (photocellReading <300)
   {
     accenditutto();
   }
   
   else {
     spegnitutto();
   }
  
}

void spegnitutto()
{  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
}

void accenditutto()
{
  if (millis() -  previousMills > timerandom ){
    previousMills = millis();
    timerandom=random(2000, 6000);
    accendi(); 
    spegni();  
    faro(); 
    }
     
}
 
void accendi()
{
  caso=random(4,10);
  Serial.println(caso);
  Serial.println(timerandom);
  digitalWrite(caso, HIGH);
}
  
void spegni()
{
  caso=random(4,10);
  digitalWrite(caso, LOW);
}

void faro()  { 
  for (int br=0; br <70; br=br+1){
  analogWrite(10, br);
  delay(40);
 
  } 
  
  
  for (int br=70; br <255; br=br+3){
  analogWrite(10, br);
  delay(5);
 
  }
  
  
  analogWrite(11,255);
  delay(300);
  analogWrite(11,5);
  
  
  for (int br=255; br>70; br=br-3){
  analogWrite(10, br);
  delay(5);
  
  } 
  
  for (int br=70; br>0; br=br-1){
  analogWrite(10, br);
  delay(40);
  
  }  
  
  
}

Sicuramente un paio di cose:

  1. non usare tipi esageratamente grandi per variabili che dovranno contenere valori molto inferiori. Ad esempio dichiari “caso” di tipo long, ossia un intero lungo 4 byte, quando caso conterrà al max un valore da 4 a 10 (caso=random(4,10);). Basta un tipo byte, grande appunto 1 solo byte.

  2. visto che i pin sono in fila dal 4 al 10 è inutile scrivere 7 volte le dichiarazioni dell’inizializzazione dei pin nel setup() e in spegnitutto(). Basta un ciclo for:

for (byte i=4; i<11; i++) { pinMode(i, OUTPUT); }

e

for (byte i=4; i<11; i++) { digitalWrite(i, LOW); }
  1. quando si usa la funzione millis() si usa sempre un tipo unsigned long, non un tipo long. Altrimenti potresti avere problemi nei valori sul lungo periodo.

Altro non mi viene in mente perché non so cosa vuoi fare.