Projet de télérupteur temporisé

Bonjour,

Pour mon projet de télérupteur temporisé, je souhaiterais programmer une fonction un peu plus évoluée que la fonction MsTimer2.h, qui me permettrait d’alerter les personnes présentes dans la zone
de balayage de mon télérupteur que celui-ci va bientôt se couper automatiquement au bout d’un certain délais :

La fonction devrait pouvoir générer un signal de ce type sur une sortie de ma carte arduino :

activer sortie LED pendant 60s
couper sortie LED pendant 0.3s
activer sortie LED pendant 5s
couper sortie LED pendant 0.3s
activer sortie LED pendant 20s
couper sortie LED.

Merci d’avance pour vos reponses

Cordialement

DOM

#include <MsTimer2.h>

const int BP = 8;       // Declaration variable pour entree 8 = B.P. allumage lampe
const int LAMPE = 2;    // Declaration variable pour sortie 2 = lampe

int etat_BP;            // Declaration variable etat du B.P. (ouvert/ferme)
int ancien_etat_BP;     // Declaration variable ancien etat du B.P. (ouvert/ferme)
int etat_sortie2_Lampe; // Declaration variable pour sortie 2 = ma lampe

int timer_2_start = 0;  // Pour extinction de la lampe sur temporisation

// Vrai au bout de X secondes
void InterruptTimer2() 
{
    digitalWrite(LAMPE, LOW);
    etat_BP=ancien_etat_BP;
    etat_sortie2_Lampe = 0;
}


void setup() 
{
   // Definition des fonction de chaque PIN 
   // 1) ENTREES
   pinMode(BP, INPUT); // Definition PIN 8 = ENTREE
   // 2) SORTIES
   pinMode(LAMPE, OUTPUT);// Definition PIN 2 = SORTIE
   pinMode(3, OUTPUT);// Definition PIN 2 = SORTIE

   // 3000 ms => 3s !
   MsTimer2::set(3000, InterruptTimer2); 
}

void loop() 
{
   digitalWrite(BP, HIGH);

   etat_BP=digitalRead(BP);

   delay(100);
      
   if ( etat_BP != ancien_etat_BP )
   {
     if ( !etat_BP )
     {
       etat_sortie2_Lampe = !etat_sortie2_Lampe;
       digitalWrite(LAMPE, etat_sortie2_Lampe);
     }
   }
   
    // Permet de lancer a tache d'extinction sur temporisation
    // Si le BP est relache
    if ( digitalRead(BP) == HIGH )
    {
      // Si la lampe est allumee,
      if ( digitalRead(LAMPE) == HIGH )
      {
           if ( timer_2_start == 0 )
           {
              timer_2_start = 1;
              MsTimer2::start(); // active Timer 2
           }
      } 
      else
      {
           timer_2_start = 0;
           MsTimer2::stop(); // desactive Timer 2
      }
    }
    
    ancien_etat_BP = etat_BP;
}

Idealement, voici le type de signal que je souhaiterais programmé :

Bonjour,

Donc ce matin, j’ai avancé dans mon projet, je suis arrivé à une version stable qui fonctionne, j’ai utilisé pour cela une librairie SimpleMinuteur.zip que j’ai trouvé sur le forum.

Vous trouverez mon code en bas de ce message.

L’etape suivante pour moi va etre de simplifier mes ecritures, car je voudrais alléger tout ça, de maniere
à pouvoir appeler une fonction pour chacune de mes lampes à piloter, car dupliquer ce que j’ai fait pour 3 lampes, j’en suis capable, mais je pense qu’il y a mieux à faire : je demande donc de l’aide pour peut etre generé mon cprog code de fonction en .cpp et .h.

Merci d’avance à tous.

DOM

#include <simpleMinuteur.h>

#define TEMPO_DUREE_MAXI_PHASE_1_MS 5000

// Duree maxi avant signalement temps_maxi_ecoulee
simpleMinuteur tempo_phase_1(TEMPO_DUREE_MAXI_PHASE_1_MS);// Duree phase 1
simpleMinuteur tempo_micro_coupure_1(300);        // Duree des micro coupure
simpleMinuteur tempo_phase_2(2000);               // Duree phase 2 apres 1ere micro coupure
simpleMinuteur tempo_micro_coupure_2(300);        // Duree des micro coupure
simpleMinuteur tempo_phase_3(2000);               // Duree phase 3 apres 2nd micro coupure

const int BP = 8;       // Declaration variable pour entree 8 = B.P. allumage lampe
const int LAMPE_2 = 2;  // Declaration variable pour sortie 2 = lampe
const int LAMPE_3 = 3;  // Declaration variable pour sortie 3 = lampe

int etat_BP;            // Declaration variable etat du B.P. (ouvert/ferme)
int ancien_etat_BP;     // Declaration variable ancien etat du B.P. (ouvert/ferme)
int etat_sortie2_Lampe; // Declaration variable pour sortie 2 = ma lampe

int mode_timer_ctrl_start = 0;  // Pour extinction de la lampe sur temporisation
int restart_demande = 0;

void setup() 
{
   // Definition des fonction de chaque PIN 
   // 1) ENTREES
   pinMode(BP, INPUT); // Definition PIN 8 = ENTREE
   // 2) SORTIES
   pinMode(LAMPE_2, OUTPUT);// Definition PIN 2 = SORTIE
   pinMode(LAMPE_3, OUTPUT);// Definition PIN 3 = SORTIE
}

void loop() 
{
   digitalWrite(BP, HIGH);

   etat_BP=digitalRead(BP);

   delay(100);

    // Si le BP est appuye
    if ( (digitalRead(BP) == LOW) && (mode_timer_ctrl_start >= 2) )
    {
      digitalWrite(LAMPE_3, HIGH);
      restart_demande = 1;
    }
      
   if ( (etat_BP != ancien_etat_BP) && (restart_demande != 1) )
   {
     if ( !etat_BP )
     {
       etat_sortie2_Lampe = !etat_sortie2_Lampe;
       digitalWrite(LAMPE_2, etat_sortie2_Lampe);
     }
   }
   
    // Permet de lancer a tache d'extinction sur temporisation
    // Si le BP est relache
    if ( digitalRead(BP) == HIGH )
    {
      // Si la lampe est allumee,
      if ( (digitalRead(LAMPE_2) == HIGH) || restart_demande )
      {
           if ( (mode_timer_ctrl_start == 0) || restart_demande )
           {
              restart_demande = 0;
              mode_timer_ctrl_start = 1;
              tempo_phase_1.demarrer();
           }
      } 
    }
    
    if ( mode_timer_ctrl_start >= 1 )
    {
        if ( (tempo_phase_1) /* PHASE 1 : Vrai au bout de XXXX s */ && (mode_timer_ctrl_start == 1) )
        {
          digitalWrite(LAMPE_2, LOW);
          tempo_micro_coupure_1.demarrer(); // Micro-coupure
          mode_timer_ctrl_start++;
        }

        if ( (tempo_micro_coupure_1) /* Vrai au bout de 0.3s */ && (mode_timer_ctrl_start == 2) )
        {
          digitalWrite(LAMPE_2, HIGH);
          tempo_phase_2.demarrer(); // Phase 2 = 5s
          mode_timer_ctrl_start++;
        }
        
        if ( (tempo_phase_2) /* PHASE 2 : Vrai au bout de 5s */ && (mode_timer_ctrl_start == 3) )
        {
          digitalWrite(LAMPE_2, LOW);
          tempo_micro_coupure_2.demarrer(); // Micro-coupure
          mode_timer_ctrl_start++;
        }

        if ( (tempo_micro_coupure_2) /* Vrai au bout de 0.3s */ && (mode_timer_ctrl_start == 4) )
        {
          digitalWrite(LAMPE_2, HIGH);
          tempo_phase_3.demarrer(); // Phase 3 = 20s
          mode_timer_ctrl_start++;
        }

        if ( (tempo_phase_3) && (mode_timer_ctrl_start == 5) )
        {
          digitalWrite(LAMPE_2, LOW);
          mode_timer_ctrl_start = 0;
        }
    }
    ancien_etat_BP = etat_BP;
}

simpleMinuteur.zip (4.43 KB)