Go Down

Topic: Millis (Read 895 times) previous topic - next topic

ciarly64

Feb 24, 2013, 08:30 pm Last Edit: Feb 24, 2013, 10:46 pm by leo72 Reason: 1
Code: [Select]
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

nid69ita

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
my name is IGOR, not AIGOR

Alfa03

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!

leo72



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.

nid69ita

Azz, bravo leo72. Io stupidamente mi sarei intestardito a usare 2 variabili.  :smiley-red:

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?

my name is IGOR, not AIGOR

leo72


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.
Code: [Select]

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);
    }
}

nid69ita

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 !!!  :smiley-red:
my name is IGOR, not AIGOR

leo72

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

ciarly64

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à.

leo72

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.

ciarly64

#10
Feb 26, 2013, 07:35 pm Last Edit: Feb 26, 2013, 09:06 pm by leo72 Reason: 1
ciao leo72 mi puoi spiegare la differenza del codice da me postato e il tuo. ( solo per capire io meglio)

Code: [Select]
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..

leo72

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

Tornando al tuo quesito:

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à.

ciarly64

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

leo72


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

Esattamente (vedi qui).

Go Up