Lettura sensori ogni ora

Buonasera,
ho la necessità di leggere dei sensori (temperatura, luminosità, ecc.) ogni ora.
So che non è possibile usare delay con intervalli così lunghi.
Sono al corrente che posso usare millis().
Il circuito comprende anche un Real Time Clock, quindi potrei anche leggere i sensori ogni qualvolta i valori del Real Time Clock minuti = 0 e secondi = 0, così la lettura avverrebbe ogni ora.
Così facendo però Arduino continua a elaborare in continuazione fino a che non si verifica la condizione.
Ci sono altre soluzioni migliori? Secondo voi quale è la strategia migliore?

Grazie mille a tutti

Buonasera e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

begins:
... So che non è possibile usare delay con intervalli così lunghi.

... ti hanno informato male e, se guardi nel reference della funzione, ti accorgi che si aspetta in ingresso un unsigned long ... quindi, puoi arrivare a quasi 50 giorni (4294967 secondi, pari a 49.7 giorni) :smiley:

Il problema è che se usi la delay(), il programma NON può fare altro (si blocca li e aspetta), se invece impari ad usare come si deve la funzione millis(), mentre aspetti la tua ora, puoi anche fare tante altre cose :wink:

Guglielmo

Grazie mille per la delucidazione.
Io in realtà non devo fare altro in quel lasso di tempo quindi potrebbe interessarmi usare il delay.
Con delay, tutto Arduino rimane completamente bloccato senza eseguire alcun tipo di operazione?
In sostanza io vorrei evitare che Arduino continui ad eseguire operazioni e controlli inutilmente durante il periodo di pausa.

Lascia stare il delay e usa millis() oppure l'RTC.
L'unica operazione che fa arduino nel "tempo morto" è un if per verificare se è giunto il momento.

Grazie mille.
Se Arduino rimane acceso per mesi e mesi, ci sono problemi se continua a verificare questa condizione if ad oltranza?

begins:
... In sostanza io vorrei evitare che Arduino continui ad eseguire operazioni e controlli inutilmente durante il periodo di pausa.

NON esiste ... nessuna MCU, se accesa, non esegue nulla, se, per ragioni di consumi, la si vuole fermare, la si deve mettere in una modalità partcolare di consumo ridotto.

Comunque, NON stai parlando di una macchina, una MCU, purché usata nei parametri del costruttore (temperatura, tensione, ecc), è fatta per lavorare in continuazione.

Se non devi fare altro, usa tranquillamente delay(), inutile usare altro, ma ricorda che ... presto, andando avanti, ti scontrerai con problematiche in cui invece, per certe cose dovrai attendere, mentre per altre no, quindi ... dovrai studiare come si usa millis() o non ne uscirai :wink:

Guglielmo

Si certo, io so come usare millis, o come sfruttare il RTC, la mia era una domanda legata a cosa è più consigliato fare per salvaguardare Arduino e non fargli eseguire controlli in più inutilmente.
Seguirò il vostro consiglio sicuramente!

Grazie mille!

begins:
Il circuito comprende anche un Real Time Clock, quindi potrei anche leggere i sensori ogni qualvolta i valori del Real Time Clock minuti = 0 e secondi = 0, così la lettura avverrebbe ogni ora.
Così facendo però Arduino continua a elaborare in continuazione fino a che non si verifica la condizione.

Mah a me non pare tutta sta difficoltà…

...
DateTime dateTime;
byte Hour;
byte lastHour = -1;
...
bool checkTime() {
  dateTime = rtc.now();
  Hour = dateTime.hour();
  bool Esegui = false;
  if (Hour != lastHour) {
    Esegui = true;
    lastHour = Hour;
  }
  return Esegui;
}
...
  if (checkTime()) {
    // Fai quello che devi fare
    ...
  }
...

PS: non controllo minuti e secondi perché se per caso il check non lo esegui esattamente in quel secondo, “salti” l’ora. Così invece sei sicuro che esegui il codice sempre e solo una volta l’ora.
Se alla partenza hai bisogno di essere certo che venga eseguito solo ad inizio dell’ora successiva cambia l’inizializzazione di lastHour con l’ora corrente:

byte lastHour = dateTime.hour();

begins:
domanda legata a cosa è più consigliato fare per salvaguardare Arduino e non fargli eseguire controlli in più inutilmente

Arduino non si stanca. Anche se il tuo programma non fa nulla, i circuiti interni continuano comunque ad avanzare di un passo sedici milioni di volte al secondo eseguendo un sacco di operazioni, tra cui eseguire una per una le singole istruzioni in linguaggio macchina in cui il tuo programma C viene tradotto dal compilatore. Per fargli eseguire davvero il minimo possibile dovresti scendere a livello di programmazione assembly, e anche così a meno di non mettere tutto in sleep hardware continueresti ad eseguire lo stesso milioni di istruzioni al secondo.

Piuttosto considera che delay e millis hanno un errore di diversi secondi all'ora, mentre un RTC alcuni secondi al mese.

Il modo consigliabile di strutturare il software è fare in modo che il ciclo di loop si ripeta il più velocemente possibile, testando tutte le condizioni che servono per far avanzare il proprio processo, e in pratica è l'unico modo "giusto", comodo e generale per elaborare più cose "contemporaneamente".

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.