GDWLIB #1 La classe DailyTimer pour Arduino


Messages recommandés

Bonjour à tous.

 

Vu le nombre de requêtes personnelles concernant des exemples de codes, et le nombre de néophytes qui , disont le, rament avec le codage C++

Je vous mets à disposition la classe DailyTimer que je vous ai concocté de la manière la plus simple possible afin de faciliter le travail des pauvres galériens..

 

Elles sont documentées et deux exemples d'utilisations sont fournis

 

Cette classe est un temporisateur journalier, qui peut être utilisé par exemple pour des lampes, mais des extracteurs ou autres.. que sais-je encore

Cette classe gère le chevauchement de 2 jours et est très simple à utiliser.

l'exemple ne prend pas en compte la gestion du RTC qui est à votre charge

 

exemple :

 

#include "DailyTimer.h"
#define HPS_PIN 10

DailyTimer HPS(HPS_PIN); // déclaration de la minuterie sur pin 10 de l'arduino

void setup()
{    
     HPS.setValue(GROW_START,21,00);  // 21:00
     HPS.setValue(GROW_STOP ,15,00);  // 15:00
     HPS.setValue(FLO_START ,11,20);  // 11:20
     HPS.setValue(FLO_STOP  ,23,20);  // 23:20

}

void loop()
{
     HPS.run(1347,CROISSANCE);
}

 

Dans cet exemple, le 1347 correspond au nombre de minutes écoulées depuis 00:00hr.

 

Je vous remercie de ne poser à la suite, que des questions ayant attrait au sujet de cette classe.

Si vous rencontrez des problèmes, n'hésitez pas à poser vos questions ci-dessous.

Je me ferai un plaisir d'y répondre.

 

les fichiers et exemples sont contenus dans le fichier .zip en pièce jointe.

 

DailyTimer.zip

 

Amusez-vous bien !

 

@pluche

GEN

Modifié par Gen
  • Like 3
Lien à poster
Partager sur d’autres sites

Je viens de voir ta classe, autant dire qu'elle va m'être utile ;)

Je ne vois cependant pas très bien comment s'en servir, en effet dans loop pourquoi 1347 ?
Après avoir déclaré le RTC, où faire appel à lui dans le code ? sous quel forme enregistrer l'heure ? quel fichier contenu dans le dailytimer.zip faut-il modifier ?
Merci d'avance !

Lien à poster
Partager sur d’autres sites

yop

 

il n'y a rien a modifier dans la librairie (.h et .cpp)

le 1347 est un exemple, il représente le nombre de minutes depuis 00:00hr à l'instant T

 

voici comment cela se présente :

#include <Wire.h>
#include <RTClib.h>
#include "DailyTimer.h"
#define HPS_PIN 10
 
RTC_DS1307 RTC;
DateTime now;
DailyTimer HPS(HPS_PIN); // déclaration de la minuterie sur pin 10 de l'arduino
 
// fonction qui te permet de recupérer le nombre de minutes écoulées depuis minuit.
int getTimeInMinutes(DateTime currentTime)
{
    return ((currentTime.hour() * 60) + currentTime.minute());
}
 
void setup()
{
    Serial.begin(9600); // pour les éventuelles sorties sur moniteur serie
    Wire.begin();
    RTC.begin();
    HPS.setValue(GROW_START,21,00);  // 21:00
    HPS.setValue(GROW_STOP ,15,00);  // 15:00
    HPS.setValue(FLO_START ,11,20);  // 11:20
    HPS.setValue(FLO_STOP  ,23,20);  // 23:20
}
 
void loop()
{
   now = RTC.now();
   HPS.run(getTimeInMinutes(now),CROISSANCE);
// ou sans la fonction getTimeInMinutes tu aurais pu écrire cela egalement sous
// cette forme
// HPS.run((now.hour() * 60) + now.minute(),CROISSANCE);
// mais c'est moins propre et moins lisible
}
 

Plus simple... tu meurs :-)

 

++

GEN

Modifié par Gen
Lien à poster
Partager sur d’autres sites

re:

 

Content de voir que cela te plait, effectivement c'est le but des classes, faciliter l'usage de fonctionnalités avec un niveau d'abstraction.

 

Définition de l'abstraction : tu te fous de savoir ce qu'il y a dans cette classe, et de savoir comment elle fonctionne.

tout ce que tu as besoin de savoir c'est comment l'utiliser ;-)

 

Elle n'est pas belle la vie ?

 

N-Joy Man

 

++

GEN

  • Like 1
Lien à poster
Partager sur d’autres sites

dans l'exemple simple, j'avais mis  les explications

 

 

 
Methodes disponibles :
******************************************************************
* void    setValue(int configurationType, int inputTime);        *
******************************************************************
Assigne les valeurs de départ et de fin pour chaque cycle
voir exemple plus bas

******************************************************************
* void    setValue(int configurationType,int HH, int MM);        *
******************************************************************
Variante d'introduction des valeurs de départ et de fin pour
chaque cycle voir exemple plus bas

******************************************************************
* void    run(int currentTime, int plantCycle);                  *
******************************************************************
doit se trouver dans la boucle 'void loop()'
parametre 1 = heure actuelle sous forme de minutes depuis 00:00hr
parametre 2 = type de cycle lumineux (CROISSANCE ou FLORAISON)

******************************************************************
* int     getValue(int configurationType);                       *
******************************************************************
renvoie la valeur enregistrée en fonction du type de selection
param 1 = GROW_START ou GROW_STOP ou FLO_START ou FLO_STOP
valeur renvoyée = un entier avec le temps converti en
minutes depuis 00:00 hr

******************************************************************
* bool    isWorking();                                           *
******************************************************************
renvoie un booléen signifiant si la lampe est en activité
synthaxe :
if(HPS1.isWorking())
{
    ......
}
 

++

GEN

Lien à poster
Partager sur d’autres sites

Bonsoir GEN,

 

Je vois que dans l'exemple multi, pour chaque HPS il y a un "mode" croissance et floraison. Le choix de ce mode ce fait dans le void loop ()

HPS.run(1260,FLORAISON);

ou

HPS.run(1260,CROISSANCE);

 

si je veux faire ce choix par un interrupteur par exemple? 

 

Merci de ton aide.

Lien à poster
Partager sur d’autres sites

Re,

 

Alors, est ce que ceci fonctionne? (je ne met que ce que j'ai ajouté)

 

#define BP1 12

 

void setup()
{
  pinMode (BP1, INPUT);
}
 
void loop()
{  
 
 if ( BP1, HIGH ) 
   {
   HPS.run(1260,CROISSANCE);
   HPS.stop(900,CROISSANCE); 
   Serial.println("Mode CROISSANCE");
   }
   else if ( BP1, LOW )
   {
   HPS.run(1260,FLORAISON);
   HPS.stop(540,FLORAISON);
   Serial.println("Mode FLORAISON");
   }
 
 
}
 
C'est bien ça?
Lien à poster
Partager sur d’autres sites

yop.

 

pas du tout. LoL

 

1 - Pour connaitre l'état du I/O il faut utiliser suivant le cas, la commande digitalRead() ou analogRead()

2 - pour la définition du mode croissance ou floraison via un interrupteur il faut que l'interrupteur soit d'un coté branché au 5v et de l'autre à l'I/O, l'usage d'une résistance est nécessaire et d'un condensateur pour éviter les rebonds

3 - ensuite il ne te reste plus qu'à aller lire l'état de ton i/o et d'assigner ta variable globale via un if conditionnel.

 

338724.png

 

 

 

#define bouton 3

 

int growingMode;

 

void setup()
{
    pinMode(bouton, INPUT);
     //on active la résistance de pull-up en mettant la broche à l'état haut (mais cela reste toujours une entrée)
    digitalWrite(bouton, HIGH);
}

 

void loop()
{
   if(digitalRead(bouton)==HIGH)
   {

      growingMode = CROISSANCE;
   } 
    else
   {

     growingMode = FLORAISON;

   }

  

  et dans ton appel de fonction run

  HPS1.run(le temps en minute depuis minuit qui vient de ton RTC, growingMode);

}

 

 

 

PS 1 : tu devrais taper ton code dans une environnement de développement et ensuite compiler ton code

il te signifiera de suite toutes tes erreurs de syntaxe.

PS 2 : je sais pas d'où tu sors la méthode stop ???  il n'y a pas besoin de lui dire stop because

la definition des plages horaire se fait via la methode setValue() de l'objet HPS1 qui vient de l'instanciation de ta classe DailyTimer

 

++

GEN

Modifié par Gen
Lien à poster
Partager sur d’autres sites
  • 5 mois après ...

Coucou !

 

Dis moi, pourrait on, plutôt que de mettre "CROISSANCE" ou "FLORAISON" en paramètres, lui donner un booléen ?

Comme dans ta classe MistController. Cela permettrait d'utiliser la même variable :P

Je dis peut-être une grosse ânerie, désolé !

 

Tchuss !

Lien à poster
Partager sur d’autres sites

yop

 

Je te rassure, tu dis une grosse ânerie..  Si tu regardes la défintion de la classe (fichier .h) tu y trouveras ceci

 

#ifndef DailyTimer_h
#define DailyTimer_h

#define GROW_START  0
#define GROW_STOP   1
#define FLO_START   2
#define FLO_STOP    3
#define CROISSANCE  0 
#define FLORAISON   1

 

tu peux le caster sans aucun problème..

Si justement j'ai utilisé les terme CROISSANCE & FLORAISON, c'est dans un souci de lisibilité, afin de ne pas chercher la valeur booléenne associée..

 

donc si tu préfères CROISSANCE = false et FLORAISON = true

 

on aurait aussi pu définir un type enum... mais pour 2 valeurs je trouve cela ridicule.

 

@pluche

GEN

  • Like 3
Lien à poster
Partager sur d’autres sites
Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.