Cadencer l'acquisition avec un Timer

Bonsoir,
J’ai une carte Arduino Leonardo, et je cherche comment faire fonctionner un Timer avec un mode discontinu. Par exemple tous les heures je fais une acquisition des mesures via un C.A.N et les capteurs pendant 5 minutes. Je sais un peu près comment fonctionne un Timer avec cette carte Arduino en revanche je ne sais pas s’il me faut 2 Timers pour faire une acquisition toute les heures avec une acquisition en continue pendant 5 minutes ou bien un seul Timer me suffit pour ça. Merci d’avance de votre aide.

Pourquoi veux tu utiliser un timer?
C’est facilement faisable avec millis()

Rebonjour Kamill, pour pouvoir faire des choses en // sans ralentir le process. Et c’est propre de programmer avec un Timer il me semble non ?

il n’y a qu’un seul processeur, donc vous ne ferez rien en // …

le timer c’est bien pour gérer des choses à la micro ou milliseconde… là on dirait qu’il n’y a pas urgence si vous faites l’acquisition au bout de 1h et 1ms versus 1h pile…

avec ces durées, une RTC sera sans doute utile aussi

Bonjour JML,
Désolé mais je n’ai pas compris votre explication, le Timer n’a pas de rapport avec le processeur (il me semble). Effectivement, je fais une acquisition toute les heures pendant 5 minutes mais c’est quelque chose répétitive et je pensais à 2 Timers, il me semble que le Timer est fait pour cadencer le temps non ? Avec une RTC comment faites vous ?

De toute façon avec un timer tu ne pourras pas avoir des durées de 60 minutes, il te faudra un diviseur soft.

Oup! Je n’avais pas vu qu’on ne pouvait pas aller au delà de 60 minutes. Dans ce cas je vais plutôt me diriger vers une RTC comme l’avait dit JML. Une RTC c’est une horloge du coup je peux lire l’intervalle de temps quand je veux il me semble non ?

Pourquoi une rtc?

Le timer déclenche un événement mais ensuite c’est le processeur qui travaille et fait votre acquisition de données

La RTC c’est parce que j’imaginais que vu les délais entre acquisitions vous enregistrez cela sur plusieurs jours/semaines/mois et donc que vous aurez sans doute besoin de la vraie date

Sinon pour le besoin de base millis() fait le job

Effectivement, il y a 2 temps à surveiller en réalité mais je pense que vous l’avez vu.
t1= tous les x heures → On lance une acquisition des mesures via le CAN et les capteurs.
t2= On effectue les mesures pendant x minutes.
millis() fait le job → Certainement mais mon programme ne fait pas (il a d’autres tâches à effectuer) que ça du coup millis() reste fonction bloquante (je ne peux pas faire autre chose).

On peut gérer de façon hard 60mn avec 2 timers, le premier fournit une horloge pour le second. Il faut juste un bout de fil entre la sortie de l’un et l’entrée de l’autre. Mais une division soft sous interruption est plus simple encore.

En revanche, si je peux économiser un Timer ça sera bien (car j’ai besoin d’autres Timer pour faire autre chose). Je serai bien intéressé si on peut me montrer “une division soft sous interruption…” car d’après vileroi c’est encore plus simple.

Dans un premier temps je vais essayer de faire x heures pour commencer avec un seul Timer (pour traiter t1). Ensuite je vais voir pour t2…

Millis n’est pas bloquante… confusion avec delay() ??

uint32_t topChrono;
void setup() {}
void loop() {
   ... // votre business
  if (millis() - topChrono > 3600000ul) {
    // une heure de passée lancer le process d’acquisition 
    ,,,
    topChrono = millis();
  }
}

Bonjour Jackson,
J’ai du me confondre effectivement. Je ne connais pas la fonction millis() désolé, cette fonction elle retourne une valeur en millisecondes est ce bien ça ? sur une journée, un mois, un an ? Comment elle fonctionne cette fonction millis() ? Merci

Je viens de regarder, il me semble que la fonction millis() fonctionne sur 50 jours environ soit 4 320 000 000 millisecondes or uint32_t topChrono est limité à 4 294 967 295 ce qui est largement suffisant mais je me demande si on arrive à la valeur max la fonction millis() repasse à 0 pour recompter après ? Comment ça se passe ?

Bien!
Si tu gères correctement les millis, c’est à dire si tu fais
if (millis()-millisDebut)

Cette comparaison peut-être négative si on fait le tour du compteur millis() comment peut-on savoir ?

Non les deux sont des unsigned long, la différence est toujours positive ou nulle.

Alors je ne comprend pas grande chose, à l’instant t par exemple on a millisDebut = 4000 et millis() a fait le tour du coup il repart à 0. if (millis()-millisDebut) = 0 - 4000 = -4000 (non je me trompe ?)

Essaies

  unsigned long val1=0;
  unsigned long val2=4000;
  Serial.println(val1-val2);

Et tu verras que le résultat n’est pas négatif

D’accord Kamill, j’essaierai ce soir. Merci