Ciao a tutti! sono agli inizi con arduino, e volevo qualche dritta! ^^
sto compilando un programmino con 3 led ed un pulsante utilizzando if ed else.
l'idea è: i led si accendono e spengono in una determinata sequenza in loop, premo il pulsante, i led si accendono e spengono in loop con un altra sequenza. Fino a qui tutto bene, poi ho inserito un cicalino, l'idea era di farlo suonare solo nel primo loop con una sequenza decisa da me. Come posso fare? dato che a quanto pare arduino non supporta il multi tasking?
Prima di tutto, essendo il tuo primo post, ti consiglio di presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...
... poi, sempre in relazione al regolamento, punto 7, edita il tuo post precedente e racchiudi il codice entro gli appositi tag "CODE".
Infine ... devi a studiarti come si usa la millis() (... al posto di usare delay()) prima QUI, poi QUI ed infine leggi anche QUI, così ... capirai come fare
grazie mille per la risposta! domani proverò, ma la millis sembra proprio faccia al caso mio!
Mi scuso per il formato non corretto del post! Ora corro subito a presentarmi!
allora, utilizzando i millis() e il programmino di esempio consigliatomi da Guglielmo, ho fatto questi loop con 3 led
const int ledPin1 = 3;
const int ledPin2 = 4;
const int ledPin3 = 5;
int ledState = LOW;
int ledState2 = LOW;
int ledState3 = LOW;
long prevMillis = 0;
long prevMillis2 = 0;
long prevMillis3 = 0;
long interval = 2000;
long interval2 = 1000;
long interval3 = 500;
void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - prevMillis > interval) {
prevMillis = currentMillis;
if (ledState ==LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin1, ledState);
}
if (currentMillis - prevMillis2 > interval2) {
prevMillis2 =currentMillis;
if (ledState2 ==LOW)
ledState2 = HIGH;
else
ledState2 = LOW;
digitalWrite(ledPin2, ledState2);
}
if (currentMillis - prevMillis3 > interval3) {
prevMillis3 =currentMillis;
if (ledState3 ==LOW)
ledState3 = HIGH;
else
ledState3 = LOW;
digitalWrite(ledPin3, ledState3);
}
}
e avrei delle domande da porvi!
iniziamo con ordine
ho davvero bisogno di tutte queste variabili? non c'è una via più breve?
se io volessi regolare l'intervallo di blink del led tramite un potenziometro dovrei inserirlo all'interno del loop, ma con che parametro? mantengo il long o sarebbe più corretto qualcos'altro?
i led dovrebbero lameggiarmi con un ordine ben preciso, essendo i valori dell'intervallo di blink l'uno la metà dell'altro, ma vedo che sono sfasati, come mai?
per ora le domande finiscono qui! eheh! grazie ancora per l'attenzione! a presto!
int ledState[3] = {LOW,LOW,LOW};
unsigned long prevMillis[3] = {0,0,0};
unsigned long interval[3] = {500,1000,2000};
... nota che millis è un unsigned long e non un long.
dato che stai lavorando con gli unsigned long è bene che tu tratti tutto allo stesso modo
non sono "in sequenza", ma solo con periodi diversi ... il primo lampeggia con un periodo di 1/2 secondo, il secondo con un periodo di un secondo ed il terzo con un periodo di due secondi ... quindi ...
Per fare una cosa più precisa, potresti aggiornare currentMillis alla fine di ogni IF dato che ... il tempo continua a scorrere
che velocità! ^^
darò un'occhiata agli array per capire meglio! devo anche andare a leggermi bene le variabili, perchè non so mai quale utilizzare! eheh
invece per quanto riguarda i led sfasati, pensavo anche fosse colpa del mio if
if (currentMillis - prevMillis > interval)
nel mio caso signifa che la condizione è vera quando interval è almeno 1001ms (o 501 o 2001) o più! giusto?
quindi magari anche questo può causare lo sfasamento della sincronizzazione dei blink. o stiamo parlando di valori talmente bassi da essere ininfluenti?
Fai sempre riferimento al "reference" ... per millis() c'è chiaramente scritto : "Number of milliseconds since the program started (unsigned long)" ... più chiaro di così ...
Per il resto ... stiamo parlando di milliSecondi ... non credo che il tuo occhio riesca ad apprezzarli ...
no no chiaro! però si accumulano! se ho un led che blinka a 501 ms e uno a 2001 dopo un minuto il led a 501 ms avrà accumulato 90ms di ritardo rispetto a quello da 2001ms che dopo 5 minuti sono diventati 450 ms, cioè quasi mezzo secondo! xD
ora ho provato a mettere >= e funziona perfettamente, questo dovrebbe avvalorare la mia tesi, credo! xD
if (currentMillis - prevMillis >= interval)
ultima domanda poi la smetto di approfittare della tua gentilezza!
come mai se metto solo = e non >= mi dà errore?
if (currentMillis - prevMillis = interval)
questo è l'errore che mi dà
error: lvalue required as left operand of assignment
... perché sarà il caso che ... TI STUDI un bel manuale di "C" !
Si si è proprio il caso.
Solitamente quello è un errore che si commette per distrazione, in questo caso non potendo fare l'assegnazione il compilatore ha emesso errore, ma quando il compilatore riesce comunque a fare assegnazione non emette errore ma il programma si comporta in modo inaspettato e in questo caso trovare l'errore può comportare molto tempo ed è facile spazientirsi.