Pages: [1]   Go Down
Author Topic: Millis  (Read 780 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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
« Last Edit: February 24, 2013, 04:46:35 pm by leo72 » Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 77
Posts: 4661
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

my name is IGOR, not AIGOR

Roma
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


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


ivrea (to)
Offline Offline
Faraday Member
**
Karma: 77
Posts: 4661
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

Logged

my name is IGOR, not AIGOR

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


ivrea (to)
Offline Offline
Faraday Member
**
Karma: 77
Posts: 4661
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

my name is IGOR, not AIGOR

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 1
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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..
« Last Edit: February 26, 2013, 03:06:01 pm by leo72 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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


Offline Offline
Newbie
*
Karma: 1
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie di tutto,
ma come si include il codice nei tag?
forse e il tasto con il cancelletto?
Esattamente (vedi qui).
Logged


Pages: [1]   Go Up
Jump to: