Millis

int 
ledPin = 13;
int value = LOW;
long previousMillis = 0;
long interval = 1000;
 
void setup()
{
  pinMode(ledPin, OUTPUT);
}
 
void loop()
{
  if (millis() - previousMillis > interval) {
    previousMillis = millis();
 
    if (value == LOW)
      value = HIGH;
    else
      value = LOW;
 
    digitalWrite(ledPin, value);
  }
}

in questo sketch il led fa un intervallo di un secondo,
ma se io volessi far accendere il led per 5 secondi, e far stare spento per un secondo come posso fare.

Grazie-

edit by mod: per favore includere il codice usando gli appositi tag

O usi una istruzione di attesa (delay che però stoppa il loop) , oppure usi 2 variabili per contare il tempo.
Cioè dovrai usare una variabile per sapere quanto tempo è passato prima di accendere e una per sapere il tempo passato prima di spegnere

fa' un intervallo di un secondo cosa intendi?
accensione e spegnimento entrambi un secondo?

Sono un novello, ma penso che settare il millis() a 5000, e mettere un delay(1000) alla fine ti possa dare una mano!

ciarly64:
in questo sketch il led fa un intervallo di un secondo,
ma se io volessi far accendere il led per 5 secondi, e far stare spento per un secondo come posso fare.

Quando modifichi il valore di "value" all'interno dell'if, cambi anche l'intervallo impostato da "interval", mettendolo appunto a 5000 quando accendi il led, e poi mettendolo a 1000 quando lo spengi. In questo modo il check con millis varierà in base all'attesa che hai impostato.

Azz, bravo leo72. Io stupidamente mi sarei intestardito a usare 2 variabili. :blush:

Pongo una domanda, se non violo le regole del forum (porre domanda su domanda di altri):
il codice postato a ogni ciclo invia al pin il valore high oppure low.
Per il tempo "intervallo" continuo a mettere a low oppure high quando lo è già.
Non è uno spreco? Non sarebbe meglio inviare solo quando devo cambiare stato?

nid69ita:
il codice postato a ogni ciclo invia al pin il valore high oppure low.
Per il tempo "intervallo" continuo a mettere a low oppure high quando lo è già.
Non è uno spreco? Non sarebbe meglio inviare solo quando devo cambiare stato?

No, perché se vedi il digitalWrite è inserito come ultima istruzione dell'if (il codice è indentato male, altrimenti lo avresti notato subito). Quindi viene eseguito solo quando il check su millis è vero, per cui 1 volta ogni interval.

Questo codice è simile a quello di Alfa: ho aggiunto un serial.print insieme al digitalWrite così da vedere effettivamente che l'operazione è eseguita solo 1 volta. Ho anche corretto i tipi dei dati, che non andavano bene.

byte ledPin = 13;
byte value = LOW;
unsigned long previousMillis = 0;
unsigned long interval = 1000;
 
void setup() {
    delay(2000);
    Serial.begin(19200);
    pinMode(13, OUTPUT);
}
 
void loop() {
    if (millis() - previousMillis > interval) {
        previousMillis = millis();
        if (value == LOW) {
            value = HIGH;
            interval = 5000;
        } else {
            value = LOW;
            interval = 1000;
        }
        digitalWrite(ledPin, value);
        Serial.println(value);
    }
}

Fammi un favore Leo72, quando faccio domande del piffero, mandami a cacare.
Hai ragione, può anche essere indentato male, ma sono io pirla che non ho letto bene.
Oggi non ne azzecco una !!! :blush:

Alle volte mi ci perdo anche io nel codice degli altri, perché non è facile leggere una cosa scritta con un altro stile. A me, ad esempio, le graffe messe diversamente da come le uso io mi fanno diventar matto

Grazie leo72 per la tua risposta , il "mio" sketch e solo per riuscire a capire la funzione millis volendo ricreare il classico blink senza i delay.
adesso posso pilotare un relè con questo sketch?
ciao e grazie per la tua disponibilità.

Qualsiasi cosa che puoi attivare/disattivare mediante un segnale alto/basso su un led.
Con le debite proporzioni, ovviamente: se devi pilotare un relé, ti serve un transistor come attuatore del relé stesso, non puoi collegare il relé direttamente al pin. Ma di schemini ne trovi una marea in rete.

ciao leo72 mi puoi spiegare la differenza del codice da me postato e il tuo. ( solo per capire io meglio)

byte ledPin = 13;                                           //int ledPin=13;                      
byte value = LOW;                                         //int value=LOW;
unsigned long previousMillis = 0;                       //long previousMillis = 0;
unsigned long interval = 1000;                         // long interval = 1000;



void setup() {
    
    pinMode(13, OUTPUT);
}
 
void loop() {
    if (millis() - previousMillis > interval) {
        previousMillis = millis();
        if (value == LOW) {
            value = HIGH;
            interval = 5000;
        } else {
            value = LOW;
            interval = 1000;
        }
        digitalWrite(ledPin, value);
       
    }
}

Leo72 scusa cerco solo di capire meglio..

Prima di tutto un appunto, avevo già corretto il tuo primo post... quando pubblichi del codice, includilo negli appositi tag. :wink:

Tornando al tuo quesito:

ciarly64:
ciao leo72 mi puoi spiegare la differenza del codice da me postato e il tuo. ( solo per capire io meglio)

Si tratta di ottimizzare il consumo delle risorse.
Quando si usa una variabile, su un microcontrollore con soli 2 kB di RAM si deve sempre pensare ad usare il tipo più consono. Usare un tipo "int" per dichiarare un pin è uno spreco: un pin max arriva a 19 nel caso di Arduino o sui 50/60 nel caso della Mega. Basta un tipo "byte", che rispetto all'"int" occupa 1 solo byte contro i 2 dell'altro. Quando si scrivono programmi molto lunghi, usando tante variabili si può saturare la memoria.

Sulla questione dell'"unsigned", devi ricordarti che un "int" o un "long" possono tenere anche numeri negativi mentre gli "unsigned" solo numeri positivi. Siccome millis è di tipo unsigned long, potresti avere dei problemi nella gestione se lo sketch gira per diversi giorni.

Sicuramente non è il tuo caso per entrambe le situazioni ma è bene imparare a scrivere programmi seguendo alcune linee guida che poi si rivelano utili quando le cose crescono di complessità.

Grazie di tutto,
ma come si include il codice nei tag?
forse e il tasto con il cancelletto?

ciarly64:
Grazie di tutto,
ma come si include il codice nei tag?
forse e il tasto con il cancelletto?

Esattamente (vedi qui).