[Prime armi] Lampeggiamento indipendente di LED

salve, premetto che mi sto avvicinando adesso ad arduino: sono pochi giorni che ci smanetto un po' dopo che mi sono comprato la scheda e il kit base^^
Vorrei provare a fare uno sketch che mi faccia lampeggiare due Leds in modo indipendente: uno che lampeggia ogni mezzo secondo, e uno che lampeggia ogni 2 secondi. I collegamenti sono giusti, ma essendoci una sola funzione loop giustamente se faccio aspettare due secondi a uno con un delay aspetta pure l'altro. qualcuno mi può consigliare una soluzione? grazie 1000 in anticipo^^

Quello che dici tu e' corretto se utilizzi la funzione delay().
Quello che ti serve e' il millis, troverai nel tuo ide di arduino un esempio che se non ricordo male si chiama blink without delay.

Sostanzialnente non devi fare altro che prendere quello sketch, raddoppiare la parte di blink creando qualche nuova variabile per contenere i tuoi dati (tipo 1000 e 2000 per i millisecondi tra un blink e l'altro) e via!

Fede

non avevo ancora letto la risposta e ho fatto questo codice, che usa i delay ma per adesso funziona solo se un ritardo è multiplo dell'altro!
ora vedo il blink without delay, però già che ci sono... mi chiedo se esiste un modo per far funzionare questo codice, anche nel caso che i due ritardi non siano uno multiplo dell'altro.

#define LED1 13 //LED collegato al pin digitale 13
#define LED2 10

int contatore = 0;

int trovaMCD(int a, int b){
  int g = 1;
  int t;
  while((a%2==0)&&(b%2==0)){
    a=a/2;
    b=b/2;
    g=2*g;
  }
  while(a>0){
    if(a%2==0){
      a=a/2;
    }
    else if(b%2==0){
      b=b/2;
    }
    else{
      t=(abs(a-b))/2;
      if(a<b){
        b=t;
      }
      else{
        a=t;
      }
    }
  }
  return b*g;
}

void setup(){
  pinMode(LED1, OUTPUT); //Imposta il pin digitale come Output
  pinMode(LED2, OUTPUT); //Imposta il pin digitale come Output
}

int acceso = 0;

void loop(){
  int ritardo1 = 2000;
  int ritardo2 = 500;
  int ritardo = trovaMCD(ritardo1,ritardo2);
  int volte = ritardo1/ritardo2;
  digitalWrite(LED1, HIGH);
  if((contatore>=volte)&&(acceso==0)){
    digitalWrite(LED2, HIGH);
    contatore = 0;
    acceso = 1;
  }
  delay(ritardo);
  contatore++;

  digitalWrite(LED1, LOW);
  delay(ritardo);
  contatore++;
  if((contatore>=volte)&&(acceso==1)){
    contatore = 0;
    digitalWrite(LED2, LOW);
    acceso = 0;
  }
}

E' vero... conosco già la risposta: è lungo da leggere ma... fidati c'è tanto codice ma è molto veloce.
Leggi questi due articoli: li ho scritto proprio per queste occasioni:
Parte prima
Parte seconda

Se impari bene il meccanismo fai un enorme passo in avanti nella programmazione di arduino :slight_smile:

Fai un po' meno il figo :stuck_out_tongue:

@nathanvi
Ottimi tutorial, grazie

@federico
ah ah ah.
Eddai ogni tanto ci vuole no? :stuck_out_tongue:

@jumpingj
Grazie :stuck_out_tongue: