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