Domanda sui loop

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?

questo è il programma

int PULSANTE = 3;
int BIP = 5;

void setup() {
 pinMode(PULSANTE, INPUT);
 pinMode(BIP, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
}

void loop() {
 int val = digitalRead(PULSANTE);
 if (val == HIGH) {
   digitalWrite(BIP, HIGH);
   digitalWrite(9, HIGH);
   delay (100);
   digitalWrite(10, HIGH);
   delay (100);
   digitalWrite(11, HIGH);
   delay (1000);
   digitalWrite(11, LOW);
   delay (100);
   digitalWrite(10, LOW);
   delay (100);
   digitalWrite(9, LOW);
   delay(1000);
   digitalWrite(BIP,LOW);
 }
 else {
   digitalWrite(9, HIGH);
   delay (1000);
   digitalWrite(11, HIGH);
   delay (1000);
   digitalWrite(10,HIGH);
   delay(1000);
   digitalWrite(9, LOW);
   delay(1000);
   digitalWrite(11,LOW);
   delay(1000);
   digitalWrite(10,LOW);
   delay(1000);
 }
}

i pin 9 10 11 sono i led

loop_con_if.ino (847 Bytes)

Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (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 :wink:

Guglielmo

grazie mille per la risposta! domani proverò, ma la millis sembra proprio faccia al caso mio! :slight_smile:
Mi scuso per il formato non corretto del post! Ora corro subito a presentarmi! :slight_smile:

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! :stuck_out_tongue:
iniziamo con ordine :grin: :grin:
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! :slight_smile:

  1. la via più breve è ... usare degli array ... :grin:
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.

  1. dato che stai lavorando con gli unsigned long è bene che tu tratti tutto allo stesso modo

  2. 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 ... :roll_eyes:

Per fare una cosa più precisa, potresti aggiornare currentMillis alla fine di ogni IF dato che ... il tempo continua a scorrere :wink:

Guglielmo

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?

intanto ancora grazie! :grinning:

Fai sempre riferimento al "reference" ... per millis() c'è chiaramente scritto : "Number of milliseconds since the program started (unsigned long)" ... più chiaro di così ... :roll_eyes:

Per il resto ... stiamo parlando di milliSecondi ... non credo che il tuo occhio riesca ad apprezzarli ... :grin:

Guglielmo

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" ! :grin:

Queste sono proprio le basi ... = è l'operatore "assegnazione", mentre l'operatore logico per un confronto di uguaglianza è ==

Comunque, se come ti avevo detto "currentMillis" lo aggiorni dopo ogni IF ... riduci l'errore ... :roll_eyes:

Guglielmo

... perché sarà il caso che ... TI STUDI un bel manuale di "C" ! :grin:

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.

Ciao.