Problème avec le Millis();

Bonjour à tous.

Je cherche dans mon prog de gestion simple d’ un bac récifal, à inclure dans le prog un appui sur une image de couper les deux pompes à eau le temps que les poissons dînent tranquille, mais avec la partie de code ajouter, à part faire clignoter les relais je ne parvient pas à arreter les pompes pendant 10 minutes et qu’elles redémarrent àpres ce laps de temps.

Si vous pouviez seulement m’aiguiller.

Merci d’avance.

// **************************************** horloge
RTC_DS3231 RTC;

int time;
int tempoActive = 0;
unsigned long tempoDepart = 0;

int hour;
int minute;
int second;
int day;
int month;
int year;


// debut programmation


void setup() 
{

  Serial.begin(115200);
  Serial.println(F("Initialising LCD ..."));
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  Serial.println(F("Initialising SD card..."));
  //Wire.begin();
  bool mysd = 0;
  // see if the card is present and can be initialized:
  while (!mysd)
  {
    if (!SD.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) {
      Serial.println(F("Card failed, or not present"));
      Serial.println(F("Retrying...."));
    }
    else
    {
      mysd = 1;
      Serial.println(F("Card initialised."));
    }
  }


  myGLCD.setColor(255, 255, 255);
  myGLCD.fillScr(10, 30, 30); 
  myGLCD.setBackColor(10, 30, 30); 
  myGLCD.drawRect(2,2,798,478); 


  Wire.begin();
  RTC.begin();
  //if (! RTC.isrunning()) 
  {
    //Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  sensors.begin();


  // Consignes sortie Relais.
  //etatFonction = 0;
  pinMode (Pompe1,OUTPUT); // Relais Pompe1.
  digitalWrite(Pompe1, HIGH);
  pinMode (Pompe2,OUTPUT); // Relais Pompe2.
  digitalWrite(Pompe2, HIGH);
  pinMode (Ecumeur,OUTPUT); // Relais ecumeur.
  digitalWrite(Ecumeur,HIGH);
  pinMode (Brassage,OUTPUT); // Relais brassage.
  digitalWrite(Brassage,HIGH);
  pinMode (Eclairage,OUTPUT);// Relais Eclairage.
  digitalWrite(Eclairage,HIGH);
  pinMode (relai_ventil,OUTPUT); // Relais Ventilateur.


}



void loop() 
{

  // **************************************** horloge
 RTC_DS3231 rtc;
 unsigned long Time, H;
 unsigned int M, S;
 unsigned long tempoDepart = 0;

  // **************************************** Récupération de l'heure du ds3231
  DateTime now = rtc.now();
  H = now.hour();
  H = (H * 3600);
  M = (now.minute() * 60);
  S = now.second();
  //tempoActive = millis();


  // Etat Programme Pompe1 On/Off.

  myFiles.load(685, 75, 90, 130, "Pompe.RAW");

  if (myTouch.dataAvailable()) 
  {
    myTouch.read();
    x = myTouch.getX(); // X coordonnée de pression.
    y = myTouch.getY(); // Y coordonnée de pression.
    // Si icone On/Off pressé.

    if ((x >= 685) && (x <= 775) && (y >= 75) && (y <= 205)) 
    {
      etatPompe1 = !etatPompe1;
      digitalWrite(Pompe1, etatPompe1);//on met en fonction la Pompe.
    }
    delay(100);
  }

  // *****Affichage Pompe a eau N°1 On/Off. 
  if (digitalRead(Pompe1) == HIGH)
  {
    myFiles.load(540, 80, 120, 52, "ON_V.RAW");
  }
  else
  {
    myFiles.load(540, 80, 120, 52, "OFF_R.RAW");
  }


  //****************************************************************

  // Etat Programme Pompe2 On/Off.

  if (myTouch.dataAvailable()) 
  {
    myTouch.read();
    x = myTouch.getX(); // X coordonnée de pression.
    y = myTouch.getY(); // Y coordonnée de pression.
    // Si icone On/Off pressé.

    if ((x >= 685) && (x <= 775) && (y >= 75) && (y <= 205))
    {
      etatPompe2 = !etatPompe2;
      digitalWrite(Pompe2, etatPompe2);//on met en fonction la Pompe.
    }
    delay(100);
  }
  //delay(200);

  // *****Affichage Pompe a eau N°2 On/Off. 
  if (digitalRead(Pompe2) == HIGH)
  {
    myFiles.load(540, 152, 120, 52, "ON_V.RAW");    
  }
  else
  {
    myFiles.load(540, 152, 120, 52, "OFF_R.RAW"); 
  }    

  //*****************************************************************
  
  //****************** nourissage *******************

  myFiles.load(555, 340, 90, 77, "Distrib.RAW");

  if (myTouch.dataAvailable()) 
  {
    myTouch.read();
    x = myTouch.getX(); // X coordonnée de pression.
    y = myTouch.getY(); // Y coordonnée de pression.
    // Si icone On/Off pressé.

    if ((x >= 555) && (x <= 645) && (y >= 340) && (y <= 417))
    {
    tempoActive = 0;
    tempoDepart = millis();
  }
  // Si la temporisation est active,
  if ( tempoActive )
  {
      
      digitalWrite(Pompe1, LOW);//on met en fonction la Pompe.
      digitalWrite(Pompe2, LOW);//on met en fonction la Pompe.
  }    
      myFiles.load(540, 80, 120, 52, "OFF_R.RAW");
      myFiles.load(540, 152, 120, 52, "OFF_R.RAW");
      myGLCD.setFont(GroteskBold16x32);
      myGLCD.setColor(255,140,0);
      myGLCD.print("MIAM",660, 360);
  
    
     // Et si il s'est écoulé 10 minutes. 
    if (( millis() - tempoDepart ) >= 600000)
    {
      digitalWrite(Pompe1, HIGH);//on met en fonction la Pompe.
      digitalWrite(Pompe2, HIGH);//on met en fonction la Pompe.
    }
      myFiles.load(540, 80, 120, 52, "ON_V.RAW");
      myFiles.load(540, 152, 120, 52, "ON_V.RAW");
      myGLCD.print("    ",660, 360);
      
    tempoActive = 0;
   
  }

Il faut que tempoDepart prenne la valeur millis() une seule fois avant. Si tempoDepart prend la valeur millis() pendant ton décompte, le décompte va repartir 0

Effectivement il faut procéder comme l’a expliqué Erwan.
Je joins un code test en attaché qui fonctionne pcq moi aussi j’ai eu des difficultés au début. Inspire t-oi de ce code pour l’intégrer dans ton sketch.
A bientôt

millis6_ok_tempo.ino (1.54 KB)

Bonjour;

La copie de code ça n'aide pas. :frowning:

Je pense plutôt qu'il devrais repenser tout son programme car je doute que cela fonctionne.
Je veux dire par la qu'il devrais l'écrire de lui même et pensé a chaque séquences de son appli.

Salutations.

Breisleach:
Bonjour à tous.

Je cherche dans mon prog de gestion simple d' un bac récifal, à inclure dans le prog un appui sur une image de couper les deux pompes à eau le temps que les poissons dînent tranquille, mais avec la partie de code ajouter, à part faire clignoter les relais je ne parvient pas à arreter les pompes pendant 10 minutes et qu'elles redémarrent àpres ce laps de temps.

Si vous pouviez seulement m'aiguiller.

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement). l'action sur l'écran est une action qui va vous faire changer d'état et vous aurez aussi des événements 'temps' comme dans mon tuto

Bonjour à tous.

Je vous remercie pour vos conseils et merci JML.

Je ne demande pas que l’on écrive mon prog à ma place, juste que l’on me donne une direction.

Donc pour cela je vous remercie encore une fois.