Arduino 08
Gestion du temps, et fonctions
Sommaire
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