info su "delay"

Chiedo scusa ma non sono riuscito a trovare info appropriate riguardo al comando "delay", volevo sapere a cosa è collegato... mi spiego meglio se assegno a delay 30000, quanti millisecondi sono? Ho realizzato un programma per una gestione dell'illuminazione di un acquario ed ho notato che sui tempi lunghi la funzione delay mi da tempi molto sballati, pertanto credo che alla base ci sia un "tempo" relativo all'unitá del comando delay, quanto dura 1 delay?

grazie

http://arduino.cc/en/Reference/Delay

delay() ferma lo sketch. Il valore indicato sono millisecondi. Puó essere un problema di tipi di variabili perché usi int al posto di unsigned long.

Puoi farci vedere lo sketch.

Ti consiglio di usare millis() al posto di delay. Vedi esempio blink witout delay http://www.instructables.com/id/Intermediate-Arduino-Inputs-and-Outputs/step1/Blink-without-Delay/

Ciao Uwe

La base dei tempi è data dall'oscillatore che da il clock all'Arduino. Se non è buono quello i tempi verranno sempre sballati.
L'Arduino DUEMILANVE monta un quarzo al posto dell'oscillatore ed è leggermente più preciso.

Trovi il codice della funzione delay() nel core di Arduino. Nelle sottodirectory dell'IDE.

p.s.
--> Arduino Playground - ShowInfo (Arduino Playground - ShowInfo)
s = SpeedTest

Grazie a tutti delle informazioni, conosco la possibilità di utilizzare il comando "millis()" ma la mia è una curiosità relativa appunto al comando delay (), nelle reference non ho trovato nulla a riguardo il tempo della funzione delay, tra l'altro io sto lavorando su un Attiny 85 programmato tramite Arduino Uno v3 in modalita ISP, so che ha un oscillatore interno ed io lo sto utilizzando a 16 Mhz pertanto un delay () quanto dura?

Dipende dal valore che inserisci fra le parentesi, e da come lo inserisci.

Se hai fatto delay(30000), sono all'incirca 30 secondi, sempre in base alla precisione dell'oscillatore.
Se hai fatto delay(variabile), dipende da come hai dichiarato la variabile.

Se ci facessi vedere un po' lo sketch, magari possiamo esserti un po' più d'aiuto, e non spariamo a caso delle risposte, non trovi ? :wink:

minosat:
tra l'altro io sto lavorando su un Attiny 85 programmato tramite Arduino Uno v3 in modalita ISP, so che ha un oscillatore interno ed io lo sto utilizzando a 16 Mhz pertanto un delay () quanto dura?

L'oscillatore interno è poco preciso inoltre è solo 8 MHz, se non usi la corretta board virtuale, con il clock dichiarato a 8 MHz, il programma viene compilato ragionando su un clock di 16 MHz e tutte le temporizzazioni, millis() inclusa, sono sbagliate perché durano il doppio, delay(30000) dura circa 60 secondi invece di circa 30 secondi.
Da notare che usando l'oscillatore interno l'errore sulle lunghe temporizzazioni è più che sensibile, parliamo di ottenere tempi compresi tra 33 e 27 secondi, invece che 30 secondi, utilizzando la calibrazione di serie, tra 31 e 29 secondi con calibrazione personale (serve un frequenzimetro per farla), inoltre l'oscillatore rc interno è fortemente influenzato dalla temperatura.
Per farla breve, scordatevi temporizzazioni precise con l'oscillatore interno.

astrobeed:
L'oscillatore interno è poco preciso inoltre è solo 8 MHz, se non usi la corretta board virtuale, con il clock dichiarato a 8 MHz, il programma viene compilato ragionando su un clock di 16 MHz e tutte le temporizzazioni, millis() inclusa, sono sbagliate perché durano il doppio, delay(30000) dura circa 60 secondi invece di circa 30 secondi.

Astro, in realtà, su ATTiny85, puoi usare il "High Frequency PLL Clock" che ti permette di avere, impostando CKSEL[3:0] a 0001, una frequenza di clock di 16MHz (Vd. pag. 26 del datasheet)

Ovviamente ... stendiamo un velo pietoso sulla precisione e stabilità di detto oscillatore per temporizzazioni precise :grin:

Guglielmo

Ecco dove volevo arrivare.... allora io ho programmato l'Attiny 85 per far accendere delle luci ad un tempo prefissato, non ho inserito alcuna variabile, ho solo eseguito un delay () calcolando ad esempio cicli di 15 minuti (espressi in millisecondi) e cicli di ore (4) sempre in millisecondi, ebbene se rimaniano nell'ordine dei 5 minuti... va quasi tutto ok ma se arriviamo ale ore ho un ciclo sballato, pertanto la mia curiosita era relativa a come settare opportunatamente il delay. Mi trovo con quanto detto da astrobeed in quanto settando il delay come multiplo di 512 ho una precisione quasi reale...il gioco si fa avvincente, adesso sono lontano dal pc ma piu tardi allego lo sketch tra l'altro è estremamente stupido ma efficace che svolge apieno al proprio compito tranne che nel essere preciso

@minosat : Non sperare di avere temporizzazioni precise con il "High Frequency PLL Clock". Leggermente più precise (ma comunque con differenze di minuti sulle 24 ore) le hai con il "Calibrated Internal Oscillator" lavorando ad 8 MHz (vd. pag. 27 del datasheet).

Nel caso ti servano invece tempi esatti ... l'uso di un RTC esterno è d'obbligo.

Guglielmo

E direi anche di un buon RTC e con i gusti accorgimenti.

Tempi esatti non mi servono, l'RTC ce l'ho ma volevo evitare di usarlo perchè sto usando l 'Attiny85 che montato sulla scheda di interfaccia mi snellisce molto il lavoro (uno zoccolo, un chip, tre transistor e piloto tanquillamente 5 strisce a led da 30 cm.... meno di così!) In effetti prevedendo di interfacciare l'RTC con l'Attiny credo sia cosa leggermente piu difficile! O no?

ecco allegato lo sketch del progetto :

void setup() {

pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);

}

void loop() {

analogWrite(0, 50);
delay(60000);
analogWrite(0, 100);
delay(60000);
analogWrite(0, 150);
delay(60000);
analogWrite(0, 200);
delay(60000);
digitalWrite(0, HIGH); // accende laterali

analogWrite(1, 50);
delay(60000);
analogWrite(1, 100);
delay(60000);
analogWrite(1, 150);
delay(60000);
analogWrite(1, 200);
delay(60000);
// delay(921600); // aspetta 15 minuti
digitalWrite(1, HIGH); // accende centrali bianche
delay(921600); // aspetta 15 minuti
digitalWrite(2, HIGH); // accende blu e giallo
digitalWrite(3, HIGH); // accende areatore

delay(1843200); // aspetta 30 minuti
digitalWrite(3, LOW); // spegne areatore

delay(14745600); // aspetta 4 ore
digitalWrite(0, LOW); // spegne laterali
digitalWrite(3, HIGH); // accende areatore
delay(1843200); // aspetta 30 minuti
digitalWrite(3, LOW); // spegne areatore

delay(14745600); // aspetta 4 ore
digitalWrite(0, HIGH); // accende laterali
digitalWrite(1, LOW); // spegne centrale
digitalWrite(3, HIGH); // accende areatore
delay(1843200); // aspetta 30 minuti
digitalWrite(3, LOW); // spegne areatore

delay(5529600); // aspetta 1 ora e 30 minuti
digitalWrite(1, HIGH); // accende centrale

digitalWrite(2, LOW); // spegne la blu
delay(921600); // aspetta 15 minuti
digitalWrite(1, LOW); // spegne la centrale
delay(921600); // aspetta 15 minuti
digitalWrite(0, LOW); // spegne la laterale
delay(44236800); // Dorme per 12 ore

}

minosat:
... In effetti prevedendo di interfacciare l'RTC con l'Attiny credo sia cosa leggermente piu difficile! O no?

NO, è banale ... almeno per gli RTC più usati come il DS1302 o il DS3231 ... basta studiarsi i datasheet :smiling_imp:

Guglielmo

ok gpb01 io sono in possesso di uno shield con DS1307 e pertanto come collegamento oltre a VCC e GND porta come pin di collegamento SCL e SDA i quali pin sull' Attiny85 corrispondono rispettivamente a PIN 7 (PB2) e PIN 5 (PB0) i suddetti pin nel mio progetto vengono ampiamente utilizzati come OUTPUT insieme al PIN 6 (PB1) ed al PIN 2 (PB3) e anche volendo spostarli non ho disponibilità in quanto il PIN1 (RESET) è inutilizzabile ed il PB4 me lo sono riservato come ingresso.

Se tu hai una dritta su come fare il collegamento del DS1307 al Attiny85 con questo miei collegamenti beh te ne sarei grato.

Grazie

L'Attiny85 non puoi collegarlo direttamente all'RTC perché l'Attiny85 NON ha l'interfaccia I2C interna. Serve un'apposita libreria, la TinyWire (disponibile sia per far funzionare il chippino come master che come slave):

I pin che citi tu sono collegati alla periferica USI, Universal Serial Interface, che è compatibile con l'interfaccia TwoWire, simile all'I2C.
http://playground.arduino.cc/Code/USIi2c

Scusate le mia ignoranza ma non ho capito e siccome devo imparare permettetemi di fare domande stupide, premettendo di usare le suddette librerie mi dite che posso collegare sullo stesso piedino (pin) del Attiny85 sia la comunicazione del DS1307 che l'uscita che mi pilota il transistor?
Ho capito bene? mi sembra strano che un pin impostato come output possa comunicare con una periferica tipo una shield DS1307...

Ovvio che se hai utilizzato già tutti i pin disponibili per altre cose NON puoi usarli anche per collegarci l'RTC !

Del resto tu avevi scritto :

minosat:
... In effetti prevedendo di interfacciare l'RTC con l'Attiny credo sia cosa leggermente piu difficile! O no?

... e la risposta era relativa a questa tua affermazione, ovvero che NO, non è difficile ... ma certo, devi avere i pin per farlo !

Passa al ATTiny84 e li avrai :grin: :grin: :grin:

Guglielmo

Ok comincia tutto ad essere piu chiaro, in effetti preso dalla foga per le potenzialita del Attiny85 ne ho comprati sei e pertanto adesso li devo utilizzare poi magari se proprio mi serve l'orologio cambio è ovvio... Pertanto ritorno al problema iniziale, volendo conoscere la durata del ciclo di "delay()" come posso fare? Esiste un modo per conoscere approssimativamente come calcolare il tempo con il comando delay?

SI, fai un ciclo LOW - HIGH - LOW su un pin gestito tramite una delay(10), colleghi l'oscilloscopio a tale pin e sai che ...
... in quel momento, a quella precisa temperatura e a quella precisa tensione di alimentazione, la delay(10) vale x millisecondi e ... che te ne fai ? ... visto che al variare dell'ambiente tutto cambia ? :smiling_imp:

T'è stato detto e ribadito che NON puoi avere un valore costante e preciso ... quindi, o t'accontenti dell'approssimazione che delay(1) è CIRCA 1 millisecondo o risolvi in altro modo !

Guglielmo