uso millis()

salve
volevo provare ad impostare un sequenza alba tramonto usando la funzione millis().
per comodita ho preso negli esempi il codice fade e ho aggiunto questa parte

const int INTERVALLO = 5000;//intervallo
unsigned long TEMPO = 0;//costante tempo 
int ledPin = 5;    // LED connected to digital pin 9

void setup() {
  pinMode(ledPin, OUTPUT);//imposto ilpin di uscita
  
}

void loop() {
  digitalWrite(ledPin, LOW);//accendo il led
  if(millis() - TEMPO > INTERVALLO){// intervallo in cui il lde rimane acceso
  for (int fadeValue = 0 ; fadeValue >= 0; fadeValue += 5) {// inizia sequenza di spegnimento
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
  }

  // fade out from max to min in increments of 5 points:
  for (int fadeValue = 255 ; fadeValue <= 255; fadeValue -= 5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
  }
  TEMPO = millis();}// porto tempo = a millis
}

al primo avvio funziona come vorrei led acceso e dopo un certo tempo si spegne lentamente e poi si riaccende lentamente , ma al secondo fa solo il fade,
qualche consiglio ? grazie

forum.arduino.cc/index.php?topic=491944.msg3361369#msg3361369

forum.arduino.cc/index.php?topic=500503.msg3415341#msg3415341

Grazie del suggerimento. Ho letto la discussione (dal cellulare quindi non molto accurata) .....ma non ho trovato un suggerimento per risolvere il problema...
Non riesco a capire perché al primo ciclo funziona
E poi continua ma senza la parte del millisecondi()

Forse perche metti tempo = millis FUORI dall'if ... messo cosi, ogni singolo ciclo del loop, tempo si rimette a millis, quindi la condizione dal secondo loop in poi non si riavvera piu ... :wink:

dove adesso non è dentro il ciclo if? è prima dell chiusura della parentesi `}.

p.s.
come da presentazione e gia un po che uso arduino per vari progetti , ma senza entrare nello specifico o capire il
funzionamento ,
adesso volevo conoscere piu affondo e volevo gestire il mio acquario ( ci sono tantissimi progetti gia belli e pronti in rete con codici , stampati ecc ma volevo fare tutto da me)e siccome prima si va gattoni , poi si cammina e dopo si corre , mi sono affidato ad un manuale per principianti , che pero non spiega bene ,o meglio non entra molto nel particolare , la funzione millis() , uso , problemi ecc..
se io ho una funzione if( millis()- tempo > intervallo) questa funzione mi blocca il resto del codice come la funzione delay() o continua svolgendo le altre istruzioni?
grazie

ciao albepancio,

ci provo...millis() è una funzione di base di Arduino che lavora "indipendentemente" dal tuo sketch...tu usi il valore che ritorna per fare delle verifiche tipo if(millis() - millisPrecedente > tempoVerifica)...che se vera verrà eseguita se falsa va avanti.

con delay() invece imponi al programma di stare fermo li...infatti delay() non lo usi per fare confronti o verifiche...ma come comando diretto.

nel tuo sketch hai messo TEMPO = millis(); prima dell'ultima parentesi grafa "}", quella che chiude il ciclo loop(), quindi non all'interno dell'if() ma fuori...e quindi TEMPO viene aggiornato ad ogni ciclo del loop()...con tutte le conseguenze.

albepancio:
se io ho una funzione if( millis()- tempo > intervallo) questa funzione mi blocca il resto del codice come la funzione delay() o continua svolgendo le altre istruzioni?

forum.arduino.cc/index.php?topic=520666.msg3551257#msg3551257

dico la mia
va bene l'obbiettivo lontano,ma almeno c'è l'hai un obbiettivo???
secondo me stai facendo un gran casino esclusivamente perche ti MANCA UN OBBIETTIVO.

sembri me la prima volta che ho fatto il mio 1° approccio ad arduino.

Provo a dartelo io un piccolo obbiettivo,ACCENDI e SPEGNI due semplici led alternati utilizzando millis().
-Niente librerie.
-Niente cicli for,while,do while.
-Niente delay.

è semplice da fare..fallo. :wink: :wink: :wink:

Quello lo ho già fatto usando prima il delY. Poi ho
Lavorato con le variabili ,sempre facendo una sequenza di accensioni, usando, sotto consiglio, un array e capendo anche il funzionamento.
Per ora lavoro sempre sui led .
Cmq il codice è scritto bene . Non funziona solo per quello errore?

la prima cosa che ho notato nel tuo schetc(e sono un neofita smanettone del PC),è che hai mischiato un po di cose.

ciao...allora adesso ho ricopiato lo sketch nell'ide di arduino e l'ho identata....così ho visto che tempo=millis() è messo nell'if...quindi avevi ragione tu solo che, almeno per me, non si capiva in quanto, appunto, l'identazione era fatta male ed il commento troppo vicino alla "}".

fai così nei due cicli for invece di creare una int fadeValue crea una word fadeValue...quindi sostituisci int con word...e guarda se ti funziona

albepancio:
Non funziona solo per quello errore?

Intanto dall'esempio e dai commenti si deduce che il collegamento del LED deve essere con anodo a +Vcc (acceso quando uscita a Arduino 0). È così?

Poi nei for sono sbagliate le condizioni (il conteggio continua sempre fino all'overflow della variabile).

for (int fadeValue = 0 ; fadeValue >= 0; fadeValue += 5) {// inizia sequenza di spegnimento

:o :o :o
cioè parti da 0, fino a quando il valore è maggiore uguale a 0 (ed è verificata come comincia il ciclo for) aggiungi 5 :o :o :o :o
penso che dovresti partire da qui :roll_eyes:
EDIT: rimane spento perché quel cliclo è sempre vero.
parte da 0
domanda: è maggiore o uguale a 0?
risposta: si poiché 0 inizialmente.
quindi entra nel for e aggiunge 5.
SECONDO GIRO
domanda: è maggiore o uguale a 0?
risposta: si poiché 5.
quindi entra nel for e aggiunge 5.
TERZO GIRO
domanda: è maggiore o uguale a 0?
risposta: si poiché 10.
quindi entra nel for e aggiunge 5.
. . .
e così va all'infinito e non uscirà più di li....
quindi penso sia più giusto

for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5)

EDIT 2: se è solo l'inizio di un progetto va bene impostarlo sull'utilizzo di millis(), ma se deve fare solo il fade ogni tot secondi allora io andrei di delay(5000) a led acceso.

Ciao Miky....

Claudio_FF:
Poi nei for sono sbagliate le condizioni (il conteggio continua sempre fino all'overflow della variabile).

aaahhh!! è così che si dice in termini tecnici! è inutile imparo sempre una cosa nuova... GRAZIE!!!

Grazie per le risposte.
La parte dei for é quella degli esempi dell' ide
Non li ho studiati ma semplicemente selezionati dagli esempi. Ed ho aggiunto il millis ()
Per il momento non entro nel merito se è come funziona quel ciclo.
Prima. Oglio capire bene il millis e perché non funziona il mio codice.
Ho preso l esempio del ide prrche do per scontato
Che siano funzionanti.

albepancio:
... Ho preso l esempio del ide prrche do per scontato

Puoi indicare l'esempio? In quale sezione si trova esattamente?

Guglielmo

analo ----->fading
volevo capire il funzionamento , del millis() e gia che cero volevo provare un effetto alba/tramonto,
cè un esempio (blink Withoutdelay) ma era gia fatto e poi fa solo lampeggiare illed
quindi ho seguito l altra strada esempio gia fatto per il fading( visto che non stvo studiandoo questa funzione) e millis () fatto da me

il led è collegato al positivo perche e un led rosso/verde, con il positivo in comune.

... quindi quel "for" errato NON lo hai preso da un esempio del IDE come dicevi ... ::slight_smile:

Guglielmo

albepancio:
volevo capire il funzionamento , del millis()

... sfatiamo un po' questo mito della millis().

millis() è una normalissima funzione (... come lo è sqrt(), che ritorna la radice quadrata di un numero) che chiamata restituisce il valore di un contatore ... tutto qui.

Un timer, preprogrammato dal "core" di Arduino, genera un interrupt ogni millisecondo e la ISR associata non fa altro che incrementare di 1 un contatore. Quando chiami la funzione millis() ti viene semplicemenete restituito detto contatore che, in pratica, contiene un numero che cresce sempre regolarmente nel tempo fino ad arrivare al suo massimo in 49 gg e qualche cosa in cui si azzera e ricomincia.

Quindi, di per sé, millis() è una banalissima funzione che ti torna un contatore.

Un altro paio di maniche è capire cosa farci con questo contatore ...
... ed una delle possibilità è misurarci "il tempo trascorso" (...visto che si incrementa di 1 ogni milliSec) e fare operazioni in funzione di detto trascorrere del tempo.

Quindi, se tu devi fare una cosa ogni tempo X basta che ti salvi il tempo iniziale e, ad ogni giro del loop() ti chiedi se il tempo attuale Y meno il tempo iniziale X sia maggiore o uguale dell'intervallo che volevi attendere. Se si fai quello che volevi fare e, volendo, puoi riprendere il nuovo tempo iniziale e ripetere la cosa all'infinito.

Tutto qui ... si tratta solo di capire come fare operazioni con il tempo che scorre ... :slight_smile:

Guglielmo

ho scritto male ,
allora volevo ( cercare ) capire il funzionamento dell millis(),
cè un esempio di milliss() nell ide, ma volevo fareda me ( altrimenti non riesco a capire il funzionamento)
quindi ( visto che volevo fae un effetto alba/ tramonto usando millis ) ho presodagli esempi dell ide
la funzione fadinged aggiungendo il milless ma non mi funziona o megli ( come ho scritto in precedenza)
va solo per un ciclo poi continua ad andare ma senza la parte millis()
oggi riprovo , magari parto col solo lampeggio e poi vedo
grazie