besoin d'aide gestion de pompes doseuses

Bonjour a tous,

je possède un UNO, un ds1307 et une carte 8 relais. J’ai besoin d’alimenter via la carte relais, a heure fixe tous les jours de la semaine des pompes qui servent a doser des ajouts dans mon aquarium.
Le matin 8-9h je dois alimenter les relais 1 et le 2
Le midi les relais 1 et le 3
Le soir 20h les relais 1 et 4
et enfin vers 22h les relais 1 et 5

Afin de pouvoir modifier les quantités de produits versés dans le bac il me faut pouvoir modifier le temps de fonctionnement des relais entre 20s et 5 min.

J’ai éssayé plusieurs solutions de code mais j’ai toujours quelque chose qui ne va pas, de plus je n’arrive pas bien à gérer les temps de démarrage et de fonctionnement.

Si quelqu’un veut bien me filer un coup de main ce serai sympa. Merci

Bonjour, Je crois qu'il faudrait donner plus de détails sur la nature de tes problèmes et des solutions que tu as expérimentées, ainsi que sur les libs utilisées.

J'utilise le DS1307 avec cette doc: http://www.ladyada.net/learn/breakoutplus/ds1307rtc.html sans aucun problème. Est-ce que ce sont les comparaisons d'heures qui te posent problème?

Souvent le soucis c'est quand on veut effectuer une action ponctuelle (un seul déclenchement), à une heure donnée. Y'a une technique simple pour ça qui en plus de la comparaison d'heure utilise un booléen pour savoir si l'action a déjà été effectuée par le sketch ou pas (puis une remise à zéro une fois par jour où après une heure définie par exemple).

C'est la technique que j'utilise sur mon projet d'horloge actuel (pour avoir une synchronisation DCF77 par nuit à partir d'une heure donnée par exemple).

Oula, je ne suis pas assez expérimenté pour maitriser tout ce que tu me dit là.

Mes problemes sont: - je n'arrive pas à faire s'enclencher les relais par deux, enfin si je pilote juste un groupe (le matin par exemple) ca passe mais je n'arrive pas a enchainer tout au long de la journée. - je n'arrive pas à faire un réglage précis du temps d'enclenchement non plus.

C'est pas grave, c'est l'occasion d'apprendre, même si ça prend du temps et de la sueur et si ça coûte quelques cheveux :grin: Faudrait que tu te familiarises avec les concepts de base du développement, ça aide beaucoup (les types de données et les structures de contrôle par exemple).

J'ignore comment se pilotent tes relais mais d'une façon générale, n'essaie pas de tout faire dès le début, ça rend la chose très difficile à mettre au point. Commence par exemple par piloter tes relais indépendamment de l'heure (tu simules une heure à l'aide de variables indiquant les heures et minutes par exemple). Quand ça marche comme tu veux, tu introduis la gestion de l'horloge RTC et tu intègres le tout.

Je fais du développement logiciel depuis mon plus jeune âge alors je suis très mal placé pour juger de la complexité d'un développement. Mais je procède toujours en utilisant la méthode que j'ai indiqué (ce qui ne m'empêche pas d'avoir des cheveux blancs, mais pour une autre raison :grin: ).

Je vois bien comment implémenter ce dont tu as besoin, mais l'expliquer en termes compréhensibles c'est moins évident.

Oui je suis totalement d’accord avec ce que tu me dis, mais justement c’est la gestion RTC qui me pose beaucoup de problemes. Avec des variables j’arrive a le faire fonctionner.

Explique le détail de tes problèmes et mets des exemples de codes. Sans ça on ne peut pas vraiment t'aider.

Original82:
Bonjour a tous,

je possède un UNO, un ds1307 et une carte 8 relais. J’ai besoin d’alimenter via la carte relais, a heure fixe tous les jours de la semaine des pompes qui servent a doser des ajouts dans mon aquarium.
Le matin 8-9h je dois alimenter les relais 1 et le 2
Le midi les relais 1 et le 3
Le soir 20h les relais 1 et 4
et enfin vers 22h les relais 1 et 5

Afin de pouvoir modifier les quantités de produits versés dans le bac il me faut pouvoir modifier le temps de fonctionnement des relais entre 20s et 5 min.

J’ai éssayé plusieurs solutions de code mais j’ai toujours quelque chose qui ne va pas, de plus je n’arrive pas bien à gérer les temps de démarrage et de fonctionnement.

Si quelqu’un veut bien me filer un coup de main ce serai sympa. Merci

bonjour
gestion horodaté et temporisation des evenements 8)
aussi bizarre que cela semble, c’est une résolution du probleme pas si simple qu’il apparaisse au premier abord :grin:

il faut déjà bien poser les termes la matrice de decision :

je résume ma lecture :
ici 8 relais (actionneurs) évolutif ?
l’unité temporelle de decision est la seconde de temps ?
la répétition du cycle est systématiquement englobée sur 1 jour=24H ? (pas d’autre différenciation temporelle a intégrer ? )

Bonjour Artouste. merci pour ton aide.

8 relais c'est bien ça et non il n'y aura pas d'évolution surtout que je n'en utilise que 5 L'unité de décision est bien la seconde oui et la répétition est bien exactement identique toutes les 24h.

Original82:
Bonjour a tous,

je possède un UNO, un ds1307 et une carte 8 relais. J’ai besoin d’alimenter via la carte relais, a heure fixe tous les jours de la semaine des pompes qui servent a doser des ajouts dans mon aquarium.
Le matin 8-9h je dois alimenter les relais 1 et le 2
Le midi les relais 1 et le 3
Le soir 20h les relais 1 et 4
et enfin vers 22h les relais 1 et 5

Afin de pouvoir modifier les quantités de produits versés dans le bac il me faut pouvoir modifier le temps de fonctionnement des relais entre 20s et 5 min.

J’ai éssayé plusieurs solutions de code mais j’ai toujours quelque chose qui ne va pas, de plus je n’arrive pas bien à gérer les temps de démarrage et de fonctionnement.

Si quelqu’un veut bien me filer un coup de main ce serai sympa. Merci

a la premiere lecture il me semble que ton relais 1 doit toujour fonctioner non ?

sinon voici des code qu’i mon permit de réaliser des effet similaire
voici tout d’abort une fonction qui me permet de me situer dans le temps au cour de la journée
(jutilise une RTC avec un DS1307, il faudra peut’etre adapter).

/*___________________________________________________________ fonction de calcule de l'heure actuel RTC en seconde______________________________________*/
unsigned long temps(){
  unsigned long resultat;
  rtc.get(&sec, &min, &hour, &day, &month, &year);//fait la demande a la RTC
  resultat=((hour*3600L)+(min*60L)+sec); //calcule le moment de la journer en seconde
  return resultat;
}

apres il te sufira de faire quelque chose du genre

unsigned long mon _heure_marche=(8*3600L);//pour 8heur du matin (le L est obligatoire avec les variable long)
unsigned long mon _heure_arret=(22*3600L+30*60L+0);//Pour 22H 30min 0sec
if (temps()-mon _heure_marche>0)//verifi si on a depaser l'heure de mise en marche du relais voulu ici relais1
{
digitalWrite(relais1,HIGH);};
if (temps()-mon _heure_arret>0)
//verifi si on a depaser l'heure de mise a l'arret du relais voulu ici relais1{
digitalWrite(relais1,LOW);};

j’esper que sa pourra t’aider

Effectivement c'est très similaire, le relais 1 dois toujours fonctionner quand les autres fonctionne sinon il ne doit pas fonctionner, c'est une redondance de sécurité au cas ou 1 relais reste collé.

Tu viens de répondre à une de mes interrogation, j'avais fais cette ligne: résultat=((hour*3600L)+(min*60L)+sec); mais sans le "L" et l'arduino affichait des valeurs complètement a la rue.

Merci car du coup je peux essayer d'avancer un peu plus.

Non c'est pas si simple en effet! J'ai mis de longues heures à mettre au point mon horloge actuelle qui a différentes actions temporisées et tout un tas de conditions associées. Mais quelle satisfaction quand ça marche comme attendu! :)

L'idée de base c'est de mémoriser pour chaque relai s'il s'est déclenché depuis les dernières 24h, et quand il a été déclenché. S'il n'a pas été déclenché tu compares l'heure courante avec la valeur souhaitée et dès que tu dépasses cette valeur tu allumes le relai et tu mémorises l'heure à laquelle il a été allumé.

Si le relai est allumé, tu regardes depuis combien de temps. Quand tu dépasses le temps imparti, tu l'éteins.

Une fois par jour, genre à minuit, tu remets à zéro la variable qui indique si le relai a été déclenché dans la journée, et ça repart pour 24h.

Pour les mesures de temps d'allumage de relais il est plus simple d'utiliser millis() que l'heure fournie par l'horloge RTC. Cette heure-là ne sert que pour déterminer s'il est l'heure d'allumer un relai.

Edit: si tu as durée d'allumage des relais supérieure à 1s et d'une résolution d'1s tu peux faire plus simple en comparant simplement avec l'heure issue de l'horloge RTC.

Pour gérer 5 relais il vaut mieux utiliser des tableaux que 5 variables de chaque type.

bas de rien je me fait moi aussi un système pour gérer ma pièce d’élevage de reptile qui neccésite des approches similaire au tienne j'imagine , perso je galère dessus depuis janvier et j'ai, grace au persone du forum passer plein detape donc n'esite pas !

Je ne sais pas utiliser les tableaux et justement comme je le disais, un allumage je le gère sans problème mais impossible de gérer les 4 allumages, certains relais ne se ré allume pas :/

Original82: Je ne sais pas utiliser les tableaux et justement comme je le disais, un allumage je le gère sans problème mais impossible de gérer les 4 allumages, certains relais ne se ré allume pas :/

Tu pourrais te faire un petit sketch pour apprendre justement à utiliser les tableaux (création, initialisation et parcours avec une boucle). Quand c'est acquis, tu les utilises dans ton programme actuel.

Depuis tout petit je fais ce genre d'exercice pour acquérir de nouvelles connaissances. Ca a donné pas mal de projets jamais terminé mais c'est toujours intéressant :)

Original82:
Je ne sais pas utiliser les tableaux et justement comme je le disais, un allumage je le gère sans problème mais impossible de gérer les 4 allumages, certains relais ne se ré allume pas :confused:

si il ne se ré-alume pas c’est qu’il ne reçoivent pas la commande certainement, regarde si tu a bien un nouveau digitalwrite(mon relais , HIGH); pour chaque relais voulu sur chaque heure.

Comme les actions se répètent tous les jours, il n'y a pas nécessité de gérer la date. Donc on va manipuler, des heures, et des actions.

1ère étape, création d'une structure pour manipuler ces informations

struct event{
    uint8_t h;
    uint8_t m;
    uint8_t s;
    uint8_t action;
};

les membres h, m, s de la structure contiendront l'heure de déclenchement de l'événement. Le membre action indique l'état des relais en utilisant un bit par relais.

2ème étape , déterminer combien d'évènements on veut gérer et créer un tableau pour les gérer. Par exemple 10 actions par jour.

const int NBACTION=10;
struct event mesActions[NBACTION];

3ème étape, il faut prévoir quelque part du code pour initialiser le tableau, soit par une affectation directe soit de manière interactive. Dans tous les cas pour accéder à un membre il faut faire ainsi:

mesActions[0].h=08;
 mesActions[0].m=45;
 mesActions[0].s=25;
 mesActions[0].action=0b00101100;

ou dans la déclaration du tableau

struct event mesActions[10]={8,45,25,0b00101100, // et ainsi de suite pour chacune des 10 ligne du tableau.
   .....
   .....
   0,0,0,0         // une ligne sans action peut être initialisée ainsi
}

4ème étape, dans loop tu fais une boucle qui parcourt le tableau et qui compare l'heure courante retournée par ton horloge avec l'heure des actions dans le tableau. S'il y a égalité, tu appliques l'action.

Effectivement cette approche me parait pas mal aussi, je vais voir si j'arrive a manipuler ceci. Merci