Go Down

Topic: [RÉSOLU] Relais 2 Canaux et Compresseur du frigo (Read 457 times) previous topic - next topic

Col68

Bonjour,

Avec votre aide (Communauté Arduino) et surtout ☆J-M-L☆ j'ai réussi mon projet de thermostat contrôle de température et d'humidité.

Les relais sont des relais basics en module 2 canaux, le code est simple il allume et éteint les relais selon les instructions (température et humidificateur) l'objectif est d'utiliser ce projet dans un frigo.



Le problème auquel je ne trouve pas vraiment de solution, après avoir fini d'assembler le thermostat sur le frigo, allumé le thermostat, les relais s'ouvrent et se ferment et donc quand on change la consigne il y a un auto-reset qui redémarre le programme et les relais s'allument et s'éteignent à nouveau,

à ce moment-là, nous avons le câble du compresseur sur le relais qui coupe et allume le compresseur, je pense que ce n'est pas bon pour le compresseur.

Ma question, Pouvons-nous éviter cela en utilisant un morceau de code pour ne pas changer l'état des relais pendant la réinitialisation ou simplement remplacer les relais à 2 canaux par des relais SSR?

Désolée pour les erreurs, Merci d'avance.

Cordialement.


Artouste

Bonjour,

Avec votre aide (Communauté Arduino) et surtout ☆J-M-L☆ j'ai réussi mon projet de thermostat contrôle de température et d'humidité.

Les relais sont des relais basics en module 2 canaux, le code est simple il allume et éteint les relais selon les instructions (température et humidificateur) l'objectif est d'utiliser ce projet dans un frigo.et donc quand on change la consigne il y a un auto-reset qui redémarre le programme et les relais s'allument et s'éteignent à nouveau,

Bonjour
Surement un probleme de code initial
un changement/modif de "valeur de consigne" n'a pas à lui seul à generer un reset.
expose ton code 

Leptro

#2
Dec 16, 2017, 03:24 pm Last Edit: Dec 16, 2017, 06:03 pm by Leptro
Le problème auquel je ne trouve pas vraiment de solution, après avoir fini d'assembler le thermostat sur le frigo, allumé le thermostat, les relais s'ouvrent et se ferment et donc quand on change la consigne il y a un auto-reset qui redémarre le programme et les relais s'allument et s'éteignent à nouveau,

bonjour, je n'ai pas compris là.
Au démarrage du programme, les relais s'activent?

Pourquoi et comment il y a un auto-reset au changement de consigne?

jfs59

bonjour,

comme déjà dis il est anormal d'avoir un reset dans le cas de changement de consigne il faudrait avoir le code.

de toute façon si les relais mécaniques se déclenchent pas de raison qu'un statique agissent différemment.

L'autre solution c'est qu'on ai rien compris à la question ou à son exposé.

Effectivement une remise en marche du compresseur juste après son arrêt n'est pas bon (c'est pour ça qu'il y a toujours une protection anti court cycle sur les installations frigo)
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.

Lao Tseu.

Col68

Bonsoir, toutes mes excuses, Merci a chacun pour vos réponses.

Leptro, quand je change de consigne, le module relais s'allume et s'éteint comme un reset ou auto-reset, la uno aussi, mais je viens de me rendre compte que je pourrais peut être changé les consignes quand le compresseur est éteint ?

Artouste et jfs59 voici le code

Code: [Select]
#include <EEPROM.h>
#include <LiquidCrystal.h>  //this library is included in the Arduino IDE


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

byte grad[8] = {
  B01100,
  B10010,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
};

#include "DHT.h"


#define DHTPIN 13     // what pin we're connected to 13
#define DHTTYPE DHT22   // DHT 22  (AM2302)

DHT dht(DHTPIN, DHTTYPE);

// define pins for relay
#define temppeste 11
#define umidpeste 12

// define variable
float te, t1, tes, dete;   // variable for temperature
int has, hass, dehas;        // variable for humiditiy

byte meniu = 0;

int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

#define fundal 10   // backlight
int inceput = 0;  // time in second when push the button
int actual = 0;   // actual time in second
int ultimaapasare;  // sore time when push last time the button
int timplumina = 5; // timp for maximum value
byte fundalminim = 15;  // minimum value for backlight
byte fundalmaxim = 255; // maximum value for backlight
byte nivelfundal = 25;  // value for fundal
byte treaptanivel = 5;  // step for decrease light

void setup()
{

// Initialize LCD display  
 lcd.begin(16, 2);
// create custom symbol
lcd.createChar(0, grad);

// Initialize DHT sensor
  dht.begin();

// define outputs
 pinMode(temppeste, OUTPUT);  
 pinMode(umidpeste, OUTPUT);

// set the default state for outputs
  digitalWrite(temppeste, LOW);
  digitalWrite(umidpeste, LOW);

  lcd.setCursor(0,0);  
  lcd.print("thermostat with");
  
  lcd.setCursor(0,1);  
  lcd.print("humidity control");

delay(3000);
lcd.clear();

  lcd.setCursor(0,0);  
  lcd.print("original sketch");
  
  lcd.setCursor(6,1);  
  lcd.print("by niq_ro");
delay(3000);
lcd.clear();


byte tset1 = EEPROM.read(201);
byte tset2 = EEPROM.read(202);
tes = 256 * tset1 + tset2;  // recover the number
tes = tes/10;
dete = EEPROM.read(203);
dete = dete/10;
hass = EEPROM.read(204);
dehas = EEPROM.read(205);  

analogWrite(fundal, nivelfundal);
inceput = millis()/1000;  // store value for begining of program
....

Col68

Partie 2 du code :

Code: [Select]
}

void loop()


{

lcd_key = read_LCD_buttons();  // read the buttons
 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnSELECT:
     {
     meniu = meniu + 1;
     delay(1000);
     lcd_key = btnNONE;
     lcd.clear();
     break;
     }
     case btnNONE:
     {
     break;
     }
   }


if (meniu >= 5) meniu = 0;

if (meniu == 0)
{

lcd_key = read_LCD_buttons();  // read the buttons
 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnSELECT:
     {
     meniu = 1;
     delay(1000);
     lcd_key = btnNONE;
     lcd.clear();
     break;
     }
     case btnNONE:
     {
     break;
     }
   }

   // Reading temperature or humidity
 has = dht.readHumidity();
 te = dht.readTemperature();

 
delay(500);

 lcd.setCursor(0, 0);
  // lcd.print("t=");
 if (te < 0)
 {t1=-te;}
 else t1=te;
  
    if ( t1 < 10)
   {
     lcd.print(" ");
   }
   if (te>0) lcd.print("+");
   if (te==0) lcd.print(" ");
   if (te<0) lcd.print("-");
   lcd.print(t1,1);
//   lcd.write(0b11011111);
   lcd.write(byte(0));
   lcd.print("C  ");

   lcd.setCursor(10, 0);
  // lcd.print("H=");
   lcd.print(has);
   lcd.print("%RH");

   if (te > tes)
 {
 digitalWrite(temppeste, LOW);
   lcd.setCursor(0, 1);
   lcd.print("OVER ");
 }
if (tes - dete > te)
  {
   digitalWrite(temppeste, HIGH);
   lcd.setCursor(0, 1);
   lcd.print("BELOW");
 }
if ((te <= tes) and (tes - dete <= te))
 {
   lcd.setCursor(0, 1);
   lcd.print("OK !  ");
 }


 if (has > hass)
 {
 digitalWrite(umidpeste, HIGH);
   lcd.setCursor(10, 1);
   lcd.print("OVER ");
 }
 if (has < hass - dehas)
 {
   digitalWrite(umidpeste, LOW);
   lcd.setCursor(10, 1);
   lcd.print("BELOW");
 }
 if ((has <= hass) and (has >= hass - dehas))
 {  lcd.setCursor(10, 1);
   lcd.print("OK !  ");
}

actual = millis()/1000;
if ((actual - ultimaapasare > timplumina) &&  (nivelfundal > fundalminim))  // daca a trecut timpul de aprindere lumina fundal la maxim si nu s-a stins la minim
{
  nivelfundal = nivelfundal - treaptanivel;   // nivel aprindere in scadere
  if (nivelfundal < fundalminim) nivelfundal = fundalminim; // nu trebuie sa scada valaorea sub minim
  analogWrite(fundal, nivelfundal);
  Serial.println(nivelfundal);
}
} // last line for MENIU = 0


if (meniu == 1) {
  while (meniu == 1) {
//   teset(tset);
   lcd.setCursor(0, 0);
   lcd.print("Temperature SET:");
   lcd.setCursor(0, 1);
//   lcd.print("+");
   lcd.print(tes,1);
//   lcd.write(0b11011111);
   lcd.write(byte(0));
   lcd.print("C  ");

   lcd.setCursor(8, 1);
   lcd.print("dt=");
   lcd.print(dete,1);
//   lcd.write(0b11011111);
   lcd.write(byte(0));
   lcd.print("C  ");
  
lcd_key = read_LCD_buttons();  // read the buttons
 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
    case btnLEFT:
     {
     meniu = 0;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
   case btnUP:
     {
     tes = tes + 0.1;
     delay(250);
int tes2 = tes*10;  
byte tset1 = tes2 / 256;
byte tset2 = tes2 - tset1 * 256;
EEPROM.write(201, tset1);  // partea intreaga
EEPROM.write(202, tset2);   // rest
     break;
     }
   case btnDOWN:
     {
     tes = tes - 0.1;
int tes2 = tes*10;  
byte tset1 = tes2 / 256;
byte tset2 = tes2 - tset1 * 256;
EEPROM.write(201, tset1);  // partea intreaga
EEPROM.write(202, tset2);   // rest
     delay(250);
     break;
     }
     case btnSELECT:
     {
     meniu = 2;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
     case btnRIGHT:
     {
     meniu = 2;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
     case btnNONE:
     {
     break;
     }
   }

     }
   delay (100);
}   // end loop for MENIU = 1


if (meniu == 2) {
 // if (tmax <= tmin) tmax = tmin + 10;
   while (meniu ==2) {
 //    maxim(dt/10); // this is number to diplay
 //    dete(dt); // this is number to diplay
   lcd.setCursor(0, 0);
   lcd.print("hyst.temp. SET:");
   lcd.setCursor(0, 1);
//   lcd.print("+");
   lcd.print(tes,1);
//   lcd.write(0b11011111);
   lcd.write(byte(0));
   lcd.print("C  ");

   lcd.setCursor(8, 1);
   lcd.print("dt=");
   lcd.print(dete,1);
//   lcd.write(0b11011111);
   lcd.write(byte(0));
   lcd.print("C  ");

Col68

#6
Dec 16, 2017, 06:10 pm Last Edit: Dec 16, 2017, 06:16 pm by Col68
et la partie 3 du code:

Code: [Select]

 lcd_key = read_LCD_buttons();  // read the buttons
 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
     case btnLEFT:
     {
     meniu = 1;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
   case btnUP:
     {
     dete = dete + 0.1;
if (dete > 2.) dete = 2.;
EEPROM.write(203,dete*10);  
     delay(250);
     break;
     }
   case btnDOWN:
     {
     dete = dete - 0.1;
if (dete < 0.1) dete = 0.1;
EEPROM.write(203,dete*10);  
     delay(250);
     break;
     }
   case btnSELECT:
     {
     meniu = 3;
     lcd_key = btnNONE;
     delay(1000);
     lcd.clear();
     break;
     }
     case btnRIGHT:
     {
     meniu = 3;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
     case btnNONE:
     {
     break;
     }
   }

//   delay(15);
if (dete < 0.1) dete = 0.1;
    }
}  // end loop for MENIU = 2


if (meniu == 3) {
  while (meniu == 3) {
//   teset(tset);
   lcd.setCursor(0, 0);
   lcd.print("Humidity SET:");
   lcd.setCursor(0, 1);
//   lcd.print("+");
   lcd.print(hass,1);
//   lcd.write(0b11011111);
//   lcd.write(byte(0));
   lcd.print("%RH  ");

   lcd.setCursor(7, 1);
   lcd.print("dh=");
   lcd.print(dehas);
//   lcd.write(0b11011111);
//   lcd.write(byte(0));
   lcd.print("%RH");

 lcd_key = read_LCD_buttons();  // read the buttons
 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
     case btnLEFT:
     {
     meniu = 2;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
   case btnUP:
     {
     hass = hass + 1;
if (hass > 99) hass = 99;    
EEPROM.write(204,hass);    
     delay(250);
     break;
     }
   case btnDOWN:
     {
     hass = hass - 1;
if (hass < 1) hass = 1;    
EEPROM.write(204,hass);    
     delay(250);
     break;
     }
   case btnSELECT:
     {
     meniu = 4;
     lcd_key = btnNONE;
     delay(1000);
     lcd.clear();
     break;
     }
     case btnRIGHT:
     {
     meniu = 4;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
     case btnNONE:
     {
     break;
     }
   }
  
//  delay(15);
     }
   delay (100);
}  // end loop for MENIU =3


if (meniu == 4) {
   while (meniu ==4) {
   lcd.setCursor(0, 0);
   lcd.print("hyst.humid. SET:");
   lcd.setCursor(0, 1);
//   lcd.print("+");
   lcd.print(hass);
//   lcd.write(0b11011111);
   lcd.write(byte(0));
   lcd.print("%RH");

   lcd.setCursor(7, 1);
   lcd.print("dh=");
   lcd.print(dehas);
//   lcd.write(0b11011111);
   lcd.write(byte(0));
   lcd.print("%RH");

 lcd_key = read_LCD_buttons();  // read the buttons
 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnLEFT:
     {
     meniu = 3;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
   case btnUP:
     {
     dehas = dehas + 1;
if (dehas > 99) dehas = 99;
EEPROM.write(205,dehas);
     delay(250);
     break;
     }
   case btnDOWN:
     {
     dehas = dehas - 1;
if (dehas < 1) dehas = 1;    
EEPROM.write(205,dehas);
     delay(250);
     break;
     }
   case btnSELECT:
     {
      meniu = 5;
      lcd_key = btnNONE;
     delay(1000);
     lcd.clear();
     break;
     }
     case btnRIGHT:
     {
     meniu = 5;
     delay(1000);
     lcd.clear();
     lcd_key = btnNONE;
     break;
     }
     case btnNONE:
     {
     break;
     }
   }
 
//   delay(15);
if (dehas < 1) dehas = 1;
    }

}


}   // last line in main loop

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
if (adc_key_in < 1000)
{
 nivelfundal = fundalmaxim;
      analogWrite(fundal, nivelfundal);  // backlight at maximum
      delay(50);    
      ultimaapasare = millis()/1000;  // store last time whem button is pushed
}

 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP;
 if (adc_key_in < 450)  return btnDOWN;
 if (adc_key_in < 650)  return btnLEFT;
 if (adc_key_in < 850)  return btnSELECT;  

   return btnNONE;  // when all others fail, return this...
}  


Purée je ne savais pas que ça allez être aussi long, vraiment désolé, Karma pour Artouste, Leptro et jfs59 et merci d'avance pour toutes informations, cordialement.

Col68

#7
Dec 16, 2017, 07:56 pm Last Edit: Dec 16, 2017, 07:59 pm by Col68
jfs59 :
Quote
Effectivement une remise en marche du compresseur juste après son arrêt n'est pas bon (c'est pour ça qu'il y a toujours une protection anti court cycle sur les installations frigo)
Merci pour l'info jms59, c'est exactement ce qui m'est arrivé à cause du relais qui c'est éteint puis rallumé avec le changement de consigne, le frigo à brouter au redémarrage comme si quelque chose à empêché le compresseur de redemarrer.

Pas à pas je comprends mieux les choses, comme les consignes sont stocker dans l'Eeprom du Uno, au changement de consigne il y a un auto-reset qui fait un départ avec les nouvelles consignes, puis plus aucun problème du moment que la Uno et le module relais sont alimenté jusqu'au prochain changement de consigne.

L'astuce qui pourrait fonctionner pour eviter ce genre de désagrément (à mon avis) serait de changer les consignes quand le compresseur est à l'arrêt ?
Le mieux serait de trouver la solution pour eviter les relais de changer d'état apres le changement de consigne mais (je rêve peut être) ?

Désolé de vous embêter avec mes aventures.

Col68

Bonjour à tous,

Pour finir le sujet résolu je voulais remercié Artouste, Leptro et jfs59 pour leurs interventions, Karma à tous.

Je vais tous simplement attendre l'arrêt du compresseur puis 3/4 minutes après changé les consignes et pour le peut de fois qu'on les changent y a moyen de gèrer la situation.



L'idée de base est de remplacer les 2 boîtiers (thermostat/hygrostat) pour avoir une seul boite de commande thermostat/hygrostat sur le frigo.



Très bon dimanche à tous, cordialement.

Leptro


jfs59

Bonjour,

si ça vous convient bah ça vous convient, mais c'est peu satisfaisant ...

C'est comme dire "ma voiture cale dans les cotes mais j'ai la solution ! je la pousse jusqu'en haut et ensuite ça redémarre dans la descente"

voyant la photo du système je me pose la question des contacts sur ce montage : micro coupure micro court circuit lors de la manipulation ??? qui ferait un reset ?


De toute façon pour une utilisation définitive cela me semble peu viable.

cordialement
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.

Lao Tseu.

Col68

#11
Dec 18, 2017, 11:15 am Last Edit: Dec 18, 2017, 11:26 am by Col68
Bonjour jfs59 merci pour ta sincérité, j'avoue que c'est exactement ce que j'ai pensé. À la base je suis un travailleur à l'usine, loin du monde de l'électronique, mon hobby est la fabrication de fromages, saucisse.. à la maison et mon but est d'affiner les fromages, saucisses dans un frigo modifier pour avoir une température entre 12 et 14℃ avec une humidité constante entre 75 et 90%.

Je possède 2 frigo, 1 de 100 Litres pour le fromages et un autre plus petit frigo vitrée de 25L (style mini bar d'hôtel) pour fabriquer et affiner un peut de saucisse, salami...

Après avoir découvert vu et lu les possibilités avec le système Arduino je suis tombé sous le charme. :)
Mon projet est de réaliser 4 Contrôleurs de température et d'humidité avec Arduino :

1) "Keith Contrôle" Mon premier projet, l'idée est partie après avoir vu 2 super tuto sur le site instructables où on utilisais un module I2C avec le Shield Keypad 1602 et un autre tuto avec DHT22, Relais 2 canaux et un petit menu pour changé les consignes Avec l'aide de Mr Keith, la communauté Arduino et surtout JML j'ai pu finaliser ce super Projet. Merci encore à Mr Keith toute l'equipe et JML, je vous souhaite à tous que du bonheur.

2) "Niq_Ro Contrôle" Ce projet est partie après avoir trouvé un blog de tutos qui ma conquis avec les explications en détail, les codes, photos et vidéos sont mis à disposition. (L'auteur à 2 sites en Roumain ou Anglais, celui en Roumain est plus complet avec un translator aucun soucie pour comprendre) Bref c'est un expert en contrôle des contrôlables :) après lui avoir écrit gentiment il à accepté de faire un tuto et l'a partagé.

C'est celui avec lequel j'ai ce problème d'auto-reset dû aux changements de consignes) sinon il fonctionne parfaitement et je lui souhaite aussi que du bonheur à Nicu Florica (beaucoup de respect pour son partage)

3) "Leo Contrôle" un collègue de la communauté Arduino qui partage un système de thermostat assez intéressant, le but est d'utiliser des capteurs DS18B20 dans les etages du frigo pour suivre en détail l'enceinte, le projet s'appelle "Fresco-Versatile" et est dispo dans les projet du site Arduino Hub Projet, après discussion avec le chér Leo il à gentiment modifié le code pour utilisé un DHT22 (Projet en cours, attente matériel) Je remercie encore Léo pour son soutient et lui souhaite bien-sûr que du bonheur.

4) "J-M-L Contrôle" Alors là :) Je ne sais pas par où commencer, c'est le Projet le plus complet que je tiens à réalisé, C'est un projet impressionnant, hors normes, je l'ai déjà dit et le répète, j'en ai fait des recherches pour aboutir mes projets, pour comprendre etc... je n'ai pas trouvé un seul système de thermostat identique, avec autant d'options, les possibilités de reglages en mode programme auto, manuel... trop trop fort.

J'avoue que c'est le Mega Big Projet pour moi, mon favoris, celui que je tiens le plus à réalisé pour l'utiliser dans le frigo d'affinage. (me manque juste le capteur que j'attends et passe à l'attaque) j'en profite pour remercié J-M-L pour ce partage énorme, tout est "trop" bien expliqué en détails ce qui mérite un grand mais immense Respect pour J-M-L. Karma (matin/midi/soir).

Je vous souhaite aussi que du bonheur J-M-L franchement vous êtes un homme rare, je vous respecte déjà pour toute l'aide que vous m'avez apporté, votre patience, votre compréhension admirable et aussi pour ce partage magnifique.

Très Grand Respect à tous ☆☆☆☆☆ Vive la communauté Arduino☆☆☆☆☆

Voilà en gros mon aventure :)

Go Up