modification temps minuteur

Bonjour,

je cherche a avancé dans mon projet de minuteur qui me permet de faire un contact avec un relais au bout d'un certain temps.

Mon problème et que j'aimerais savoir qu'elle code je peux mettre et comment relier un bouton poussoir a mon Arduino permettent d'ajouter du temps avant le déclenchement ou d'en enlever pour ça je souhaite mettre 2 boutons poussoir merci .Voici mon code actuelle pas du tout optimisé et non modifiable sans ordinateur ce qui n'es pas du tout pratique .

<int sega=2; // le segmeent A est connecter au pin 2 de l'arduino
int segb=3; // le segment B est connecter au pin 3 de l'arduino
int segc=4; // le segment C est connecter au pin 4 de l'arduino 
int segd=6; // le segment D est connecter au pin 6 de l'arduino
int sege=9; // le segment E est connecter au pin 9 de l'arduino
int segf=11; // le segment F est connecter au pin 11 de l'arduino
int segg=13; // le segment G est connecter au pin 13 de l'arduino
int tempo = 1000; // tempo est le temps qui va se passer entre chaque nombre donc la cest une 1 seconde d'attente entre chaque nombre car 1000 ms = 1 second

void setup() // je déclare mes sortie de mon arduino 
{
pinMode (sega,OUTPUT);
pinMode (segb,OUTPUT);
pinMode (segc,OUTPUT);
pinMode (segd,OUTPUT);
pinMode (sege,OUTPUT);
pinMode (segf,OUTPUT);
pinMode (segg,OUTPUT);
pinMode (7,OUTPUT);
}

void loop() // ceci est la boucle pour afficher les nombres de 0 juqu'a 9 avec 1 seonde entre chaque nombre 

{

//laisser 1 seconde d'attente

// afficher 1
digitalWrite (sega,LOW);
digitalWrite (segg,LOW);
digitalWrite (segd,LOW);
digitalWrite (sege,LOW); 
digitalWrite (segf,LOW); 
digitalWrite (segb,HIGH);
digitalWrite (segc,HIGH);

// laisser 1 seconde d'attente 
delay (tempo);

// afficher 2
digitalWrite (sega,HIGH);
digitalWrite (segg,HIGH);
digitalWrite (sege,HIGH);
digitalWrite (segd,HIGH);
digitalWrite (segb,HIGH);
digitalWrite (segc,LOW);
digitalWrite (segf,LOW);

// laisser 1 seonde d'attente
delay (tempo);

// afficher 3
digitalWrite (segf,LOW);
digitalWrite (sege,LOW);
digitalWrite (segc,HIGH);
digitalWrite (sega,HIGH);
digitalWrite (segb,HIGH);
digitalWrite (segd,HIGH);
digitalWrite (segg,HIGH);

// laisser 1 seconde d'attente
delay (tempo);

// afficher 4
digitalWrite (sega,LOW);
digitalWrite (segf,HIGH);
digitalWrite (sege,LOW);
digitalWrite (segd,LOW);
digitalWrite (segb,HIGH);
digitalWrite (segc,HIGH);
digitalWrite (segg,HIGH);

// laisser 1 seconde d'attente
delay (tempo);

// afficher 5
digitalWrite (sege,LOW);
digitalWrite (sega,HIGH);
digitalWrite (segd,HIGH);
digitalWrite (segb,LOW);
digitalWrite (segc,HIGH);
digitalWrite (segf,HIGH);
digitalWrite (segg,HIGH);

// laisser 1 seconde d'attente
delay (tempo);

// afficher 6
digitalWrite (segb,LOW);
digitalWrite (segf,HIGH);
digitalWrite (sege,HIGH);
digitalWrite (segd,HIGH);
digitalWrite (segg,HIGH);
digitalWrite (sega,HIGH);
digitalWrite (segc,HIGH);

// laisser 1 seconde d'attente
delay (tempo);

// afficher 7
digitalWrite (sege,LOW);
digitalWrite (segf,LOW);
digitalWrite (segg,LOW);
digitalWrite (segd,LOW);
digitalWrite (segb,HIGH);
digitalWrite (sega,HIGH);
digitalWrite (segc,HIGH);

// laiserr 1 seconde d'attente
delay (tempo);

// afficher 8
digitalWrite (segg,HIGH);
digitalWrite (segf,HIGH);
digitalWrite (sege,HIGH);
digitalWrite (segd,HIGH);
digitalWrite (segc,HIGH);
digitalWrite (segb,HIGH);
digitalWrite (sega,HIGH);

// laisser 1 seconde d'attente
delay (tempo);

// afficher 9
digitalWrite (segg,HIGH);
digitalWrite (segf,HIGH);
digitalWrite (sege,LOW);
digitalWrite (segd,HIGH);
digitalWrite (segc,HIGH);
digitalWrite (segb,HIGH);
digitalWrite (sega,HIGH);
delay (tempo);

// afficher le 0
digitalWrite (sega,HIGH);
digitalWrite (segb,HIGH);

digitalWrite (segc,HIGH);
digitalWrite (segd,HIGH);
digitalWrite (sege,HIGH);
digitalWrite (segf,HIGH);
digitalWrite (segg,LOW);
// laisser 1 seconde d'attente
delay (tempo);

{
digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(4000);   
   digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);     
 }
// et la sa repart a 0 et sa boucle
}
>

Cordialement

bonjour,
édite ton post et met le code entre balise code </>

tu peux utiliser attachinterrupt

 void setup(){
blabla
 attachInterrupt(0, tempoplus, LOW);
 attachInterrupt(0, tempomoins, LOW);
}
void tempoplus(){
tempo -=1000;
}

void tempomoins(){
tempo -=1000;
}

merci beaucoup on m’enlève une épine du doigt

je me permet de demandé une autre aide une fois que j'appuis sur mon bouton et qu'il ajoute du temps j'aimerais que il m'affiche le nombre de seconde sur un écran LCD avec un module i2c mes comme j'ai jamais programmé d’écran comme ce la je voulais savoir quelle code je peux mettre pour qu'il m'affiche le nombre de seconde et qu'il fasse une décompte

merci par avance

cordialement

tu as plein d'exemples sur le net pour ca, une tite recherche de ta part :wink:

d'accord merci je vais continuer mes recherche bonne soirée

cordialement

bonjour
après avoir passé ma soirée a essayé d'avancé dans mon projet et je suis toujours bloquer mon problème est que je n’arrive pas a avoir le bon code quand je le fais vérifier il me sort une erreur a chaque ligne et je m'en sors pas du tout je veux juste ajouté des seconde ou en retirer avec deux bouton pour alimenté un relais au bout d'un certain temps et après avoir feuilleté le net je trouve ni ce que je veux faire ni ajouté un afficheur 16x2 avec un i2c pour me donné le temps help my

cordialement

sans code pour vérifier, difficile de répondre.
allez une piste, il manquerait pas des ; en bout de ligne

voici mon code

#define (tempoplus  4 ) ;     // Bouton +
#define (tempomoins  3) ;    // Bouton -
//#define START 2   // Bouton Start/Stop (interruption)
void setup() {
  pinMode(tempoplus, INPUT_PULLUP);
  pinMode(tempomoins, INPUT_PULLUP);
 // pinMode(BP_START, INPUT_PULLUP);

}

void tempoplus   {
(tempo -=1000);

}
void tempomoins )  {
  (tempo -=1000);
}

a mon avis j'ai fais des erreur mais comme je débute en arduino

Bonjour,
Essaye sans mettre les parenthèses dans tes define

bonjour
j'ai fais plusieurs essai sans parenthésé et je suis toujours autant embête

+1 avec Icare
de plus pas de ; à la fin d'une ligne #define :wink:

il manque le loop
tu ne mets pas attachInterrupt comme indiqué plus haut

attachInterrupt (0 ====> pin 2
attachInterrupt (1 ====> pin 3

maintenant j'ai ça

//#define (tempoplus  4 ) ;     // Bouton +
//#define (tempomoins  4) ;    // Bouton -
//#define START 2   // Bouton Start/Stop (interruption)
void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
 // pinMode(BP_START, INPUT_PULLUP);
}

{attachInterrupt (0 ====> pin 2) ; 
attachInterrupt (1 ====> pin 3) ;
}
void tempoplus   {
(tempo -=1000);

}
void tempomoins )  {
  (tempo -=1000);
}

c'est pas méchant, mais tu le fais exprès ou quoi?
tu recopie des commentaires au lieu de mettre une ligne de code comme indiqué plus haut

 void setup(){
blabla
 attachInterrupt(0, tempoplus, LOW);
 attachInterrupt(0, tempomoins, LOW);
}
void tempoplus(){
tempo -=1000;
}

void tempomoins(){
tempo -=1000;
}

j'aurais écrit
attachInterrupt (0 ====> jètes toi par la fenêtre du premier sur la pin 2

tu aurais mis ca dans ton code?
fais quelques recherches quand même, on ne te feras pas le code pour toi.
t'aider ok, t"orienter ok, pas du tout cuit

organisation d'un code de base

déclaration des variables et pin

setup

loop

bon en lisent bien le commentaire j'ai fais ce si mon seul défaut et que mes relais s'éteingnent au bout du temps au lieu de s'allume

/*
 * Minuteur simpliste à base arduino
 */
 
/* Commandes de l'afficheur 7 segments */
enum {
  AFF_RESET = 0x76,   // Reste l'afficheur
  AFF_CRTL_DP = 0x77, // Affichage d'un point
  DP_HORAIRE = 0x10   // Double point horaire
};
 
/* Câblage */
#define BP_UP 4      // Bouton +
#define BP_DOWN 3    // Bouton -
#define BP_START 2   // Bouton Start/Stop (interruption)
#define relais 5 // Buzzer
 
/* Variables globales */
volatile byte running = false; // Etat du minuteur (true = en fonctionnement, false = à l'arrêt)
char minutes_remain = 0;       // Nombre de minutes restantes (par défaut 0)
char secondes_remain = 10;     // Nombre de secondes restantes (par défaut 10)
 
/* Setup() */
void setup() {
 
  // Initialisation du port série
 // Serial.begin(9600);
 
  // Initialisation des broches
  pinMode(relais, OUTPUT);
  pinMode(BP_UP, INPUT_PULLUP);
  pinMode(BP_DOWN, INPUT_PULLUP);
  pinMode(BP_START, INPUT_PULLUP);
  // pinMode(x, INPUT_PULLUP) correspondant à un pinMode(x, INPUT) puis à un digitalWrite(x, HIGH)
  attachInterrupt(0, bp_start_int, FALLING);
 
  // Reset de l'afficheur
  delay(1000);
  Serial.write(AFF_RESET);
 
  // Affiche le temps restant initial
  affiche_temps();
}
 
/* Loop() */
void loop() {
 
  /* Variables locales de gestion du temps */
  static unsigned long last_time = 0; // Temps antérieur
  unsigned long time_now = millis();  // Temps actuel
 
  // Si le minuteur est en marche
  if(running) {
 
    // Et que 1 sec s'est écoulée
    if(time_now - last_time >= 1000) {
 
      // Décrémentation des secondes
      if(--secondes_remain < 0) {
        secondes_remain = 59; // Si il n'y as plus de seconde
 
        // Décrémentation des minutes
        if(--minutes_remain < 0) {
          minutes_remain = 0;   //
          secondes_remain = 0; // Si il n'y as plus de minute
          affiche_temps();
 
          // Mise en marche du buzzer jusqu'à ce que l'utilisateur appui sur le bouton Start/Stop
          while(running) {
            digitalWrite(BUZZER_PIN, HIGH);
            delay(600); 
          }
 
          // Reprise à l'état initial
          secondes_remain = 10;
        }
      }
 
      // Affichage du temps restant
      affiche_temps();
      last_time = time_now;
    }
  } 
  else { // Si le minuteur n'est pas en marche
 
      // Si le bouton + est appuyé
    if(digitalRead(BP_UP) == LOW) {
 
      // Incrémentation des secondes
      if(++secondes_remain > 59) {
        secondes_remain = 0; // Si le nombre de secondes atteint 60
 
          // Incrémentation des minutes
        if(++minutes_remain > 99) {
          minutes_remain = 99;  // Si le nombre de minutes atteint 99
          secondes_remain = 59; // Blocage à 99:59
        }
      }
 
      // Attente variable (basé sur le temps d'appui)
      delay_increment(false);
 
      // Affichage du temps restant
      affiche_temps();
 
    } // Si le bouton - est appuyé
    else if(digitalRead(BP_DOWN) == LOW) {
 
      // Décrémentation des secondes
      if(--secondes_remain < 0) {
        secondes_remain = 59; // Si il n'y as plus de seconde
 
        // Décrémentation des minutes
        if(--minutes_remain < 0) {
          minutes_remain = 0; // Si il n'y as plus de minute
          secondes_remain = 0;
        }
      }
 
      // Attente variable (basé sur le temps d'appui)
      delay_increment(false);
 
      // Affiche du temps restant
      affiche_temps();
 
    } // Si aucun bouton n'est appuyé
    else {
 
      // Remise à zéro du delai variable
      delay_increment(true);
    } 
  }
}
 
/* Delai variable en fonction du temps d'appui */
void delay_increment(byte rst) {
  static unsigned long last_time = 0; // Temps antérieur
  unsigned long time_now = millis();  // Temps actuel
 
  // Si le paramètre de reset est activé
  if(rst) {
    last_time = time_now; // Remise à zéro
    return;        // Fin de fonction
  }
   
  // Si le temps d'appui est supérieur ou égale à 20 secondes
  if(time_now - last_time >= 20000) {
    delay(125);
  } // Si le temps d'appui est supérieur ou égale à 10 secondes
  else if(time_now - last_time >= 10000) {
    delay(250);
  } // Sinon pour tout appui de moins de 10 secondes
  else {
    delay(500);
  }
}
 
/* Interruption du bouton Start/Stop */
void bp_start_int() {
  running = !running;
}
 
/* Fonction d'affichage du temps restant */
void affiche_temps() {
 
  // Converti le temps restant en chaîne de caractères
  char tmp[5];
  sprintf(tmp, "%02d%02d", minutes_remain, secondes_remain);
 
  // Active les doubles points horaire
  Serial.write(AFF_CRTL_DP);
  Serial.write(DP_HORAIRE);
 
  // Affiche les 4 digits
  Serial.write((uint8_t*)tmp, 4);
}