Fade

Ciao ragazzi mi aiutate a capire come far accendere e spegnere i led lentamente o mi indirizzate a qualche link che lo spiega...grazie :slight_smile:

Ciao Millenium-bug,
puoi guardare il seguente link: http://www.arduino.cc/en/Tutorial/DimmingLEDs

Comunque, per tua informazione, devi usare la funzione PWM (Pulse Width Modulation) dei pin analogici di arduino (quelli col simboo della tilde).
In pratica il pin emette un'onda quadra da 5V a 0V con un duty cycle variabile da 0% (valore 0 impostato al pin) al 100% (valore 255 impostato al pin) ad una frequenza molto alta (non ricordo esattamente... qualcuno te lo puo' dire con precisione).
L'occhio umano non e' in grado di vedere con una frequenza cosi' elevata (googla se vuoi POV - Persistence of Vision) e quindi, anche se il led si accende e si spegne alla massima luminosita', l'occhio e' tratto in inganno e lo vede come meno intenso ma costantemente acceso.
Spero di essere stato, nella brevita' della risposta, comunque abbastanza chiaro.

Ciao.

Ciao, nella sezioen Learnign dei sito c'è quello che fa al caso tuo (http://arduino.cc/en/Tutorial/Fade )
Non ho l'IDE sotto mano ma se cerchi trovi anche l'esempio già pronto.

@Dguzz
I pin identificati con la tilde non sono pin analogici, sono digitali.
D'altronde se fossero analogici non ci sarebbe bisogno del PWM: ad esempio l'Arduino DUE ha 2 uscite analogiche.

PaoloP scusami,
Hai perfettamente ragione... Ero di fretta, ma ho voluto cercare di dare una risposta allo stesso tempo concisa ma completa... Prossima volta risponderò solo se avrò un po' più di tempo (sono nuovo del forum, abbastanza bravo con la programmazione, molto meno con l'elettronica - ricordi di lontani studi :cold_sweat:).
Spero di non aver creato confusione a nessuno. Grazie per la precisazione.

Ciao

Nessun problema, ma l'importante è non dare informazioni errate, visto che qualche leggenda metropolitana pare si sia già creata. :wink: :grin:

Grazie a tutti delle risposte .
Più o meno ho capito come funziona, solo che non capisco come impostare 2 led.
Ho trovato questo:

int ledPin = 9;    // LED connected to digital pin 9

void setup()  { 
  // nothing happens in setup 
} 

void loop()  { 
  // fade in from min to max in increments of 5 points:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 
}

Ma dice solo come fare con un solo led...e non cpaisco come si deve scrivere per avere altri led in fade.

Ciao,
spiega meglio cosa vuoi ottenere, vuoi che prima un led e poi l'altro effetuino il fade? Devi usare due pin PWM
vuoi che il fade sia identico ma con due led? Devi attaccere due led al solito pin ma ATTENZIONE che devi prendere le necessarie precauzioni affinché non ti si bruci il pin che supporta al massimo 40mA
Vuoi che i fade siano contemporanei ma sfasati o in qualche modo differenti? Devi usare due pin PWM ma ti serve un codice diverso perchè forse il for non ti permette ti ottenere il risultato desiserato...
Descrivi meglio cosa vuoi ottenere e magari metti il codice che hai prodotto dopo alcune prove e che non funziona, anche perchè il codice che hai postato è quello dell'esempio...

Ciao

Hai Ragione.

Allora ho 6 led. Voglio che si accenda prima uno in fade, poi dopo un tempo se ne accenda un' altro e così via. Appena si è acceso l'ultimo si devono spegnere nuovamente in sequenza di nuovo tutti.

I driver PWM che ho abbiamo già visto con PaoloP che vanno bene, ora il mio problema è nella scrittura del progetto.
Ho cqpito (o almeno credo) guardando qualche progetto come funziona, ma non ho capito come si mettono/scrivono (scusate ma non conosco ancora bene il linguaggio tecnico) altri led.

Ciao,
premetto che possono esistere tante soluzioni ma l'unica che conosco e posso consigliarti è sfruttare tutti e 6 le uscire PWM di arduino (con 6 led sei alla massima capacità PWM di arduino) e precisamente i pin sono 3,5,6,9,10,11. Ad ogni pin colleghi un led con relativa resistenza e invece che sfruttare il delay che blocca il programma leggi l'uso di millis che permette di effettuare verifiche del tempo trascorso senza bloccare il programma.
Ogni led avrà quindi la sua analogWrite(ledPin, fadeValue); sfasata di qualche millisecondo (se non ho capito male) e quando l'ultimo led è acceso al massimo effettui un ciclo invertendo la frequenza dei pwm.

Visto che sono totalmente a zero, potresti farmi un esempio di programmazione?

Cioè tipo devo che scrivere in :

void setup()  { 
 
} 

void loop()  { 
                        
  }

P.S. ovviamente non pretendo che mi scriva tu la programmazione (anche perchè non imparerei così) ma che mi aiuti a capire il criterio.

questo codice esegue la sequenza dei 6 led.

int led1 = 3;
int led2 = 5;
int led3 = 6;
int led4 = 9;
int led5 = 10;
int led6 = 11;
int conta =0; //sequenza led
int frequenza=0; // frequenza pwm
int uscite[] = {3, 5, 6, 9, 10, 11};
    void setup() {      
      Serial.begin(9600);      
      pinMode(led1, OUTPUT);     
      pinMode(led2, OUTPUT);     
      pinMode(led3, OUTPUT);     
      pinMode(led4, OUTPUT);     
      pinMode(led5, OUTPUT);     
      pinMode(led6, OUTPUT);     
    }
    
    // the loop routine runs over and over again forever:
    void loop() {
        if(conta>5)
           {
              conta=0;
            }      
        accendiled(uscite[conta]);
    }
    void accendiled(int uscita)
     {
        frequenza++;
        if(frequenza>255)
           {
             frequenza=0;
             analogWrite(uscita, frequenza);   // turn the LED on (HIGH is the voltage level)
             conta++;
            }
         analogWrite(uscita, frequenza);   // turn the LED on (HIGH is the voltage level)
         delay(10);               // wait for a second
         Serial.print(uscita);Serial.print(" - ");Serial.println(frequenza);
         return;
       }

Ciao, provo a farti un esempio ma non ho l'ide a disposizione quindi potrebbero esserci errori in compilazione e/o di logica

nFadeDelay = 30;
nLed1Delay = 35;
nLed2Delay = 200;
nLed1FadeValue = 0;
nLed2FadeValue = 0;
nFadeStep = 5;
nDelayCheck = millis();
nAttMillis = millis();
while (nLed2FadeValue < 255){
  if (millis() - nAttMillis > nFadeDelay ){ //Verifica se è trascorso il tempo tra un incremento di luminosità e il successivo
   if (millis() - nDelayCheck > nLed1Delay){ //Verifica se dall'avvio è trascorso abbastanza tempo per iniziare ad accendere il led 1
    if (nLed1FadeValue < 255){ //Incrementa la luminosità del led 1 se possibile
       nLed1FadeValue += nFadeStep;
    }
   }
   if (millis() - nDelayCheck > nLed2Delay){ //Verifica se dall'avvio è trascorso abbastanza tempo per iniziare ad accendere il led 2
    if (nLed2FadeValue < 255){ //Incrementa la luminosità del led 2 se possibile
       nLed2FadeValue += nFadeStep;
    }
   }
   analogWrite(ledPin1, nLed1FadeValue ); //Imposta il PWM del led 1
   analogWrite(ledPin2, nLed2FadeValue ); //Imposta il PWM del led 2
   nAttMillis = millis();
  }
}

Ovviamente dovrai definire correttamente le variabili e occuparti di inserire la procedura che spegne i led secondo el logiche descritte nei post precedenti. Ti basta comprendere il codice sopra e invertirne la logica

Ciao

Rileggento i vecchi post credo di aver preso un mezo granchio e di aver capito che il secondo led non doveva aspettare che il primo fosse totalemnte acceso. In quest'ottica il codice di giacomoforgione è forse più vicino alle tue esigenze anche se pure quello non aderisce completamente a quello che ti aspetti. Ad ogni modo hai un bel po' di codice da studiare e adattare alle tue esigenze per riuscire ad arrivare al tuo obiettivo :slight_smile:

Ragazzi grazie infinite ad entrambi. Ora me li studio per bene e vi faccio sapere come va. Grazie ancora :slight_smile:

Allora sto facendo un pò di prove.
Sto seguendo lo schema di giacomoforgione perchè l'altro me lo da come errore.
Va benissimo, solo che ogni led, una volta acceso, deve rimanere tale, fino a che non si sono accesi tutti i led. Poi riprendono a spegnersi con la stessa sequenza...solo che non riesco a capire dove sia il punto in cui agire. Sono riuscito a capire solo come fa accendere più lentamente i led.

fabpolli:
Rileggento i vecchi post credo di aver preso un mezo granchio e di aver capito che il secondo led non doveva aspettare che il primo fosse totalemnte acceso. In quest'ottica il codice di giacomoforgione è forse più vicino alle tue esigenze anche se pure quello non aderisce completamente a quello che ti aspetti. Ad ogni modo hai un bel po' di codice da studiare e adattare alle tue esigenze per riuscire ad arrivare al tuo obiettivo :slight_smile:

In realtà per me è uguale, vanno bene entrambi i casi, basta che trascorra un pò di tempo tra l'accensione di uno da quella dell'altro.