LOCODUINO

Aide
Forum de discussion
Dépôt GIT Locoduino
Flux RSS

vendredi 26 avril 2024

Visiteurs connectés : 102

Comment gérer le temps dans un programme ?

et comment faire plusieurs tâches simultanément

. Par : Dominique, Guillaume, Jean-Luc

Dès vos premières applications, vous avez pu constater que la gestion du temps revient très fréquemment dans la programmation des diverses applications qui nous concernent. Cela va de choses simples comme les animations lumineuses à base de DEL comme dans « Chenillard de DEL » ou « Enseigne de magasin » ou bien l’envoi d’une impulsion de (...)

Retourner à l'article

Vous répondez à :

Comment gérer le temps dans un programme ? 22 juin 2023 08:59, par Jean-Luc

Bonjour Bernard,
 
J’ai parcouru le document. Concernant les feux à occultation et les feux à éclats, le fonctionnement se réduit à une série de durées avec un changement d’état du feu à chaque frontière. Ça peut être représenté par un tableau de durées et un état initial du feu (allumé ou éteint). D’où la définition de la classe FeuMaritime :

class FeuMaritime {
    /* Dates relatives de changement d'état du feu */
    const uint32_t *mDatesChangement;
    /* Dernière date de changement */
    uint32_t mDerniereDate;
    /* Nombre de dates */
    uint8_t mNombreDeDates;
    /* Changement courant */
    uint8_t mChangementCourant;
    /* Etat initial */
    uint8_t mEtatInitial;
    /* Pin de la LED */
    uint8_t mLEDPin;

    /* Chainage de tous les objets lors de leur création */
    FeuMaritime *mNext;
    static FeuMaritime *sListe;

  public:
    FeuMaritime(const uint8_t inLEDPin,
                const uint32_t *inDatesChangement,
                const uint8_t inNombreDeDates,
                const uint8_t inEtatInitial):
      mLEDPin(inLEDPin),
      mDatesChangement(inDatesChangement),
      mDerniereDate(0),
      mNombreDeDates(inNombreDeDates),
      mEtatInitial(inEtatInitial)
    {
      mNext = sListe;
      sListe = this;
    }

    void objectLoop() {
      const uint32_t nouvelleDate = millis();
      if (nouvelleDate - mDerniereDate > mDatesChangement[mChangementCourant]) {
        digitalWrite(mLEDPin, ! digitalRead(mLEDPin));
        mDerniereDate = nouvelleDate;
        mChangementCourant++;
        if (mChangementCourant == mNombreDeDates) {
          mChangementCourant = 0;
        }
      }
    }

    void objectSetup() {
      pinMode(mLEDPin, OUTPUT);
      digitalWrite(mLEDPin, mEtatInitial);
    }

    static void setup() {
      FeuMaritime *objetCourant = sListe;
      while (objetCourant != NULL) {
        objetCourant->objectSetup();
        objetCourant = objetCourant->mNext;
      }
    }

    static void loop() {
      FeuMaritime *objetCourant = sListe;
      while (objetCourant != NULL) {
        objetCourant->objectLoop();
        objetCourant = objetCourant->mNext;
      }
    }

};

FeuMaritime *FeuMaritime::sListe = NULL;

Les arguments du constructeur sont la broche où la LED est connectée, un pointeur vers un tableau de constantes qui sont les intervalles de temps, le nombre d’éléments dans ce tableau et l’état initial (HIGH ou LOW).
 
Pour utiliser cette classe, il faut d’abord instancier un tableau de constantes puis instancier un objet en lui passant ce tableau. Voici par exemple les feux mentionnés aux sections 2.1, 2.2 et 2.3.

const uint32_t specAISM1[] = { 1000, 3000 };
FeuMaritime feuAOccultationsRegulieres(0, specAISM1, 2, LOW); 

const uint32_t specAISM2[] = { 1000, 2000, 1000, 6000 };
FeuMaritime feuAOccultationsGroupees(1, specAISM2, 4, LOW); 

const uint32_t specAISM3[] = { 1000, 1000, 1000, 3000, 1000, 9000 };
FeuMaritime feuAOccultationsDiversementGroupees(2, specAISM3, 6, LOW); 

setup et loop sont simplement :

void setup() {
  FeuMaritime::setup();
}

void loop() {
  FeuMaritime::loop();
}
Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

65 Messages

Rubrique Programmation

Le monde des objets (1)

Le monde des objets (2)

Le monde des objets (3)

Le monde des objets (4)

Les pointeurs (1)

Les pointeurs (2)

Les Timers (I)

Les Timers (II)

Les Timers (III)

Les Timers (IV)

Les Timers (V)

Bien utiliser l’IDE d’Arduino (1)

Bien utiliser l’IDE d’Arduino (2)

Piloter son Arduino avec son navigateur web et Node.js (1)

Piloter son Arduino avec son navigateur web et Node.js (2)

Piloter son Arduino avec son navigateur web et Node.js (3)

Piloter son Arduino avec son navigateur web et Node.js (4)

Démarrer en Processing (1)

L’assembleur (9)

Comment gérer le temps dans un programme ?

L’assembleur (8)

Processing pour nos trains

L’assembleur (7)

L’assembleur (6)

Arduino : toute première fois !

TCOs en Processing (1)

L’assembleur (5)

L’assembleur (4)

L’assembleur (3)

L’assembleur (2)

L’assembleur (1)

TCOs en Processing (2)

Calculer avec l’Arduino (1)

La programmation, qu’est ce que c’est

Types, constantes et variables

Installation de l’IDE Arduino

Répéter des instructions : les boucles

Les interruptions (1)

Instructions conditionnelles : le if ... else

Instructions conditionnelles : le switch ... case

Comment concevoir rationnellement votre système

Comment gérer l’aléatoire ?

Trucs, astuces et choses à ne pas faire !

Calculer avec l’Arduino (2)

Les structures

Systèmes de numération

Les fonctions

Trois façons de déclarer des constantes

Transcription d’un programme simple en programmation objet

Ces tableaux qui peuvent nous simplifier le développement Arduino

Les chaînes de caractères

Les derniers articles

L’assembleur (9)


Christian

L’assembleur (8)


Christian

L’assembleur (7)


Christian

L’assembleur (6)


Christian

L’assembleur (5)


Christian

L’assembleur (4)


Christian

L’assembleur (3)


Christian

L’assembleur (2)


Christian

L’assembleur (1)


Christian

TCOs en Processing (2)


Pierre59

Les articles les plus lus

Les Timers (I)

Les interruptions (1)

Instructions conditionnelles : le if ... else

Ces tableaux qui peuvent nous simplifier le développement Arduino

Comment gérer le temps dans un programme ?

Les Timers (II)

Piloter son Arduino avec son navigateur web et Node.js (1)

Calculer avec l’Arduino (1)

Les Timers (III)

Calculer avec l’Arduino (2)