Aide totale pour utilisation d'un timer

Bonjour
cela fait 1 semaine que j'essaie de comprendre et de faire un timer pour mon montage.
Je n'y arrive pas.
En gros, il me faut un timer qui compte 3h00 et doit me donner quand il a fini la variable Fin =1;
Le timer ne se remettra en route que quand je ré initialiserai Fin=0;
Je ne peux mettre mon code vu qu'il fait 5 pages et le timer n'est là que pour autoriser tout mon code en fonction du début du jour (détection faite par cellule de luminosité).
Donc si quelqu'un peut me mettre ce code il me sauvera

Me suis mal exprimé.
Le timer autorisera le fonctionnemet d' une partie du programme pas la totalité

Tu veux dire que pendant que le timer décompte son temps, une autre partie du code sera exécutée ?

Si le code est avec une Uno, une Nano, une Mega, une minipro, c'est l'utilisation typique de Mtclock, bibliothèque à télécharger ici. Il suffit de rajouter le code, par exemple n'importe où avant le setup:

#include "MTclock.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects  

void fini(void)
{
  Fin = 1;
}

MTclock Temporisateur(3ul*60ul*60ul*1000ul milli_secondes, fini, 1 action_et_arret, MT_OFF);

Rien à rajouter ni dans le setup, ni dans loop, loop peut être bloquant....

Pour (re)démarrer au lieu de

Fin = 0;

il faudra faire

Fin = 0;
Temporisateur.start();

Pour démarrer automatiquement en début de programme, remplacer MT_OFF par MT_ON


Pour une autre plateforme, je ne peux rien faire.

hello
ou tout à la mano

unsigned long tempo = (1000 * 60 * 60 * 3); //3 heures
unsigned long chrono = (millis() + tempo);

//boolean fin = true;
boolean fin = false;
int bascule_test = 0;
void setup() {
  Serial.begin(115200);
}

void loop() {
  timer();

  Serial.print(F("                 partie libre de tempo ")); Serial.println(fin);
  Serial.print(F("millis ")); Serial.println(millis());
  Serial.print(F("chrono ")); Serial.println(chrono);
  //ici je fais une partie du programme en permanence
  if (fin == 1) {
    Serial.println(F("pas de tempo en cours "));
    //ici je fais une autre partie du programme si fin ==1
    //sans contrainte de temps
    //puis si je le veux, je met fin à false
    //ce qui lance la tempo pour 3 heures
    //if(bascule_test++>3000){fin=false;bascule_test=0; }//pour test
  }
  else {
    Serial.println(F("tempo en cours "));
    // la tempo est en cours
    //ici je fais une partie de programme car fin ==0
    //if(bascule_test++>3000){fin=true;bascule_test=0; }//pour test
  }
}

void timer() {
  //si fin = true le chrono est en attente
  //si le prg passe fin à false, le chrono démarre
  //fin repasse à true, car la tempo est terminée et chrono est reinitialisé à millis()
  if (fin == true) {
    chrono = (millis() + tempo);
  }
  if ((fin == false) && (millis() > chrono)) {
    fin = true;
  }
}
/*cahier des charges:
   En gros, il me faut un timer qui compte 3h00
   et doit me donner quand il a fini la variable Fin =1;
   Le timer ne se remettra en route que quand je ré initialiserai Fin=0;
*/

C'est mieux, et moins cher, mais cela nécessite que le code soit ainsi en 2 blocs. Et je n'ai pas d'infos sur le code. Si on a des if (fin)... un peu partout ainsi que des boucles while ((fin==1) && (< autre condition >), cela ne peut pas passer sans revoir le code déjà écrit.

Bonjour phil-dordogne

Je t'ai fait un exemple basé sur l'exemple BlinkWithoutDelay
La durée du délais est dans finTempo, en millisecondes.

J'ai simulé le seuil lumineux par un bouton, il faut mettre un LOW sur la pin 2 (btnRestart) pour démarrer la temporisation.

Par la même occasion, je t'ai mis une 2ème temporisation pour afficher le décompte du temps. Actuellement toutes les 5 secondes (displayTempo = 5000), basée sur le même principe.

Le programme:

unsigned long finTempo = 20000; // = 20 secondes, pour des heures, 1000 * 60 * 60 * h
unsigned long finChrono = (millis());

unsigned long displayTempo = 5000;     // Toutes les 5 secondes
unsigned long displayChrono = millis() + displayTempo;     // Display chrono + displayTempo pour action immédiate
boolean fin = true;

const int btnRestart = 2;     // Bouton pour redémarrer le processus

void setup() 
{
	Serial.begin(115200);

	pinMode(btnRestart, INPUT_PULLUP);
}

void loop() 
{
  if (!fin && (millis() - finChrono >= finTempo))     // Si pas fin et chrono à terme
  {
	  fin = true;
	  Serial.println(F("Temporisation FIN"));
  }

  if (!fin && (millis() - displayChrono >= displayTempo))     // Si temps d'affichage
  {
	  Serial.print(F("Decompte "));
	  Serial.println(finTempo - (millis() - finChrono));

	  displayChrono = millis();
  }

  if (fin && (digitalRead(btnRestart) == LOW))     // Si redémarrage
  {
	finChrono = millis();     // Redémarrage de la temporisation de fin
	fin = false;
	 
	 Serial.println(F("\nTemporisation Demarrage"));
  }
}

A+
Cordialement
jpbbricole

Merci à vous tous
je confirme les dires, j'ai des if partout vu que mes entrées donnent des valeurs analogique, chaque pin d'entrée de l'arduino uno peut donc me donner plein de valeur différentes que j'utilise, donc des if il en faut pas mal, ils sont même inclus dans des if et dans des if pour me donner des valeurs de marche/arrêt sur les pins de sorties.

jpbbricole tu viens de me donner l'idée de ce que je veux en disant que tu mets un bouton sur une pin d'entrée. j'ai une horloge dans mon tableau électrique qui ne me sert plus et si je lui met, à elle, le retard que je souhaite? Elle me donne une valeur 1 ou 0 sur la seule entrée qui me reste de dispo.

En gros mon programme est une analyse de l'ensoleillement, de la valeur de puissance disponible dans mes panneaux solaire pour mettre en marche ou non (avec des priorités entre autres) des éléments comme cumulus, plaques chauffantes, four, clim, tv, micro onde, lave vaisselle... Cela fonctionne très bien sauf que je dois déclencher au plus tôt mes gros consommateurs (cumulus par exemple) qu'à partir de 9h30 de mai à septembre, 10h30 le reste du temps. Je n'ai pas envie de mettre une horloge au sein de l'arduino.
Merci de m'avoir aiguillé, cela sert de poser des questions ça donne d'autres idées :+1: :+1:

bonne suite

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.