Go Down

Topic: Millis o contatore attivazione relè? (Read 1 time) previous topic - next topic

gpb01

#15
May 25, 2018, 01:27 pm Last Edit: May 25, 2018, 01:27 pm by gpb01
... 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
Search is Your friend ... or I am Your enemy !

docdoc

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:
Code: [Select]
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);
}
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Claudio_FF

#17
May 25, 2018, 06:33 pm Last Edit: May 25, 2018, 06:47 pm by Claudio_FF
Quote from: 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.

* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

uwefed

#18
May 27, 2018, 09:38 am Last Edit: May 27, 2018, 08:00 pm by uwefed
Ho risolto in questo modo può funzionare secondo voi oppure ci sono errori? è solo una bozza ma testandolo funziona (allegato).
allegato? dove cosa?

samu92

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

Silente

In Arduino se funziona é la soluzione. Può anche essere un catorcio, non ha importanza

samu92

haha pero mi piacerebbe sapere se se potrebbero esserci errori ??

Claudio_FF

#22
May 27, 2018, 07:29 pm Last Edit: May 27, 2018, 07:30 pm by Claudio_FF
Il codice non è indentato.

Comandi due volte di fila 'resistenza' con due livelli opposti.

Immagino che sia normale non uscire dallo stato 3.

Indichi cosa fare se le temperature sono maggiori o minori, ma niente se sono uguali.

Nel caso in cui 'temp' sia <= 99 nello stato 2 non viene eseguita più alcuna azione.

La condizione:
Code: [Select]
if ( ore == 0, min == 0, sec == 0)non sapevo neppure fosse sintatticamente corretta, in effetti non so cosa fa.
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

samu92

in effetti non era proprio il massimo è il fatto del tempo non rimasto non funziona come dovrebbe.. Ora ho corretto un pò di cose e parrebbe funzionare ad esclusione del fatto che non riesco a passare allo stato 3 quando il tempo è 0.

gpb01

#24
May 27, 2018, 08:04 pm Last Edit: May 27, 2018, 08:04 pm by gpb01
La condizione:
Code: [Select]
if ( ore == 0, min == 0, sec == 0)
non sapevo neppure fosse sintatticamente corretta, in effetti non so cosa fa.
Sicuramente NON fa quello che lui si aspetta ...

... l'espressione viene valutata da sinistra a destra, l"operazione" viene eseguita ed il risultato scartato, dopo di che si prosegue sino all'ultima che è l'unica che, oltre ad essere "eseguita" viene anche presa in considerazione.

Quote
In the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).
Guglielmo
Search is Your friend ... or I am Your enemy !

samu92

quindi devo proprio cambiare modo di pensare questa parte di programma esatto?

Silente

... Non basterebbe sostituire le , con degli &&? Così sarebbe
Se (le ore sono zero E i minuti sono zero E i secondi sono zero) fai

gpb01

#27
May 27, 2018, 11:10 pm Last Edit: May 27, 2018, 11:10 pm by gpb01
... Non basterebbe sostituire le , con degli &&?
... si, anche se è sempre molto rischioso fare un confronto che include i secondi ... se non si passa in quella IF nel momento "esatto" in cui ore, minuti e secondi sono zero, essa NON viene soddisfatta.

Guglielmo
Search is Your friend ... or I am Your enemy !

samu92

quindi un buon metodo potrebbe essere if ( ore == 0 & minu == 0 & sec < 20) cosi da poter essere certo? riallego comunque il mio sketch con qualche aggiornamento .

gpb01

#29
May 28, 2018, 08:19 am Last Edit: May 28, 2018, 08:20 am by gpb01
Impara la differenza tra l'operatore bitwise & e l'operatore booleano && e ... coreggi quello che hai scritto.

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up