Arduino problema millis

Ciao ragazzi, sto cercando di imparare bene ad utilizzare il millis. in giro ho trovato molti esempi su cm far lampeggiare un led con millis come questo :

#define ledPin 13  //LED connesso al pin digitale 13

#define interval 1000  //Intervallo di tempo per  far lampeggiare il LED(millisecondi)
int value = LOW;  //Valore precedente del LED
long previousMills = 0;  //Memorizza l'ultima volta che il led è stato aggiornato

void setup()
{
     pinMode(ledPin, OUTPUT);  //Impostiamo il led come output
}

void loop()
{
     if (millis() -  previousMills > interval ){
         previousMills = millis();  //Tiene in memoria l'ultimo lampeggio

         //Se il LED è spento lo accende e viceversa
         if (value == LOW)
             value = HIGH;
         else
             value = LOW;

         digitalWrite(ledPin, value);
     }
}

molto semplice e intuitivo, ma ora mi serve un aiuto. Nel caso io volessi far lampeggiare il led mantenendo ad esempio 4 secondi il led spento e 1 secondo acceso? come bisogna modificare lo sketch? se modifico interval, cambia sia il tempo di accensione che quello di spegnimento... help me.. grazie in anticipo ragazzi :) :)

usi 2 variabili interval1 e interval2 e una terza variablie che dice quale dei due é attiva. Ciao Uwe

Togli completamente l'if e l'else e al loro posto metti quanto segue:

value ^= HIGH;

Risparmi un di scrivere codice e per renderlo chiaro aggingi un commento Es. flip bit state.

Ciao.

uwefed: usi 2 variabili interval1 e interval2 e una terza variablie che dice quale dei due é attiva. Ciao Uwe

ciao, ho provato, ma nn ci sono riuscito. Potresti aiutarmi proprio dicendomi cosa modificare nel void loop? scusa,ma sto uscendo pazzo da ieri sera. ciao

Una possibile soluzione.

boolean stato=0; //0=LOW - 1=HIGH;
void loop() {
     if (stato) { //controlla quando il led è acceso
         if (millis() -  previousMills > interval1 ){
             previousMills = millis();  //Tiene in memoria l'ultimo lampeggio
             stato^=1; //inverte lo stato
             digitalWrite(ledPin, stato);
        }
    } else { //il led è spento
         if (millis() -  previousMills > interval2 ){
             previousMills = millis();  //Tiene in memoria l'ultimo lampeggio
             stato^=1; //inverte lo stato
             digitalWrite(ledPin, stato);
        }
    }
}

Da provare, non so se funziona. interval1 e interval2 le carichi con i tempi rispettivamente di ON e di OFF. stato contiene lo stato del led, quindi se è 0, il led è spento e si controlla se è passato il tempo impostato di OFF. E viceversa se il led è ON. Una variante è quella di mettere il digitalWrite sotto al blocco if, però in questo modo ad ogni loop si scrive lo stato sul pin del led e non mi pare una cosa pulita. Con l'esempio che ho messo invece scrivi lo stato solo quando il led deve essere modificato.

Un altra possibile soluzione. Visto che l' ho scritto e testato e funziona, nonostante Le é sempre attacato al PC :

#define ledPin 13  //LED connesso al pin digitale 13

unsigned long interval1 = 1000;  //Intervallo di tempoLED spento
unsigned long interval2 = 2000;  //Intervallo di tempoLED acceso
int value = LOW;  //Valore precedente del LED
long previousMills = 0;  //Memorizza l'ultima volta che il led è stato aggiornato

void setup()
{
     pinMode(ledPin, OUTPUT);  //Impostiamo il led come output
     previousMills = millis(); 
}

void loop()
{
     if ((millis() -  previousMills > interval1) &&  value == LOW ){  // controlla se il tempo di LED spento é passato
         previousMills = millis();  //Tiene in memoria l'ultimo lampeggio
        value = HIGH;
        digitalWrite(ledPin, value);
     }
    if ((millis() -  previousMills > interval2) &&  value == HIGH ){ // controlla se il tempo di LED acceso é passato
         previousMills = millis();  //Tiene in memoria l'ultimo lampeggio
        value = LOW;
        digitalWrite(ledPin, value);
     }
}

uwefed: nonostante Leo é sempre attacato al PC :

Se sono al lavoro dalle 6, in qualche modo devo passare il tempo quando non ho nulla da fare... XD

uwefed: ```

define ledPin 13  //LED connesso al pin digitale 13

unsigned long interval1 = 1000;  //Intervallo di tempoLED spento unsigned long interval2 = 2000;  //Intervallo di tempoLED acceso int value = LOW;  //Valore precedente del LED long previousMills = 0;  //Memorizza l'ultima volta che il led è stato aggiornato

void setup() {     pinMode(ledPin, OUTPUT);  //Impostiamo il led come output     previousMills = millis(); }

void loop() {     if ((millis() -  previousMills > interval1) &&  value == LOW ){  // controlla se il tempo di LED spento é passato         previousMills = millis();  //Tiene in memoria l'ultimo lampeggio        value = HIGH;        digitalWrite(ledPin, value);     }    if ((millis() -  previousMills > interval2) &&  value == HIGH ){ // controlla se il tempo di LED acceso é passato         previousMills = millis();  //Tiene in memoria l'ultimo lampeggio        value = LOW;        digitalWrite(ledPin, value);     } }

ciao, innanzitutto vorrei ringraziare sia te che Leo. Mi avete dato un ottima dritta e ho capito :):) funziona tutto perfettamente. Se nel caso io volessi far lampeggiare il led una sola volta per 1 secondo e poi far terminare completamente il ciclo? quindi facendo un solo lampeggio x un secondo? cm devo fare? grazie per la disponibilità :)

Hai diverse alternative: 1) un lampeggio di un tempo prefissato: allora puoi usare uno dei 2 codici, mio o di Uwe, ed impostare il tempo di ON ed il tempo di OFF 2) se vuoi un lampeggio di 1 secondo ON, poi 1 secondo OFF ecc... è molto semplice:

byte stato=1; //si parte accesi
#define LED 13; //pin 13 di Arduino
unsigned long temporizzatore;

void setup() {
  pinMode(LED, OUTPUT);
  digitalWrite(LED, stato);
  temporizzatore=millis()+1000; //intervallo di 1 sec
}

void loop() {
  if (millis()>temporizzatore) {
    temporizzatore=millis()+1000;
    stato^=1;
    digitalWrite(LED, stato);
  }
}

leo72: Hai diverse alternative: 1) un lampeggio di un tempo prefissato: allora puoi usare uno dei 2 codici, mio o di Uwe, ed impostare il tempo di ON ed il tempo di OFF 2) se vuoi un lampeggio di 1 secondo ON, poi 1 secondo OFF ecc... è molto semplice:

ciao Leo, questo l'ho capito perfettamente, ma io intendevo di far lamapeggiare il led ad esempio 1 secondo acceso, 4 secondi spento e farlo lampeggiare ad esempio solo 2 volte e basta e dopodichè fermare completamente il ciclo. Spero di essere stato chiaro :)

ciao Leo, questo l'ho capito perfettamente, ma io intendevo di far lamapeggiare il led ad esempio 1 secondo acceso, 4 secondi spento e farlo lampeggiare ad esempio solo 2 volte e basta e dopodichè fermare completamente il ciclo. Spero di essere stato chiaro smiley

Vuoi che scriviemo il codice per te, no vero. Hai già il programma che fa la cosa ripetutamente perchè si trova dentro la funzione loop() che cicla all'infinito. Allora prendi il codice che fa il lampeggio e lo metti in un ciclo "for" oppure "while" e decidi tu quanti cicli deve fare prima di uscire poi metti tutto dentro una funzione che prende come parametro un'intero che rappresenta il numero di cicli. Poi però ti accorgi che non funziona come vorresti e cerchi altre soluzioni e posti qui che si discute. Ok non prendertela a male, diciamo che hai la sodisfazione di vedere il tuo codice in azione ora dedica un po di tempo allo studio sperimentazione con i cilci, no tri ciclo, moto ciclo. :D

PS: per far scrivere i commenti a certi programmatori li devi mettere sotto minaccia di morte ma anche così non funziona, io ho preso il brutto vizio di scrivere codice di getto e poi documentarlo, sforzati sin da ora a documentare qualunque linea di codice che giudichi non auto-documetante.

Ciao.

Quoto Mauro. Di codice te ne abbiamo dato tanto.

Cmq per rispondere al tuo quesito, basta mettere il ciclo for nel setup() invece che nel loop().

Grazie ancora ragazzi.. e scusate per il disturbo.. alla prossima :) :)