Sto cercando di programmare un arduino nano. Questo arduino dovrebbe comandare 4 led su vie separate. Mi spiego meglio: Due led dovrebbero restare sempre accesi, uno fare un'accensione random e un altro l'effetto fade. Se provo i led singolarmente riesco a fare queste cose. Il problema è fare contemporaneamente l'effetto fade e l'accensione random ai due led.
Questo è lo scketch che ho preparato:
//candela
//******* dichiarazioni ********
int valoreX = 0; //imposta la variabile numerica
const int pin_led_1 = 2; //pin del led 1
const int pin_led_2 = 3; //pin del led 2
const int pin_led_3 = 4; //pin del led 3
const int pin_led_4 = 5; //pin del led 4
//********** setup **********
void setup() {
pinMode(pin_led_1, OUTPUT); //imposta il pin del Led come uscita
pinMode(pin_led_2, OUTPUT); //imposta il pin del Led come uscita
pinMode(pin_led_3, OUTPUT); //imposta il pin del Led come uscita
pinMode(pin_led_4, OUTPUT); //imposta il pin del Led come uscita
}
//********** ciclo **********
void loop() {
valoreX = random(50, 250);
analogWrite(pin_led_1, valoreX);
delay(5);//attendi 50 millisecondi
{
// 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(pin_led_2, 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(pin_led_2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}
}
Con questo sketck i due pin pin_led_1 e pin_led_2 non lavorano contemporaneamente ma separati, e ottengo l'effetto voluto coo il pin_led_2 (Fade) ma non il pin_led_1 (random).
usando il delay e i cicli for non potrai mai avere quello che vuoi: il delay ha un effetto bloccante sul resto del codice, ciò significa che mentre è in delay il micro è bloccato e non può fare nulla.
anche il for è "bloccante" nel tuo caso.
devi utilizzare millis() per temporizzare lo sketch e degli if come controllo
Ringrazio tutti. Ma purtroppo ci sto provando ma dopo due ore non sono ancora riuscito ad ottenere nulla di apprezzabile. Non riesco a capire come applicare questa funzione al mio caso.
... quando devi fare più cose contemporaneamente ed una NON può bloccare le altre, devi pensare in modo del tutto diverso e la logica del loop() NON può essere sequenziale come l'hai scritta tu.
Quello che "governerà" il tuo programma DOVRA' essere il passare del tempo per cui, dovrai dividerlo in pezzetti che verranno attivati ogni volta che passa X tempo. Ovviamnete dovrai avere una o più variabili che ti ricordano "a che punto sei" (lo STATO del programma) e delle variabili di "tempo" con cui fare dei confronti.
Nel caso del tuo "fade" NON puoi restare bloccato in quel ciclo se vuoi fare qualche altra cosa, quindi:
dimentica l'uso del for : chiuso la dentro non esci fino alla fine e quindi, logicamente, sei bloccato la dentro
dimentica l'uso della delay
Invece ...
... dovrai gestire una variabile, es. fadeValue che inizialmente metti a 0, un altra fadeUpDn che puoi mettere a 0 per indicare che devi scendere ed ad 1 per salire e la inizializzi ad 1 ed infine poi ti servirà una variabile per il tempo d'attesa del "fade", es. fadeTime che inizializzi a millis() , dopo di che ...
if (millis() - fadeTime >= 30) { ... }
Quell'IF verrà soddisfatta 30 millisec dopo che hai inizializzato fadeTime ... dentro non farai altro che :
reinizializzare fadeTime per i prossimi 30 millisec ovvero farai di nuovo fadeTime = millis()
2.1 se fadeUpDn è a 0 sottrarre 1 da fadeValue
2.1 se fadeUpDn è a 1 aggiungere 1 a fadeValue
3.1 se fadeValue == 255 allora mettere fadeUpDn a 0
3.2 se fadeValue == 0 alllora mettere fadeUpDn a 1
farai l'analogWrite()
... e così hai creato un qualche cosa che viene eseguito ogni 30 millisec , che NON ti blocca il programma e che fa un passetto per volta nel ciclo di fade Up/Dn e che si comporta come i tuoi due cicli for pur non essendo fatto da due cicli for
Questo ovviamente molto schematicamente ... a te ragionarci ed implementarlo
gpb01:
... quando devi fare più cose contemporaneamente ed una NON può bloccare le altre, devi pensare in modo del tutto diverso e la logica del loop() NON può essere sequenziale come l'hai scritta tu.
Quello che "governerà" il tuo programma DOVRA' essere il passare del tempo per cui, dovrai dividerlo in pezzetti che verranno attivati ogni volta che passa X tempo. Ovviamnete dovrai avere una o più variabili che ti ricordano "a che punto sei" (lo STATO del programma) e delle variabili di "tempo" con cui fare dei confronti.
Nel caso del tuo "fade" NON puoi restare bloccato in quel ciclo se vuoi fare qualche altra cosa, quindi:
dimentica l'uso del for : chiuso la dentro non esci fino alla fine e quindi, logicamente, sei bloccato la dentro
dimentica l'uso della delay
Invece ...
... dovrai gestire una variabile, es. fadeValue che inizialmente metti a 0, un altra fadeUpDn che puoi mettere a 0 per indicare che devi scendere ed ad 1 per salire e la inizializzi ad 1 ed infine poi ti servirà una variabile per il tempo d'attesa del "fade", es. fadeTime che inizializzi a millis() , dopo di che ...
if (millis() - fadeTime >= 30) { ... }
Quell'IF verrà soddisfatta 30 millisec dopo che hai inizializzato fadeTime ... dentro non farai altro che :
reinizializzare fadeTime per i prossimi 30 millisec ovvero farai di nuovo fadeTime = millis()
2.1 se fadeUpDn è a 0 sottrarre 1 da fadeValue
2.1 se fadeUpDn è a 1 aggiungere 1 a fadeValue
3.1 se fadeValue == 255 allora mettere fadeUpDn a 0
3.2 se fadeValue == 0 alllora mettere fadeUpDn a 1
farai l'analogWrite()
... e così hai creato un qualche cosa che viene eseguito ogni 30 millisec , che NON ti blocca il programma e che fa un passetto per volta nel ciclo di fade Up/Dn e che si comporta come i tuoi due cicli for pur non essendo fatto da due cicli for
Questo ovviamente molto schematicamente ... a te ragionarci ed implementarlo
Guglielmo
Ringrazio tutti e in particolar modo Guglielmo per il tempo e soprattutto per le risposte.
Il significato della funzione millis mi è chiarissima solo vuoi per il tempo che in questo periodo mio personale è pochissimo o vuoi per i problemi familiari, non riesco a metterla in pratica. Purtroppo devo partire è stavo preparando il presepe per i bambini. Vuol dire che nel cielo stellato fatto quest'anno con la fibra ottica si metteranno d'accordo e avranno un solo effetto.
Jkwxp:
...Purtroppo devo partire è stavo preparando il presepe per i bambini. Vuol dire che nel cielo stellato fatto quest'anno con la fibra ottica si metteranno d'accordo e avranno un solo effetto.
Ah beh ... se ci sono di mezzo i "bambini" e devi fare una cosa per loro, allora ...
... uno strappo alla regola è concesso
//******* dichiarazioni ********
const int pin_led_1 = 2; //pin del led 1
const int pin_led_2 = 3; //pin del led 2
int valoreX = 0; //imposta la variabile numerica
int fadeValue = 0; //valore iniziale fade
int fadeUpDn = 1; //0 = Down, 1 = Up
unsigned long fadeTime; //tempo ultimo fade
unsigned long rndTime; //tempo ultima random
//********** setup **********
void setup() {
pinMode(pin_led_1, OUTPUT); //imposta il pin del Led come uscita
pinMode(pin_led_2, OUTPUT); //imposta il pin del Led come uscita
fadeTime = millis();
rndTime = millis();
}
void loop() {
//
// questo si ripete ogni 50 millisecondi circa
//
if (millis() - rndTime >= 50) {
valoreX = random(50, 250);
analogWrite(pin_led_1, valoreX);
//
rndTime = millis(); // aggiorna il tempo per il prossimo evento random
}
//
// questo si ripete ogni 30 millisecondi circa
//
if (millis() - fadeTime >= 30) {
if (fadeUpDn == 1) {
fadeValue += 5;
analogWrite(pin_led_2, fadeValue);
if (fadeValue == 255) fadeUpDn = 0; // arrivato al massimo, devi decrescere
}
else {
fadeValue -= 5;
analogWrite(pin_led_2, fadeValue);
if (fadeValue == 0) fadeUpDn = 1; // arrivato al minimo, devi crescere
}
//
fadeTime = millis(); // aggiorna il tempo per il prossimo evento fade
}
}
... NON l'ho provato, ma almeno è lo scheletro da cui partire. Fammi sapere
gpb01:
Ah beh ... se ci sono di mezzo i "bambini" e devi fare una cosa per loro, allora ...
... uno strappo alla regola è concesso
//******* dichiarazioni ********
const int pin_led_1 = 2; //pin del led 1
const int pin_led_2 = 3; //pin del led 2
int valoreX = 0; //imposta la variabile numerica
int fadeValue = 0; //valore iniziale fade
int fadeUpDn = 1; //0 = Down, 1 = Up
unsigned long fadeTime; //tempo ultimo fade
unsigned long rndTime; //tempo ultima random
//********** setup **********
void setup() {
pinMode(pin_led_1, OUTPUT); //imposta il pin del Led come uscita
pinMode(pin_led_2, OUTPUT); //imposta il pin del Led come uscita
fadeTime = millis();
rndTime = millis();
}
void loop() {
//
// questo si ripete ogni 50 millisecondi circa
//
if (millis() - rndTime >= 50) {
valoreX = random(50, 250);
analogWrite(pin_led_1, valoreX);
//
rndTime = millis(); // aggiorna il tempo per il prossimo evento random
}
//
// questo si ripete ogni 30 millisecondi circa
//
if (millis() - fadeTime >= 30) {
if (fadeUpDn == 1) {
fadeValue += 5;
analogWrite(pin_led_2, fadeValue);
if (fadeValue == 255) fadeUpDn = 0; // arrivato al massimo, devi decrescere
}
else {
fadeValue -= 5;
analogWrite(pin_led_2, fadeValue);
if (fadeValue == 0) fadeUpDn = 1; // arrivato al minimo, devi crescere
}
//
fadeTime = millis(); // aggiorna il tempo per il prossimo evento fade
}
}
... NON l'ho provato, ma almeno è lo scheletro da cui partire. Fammi sapere ;)
Guglielmo
Ti ringrazio infinitamente. Non ci speravo proprio. Logicamente ti ringraziano di più i bambini. L'ho provato e sembra funzionare bene. Per quanto riguarda i pin su un arduino nano è indifferente ? Devo solo fare un po di prove con i valori per regolare meglio gli effetti
Jkwxp:
Ti ringrazio infinitamente. Non ci speravo proprio. Logicamente ti ringraziano di più i bambini.
Figurati ...
Jkwxp:
Per quanto riguarda i pin su un Arduino nano è indifferente ?
Ora che me lo fai notare ... c'è un ERRORE in quel programma ...
... dato che usi delle analogWrite() per regolare l'intensità, DEVI usare dei pin PWM che, per l'Arduino Nano, come da reference, sono 3, 5, 6, 9, 10 e 11. Mi raccomando !
Jkwxp:
Devo solo fare un po di prove con i valori per regolare meglio gli effetti
Basta che modifichi il valore nei due IF ... come hai visto la logica è piuttosto semplice