Arduino 08arduino_goodfields_64.jpgGestion du temps, et fonctions
 
Sommaire

Gestion  du temps Gestion du temps
La page principale ... La page principale ...
   
Vers le début Vers Page 2 Vers sommaire Gestion du temps
La gestion du temps, et en particulier des temporisations précises et de l'heure et date sont souvent utiles.
On va également commencer à faire des "sous-programmes" ou "routines", que j'ai l'habitude de placer en fin de programme, ou dans une source séparée ( toto.h par exemple ) que l'on incluera par un #include "toto.h", en début de programme (pour éviter les non-résolutions d'appels).

Donc, ici ce qui est nouveau c'est :
- On va utiliser la librairie Time.h : #include <Time.h>
- le sous-programme void ger_top_centieme () qui gère l'horloge, les tempos ... et qu'il faut appeler systématiquement en debut de loop principal.
- le sous-programme void horodatage_serial() qui envoie sur le port série un horodatage de la forme 'jj/mm/aaa hh:mm:ss ' avec des syntaxes sympa pour avoir une mise en forme avec les zéros non significatifs affichés : ":" << ((minute()<10)?"0":"") << minute() << ":" qui va nous donner :32: ou :01:
Démarrez le moniteur série pour voir la trace.
Voir aussi l'exemple dans Time.h pour la mise à l'heure par voie série ...

/*
  GoodFields 08_temps
  Gestion du temps
  Compactage des sorties série (intégration d'une bibliothèque : Streaming)
  GRAFCET
  TEMPORISATION basique
  FRONT MONTANT/DESCENDANT
  
La gestion du temps, et en particulier des temporisations précises et de l'heure et date sont souvent utiles.
Ajouter la librairie standard Time.h :
#include <Time.h>

On va également commencer à faire des "sous-programmes" ou "routines", que j'ai l'habitude de placer en fin de programme

Voir l'exemple dans Time.h pour la mise à l'heure par voie série ...
*/
 
//**********************************************************
// BIBLIOTHEQUES
// incluses dans le package Arduino de base
#include <Time.h>
// ajoutées
#include <Streaming.h>

//**********************************************************
// DECLARATIONS
// entrées-sorties
int led_a = 13;
// temporisations
int tempo_a,tempo_b;
// vitesse de clignotement : maintenant en millisecondes
int tempo_a_reset=1000;
int tempo_b_reset=700;
// gestion du temps
int interval=10;         // base de temps des traitements en ms
int previousSecond;      // secondes de l'horloge
int top_seconde=false;   // top pour traitements à la seconde dans le P/P
int top_minute=false;   // top pour traitements à la minute dans le P/P
unsigned long previousMillis;
// GRAFCETS
int grafcet_a,grafcet_b;

//**********************************************************
// INITIALISATIONS
void setup() {

// mise à jour de l'horloge
// l'horloge interne est au format UNIX, c'est à dire "nombre de secondes depuis le 1/1/1970 à 0h"
// T1262347200  //noon Jan 1 2010  ( secondes depuis le 01/01/1970 )
//  1261440000 sec/40 ans (le décalage donne 10 jours, soit bien 10 années bissextiles)
//       86400 sec/jour
//    31536000 sec/an
// mise à l'heure
  setTime(12,15,00,25,12,13); // 12h15 le 25 déc 2013 
  
// initialize the digital pins
  pinMode(led_a, OUTPUT);     
// ligne série (pour traces)
  Serial.begin(9600);  // ou 9600 selon votre port COM
  Serial << "Serial ok" << endl;
// on arme les grafcets
  grafcet_a = 1;
  grafcet_b = 1;
}
//**********************************************************
// PROGRAMME PRINCIPAL
void loop() {

// gestion du temps
  ger_top_centieme ();

//--------------------------------
// GRAFCET A
switch (grafcet_a) {

  case 1:
  if ( tempo_a == 0 ) {        // si la tempo est terminée,
    digitalWrite(led_a, HIGH);   // on allume la LED
    tempo_a = tempo_a_reset;             // on arme la tempo
    grafcet_a++;               // et on passe à l'étape suivante
  }
  break;      // cette instruction vous fait sauter à la fin du "switch"
  // sinon, on continue, et cela fait perdre du temps, et il peut arriver que d'autre "case" fonctionnent ! 

  case 2:
  if ( tempo_a == 0 ) {
    digitalWrite(led_a, LOW);    // turn the LED off by making the voltage LOW
    tempo_a = tempo_a_reset;             // on arme la tempo
    grafcet_a=1;               // on reboucle
  }    
  break;

// si grafcet_a n'a pas une valeur correcte, on passe ici
  default: 
      grafcet_a = 0; // on arrête
  break;
}      // fin du "switch"
// FIN GRAFCET A
//--------------------------------
// GRAFCET B
switch (grafcet_b) {

  case 1:
  if ( tempo_b == 0 ) {        // si la tempo est terminée,
    horodatage_serial(); Serial << " grafcet_b=" << grafcet_b <<  " grafcet_a=" << grafcet_a <<endl;
    tempo_b = tempo_b_reset;             // on arme la tempo
    grafcet_b++;               // et on passe à l'étape suivante
  }
  break;      // cette instruction vous fait sauter à la fin du "switch"

  case 2:
  if ( tempo_b == 0 ) {
    horodatage_serial(); Serial << " grafcet_b=" << grafcet_b <<  " grafcet_a=" << grafcet_a <<endl;
    tempo_b = tempo_b_reset;             // on arme la tempo
    grafcet_b=1;               // on reboucle
  }    
  break;

// si grafcet_a n'a pas une valeur correcte, on passe ici
  default: 
      grafcet_b = 0; // on arrête
  break;
}      // fin du "switch"
// FIN GRAFCET B
//--------------------------------
}
// ************************************************************************************************
// SOUS-PROGRAMMES
// ************************************************************************************************
// Programme au -ieme de seconde
// gestion des temporisations
// NB : le débordement du compteur en (unsigned long) a lieu tous les 50 jours environ ...
void ger_top_centieme (){
  unsigned long delta;
  unsigned long currentMillis = millis();
  delta = currentMillis - previousMillis;
  if (delta >= interval) {
// save the last time you come here
    previousMillis = currentMillis;   

// temporisations diverses
//    if (fonction_tempo >= delta) { fonction_tempo -= delta; } else { fonction_tempo = 0; }
// gestion des TEMPORISATIONS
    if (tempo_a >= delta ) { tempo_a -= delta; } else { tempo_a = 0; }
    if (tempo_b >= delta ) { tempo_b -= delta; } else { tempo_b = 0; }
  
// tops seconde et minute pour traitements dans le main
    if (second() != previousSecond) {
      previousSecond = second();
      top_seconde = true;
      if (previousSecond == 0) top_minute=true;
    }
  }
  return;
}
// ************************************************************************************************
// affichage horloge complete sur la sortie serie, sans fin de ligne
void horodatage_serial() {
// digital clock display of the time
//  Serial << day() << "/" << month() << "/" << year() << " " << hour() << printDigits(minute()) << printDigits(second()) << endl; 
  Serial << ((day()᝺)?"0":"") << day() << "/" << ((month()᝺)?"0":"") << month() << "/" << year() << " " << ((hour()᝺)?"0":"") << hour() << ":" << ((minute()᝺)?"0":"") << minute() << ":" << ((second()᝺)?"0":"") << second();
}
// ************************************************************************************************


Photos de la page :

Dernière mise à jour : 11:39:57 18/09/2020