Pour un projet perso, j'essaie de contrôler une lampe en 220V avec un relais et un arduino, et un interrupteur. La plupart du temps, quand j'appuie sur l'interrupteur, la lampe semble s'allumer ne fraction de seconde avant de s'éteindre.
La lampe peut être allumée,
soit par le programme. En fonction de certaines conditions (ex : luminosité, horaires...) la lampe peut être allumée
soit par le bouton. Un utilisateur peut aussi allumer la lumière en appuyant sur un bouton. J'ai attaché une interruption sur la pin reliée au bouton. J'in intercalé un filtre passe bas entre le bouton et la pin de l'arduino, pour limiter les effets de rebonds.
Pour faire des phases de test en évitant le 220V, j'ai simulé mon relais et ma lampe en utilisant une simple led. J'ai ajusté les valeurs du filtre passe bas pour ne pas avoir un minimum de latence et de rebonds. Et tout fonctionnait très bien. La led s'allume correctement quand je la contrôle par le bouton ou par le programme.
Mais depuis que j'ai branché le relais, j'ai du mal à allumer la led en appuyant sur le bouton. Environ 2 fois sur 3, j'entend le "clac" du relais qui change de position, la lampe s'allume une fraction de second puis s'éteint. Environ 1 fois sur 3 (notamment si j'appuie longtemps sur l'interrupteur), l'ampoule répond correctement. On dirait que le relais bascule mais n'arrive pas à se bloquer dans sa nouvelle position.
J'avoue que je suis perplexe. Avez vous une idée pour résoudre ce problème
Si dans la fonction Setup() une ligne Serial.println("Démarrage") est insérée, il sera possible de voir si l'ARDUINO redémarre. On pourra alors soupçonner un problème d'alimentation.
Sans le code difficile de te répondre.
Comment est géré la coexistence des modes manuel/automatique?
De plus la gestion d'un bouton par interruption n'est pas vraiment nécessaire et n'est pas ce qui est le plus indiqué (sauf cas très pariculier).
Je vais vérifier ça reliant le montage à un ordi (pour l'instant le montage vit sa vie en autonomie), mais c'est peu probable. D'autres parties du montage réagissent quand j'appuie j'appuie sur le bouton reset. Les schéma au dessus n'indique qu'un extrait du projet global. Quand j'appuie sur le bouton reset, j'ai notamment une led qui s'allume, un écran qui clignote, petit bruit d'un buzzer.
Ce n'est pas le cas quand j'appuie sur le bouton pour contrôler mon ampoule. Je ne pense donc pas que la carte redémarre.
Il semblerait quand même que la durée d'appui sur le bouton soit un paramètre important. L'effet de l'ampoule qui s'allume et qui s'éteint se produit principalement si j'appuie brièvement sur le bouton. Si je maintiens un peu la pression, l'ampoule répond mieux. Mais c'est beaucoup moins sensible quand je n'ai que la led, et pas de relais.
Le code d'origine fait près de 400 lignes. Mais voici un extrait simplifié (non testé, je ne garantis pas les ";" ).
J'ai préféré travailler avec un delay et deux interruptions plutôt que des millis, car le montage suit tranquillement sa routine la plupart du temps, en réagissant en fonction de ses capteurs. La commande manuelle du montage, via les boutons est très rare, et se produit une à deux fois jour, maximum. L'interruption me permet aussi d'avoir un programme plus réactif, qui obéit rapidement à une commande (ex : si je veux qu'il arrête de faire du bruit, je veux qu'il arrête immédiatement et non pas qu'il mesure tous les autres capteurs avant de vérifier l'interrupteur et d'obéir)
Mais je doute que le problème vienne du code, car le montage fonctionnait correctement avant le branchement du relais, avec le même code.
const byte PIN_BULB = 4;
const byte PIN_SWITCH_LIGHT = 3;
bool isLightOn = false;
void setup() {
Serial.begin(9600);
// initialize pins
pinMode(PIN_SWITCH_LIGHT, INPUT);
pinMode(PIN_BULB, OUTPUT);
digitalWrite(PIN_BULB, LOW);
attachInterrupt(digitalPinToInterrupt(PIN_SWITCH_LIGHT), switchLight, RISING);
}
void loop() {
// fait des trucs à chaque tour de boucle
// fait parfois des trucs, en fonction des mesures des capteurs
delay(1000); // nécessaire pour que chaque actuateur puisse finir sa tâche tranquillement
}
void switchLight(){
Serial.println("Switch light triggered");
isLightOn = !isLightOn;
digitalWrite(PIN_BULB, isLightOn);
}
C'est un problème de rebonds. Quand le contact se fait sur un interrupteur, il y a plusieurs allers retours entre HIGH et LOW. Pour éviter cela, il ne faut pas tester le bouton immédiatement après un appui. On voit souvent de delay(20). Si le nombre de rebonds vus est impair, la lampe s'allume, si elle est pair cela flash pendant les rebonds.
Il peut y a voir le même problème au relâchement. Dans ce cas quand on relâche le bouton, on a le droit à une deuxième loterie.
Quand on passe par interruption, cela se complique un peu, il faut par exemple désactiver les interruptions pendant 20ms par exemple une fois traitée.
J'avais calculé 1s, et je trouvais ça trop long. Je m'étais même demandé comment il était possible que ça marche
Du coup j'ai essayé avec ce que j'avais sous la main :
C = 100 nF et R = 36 k => tau = 3.6 ms ; Ca marche mieux, sans être parfait
C = 100 nF et R = 100k => tau = 10 ms ; J'ai du mal à allumer l'ampoule en appuyant sur le bouton. La plupart du temps j'ai juste une faible lueur brève sur la led
C = 22 uF et R = 10k => tau = 220ms ; l'ampoule se met à clignoter rapidement avant de s'éteindre
J'ai mis le condensateur en parallèle de l'interrupteur, en supprimant la resistance. Je ne vois pas de différence de comportement. Je suis de plus en plus convaincue que le pb ne vient pas du bouton mais du relais
Le relais peut aussi être déclenché par la carte. Dans ces cas aussi, le contact se fait mal et l'ampoule se clignoter avant de se stabiliser et on entend un succession de "clic" qui indique que le relais a du mal à se bloquer dans sa nouvelle position. J'ai ailleurs dans mon montage, un piezo. Lorsque le piezo vibre, la lumière scintille au même rythme. Ils ne partagent pas les même pins.
J'ai discuté de mon problème avec un marchant de composant, qui m'a conseillé de ne pas alimenter le relais (coté VCC) directement à partir du 5V de la carte, mais à partir d'un 5V extérieur, ainsi que de vérifier l'ampérage du transformateur (certains chargeurs bas de gamme n'ont que 500 mA de courant max, ce qui peut être trop faible). Le marchant m'a aussi dit de vérifier que le voltage aux bornes d'alimentation du relais était bien de 5V.
J'ai modifié l'alimentation du circuit en sacrifiant quelques vieux cables usb qui trainaient. Maintenant le 5V du transfo alimente la carte par la prise USB, et le relais. J'ai vérifié que avant, comme après la modification, la tension aux bornes du relais restait bien à 5V. J'ai aussi mesuré que l'intensité à travers le cable de commande du relais était relativement élevée (75 mA). Mon multimètre ne me permet de voir s'il y a des pics de courant plus marqué au moment du changement d'état. Je n'ai pas mesuré le courant sur le VCC du relais. On ne peut pas dire que les résultats se soient vraiment amélioré. L'ampoule clignote quand le piezo s'allume.
Par contre, quand j'éteins mon fer à souder, qui partage la même multiprise que le reste du montage (alim du transfo vers l'arduino, et relais), mais qui n'a aucune autre connection électronique, l'ampoule branchée sur le relais s'allume...
Quand il y a plusieurs éléments et qu'un ne fonctionne pas, on a du mal à savoir lequel. Une bonne démarche est de tester les éléments un par un. On peut s'aider de la led de la carte de la broche 13 qui a priori est correcte.
Pour tester le relais, faire un programme blink with delay basique qui allume et éteint la lampe. On se serait peut être aperçu que le SDR-05VVDC-SL-C est un relais qui consomme 70mA, soit 4 fois trop pour l'Arduino (5 fois trop avec la led témoin). -> un relais s'alimente avec un transistor, sinon quand il colle il tire trop de courant et on peut avoir n'importe quoi, par exemple une baisse de la tension d'alim qui fait décoller le relais.
Pour tester le bouton, on peut faire "un appui -> changement d'état de la led".
Sur le schéma #1 on voit bien un relais SRD-05VDC-SL-C, mais comme il comporte 3 broches d'entrées 5V, GND et IN, je suppose qu'il s'agit d'un module, équipé forcément d'une électronique de commande.
Il manque simplement une info : quel modèle précis ?
Oui, c'est bien ça, mais les modules chinois sont souvent équipés de relais SRD-05VDC-SL-C.
D'autre part un module peut être commandé avec un niveau haut ou bas (ou l'un ou l'autre à l'aide d'un cavalier). Donc savoir de quel modèle il s'agit est indispensable.
Le relais est bien branché sur une carte, et non indépendant. Je n'étais pas trop à l'aise à l'idée de faire moi même les branchement en 220V, j'ai préféré faire confiance à un module pour l'occasion
Je ne vois pas de référence sur la carte et je ne retrouve pas de bon de commande dans mes mails. Après, il y a des trucs écrits en chinois, en petit. Quand j'avais reçu la carte, j'avais traduit il me semble, les inscriptions (les "claviers" chinois sur les smartphones sont bien pratiques). De mémoire, il n'y avait que des inscriptions sur les branchements (normalement ouvert, normalement fermé, commun -> pour les sorties, alimenté, commande entrée -> pour les leds).
Sur la carte du module, je vois 5 composants en CMS :
un qui ressemble à une diode (cylindre en verre? orange foncée avec un trait noir),
un composant à trois pates, a coté de l'une d'elles est inscrite la lettre N. J'ignore s'il y a d'autres caractères sous le relais, avant le N. Serait-ce un transistor ? . Je ne vois aucune inscription sur ce composant
3 petits composants rectangulaires notés 102. Sans doute des resistances de 10k.
La module ressemble beaucoup à celui ci, à l'exception de l'inscription SINGLE sur le relais (mais les autres logos sont identiques) et de l'inscription "Low Level Trigger" sous le module
Je m'étais renseignée sur le branchement d'un relais à la sortie d'un arduino, mais la quasi totalité des articles que j'avais vu branchaient directement le relais à l'arduino. Par ex, cet article, avec la même référence de relais, ou encore cet article . Je me souviens d'avoir vu passer un article au moins ou quelqu'un mettait des composants intermédiaires entre le relais et l'arduino. J'avoue ne pas avoir cherché à lire la notice du composant J'ignorais complètement que les relais 5VDC -> 220VAC étaient pouvaient être si différents, et encore plus que pour un même relais, les modules pouvaient eux aussi être variables.
A vrai dire, et comme indiqué dans le premier message, le montage fonctionnait bien tant que le relais était simulé par une simple LED. Et oui, j'avais bien testé que la led changeait d'état à l'appui sur le bouton ainsi qu'en fonction des valeurs du programme. Les problèmes ont commencé au moment ou j'ai ajouté le relais. C'est pour ça que j'ai toujours supposé que le pb venait du relais et non de l'interrupteur ou d'une autre partie du montage.
L'ampoule utilisée est une led en 220V. Je ne suis pas sure que le fait de l'allumer ou de l'éteindre trop souvent soit une bonne idée, pas avec des delay de l'ordre de la seconde ou de plusieurs secondes. Enfin je ne sais pas... Spontanément je ne l'aurais pas fait, en souvenir des lampes à incandescence. Mais maintenant que les ampoules sont des leds dont on peut contrôler la luminosité avec des triacs...
Il me semblait avoir lu que les relais non plus n'aimaient pas être sollicité trop rapidement. Après j'ignore ce que "rapidement" peut signifier pour un relais. Un fraction de seconde ? une seconde ? une minute ?
Je confirme : ce module se commande par un niveau LOW.
Je mesure un courant de commande de 3,5mA, donc c'est OK pour le brancher directement sur une sortie.
Avec une durée de vie de 100000 opérations, tu peux faire le calcul.
Dans ce cas il ne faut pas se pencher du côté du programme ni de l'anti-rebonds.
Est tu sûre que les GND de tes modules, Arduino, module relais etc. sont bien reliés ensemble.
Ce genre de phénomènes est typique de liaison(s) GND manquante(s).