Millis o contatore attivazione relè?

Buonasera a tutti, facendo fatica a reperire informazioni chiedo a voi. Devo attivare un refrigeratore oppure una resistenza (attraverso relè)in base allo step in cui mi trovo, mi spiego meglio: alla pressione di un tasto partirà il mio programma che riscaldera fino a 42 gradi e ci resterà per 8 ore per poi riscendere ad una temperatura per altre 4 ore (tutto controllato da una sonda ntc). Il problema sta nel fatto che oltre a dovere scrivermi su LCD il tempo che sta trascorrendo o viceversa dovrà attivare la resistenza oppure il refrigeratore perciò di certo non potrò usare la funzione delay e vorrei poter non usare neppure un modulo rtc. A questo punto conviene usare la funzione Millis?

Il valore ritornato dalla funzione millis (ma anche il ritardo prodotto con delay) ha normalmente qualche minuto secondo di errore all'ora se si fanno i conti correttamente (altrimenti di più), quindi per un periodo di 12 ore ci si possono aspettare almeno tre quarti d'ora circa 50 secondi di errore.

Si può certamente misurare un'ora millis per vedere di quanto differisce dall'ora reale e modificare in proporzione i valori (ma l'operazione va effettuata direttamente sull' Arduino che si intende utilizzare, perché gli oscillatori possono differire leggermente l'uno dall'altro, e anche a causa della temperatura).

Ma contare i secondi con un RTC (anche non regolato se l'ora non serve) è senz'altro preferibile, anche perché non è influenzato da eventuali ulteriori ritardi di millis causati da gestione interrupt ecc.

quindi la cosa migliore sarebbe l' ulilizzo di un' RTC? oppure un modo nel quale la temperatura venga continuamente monitora ma e intanto il tempo di 6 ore scorra?

Claudio_FF: Il valore ritornato dalla funzione millis (ma anche il ritardo prodotto con delay) ha normalmente qualche minuto di errore all'ora se si fanno i conti correttamente (altrimenti di più), quindi per un periodo di 12 ore ci si possono aspettare almeno tre quarti d'ora di errore.

Secondo me esageri di tanto. Il risuonatore che fa il clock del Arduino UNO è impreciso ( intorno al 0,5%) ma passare da 0,5% al 6% che Tu scrivi non c'é motivo. Se si vuole essere piú preciso si puó usare un Arduino Leonardo o Micro che ha un quarzo che ha la precisione confrontabile a un normale RTC. Ci sono anche RTC corretti alla tempaeratura (cme il DS3231) che hanno un errore nella grandezza di qualche secondo al anno. @ samu92 Cerca un po, ci sono giá un sacco di progetti per produrre la birra.

Ciao Uwe

hahaha non è proprio birra ma è yogurt… il fatto è che utilizzando un normale RTC me ne farei ben poco più che altro non m interessa avere l’ ora corrente esatta ma una specie di conto alla rovescia non credo che su 6 ore se perda un paio di minuti ci siano problemi ma mi interessa più che altro che il programma non si fermi e che possa essere visualizzato il tempo su LCD.

Puoi usare tranquillamente la funzione millis() ... :)

Guglielmo

Volendo proprio esagerare, si puo sempre saldare un quarzo vero al posto dell'oscillatore ceramico ... ;)

(ma la uno r3 non monta gia un quarzo SMD da 16MHz, ora che ci penso ?)

Etemenanki: (ma la uno r3 non monta gia un quarzo SMD da 16MHz, ora che ci penso ?)

... si, ma per l'ATmega16U2, non per il ATmega328P :D :D :D

Guglielmo

Avete qualche idea sul come?utilizzando la funzione millisecondi a questo punto, visto che ha quanto mi dite per ciò che devo fare è più che abbastanza. Mi piacerebbe che una volta raggiunta la temperatura parta il conto alla rovescia a display (mostrando ore e minuti a display ho letto tante domande su questo ma senza venirne a capo) senza però interrompere programma in quanto deve attivare relè per frigo oppure resistenza(poi vedrò se conviene il PID).

Se sostituisci il risuonatore con un quarzo devi aggiungere anche i 2 condensatori da 22pF. Ciao Uwe

ma mi serve sostituire i componenti? a me non serve tutta questa precisione utilizzerei come ho detto la funzione millis

samu92: ma mi serve sostituire i componenti? a me non serve tutta questa precisione utilizzerei come ho detto la funzione millis

NO, non ti serve, Uwe stava rispondendo ad Etem, non a te.

Per i tuoi scopi va bene Arduino così com'è e la funzione millis().

Guglielmo

ok perfetto ma come posso gestirla la cosa?

Beh ... devi studiarti bene come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... :)

Anche una lettura di QUESTO post è sicuramente utile.

Guglielmo

Tutto chiaro, quello che non mi è chiaro è il come scrivere a Lcd ore e minuti mancanti

... beh, direi con un semplice calcolo.

Se imposti, ad esempio, a 1 ora e 15 minuti hai che dovrai, con millis() verificare se sono passati 75 minuti = 4500 secondi = 4500000 millesimi di secondo.

Mano mano che passano i secondi, scali da questo valore e fai il calcolo al contrario dividi per 1000 ed hai i secondi rimanenti, dividi per 60 ed ha i minuti mentre il resto della divisione ti permette di calcolare i secondi. I minuti divisi a loro volta per 60 ti danno le ore ed il resto della divisione ti permette di calcolare i minuti.

Guglielmo

Quando parte il "conto alla rovescia" calcoli il limite sommando a millis() corrente (trascuro il problema del reset di millis(), tanto se hai già letto quello che ti ha indicato Guglielmo dovresti sapere come gestirlo) il valore di secondi prima della fine periodo ossia per semplicità assumiamo di non voler arrivare alla precisione del millisecondo ma che i secondi siano più che sufficienti possiamo tenere riferimenti più piccoli. Ad esempio per 4 ore:

secFine = millis()/1000 + 4 * 3600;

Quindi nel loop calcoli quanto manca, in secondi, semplicemente facendo secFine-millis()/1000, quindi per visualizzarlo in ore minuti e secondi devi semplicemente fare le divisioni intere per 3600 e 60, più il resto.

Esempio:

unsigned long secFine;

unsigned long secMancanti;
unsigned int ore, min, sec = 0;

void setup(){
  Serial.begin(9600);
  secFine = millis()/1000 + 4 * 3600;
}

void loop() {
  secMancanti = secFine-millis()/1000;
  ore = secMancanti/3600;
  secMancanti -= ore*3600;
  min = secMancanti/60;
  secMancanti -= min*60;
  sec = secMancanti;
  Serial.print(ore);
  Serial.print(":");
  Serial.print(min);
  Serial.print(":");
  Serial.println(sec);
  delay(1000);
}

uwefed: Secondo me esageri di tanto.

Vero, verissimo, ho confuso secondi con minuti.

Le misure di frequenza (con risoluzione 0.1Hz) sul pro mini mi danno uno 0.122% di errore, pari a meno di cinque secondi all'ora. Ho corretto il post sopra.

L'Arduino2009 che ha il clock quarzato mi da un errore dello 0.002% (0.072 secondi all'ora)

Invece i due RTC DS3231 per ora stanno sgarrando circa uno o due secondi al mese.

samu92: Ho risolto in questo modo può funzionare secondo voi oppure ci sono errori? è solo una bozza ma testandolo funziona (allegato).

allegato? dove cosa?

Ho risolto in questo modo può funzionare secondo voi oppure ci sono errori? è solo una bozza ma testandolo funziona (allegato). scusami ho riaggiornato con allegato

YogV1.ino (3.31 KB)