Compte a rebours dans une plage horaire

Bonjour,

je souhaiterai mais je ne vois pas comment faire :

1 - à 8 heures lancer une action sur un relais durant 30s
2 - de 8 heures à 20 heures, contrôler un capteur lançant ce même relais pendant 30s, mais laissant un temps d attente d au moins 10 minutes avant la prochaine mesure, le temps de laisser le temps de l action du relais agir sur le capteur

cdt

Bonjour,
quel est le degré du 'je ne vois pas comment faire' ?
hard ?
soft ?
d'un point de vue hard, il faudrait quelque chose comme le DS1307 pour la gestion du temps.

d'un point de vue soft, si ton sketch ne fait rien d'autre que ce que tu énonces, ça ne devrait pas être trop compliqué ...
1- A 8 heures, tu colles ton relais avec un delay(30000) derrière
2- entre 8 heures et 20 heures, tu contrôles soit périodiquement, soit à l'aide d'une interruption l'état de ton capteur. Si la consigne répond à ta demande, tu colles ton relais avec un delay de 30 secondes derrières, tu décolles le relais, puis tu places un delay de 10mn ensuite.

Est-ce suffisant ?

S'il te faut une réponse plus technique, il faudrait que tu donnes des infos sur le capteur et le relais.
Vincent

Yep!

J'ajouterais que tu point de vue hard, il y a

1- DS1307 (chip RTC = Real Time Clock)
2- La librairie Time qui récupère la date et l'heure courante par l'intermédiaire d'un PC (usb constemment connecté)
3- NTP (Network Time protocol) via un shield ethernet/wifi.

Côté Soft, c'est pas trop compliqué :

Si je suis dans l'intervalle de temps ou heure = 8, relais = 1. Variable_relaisactif = 1.
Au bout de 10 mn, variable_relaisactif = 0.
etc...

Grosso Modo et simplement :

  // Librairie Time;
  // Recup des heure et minutes courantes;
  int hour = (DateTime.Hour);
  int minute = (DateTime.Minute);
  // Conversion des heure en minutes
  int current = (hour*60) + minute;
  // variables mini et maxi;
  int j_min = 480;
  int j_max = 1200;

	if (j_min < current && current < j_max) AND (variable_relaisactif = 0)
                  {
                   relais = 1
                   variable_relaisactif = 1
                   }
...

Il faudrait que tu nous précise un peu plus ton projet et décrive les étapes où tu en ais.

@+

Zoroastre.

Merci pour vos réponses

en connexion ca devrait aller pour l instant, ou je pêche c est coté programmation où je découvres les commandes. Concernant la programmation relay, j ai une carte 5v/8 relay pour pic (gestion TTL, je crois) est elle la même programmation qu un relay simple, pour le branchement je partais sur le GND des pin digitaux et les PIN digitaux souhaités, + 5v alim carte ?

pour le 1 je suis parti comme tu l as évoqué un delay(3000), (le plus simple en définitive), j avais regardé du millis().

pour le 2, je vais contrôlé toutes les 1/2 heures et lancé le relais si besoin

pour le ds 1307, je l attends de futurlec, toujours pas reçu, donc pour l instant il n y a pas les bibliothèques temps

mon code pour l instant (si vous voyez des anomalies) :

#include <OneWire.h> //librairie Onewire - Port OneWire - sorte de pilote contenant les instructions pour s'en servir
#include <DallasTemperature.h> // librairie dallastemperature - T° - sorte de pilote contenant les instructions pour s'en servir


/*
Arduino branchement
 Analog Pin 0 = H% Sensor
 Analog Pin 1 = H% Sensor
 Analog Pin 2 = H% Sensor
 Analog Pin 3 = H% Sensor
 Analog Pin 4 = SDA pour ds1307
 Analog Pin 5 = SCL pour ds1307
 
 Digital Pin 0 = Relais Chauffage Terra 1
 Digital Pin 1 = Relais Chauffage Terra 2
 Digital Pin 2 = Relais Chauffage Terra 3
 Digital Pin 3 = Relais Chauffage Terra 4
 Digital Pin 4 = Relais Pompe H% Terra 1
 Digital Pin 5 = Relais Pompe H% Terra 2
 Digital Pin 6 = Relais Pompe H% Terra 3
 Digital Pin 7 = Relais Pompe H% Terra 4
 Digital Pin 8 = Relais Lumière Terras
 Digital Pin 9 = 
 Digital Pin 10 = 
 Digital Pin 11 = 
 Digital Pin 12 = 
 Digital Pin 13 = T° Sensor

 */ 
 
 // Définition pin Analogique capteur H%
 int HTerra1 = 0;
 int HTerra2 = 1;
 int HTerra3 = 2;
 int HTerra4 = 3;
 int SDA=4;
 int SCL=5;

//Définition pin de sortie
int CTerra1 = 0;
int CTerra2 = 1;
int CTerra3 = 2;
int CTerra4 = 3;
int PHTerra1 = 4;
int PHTerra2 = 5;
int PHTerra3 = 6;
int PHTerra4 = 7;
int LTerra  = 8;

// Définition pin entrée digital Dallas
#define ONE_WIRE_BUS 13
 
// Définition communication avec tout matériel Onewire
OneWire oneWire(ONE_WIRE_BUS);

// Référence t° Dallas 
DallasTemperature sensors(&oneWire);
uint8_t Terra1[8] = { 0x28, 0xF5, 0x31, 0x53, 0x3, 0x0, 0x0, 0x7A };
uint8_t Terra2[8] = { 0x28, 0xD0, 0x59, 0xFA, 0x1, 0x0, 0x0, 0x7D };
uint8_t Terra3[8] = { 0x28, 0x91, 0x46, 0xFA, 0x1, 0x0, 0x0, 0x2C };
uint8_t Terra4[8] = {};
uint8_t Terra5[8] = {};
uint8_t Terra6[8] = {};
uint8_t Terra7[8] = {};

// Nuit_Jour Temp
float Temp1Nuit=22.00;
float Temp1Jour=25.00;

//H%
float HHTerra1 = 0.00;
float HHTerra2 = 0.00;
float HHTerra3 = 0.00;
float HHTerra4 = 0.00;
float Humeterra1 = 0.00;
float Humeterra2 = 0.00;
float Humeterra3 = 0.00;
float Humeterra4 = 0.00;

// Demarrer la pompe terra1 pendant 30s
void pompe1() {
  digitalWrite(PHTerra1,HIGH);
  delay(3000);
  digitalWrite(PHTerra1,LOW);
}

// Demarrer la pompe terra2 pendant 30s
void pompe2() {
  digitalWrite(PHTerra2,HIGH);
  delay(3000);
  digitalWrite(PHTerra2,LOW);
}

// Demarrer la pompe terra3 pendant 30s
void pompe3() {
  digitalWrite(PHTerra3,HIGH);
  delay(3000);
  digitalWrite(PHTerra3,LOW);
}

// Demarrer la pompe terra4 pendant 30s
void pompe4() {
  digitalWrite(PHTerra4,HIGH);
  delay(3000);
  digitalWrite(PHTerra4,LOW);
}

void setup(void)
{
 // Pin mis en sortie
pinMode(CTerra1, OUTPUT);
pinMode(CTerra2, OUTPUT);
pinMode(CTerra3, OUTPUT);
pinMode(CTerra4, OUTPUT);
pinMode(PHTerra1, OUTPUT);
pinMode(PHTerra2, OUTPUT);
pinMode(PHTerra3, OUTPUT);
pinMode(PHTerra4, OUTPUT);
pinMode(LTerra, OUTPUT);
  
  
// Démarre le port série
 Serial.begin(9600);
 Serial.println("Gestion Terra");
 
 
// Démarre la librairie
 sensors.begin();

} 


void loop(void)
{

 /* // Horloge
  time = ((hour() * 100) + minute()); 
 */  
  
 sensors.requestTemperatures(); // envoie de commande de récupération Temperature

// Recuperation hydrometrie
HHTerra1=(analogRead(HTerra1)*5000.0)/1024.0;
HHTerra2=(analogRead(HTerra2)*5000.0)/1024.0;
HHTerra3=(analogRead(HTerra3)*5000.0)/1024.0;
HHTerra4=(analogRead(HTerra4)*5000.0)/1024.0;

// conversion pourcentage
Humeterra1=(HHTerra1-800)/31.0;
Humeterra2=(HHTerra2-800)/31.0;
Humeterra3=(HHTerra3-800)/31.0;
Humeterra4=(HHTerra4-800)/31.0;

delay(1000);

//Pulverisation du matin et soir
if ((hour()=8))
{
pompe1()
pompe2()
pompe3()
pompe4()
}
if ((hour()=19) && (minute()=30))
{
pompe1()
pompe2()
pompe3()
pompe4()
}

deuxième partie :

// entre 08:00:00 et 19:59:59 t° : 25°c et H% : 90%
//if ((hour() > 8 ) && (hour() < 20))
{ 
  
  //Allumage des lumières
  digitalWrite(LTerra, HIGH);
 
// Terra 1
Serial.print("Terra 1 : ");
if (sensors.getTempC(Terra1)>(-127))
{
if (sensors.getTempC(Terra1)<=Temp1Jour)
  {
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra1));
    Serial.println(" Chauffage en route ");
    digitalWrite(CTerra1, HIGH);
  }
  else
{ 
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra1));
    Serial.println(" Ventilation en route ");
    digitalWrite(CTerra1, LOW);
}
}
Serial.print("H% : ");
Serial.print(HHTerra1);
Serial.print(Humeterra1);


// Terra 2
 if (sensors.getTempC(Terra2)>(-127))
{
if (sensors.getTempC(Terra2)<=Temp1Jour)
  {
    Serial.print("Terra 2 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra2));
    Serial.println(" Chauffage en route ");
  }
  else
{ 
    Serial.print("Terra 2 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra2));
    Serial.println(" Ventilation en route ");
}
}

  

   if (sensors.getTempC(Terra3)>(-127))
{
if (sensors.getTempC(Terra3)<=Temp1Jour)
  {
    Serial.print("Terra 3 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra3));
    Serial.println(" Chauffage en route ");
  }
  else
{ 
    Serial.print("Terra 3 :");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra3));
    Serial.println(" Ventilation en route ");
}
}
  

  if (sensors.getTempC(Terra4)>(-127))
{
if (sensors.getTempC(Terra4)<=Temp1Jour)
  {
    Serial.print("Terra 4 : "); 
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra4));
    Serial.println(" Chauffage en route ");
  }
  else
{
     Serial.print("Terra 4 : "); 
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra5));
    Serial.println(" Ventilation en route ");
}
}
  


  if (sensors.getTempC(Terra5)>(-127))
 {
if (sensors.getTempC(Terra5)<=Temp1Jour)
  {
    Serial.print("Terra 5 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra5));
    Serial.println(" Chauffage en route ");
  }
  else
{ 
    Serial.print("Terra 5 :");  
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra5));
    Serial.println(" Ventilation en route ");
}
}


    if (sensors.getTempC(Terra6)>(-127))
{
if (sensors.getTempC(Terra6)<=Temp1Jour)
  {
     Serial.print("Terra 6 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra6));
    Serial.println(" Chauffage en route ");
  }
  else
{
    Serial.print("Terra 6 : "); 
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra6));
    Serial.println(" Ventilation en route ");
}
}
}

// entre 20:00:00 et 07:59:59 - T° : 22°c
//if ((hour() > 20 ) && (hour() < 7))
{ 

  //Extinction des lumières
  digitalWrite(LTerra, LOW);
  
if (sensors.getTempC(Terra1)>(-127))
{
if (sensors.getTempC(Terra1)<=Temp1Nuit)
  {
    Serial.print("Terra 1 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra1));
    Serial.println(" Chauffage en route ");
    digitalWrite(CTerra1, HIGH);
  }
  else
{ 
    Serial.print("Terra 1 : "); 
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra1));
    Serial.println(" Ventilation en route ");
    digitalWrite(CTerra1, LOW);
}
}


 if (sensors.getTempC(Terra2)>(-127))
{
if (sensors.getTempC(Terra2)<=Temp1Nuit)
  {
    Serial.print("Terra 2 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra2));
    Serial.println(" Chauffage en route ");
  }
  else
{ 
    Serial.print("Terra 2 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra2));
    Serial.println(" Ventilation en route ");
}
}

  

    if (sensors.getTempC(Terra3)>(-127))
{
if (sensors.getTempC(Terra3)<=Temp1Nuit)
  {
    Serial.print("Terra 3 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra3));
    Serial.println(" Chauffage en route ");
  }
  else
{ 
    Serial.print("Terra 3 :");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra3));
    Serial.println(" Ventilation en route ");
}
}
  

  if (sensors.getTempC(Terra4)>(-127))
{
if (sensors.getTempC(Terra4)<=Temp1Nuit)
  {
    Serial.print("Terra 4 : "); 
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra4));
    Serial.println(" Chauffage en route ");
  }
  else
{
     Serial.print("Terra 4 : "); 
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra5));
    Serial.println(" Ventilation en route ");
}
}
  


    if (sensors.getTempC(Terra5)>(-127))
 {
if (sensors.getTempC(Terra5)<=Temp1Nuit)
  {
    Serial.print("Terra 5 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra5));
    Serial.println(" Chauffage en route ");
  }
  else
{ 
    Serial.print("Terra 5 :");  
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra5));
    Serial.println(" Ventilation en route ");
}
}


    if (sensors.getTempC(Terra6)>(-127))
{
if (sensors.getTempC(Terra6)<=Temp1Nuit)
  {
     Serial.print("Terra 6 : ");
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra6));
    Serial.println(" Chauffage en route ");
  }
  else
{
    Serial.print("Terra 6 : "); 
    Serial.print("T° : ");
    Serial.print(sensors.getTempC(Terra6));
    Serial.println(" Ventilation en route ");
}
}
}

}

Yep!

L'idée est là, mais

delay(3000); --> En fait, çà fait 3 secondes. (30 s = 30000 ms)

time = ((hour() * 100) + minute()); --> Pourquoi multiplier par 100 ???

)) Attention aussi à la gestion du temps...

if ((hour()=8)) sera vrai pendant 60 minutes...

if ((hour()=19) && (minute()=30)) sera vrai pendant 1 minute entière...

// entre 08:00:00 et 19:59:59 t° : 25°c et H% : 90%
//if ((hour() > 8 ) && (hour() < 20))

--> Signifie strictement superieur à 8 et strictement inférieur à 20, soit entre 9h00 et 19h59.

idem ici :

// entre 20:00:00 et 07:59:59 - T° : 22°c
//if ((hour() > 20 ) && (hour() < 7))

--> Signifie strictement supérieur à 20 et strictement inferieur à 7, soit entre 21h et 06h59.

Donc, il ne se passe rien entre 7h et 9h, et entre 20h et 21h...Comme tu n'as que 2 plages de temps, le mieux est de paramétrer la première et d'accepter toutes autres possibilités dans l'autre cas.

if (plage_de_temps = 1) // première plage de temps
{ on fait un truc; }
else // deuxième plage de temps correspondant au reste
{ on fait un autre truc; }

Dans mon script, j'utilise également une gestion par plage horaire, mais j'ai trouvé plus commode de convertir les heures en minutes.

int current = (hour*60) + minute;

J'ai également integrer une condition qui verifie que la minute à basculer :

if (minute() != last_minute)
	{
         ...
         last_minute = minute(); // sauvegarde la minute en cours
         ...
         }

Ton système peut fonctionner mais cela t'obligerait à multiplier les variables d'états et à les contrôler régulièrement.

En esperant que cela puisse t'aider :wink:

@+

Zoroastre.

ca va m aider :slight_smile:
merci

pour les plages horaires, si j ai bien compris il faut que je rajoute les minutes si je veux par exemple commencer à 8h01, ou le >= ou <= peux le faire ?

pour le reste c est corrigé :wink:

Yep!

Le problème d'un code comme celui-ci :

//Pulverisation du matin et soir
if ((hour()=8))
{
pompe1()
pompe2()
pompe3()
pompe4()
}

est que tu risques de pulvériser pendant 60 minutes, avec des basculements de relais trop fréquent du coup.

Tu as deux possibilités ici, soit tu déclares une variable d'état qui prendra une valeur booléene dés que la condition est vrai.

if ((hour()=8) && eightoclock = False)
{ ...
eightoclock = True
}

Ainsi la variable eightoclock t'assurera que la fonction ne s'effectuera qu'une seule fois. Par contre, il faut du coup la réinitialisé par exemple à 9 heures.

La seconde solutions consiste à travailler avec des valeurs temps plus précise, comme la minute. J'ai plus bas donné les bases. Tu verifies tes conditions toutes les minutes et travailles avec des valeurs temps ramenées à la minutes. Le code est plus léger et précis à la fois.

Lorsque tu fait une condition avec un if, il faut s'assurer des conditions pour lesquels elle sera vrai ou fausse. Pas toujours facile :wink:

Tu pourrais préciser le type de carte relais que tu utilises, ton descriptif me rappelle la mienne !!!

@+

Zoroastre.

c est celle de chez kmtronic, prévu pic, arduino, stamp :wink:
j ai téléchargé leur pdf que je pensais commercial et je l ai regardé à priori ca se gère comme un relais normal

pour le temps j ai un peu de mal, dans ton dernier post :
avec un if (hour()=8) ---> à 8 heure du matin, il me démarre la pompe pendant 30 s puis se coupe (dans mon idée)
meme si le pompe1()
fait reférence à
void pompe1() {
digitalWrite(PHTerra1,HIGH);
delay(3000);
digitalWrite(PHTerra1,LOW);
}
il va me boucler le void pompe1() pendant une heure jusqu'a ce que l on bascule sur 9 heure ?
et si je mets if (hour()=8 && minute()=0)
il va faire de même pendant une minute

donc d ordre général dans le void loop() sauf en cas de sortie de condition if, le programme boucle en permanence

est ce que ce morceaux de code peut aller :

//Pulverisation du matin et soir
if ((hour()=8) && (minute()=00) && pompeH=false)
{
pompeH=true
pompe1()
pompe2()
pompe3()
pompe4()
}
else
{
pompeH=true
}

Yep!

pour le temps j ai un peu de mal, dans ton dernier post :
avec un if (hour()=8) ---> à 8 heure du matin, il me démarre la pompe pendant 30 s puis se coupe (dans mon idée)

il va me boucler le void pompe1() pendant une heure jusqu'a ce que l on bascule sur 9 heure ?
et si je mets if (hour()=8 && minute()=0)
il va faire de même pendant une minute

C'est exactement cela, le void loop() effectue les tâches de manière séquentielle, lorsqu'il a terminé son cycle, ben, il recommence. En 1 heure, il est certain qu'il effectuera un certain nombre de cycle. (Dépendant principalement des delay et boucle conditionnelle)
Donc, en réalité tant que le résultat d'une conditionnelle est vérifié, elle execute les actions qui en découlent à chaque cycle.

Dans ton cas, tu désires que l'action ne se réalise qu'une seule fois à 8h00. Le code que tu me présentes est quasiment bon...

Mais...

La question est de savoir si tu as réellement besoin de démarrer tes pompes alternativement. Car si tu maintiens ta base de 30 secondes, on a donc 4 pompes x 30 secondes = 120 secondes (2 minutes). En l'etat actuel du code, ton code sera figé tant que les actions pompes1 à 4 ne seront pas terminées.
Tu peux donc simplifié à :

//Pulverisation du matin et soir
if ((hour()=8) && (minute()=00))
{
pompe1();
pompe2();
pompe3();
pompe4();
}

Comme les pompes seront actives pendant une durée totale de 2 minutes, elle dépassera la condition du if. Ton code continuera sa route aprés 2 minutes de pulvérisation. Le gros inconvénient est que pendant ce temps là, l'arduino ne fait rien d'autre. A toi de voir !!!

-CONDITION OK-
8h00:30 >> pompe 1 terminé.
8h01:00 >> pompe 2 terminé.
8h01:30 >> pompe 3 terminé.
8h02:00 >> pompe 4 terminé.
Reprise du code...

@+

Zoroastre.

j ai compris tu veux me compliquer la tache :smiley:

si je parts sur ton code plus haut

ex (les valeurs sont comme ca) :
setup
digitalWrite(PHTerra1,LOW)

loop
if (500< current && current < 600) (qui corespondrait à la tranche 8h00m00 8h00m30)
{
digitalWrite(PHTerra1,HIGH)
digitalWrite(PHTerra2,HIGH)
}

est ce que les pompes s arrêteront à la fin de la condition ?
pour recuperer l heure courante de ds1307, j utilise ta commande int hour = (DateTime.Hour); int minute = (DateTime.Minute); ou il faut que je l adapte
De ce que j ai compris c est la fonction delay() qui empêche la continuité du prog, donc la il devrait passer à la suite
y a t il la possibilité de connecter une alim 5v et le port usb en même temps ?

Yep!

Loin de moi l'envie de te compliquer la tâche :wink:

est ce que les pompes s arrêteront à la fin de la condition ?

Dans ce cas, oui.

Je l'écrirais pourtant ainsi :

if (500< current && current < 600) (qui corespondrait à la tranche 8h00m00 8h00m30)
{ 
  state = 1;
  if (state != prev_state)
	{
         digitalWrite(PHTerra1,HIGH);
         digitalWrite(PHTerra2,HIGH);
        }
}
else 
{  
  state = 0;
  if (state != prev_state)
	{
         digitalWrite(PHTerra1,LOW);
         digitalWrite(PHTerra2,LOW);
        }
} 

prev_state = state;

Si tu désires un code non bloquant, je te conseille d'étudier l'exemple fournis avec le logiciel arduino : blinkwithoutdelay.

Pour la gestion du DS1307, il existe une biblio et de nombreux exemples sur le forum. Tu devras adapter ton code en implémentant une gestion sériel I2C.

Tu peux alimenter ton arduino et connecter le port USB ensemble. Pas de souci. On recommande plutôt une alimentation de 9V DC. (12 V maxi).

@+

Zoroastre.

je dirais même plus il existe de nombreuses librairies pour le ds1307 et le time

c 'était savoir laquelle utilisé et comment savoir les fonctions que l on peut appeler de celle-ci