Soucis LCD avec activation d'un relais

Bonjour à tous !

Je suis en train de réaliser un système de commande de chauffage domestique régulé à l'aide d'une sonde de température . J'ai donc une platine 2 relais avec optocoupleurs trouvée sur ebay (celles que bcp utilisent) , une DS18B20 ainsi qu'un lcd comme celui ci (http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertLCDSeulAfficheTexte) mais monté sur une Mega, j'ai aussi une horloge RTC DS1307 et un shield pour carte SD.

En gros mon programme déclenche le relais quand la température est trop basse et le stoppe quand la température redescend (on verra une régulation plus propre plutard)et enregistre la température et l'état du relais toutes les 5 mins.

Quand je n'ai pas de charge sur le relais, tout fonctionne . Quand je branche un ventilo de PC basique , ça marche aussi mais quand j'essaie de commuter du 220V , l'affichage disparait ou plante ou m'affiche des caractères bizarres... Je vais connecté quelques leds pour être sûr que le programme continue de tourner , la communication avec le Moniteur série déconne aussi .

Pour être plus précis , tout plante à la deuxième commutation : exemple , il fait 21°C donc mon relais est activé au démarrage de la carte , une fois les 25°C atteints , le relais se coupe (des fois ça plante à ce moment là) , une fois que la température est redescendu en dessous de 23°C le relais est réactivé et là c'est le bazar ..

J'ai cherché sur le net et ici sur ce forum et il revient souvient que ça vient d'un soucis d'alimentation .

Actuellement ma carte est alimenté en 12v via un chargeur de PC et tous les organes dont la platine relais est alimenté en 5v par ce même chargeur . Tout ce petit monde a donc une masse commune .

Je vais vous fournir un schéma , mon code ainsi que la puissance du chargeur :wink: mais en attendant avez vous quelques idées ? Usage de snubber ? Revoir le choix des alimentations ?

Merci

Donc mon chargeur crache 12V (1,5A) et 5V (2A) .. je viens d'essayer pas mal de combinaisons : alimentation du module relais par le chargeur seul , alimentation par le 5V de l'Arduino avec la carte sur USB, alimentation exclusivement avec le chargeur ...

J'ai toujours des soucis d'affichage ..

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SD.h>

#include <Wire.h>
#include "RTClib.h"
#include <DataTimeStrings.h>

#include <LiquidCrystal.h>
/*
const int RS=2; //declaration constante de broche 
const int E=3; //declaration constante de broche 
const int D4=4; //declaration constante de broche 
const int D5=5; //declaration constante de broche 
const int D6=6; //declaration constante de broche 
const int D7=7; //declaration constante de broche */

const int RS=12;  const int E=11;  const int D4=5;  const int D5=4; const int D6=3;  const int D7=2;  

#define ONE_WIRE_BUS_PIN 6
OneWire oneWire(ONE_WIRE_BUS_PIN); // décla broche utilisée
DallasTemperature sensors(&oneWire); // décla sensor
RTC_DS1307 rtc;

const int chipSelect = 53;  
const int LEDR = 10;
const int LEDV = 8;
const int RELAIS = 9; //declaration broche 3 output
boolean etatRelais = 1; // Etat du relais (on / off)
boolean Froid = 0;
//Adresse des capteurs
DeviceAddress Temp1 = {0x28, 0xE6, 0x03, 0x51, 0x07, 0x00, 0x00, 0xE6 }; //Domo
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits 

int resolution = 12;
int i = 0;
  int heuretop = 0;
  int minutetop = 0;
  int secondetop = 0;
char buff2[50]="";
int chrono;
int stock = 0;
int interval = 5;
boolean stockage = 0;

int etatLEDV = 0;
int etatLEDR = 0;
int test = 0;

void setup()
{
    
  delay(50);
  lcd.begin(16,2);  
  delay(500);
  rtc.begin();
  delay(500);
  sensors.begin();
  delay(500);

  rtc.adjust(DateTime(__DATE__, __TIME__)); 

  pinMode(LEDR, OUTPUT); 
  pinMode(LEDV, OUTPUT); 
  pinMode(RELAIS, OUTPUT);  
    
  sensors.setResolution(Temp1, resolution);

  
  DateTime now = rtc.now();
   heuretop = now.hour();
   minutetop = now.minute();
   secondetop = now.second();
  
    if (!SD.begin(chipSelect)) {    Serial.println("Card failed, or not present");        return;  }
    
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  dataFile.println("T1\tChauffage\tHeure\tTps(min)\n");
  delay(50);
  dataFile.close();
  Froid = 0;
  sprintf(buff2, "%02d:%02d:%02d", heuretop, minutetop, secondetop );
   delay(100);
}

void loop()
{
  sensors.requestTemperatures();  
  delay(200);
  float T1 = sensors.getTempC(Temp1);
  delay(200);
    
    
  if(T1 < 21) { etatRelais = 1;}else{etatRelais = 0;}
  
  digitalWrite(RELAIS,!etatRelais);

   etatLEDV = !etatLEDV ; 
    
    
  /*  
    if(T1>22)              {  etatRelais = 0 ;}
    delay(50);
    if(T1<21)              {  etatRelais = 1 ;}
    delay(50);
    
  etatLEDV = !etatLEDV ;
 
 if( etatRelais = 1){ digitalWrite(RELAIS,HIGH); delay(50);}
 if( etatRelais = 0){ digitalWrite(RELAIS,LOW); delay(50);}
 */
  delay(10);
 digitalWrite(LEDV,etatLEDV);
  delay(10);
 digitalWrite(LEDR,etatLEDR);
  delay(10);  

 /* Serial.print(T1);
  Serial.print("  ");*/


  DateTime now = rtc.now();
  delay(50);
  char buff[50]="";
  
sprintf(buff, "%02d:%02d", now.hour(), now.minute());
  int heureT = now.hour();
  int minuteT = now.minute();
  int secondeT = now.second();
  
//  int chrono = ((heureT - heuretop)*3600 ) + ((minuteT - minutetop)*60) - secondetop + secondeT ;
   
   if(chrono != minuteT){stockage = TRUE;}
  
  
  if(minuteT%interval == 0 && stockage == TRUE)
  { 
  stock= stock + 1;
  
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  dataFile.print(T1);
  dataFile.print("\t");
  dataFile.print(etatRelais);
  dataFile.print("\t");
  dataFile.print(buff);
  dataFile.print("\t");
  dataFile.print(stock*interval);
  dataFile.println("\n");
  delay(50);
  dataFile.close();
  
  stockage = FALSE; 
  chrono = minuteT; 
  etatLEDR = !etatLEDR ;
    
  }


/*  Serial.print(stockage);
  Serial.print("  ");
  Serial.print(buff);
  Serial.print("  ");
  Serial.print("\n");*/

lcd.setCursor(0,0) ; 
lcd.print(T1) ;
lcd.setCursor(0,1);
lcd.print(etatRelais);
lcd.setCursor(11,0);
lcd.print(buff);
lcd.setCursor(11,1);
lcd.print(stock*interval);



delay(200);
}

Bonjour,

Je connais ce problème, j'en ai déjà parlé sur ce forum.
Tu as ce problème le plus souvent à la coupure du relais.
Lorsque la coupure se fait a un moment ou la tension est faible, rien ne se passe, par contre si la tension est prêt du maximum qui se situe a plus de 300v, là, tu as un amorçage au niveau des contacts du relai. Ca génère des parasites.
En général, on met sur le contact, un condensateur en série avec une résistance.
Attention pas n'importe quel condensateur.
Tu peux essayer avec un condensateur de 0,1µF à 0,33µF /400v ac minimum et une resistance de 100 ohms-1/2W. Elle fera fusible si le condo se met en CC.

Ce n'est pas la seule cause possible. Ton câblage est peut être en cause. Les alimentations un peu justes.
Dans tout les cas, c'est jamais simple.

Roger.

Salut,

Peut tu mettre un schéma du cablage des différents composants ou une photo, avec la platine relais, relié à la carte arduino, il faut alimenter celle-ci par la prise noir avec une tension de 9V et au moins 1A.

La platine relais est celle-ci, si oui le vcc platine sur 5 V arduino , mais avec l'arduino alimenté comme indiqué ci-dessus.

bilbo83:
Tu peux essayer avec un condensateur de 0,1µF à 0,33µF /400v ac minimum et une resistance de 100 ohms-1/2W. Elle fera fusible si le condo se met en CC.

Je vais essayer ça :wink: !

hameau:
Salut,

Peut tu mettre un schéma du cablage des différents composants ou une photo, avec la platine relais, relié à la carte arduino, il faut alimenter celle-ci par la prise noir avec une tension de 9V et au moins 1A.

La platine relais est celle-ci, si oui le vcc platine sur 5 V arduino , mais avec l'arduino alimenté comme indiqué ci-dessus.

Oui c'est bien ce module alimenté en 5V par la carte Arduino , elle-même alimenté par mon chargeur 12V 1,5A .

Je vais récupéré des L7805, je pense dédier un chargeur alimentant seulement la carte arduino et un autre me procurant un 5V par le biais d'un L7805 alimenté par un 2ieme chargeur ...

Si le module relais n'est pas alimenté par carte arduino donc VCC et GND, mais pas une source Externe, il faut changer de place le cavalier Orange sur la photo.

@+

C'est à dire JD-VCC : alim 5V Arduino
GND-VCC : alim externe ?

Normalement oui, sinon faire une recherche avec Google avec le terme JD-Vcc.

On peut aussi tester avec un ohmètre, c'est souvent plus sûr que les écrits de certains auto-proclamé expert.

C'est à dire JD-VCC : alim 5V Arduino
GND-VCC : alim externe ?

Je penserai plus volontiers l'inverse puisque Vcc c'est un symbole bien précis et qui pour moi se rapporte au micro-controleur.

Tel que le cavalier est placé sur la photo un point de la diode de roue libre est normalement relié à l'ensemble JdVcc /Vcc.
En retirant le cavalier je suppose que ce même point de la diode restera relier à JdVcc et ne le sera plus à Vcc.

Si c'est bien cela JdVcc est relier à l'alim extérieure.

je pense que 68tjs a tjs raison, jdvcc est alim externe, il y a des modules avec relais 12 volts, il faut bien appliquer le 12 volts à jdvcc.
suivant les modules : explications ICI

"If you isolate Arduino, you need to connect +5V ONLY (NOT GND) from Arduino to the VCC pin. The Arduino output pins go to IN1 through IN8. And again, these pins are Active LOW.

The separate 5V supply would go from
JD-VCC (Jumper removed)
GND
The ONLY connection to Arduino would be
Relay board VCC to Arduino +5V
(signal pins to In0, IN1 etc)"
logique : à quoi bon ajouter un optocoupleur si on relie les 2 gnd : arduino gnd+gnd 5 volts séparé

le relais est déjà un "isolateur" entre la commande et la charge, l'optocoupleur isole le circuit de commande de la bobine du relais en plus, à condition de ne pas relier gnd du circuit de commande, l'avantage de l'opto, entres autres, c'est que si la commande est en l'air, le relais ne se déclenche pas, ce qui pourrait être le cas en cas de commande directe de la base du transistor qui commande la bobine du relais

j'ai testé : pas de cavalier, 5v arduino sur vcc, in1 sur gnd, rien d'autre la led indication s'allume
led cms qu'on ne verra pas dans un montage fini en boitier, on ne peut pas la courtcircuiter, on peut l'enlever uniquement si on la remplace par une autre led à "pattes" de la meme couleur probablement rouge dans la plupart des cas

tester une alim 5 volts completement séparée : enlever le cavalier, brancher jdvcc et gnd, arduino : 5 volts de l'arduino sur vcc et broche commande relais à in1, pas le gnd de l'arduino

Ok je verrais ça et je vous redirais ...

Comme quoi il ne faut pas suivre bêtement les exemples du Net où la masse du module relais est toujours relièe à celle de l'Arduino ..

BrUnO14200:
Comme quoi il ne faut pas suivre bêtement les exemples du Net où la masse du module relais est toujours relièe à celle de l'Arduino ..

quand on n'utilise qu'une seule alimentation, il faut bien !!!!
c'est quand on utilise 2 alimentations indépendantes dont une exclusivement pour le module relais jdvcc et gnd, il ne faut pas relier le gnd des 2 alimentations, uniquement quand le module relais est "piloté" par des optos ce qui n'est pas le cas de tous les modules du commerce