Voici un code pour volet piscine qui fonctionne, mais avant mise en place dès les
" prochains beaux jours!" , je souhaite y adjoindre une dernière modification. Après plusieurs tentatives et sans doute un peu de fatigue, mon programme se bloque, du coup j'ai retiré la partie douteuse du code.
j'ai choisi de piloter l'inversion sens moteur par 2 relais inverseurs, et protégé ces derniers des effets selfiques moteur et coupure par un gros relais auxiliaire en série. (10 A) De ce fait à l'enclenchement , l'auxiliaire colle après les inverseurs, ce qui fonctionne corrrectement dans mon code actuel. A l'arrêt système, l'effet est contraire, l'auxiliaire doit décoller avant les inverseurs. ayant opté pour un décallage d'une demi seconde.
N'ayant pas réussi à trouver de solution convenable sans perturber ce qui pour l'heure est efficace, je suis à la recherche de la solution qui m'ai échappé.
if(!difaux) // variable retard relais auxiliaire
topdepart2 = millis(); // démarrage tempo différant le relais auxiliaire
if(millis()-topdepart2>=500) // boucle de temporisation
digitalWrite(11,HIGH); // relais auxiliaire activé
// FIN DE PROGRAMME
vous rentrez dans le if si valid est faux, pourquoi le remettre à faux dans ce if ?
si vous voulez noter l'heure de début ce serait peut être
if (valid) {. // la première impulsion au démarrage ouverture ou fermeture
chrono = millis(); // déclenche le démarrage chrono obstacle
valid = false;
}
Tout a fait vrai, en fait n'y ai pas fait attention, de plus pour une fonction qui se fera très occasionnelle, 1 à 3 fois par an!
N'étant pas spécialement initié, il m'arrive de trouver une solution en tâtonnant, ce qui fut le cas ici en saisissant de la sorte lorsque j'ai voulu que le timer de la sécurité obstacle soit effectif dès le démarrage, et non seulement entre 2 impulsions compteur. c'est pourquoi j'ai conservé cela ainsi. je vais tenir compte de votre remarque et corriger ces lignes de code.
je suis conscient qu'il y ait bien meilleure façon de rédiger un tel code , type machine à état, malheureusement et malgré diverses tentatives je n'arrive pas à m'y habituer. N'y a t il pas une solution similaire à celle utilisée en démarrage cycle
que je puisse adapter en inverse en fin de cycle fermeture ou ouverture pour le relais auxiliaire sans preprendre tout mon code? Pour info, j'ai fait des essais avec des lignes en début des fonctions 2 et 4,( correspondant à l'arrêt fermeture et ouverture), désactivant d'abord le relais Aux, démarrant un timer de 500ms et dès ce dernier terminé, reprise des lignes réintitialisant toute les sorties et variables.
Certes, j'ai mal placé l'enregistrement EEprom en le plaçant dans la Loop, puisque ça ne doit se produire qu'en cas de coupure courant. Il semble d'ailleurs que je puisse éliminer cette fonction lecture et enregistrement EEprom sur les dernières version Nano 3, puisque lors de mes récents essais , mes compteurs conservent la mémoire Position à chaque coupure alim Nano,contrairement à des Nano précédentes.
Ayant lu qu'une mémoire neuve est systématiquement à la valeur 255, j'ai voulu imposer la valeur 0 au 1er démarrage, volet complètement ouvert, ce étant la configuration de mise en service. Encore vrai, mal positionné à la rélexion, puisque ça ne se produira qu'une seule fois en tout et pour tout. Mieux aurait valu le placer dans les déclaration de début de code, voir s'en passer, vu que le détecteur RFID impose systématiquement la valeur 0 , le volet complètement ouvert, toujours à la mise en service.
D'où, il est intéressant d'avoir un oeil extérieur, une fois plongé dans notre univers, notre regard se fige pour certains dont je fais partie.......
Ormis ces erreurs notoires, où et comment m'y prendre pour ce relais auxiliaire?
Il est vrai que sur smartphone, vu mon code, difficile d'avoir une vue d'ensemble.
Pour ma part je fais tout avec un PC, tellement plus facile à scruter.
hum, non, la RAM perd ses valeurs en cas de coupure de courant.
on ne peut pas vraiment faire confiance à cela, ça peut aussi être 0 ou autre chose.
La façon "propre" de traiter cela est d'écrire en plus en EEPROM un mot magique sur quelques octets qui aurait peu de chance de se trouver là si la carte n'a pas déjà été initialisée.
Par exemple on attend 4 octets (0xDEADBEEF ou autre Hexspeak pour le fun) à l'adresse 0,1,2,3
Si on les voit, c'est que les valeurs stockées ensuite sont bonnes sinon on met les valeurs par défaut en EEPROM et on écrit le mot magique pour la prochaine fois.
On fait cela qu'une seule fois dans le setup.
je suis en vadrouille en ce moment donc je regarde le forum sur mon smartphone. moins pratique que mon Mac et mes 2 écrans 32 pouces pour lire du code, c'est sûr
personnellement je repenserais tout le code sous forme de machine à état... c'est une écriture complète mais ce sera plus lisible. Et dessiner le graphe des états et des transitions possible vous permet de réfléchir à ce qu'il faut faire et quand. ça aide à formaliser tous les cas.
Difficile pour une photo du montage, étant déjà chez la personne où il sera utilisé, loin de chez moi! Par contre, un schéma est envisageable si besoin.
je tente pour l'instant, quelques lignes du type de celles fonctionnant bien à l'ouverture ou fermeture, où le retard du relais auxiliaire fonctionne bien.
En principe, il suffit de faire de même à l'arrêt de ces deux fonctions, en inversant tout bonnement l'ordre des relais avec un même retard pour les inverseurs cette fois. L'essentiel, et c'est là le plus délicat, judicieusement réinitialiser les variables au moment opportun. Sans doute où je dois approfondir la question. Je reviendrai avec plus d'informations si mes prochains essais restent infructueux.
Merci à jef59 et JML pour leurs interventions.
La machine à états étant indigeste pour moi, et au vu de la lecture de quelques post, je ne suis pas un cas isolé, j'ai remis tout à plat comme JML l'a proposé.
Ce n'est pas pour rien, que plus jeune, déjà je ne faisais pas bon ménage avec les maths "modernes" !!!!
Il est vrai, qu'en réduisant le code à l'essentiel pour définir une commande, ça facilite grandement. Maintenant, reste à réimplanter tout ça dans mon code initial, pas garanti qu'un conflit vienne chambarder mes bonne illusions.! Use code tags to format code for the forum
type or paste c#include <simpleBouton.h> // bibliothèque de gestion des entrées
simpleBouton Tlc = 2; // entrée info fonctions avec la télécommande
int etatF2 ;
int memoF2 = 0;
int etatF4 ;
int memoF4 = 0;
bool dif810 = false; // mémoire retard relais fermeture et 24 v à l'arrêt
bool dif910 = false; // mémoire retard relais ouverture et 24 v à l'arrêt
bool difaux = false; // mémoire retard relais auxiliaire
int etatTlc ; // variable mémoire état actuel bouton télécommande
int memoire = 0; // mémoire état précédent bouton télécommande
unsigned long topdepart4 = 0; // mémoire référence chrono retard relais ouverture fonctions 2 et 4
unsigned long topdepart3 = 0; // mémoire référence chrono retard relais fermeture fonctions 2 et 4
unsigned long topdepart2 = 0; // mémoire référence chrono retard relais auxiliaire
int fonction = 0 ; // déclaration du compteur nommé fonction,servant à gérer le système
int relaisF = 8 ; // déclaration sortie relais fermeture
int relaisO = 9; // déclaration sortie relais ouverture
int relais24 = 10; // déclaration sortie relais 24 volts capteur induction
int relaisAux = 11; // déclaration sortie relais auxiliaire puissance
bool fermeture = false; // mémoire fermeture en cours
bool ouverture = false; // mémoire ouverture en cours
void setup() {
pinMode(Tlc, INPUT_PULLUP); // entrée télécommande
pinMode (relaisF, OUTPUT); // sortie relais fermeture
pinMode (relaisO, OUTPUT); // sortie relais ouverture
pinMode (relais24, OUTPUT); // sortie relais 24 volts capteur inductif
pinMode (relaisAux, OUTPUT);
} // sortie relais auxiliaire puissance( commutation moteur en série avec relais inverseurs, évite arcking destructeurs)
void loop () {
Tlc.actualiser(); // mise à jour entrée télécommande
if (Tlc.estEnfonceDepuisAuMoins(1000)) // si appui bouton long de la télécommande ( évite enclenchement parasites ou intempestifs )
etatTlc = 1; // changement d'état de la mémoire Tlc
else
etatTlc = 0;
if ((etatTlc != memoire) && (etatTlc == 1)) // si la la condition d'état mémoire Tlc change
fonction++; // Incrementation d'une valeur au compteur fonction
memoire = etatTlc;
if (fonction == 1)
{ digitalWrite(10, HIGH); // relais 24V ON
digitalWrite(8, HIGH); // relais Fermeture ON
fermeture = true; // fonction fermeture en cours
difaux = true;
dif910 = false;
} // pour imposer retard relais auxiliaire
if (fonction == 2) // arrêt fonction fermeture
{ digitalWrite(11, LOW); // relais auxiliaire off
fermeture = false;
difaux = false;
dif810 = true;
} // reset variable retard auxiliaire
if (fonction == 3)
{ digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
ouverture = true; // fonction ouverture en cours
difaux = true;
dif810 = false;
}
if (fonction == 4)
{ digitalWrite(11, LOW); // relais auxiliaire Off
ouverture = false; // arrêt fonction ouverture
difaux = false;
dif910 = true;
fonction = 0;
}
if (!difaux) // variable retard relais auxiliaire
topdepart2 = millis(); // démarrage tempo différant le relais auxiliaire
if (millis() - topdepart2 >= 1000) // boucle de temporisation
digitalWrite(11, HIGH); // relais auxiliaire activé
if (!dif810)
topdepart3 = millis();
if (millis() - topdepart3 >= 1000)
{ digitalWrite(8, LOW);
digitalWrite(10, LOW);
}
if (!dif910)
topdepart4 = millis();
if (millis() - topdepart4 >= 1000)
{ digitalWrite(9, LOW);
digitalWrite(10, LOW);
}
}
ode here
Pour inverser le sens de rotation d'un moteur avec des relais, il y a multitude de schémas simples et sûrs.
Par sûrs, je veut dire sans risque de "flashs" dûs aux temps d'ouverture et fermeture des contacts.
Mon intuition est que le choix d'un bon schéma simplifie et sécurise grandement les choses, le code y compris.
Par exemple:
Vous pouvez confier la fonction "MARCHE/ARRÊT" à 1 relais 2 pôles.
Et la fonction "INVERSION DE SENS" à 1 seul autre relais à 2 pôles "repos/travail".
Ainsi au niveau du code (avec la machine d'état si possible), pour inverser le sens:
Vous envoyez 0 (arrêt) au relais "MARCHE/ARRET"
Vous envoyez 0 (sens1) ou 1(sens2) au relais "INVERSION DE SENS"
Vous envoyiez 1(marche) au relais "MARCHE ARRET"
Voici le schéma de principe du système relais. j'ai repris le montage tel qu'il était déjà conçu dans l'armoire, piloté par un boîtier électronique Omron Hors Service.
Au repos, les relais inverseurs sont basculés à la masse, faisant office frein moteur en même temps au moment de l'arrêt. Seul l'un d'eux passe en mode travail lorsque l'un ou l'autre sens est sollicité. Le relais auxiliaire commute en différé, étant de puissance et qualité supérieure. ( 10 ampères)
Le relais 24 volts pour les capteurs est indépendant du 24 volts moteur, éliminant tout risque parasite, flash, etc....étant issu d'une alimentation régulée différente de celle moteur, redressée uniquement elle, par un pont de diode de puissance.
( toujours selon la conception d'origine du tableau)
Depuis hier, les choses ont grandement évolué.
Le code de mon dernier message a été combiné au code complet de gestion du système et agréable surprise, cette fois tout est bien coordonné, les relais basculent en temps et en heure voulu.
J'ai simulé les relais par des diodes led sur un prototype différent de celui déjà élaboré, pour rappel, ce dernier est déjà en possession de son destinataire.
Encore un grand merci jef59 pour t'être intéressé à ce projet. Au plaisir d'une entrevue concernant une future autre réalisation peut-être.
J'ai bien compris vos impératifs, vous nous demandiez conseils, et vous nous excusez la solution qui est adoptée
Mais avec le schéma que vous adoptez, il n'y a pas de fonction frein tout à fait efficace.
Pour freiner (relier les 2 bornes du moteur), selon votre philosophie, vous devez
ouvrir le contact du relais A
relier les 2 bornes du moteur au 0V (ou 24V)
fermer le contact du relais A
De plus, quand le contact du relais A s'ouvre, il n'y a pas de diode de roue libre pour aider à amortir le pic de courant dû à la décharge de la bobine selfique du moteur.
Je comprend que ma réponse vous surprenne.
Ma demande était axée sur le code d'inversion retard respectif des relais suivant que l'on soit en On ou OFF en somme dans chaque sens de rotation.
Quant au montage des relais, je ne souhaitait pas modifier le tableau initial. Mon erreur, je le reconnais, est de n'avoir pas communiqué le schéma relais dès le départ, d'où votre proposition très détaillée dont je vous suis reconnaissant.
D'ailleurs, à la relecture, mon schéma et mes commentaires comporte quelques erreurs.
Le 24 volts capteurs est indépendant du 24 volts moteur, issu d'une alim séparée.
Le commentaire concernant le frein moteur superflu, puisque l'insertion du relais Auxiliaire ,( équivalent à un M/A), ouvre le circuit avant le repos des inverseurs, donc les pôles moteur restent isolés l'un de l'autre, le pic tension restant lui bien réel dans ce cas. D'où votre remarque concernant les diodes de roue libre, étant toujours d'actualité et dont il me reste à tenir compte, bien que je le rappelle, le schéma reprend le tableau tel qu'initialement. ( a fonctionné 20 ans ainsi)
Le frein moteur n'a de plus pas lieu, la démultiplication est telle que l'arrêt est quasi instantané, mon commentaire était purement gratuit.
Je ne fais pas des critiques, c'est votre chantier, je fais juste des remarques en me disant que puisqu'il doit y avoir un rafraichissement, c'est peut-être occasion pour vous d'apporter quelques modifications simples si la logistique et la technique vous le permet.
Pour les diodes, c'est un mieux, mais puisque vous avez un contacteur "auxiliaire de puissance" et qu'il fonctionne ainsi depuis 20 ans, c'est qu'il est bien dimensionné pour supporter cela, alors "why not?" pourquoi changer?
Je n'ai pas perçu vos avis en temps que critiques, rassurez- vous jef59. Trop heureux d'avoir quelqu'un qui se penche sur ma requête.
Il semble qu'en effet, compte tenu du bon fonctionnement comme tel depuis des lustres et que désormais le code appliqué à la carte nano soit d'un comportement identique au boîtier pilote Omron originel, que chercher de plus!
Voir même que désormais il comporte des sécurités supplémentaires.
Encore un grand merci à vous et à JML pour ces partages.
En attendant, même s'il s'avére que ça n'a pas était fait pendant 20 ans, il faut savoir qu'un moteur électrique, constitué de bobines électriques, réagir comme une selle inductance.
Et physiquement, la tension aux bornes d'une self est E(t) = L x (di/dt).
Quand on coupe le courant dans une self, la variation du courant (le di/dt, le passage de I moteur à 0 est infini si la coupure est rapide).
Donc votre relais, même s'il a déjà 20 ans, vieillit prématurément.
Les diodes de roues libres mises au plus près du moteur, ont pour fonction de permettre "l'extinction" du courant sans créer d'arcs et de surtensions.
Forcément, ce n'est pas parce qu'elles ne sont pas là que le relais de puissance ne va pas marcher, disons que se sont ses contacts qui s'abîment plus vite que orévus et peuvent un jour se souder ensemble.