[Programmation] Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 32

Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino



  1. #1
    Ndrmnr

    Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino


    ------

    Bonjour à toutes et à tous,
    Je tourne en rond depuis quelques jours pour commander un télérupteur à l'aide d'un relais lui même commandé par une broche de l'Arduino (transfert de la puissance sur les contacts du télérupteur).
    Mon problème est que le relais se comporte comme un interrupteur et non comme un bouton poussoir. De ce fait pour ne pas commander (alimenter) le télérupteur en permanence je fais un digitalWrite(pin, HIGH), une petite tempo puis un digitalWrite(pin, LOW). Simulation d'une impulsion.
    Le résultat est qu'à chaque boucle je génère une impulsion et donc fais retomber le télérupteur, remonter, retomber...et ainsi de suite.
    J'ai essayé de gérer l'affaire en lisant un état précédent et un état suivant mais là aussi le résultat est négatif ou alors le problème vient de moi et c'est pourquoi je me retourne vers vous pour trouver une ou des pistes de réflexion pour arrêter ce générateur d'impulsions! Je vous remercie par avance pour l'aide que vous pourrez m'apporter.
    Cordialement
    Ndrmnr

    -----

  2. #2
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Bonjour Ndrmnr et bienvenue sur FUTURA
    Citation Envoyé par Ndrmnr Voir le message
    De ce fait pour ne pas commander (alimenter) le télérupteur en permanence je fais un digitalWrite(pin, HIGH), une petite tempo puis un digitalWrite(pin, LOW). Simulation d'une impulsion.
    OK
    Le résultat est qu'à chaque boucle je génère une impulsion et donc fais retomber le télérupteur, remonter, retomber...et ainsi de suite.
    - Faut que ton programme passe une seule fois dans cette boucle pour mettre ON le télérupteur
    - Faut que ton programme passe une seule fois dans cette boucle pour mettre OFF le télérupteur

    donne ton code programme ......
    J'aime pas le Grec

  3. #3
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Bonjour DAUDET78, avant le code, je te présente le projet.
    Système de régulation de température, hygrométrie et de lumière par l'utilisation d'un radiateur soufflant, d'un humidificateur, de tubes fluorescents pour plantes et d'un extracteur d'air le tout commandé respectivement par relai_temp, relai_humi, relai_lumi et relai_vent.
    J'utilise :
    - un interrupteur à 2 positions pour définir le cycle été ou hiver,
    - un capteur DHT22 pour la température et l'humidité,
    - une photorésistance pour définir si les néons sont allumés ou éteints,
    - un LCD 4 x 20 caractères,
    - une horloge temps réel (DS1302) pour les calculs d'horaires.
    Pour info,
    - j'ai essayé de mettre la commande de relais dans le Setup mais je ne vois pas comment gérer le changement d'état de l'interrupteur E/H (été / hiver),
    - j'ai essayé de gérer la commande de relais via une interruption avec lecture d'état avant/après mais dans le moniteur série je vois ces deux états toujours identiques soit 0, soit 1. Je place peut-être ces lectures à un mauvais endroit!
    Comme c'est mon 1er programme sur Arduino, je me considère comme néophyte et je compte sur ton indulgence si tu découvres des hérésies (notamment pour la définition des variables) Certaines variables ne sont plus d'actualité comme lectureEh1 et 2 qui servaient à mémoriser les états avant et après.
    Passons aux choses sérieuses, voici le code :

    Code:
    // Les 3 lignes qui suivent ne sont plus d'actualité mais sont gardées pour mémoire
    // Version avec gestion par interruption externe (bouton Ete/Hiver)
    // ==> déclenchement sur un front montant ou un front descendant.
    // ==> libération de la broche 2 (INT0) pour ce bouton et décallage des autres broches
    #include <DS1302.h>
    #include <Wire.h>
    #include <LiquidCrystal.h>
    #include "DHT.h"
    
    //Définition des constantes
    byte ConsigneHumi = 50;      // Consigne d'humidité % mini  à modifier selon besoin
    byte ConsigneTemp = 21;      // Consigne température ° mini à modifier selon besoin
    //  Affectation des PINs
    const int TimePause = 3000;         //Actualisation des valeurs toutes les 3 secondes
    int positionInter = 2;
    // Pin 3,4 et 5 = raccordement DS1302
    // Pin 6 libre
    // Pin 7 pour la sonde DTH22 (température et humdidité)
    char relai_lumi = 8;                // relais lumière à pin 8 Arduino
    char relai_temp = 9;                // Relier le pin IN2 du relais à pin 9 Arduino
    char relai_humi = 10;               // Relier le pin IN1 du relais à pin 10 Arduino
    char relai_vent = 11;               // Relier le pin IN1 du relais vent à pin 11 Arduino
    int lectureLdr;
    int etatChauffage = LOW;
    int etatHumidite = LOW;
    int etatVentilation = LOW;
    int lectureEh1;
    int lectureEh2;
    int temp;
    int humi;
    int tempo;
    int lecture;
    int Bascule;
    int Lumi = 0;
    int valLdr;
    //volatile int bascule = LOW;     // Déclaration d'une variable volatile (state) pour interruption (idem ligne 1)
    //int basculer;
    
    // Définition du capteur
    #define DHTPIN 7             // Sonde placée en broche 7 de l'Arduino
    #define DHTTYPE DHT22        // DHT22 = sonde T° et H%
    DHT dht(DHTPIN, DHTTYPE);
    
    // Définition du capteur de lumière
    #define LDR A0               // LDR placée en broche A0 de l'Arduino
    
    // Configuration du LCD
    LiquidCrystal lcd(32, 30, 28, 26, 24, 22); // Afficheur 20 colonnes x 4 lignes
    // 32 = RS, 30 = E, 28 = DB4, 26 = DB5, 24 = DB6, 22 = DB7.
    
    // Init DS1302
    DS1302 rtc(3, 4, 5);        //3=RST, 4=DAT, 5=CLK.
    
    //Init structure Time - data
    Time t;
    
    void setup()  //-----------------------------------------------------------------------------
    {
      //Réglage de l'horloge en mode exécution  et dévérouillage de la protection écriture
      rtc.halt(false);
      rtc.writeProtect(false);
    
      // Initialisation de la transmission série
      Serial.begin(9600);
    
      //Les lignes qui suivent sont à dé-commenter si l'on veut effectuer une mise à l'heure et actualiser le jour
      //rtc.setDOW(FRIDAY);         // définition du jour : LUNDI
      //rtc.setTime(17, 9, 0);     // définition de l'heure 12:00:00 (format 24hr)
      //rtc.setDate(5, 5, 2018);   // définition de la date au 23 avril 2018
    
      //Désignation des broches Arduino en sortie pour les relais.
      pinMode(relai_temp, OUTPUT);
      pinMode(relai_humi, OUTPUT);
      pinMode(relai_vent, OUTPUT);
      pinMode(relai_lumi, OUTPUT);
      pinMode(positionInter, INPUT);   //Définition de l'interrupteur en entrée
    
      lcd.begin(20, 4);            // Initialisation du LCD 20 caractères x 4 lignes
      delay(10);                   /* pause rapide pour laisser le temps d'initialisation
                                      Message d'initialisation envoyé au LCD.*/
      lcd.setCursor(0, 0);
      lcd.print("Salut !");
      lcd.setCursor(0, 1);
      lcd.print("Init...");
    
      dht.begin();                 // Initialisation du capteur DHT22
    
      // RàZ du LCD
      //lcd.clear();
      //Pause
      //delay (TimePause);
    
      delay(500);
    }
    
    void Ldr()
    {
      //valLdr = analogRead(Ldr);
      //Serial.print("Valeur de Ldr = ");
      //Serial.println(valLdr);
      if (valLdr < 340)
      {
        lectureLdr = 0;
        Serial.print("lectureLdr0 = ");
        Serial.println(lectureLdr);
      }
      else
      {
        lectureLdr = 1;
        Serial.print("lectureLdr1 = ");
        Serial.println(lectureLdr);
      }
    }
    
    void Rtc()
    {
      //Gestion date et heure
      //serial.println(rtc.getTimeStr());
      // récupération des donnees du DS1302 (horloge tepms réel suavegarde par pile)
      t = rtc.getTime();
      //tempo = ((t.hour * 60) + t.min);	 // Calcul du nombre de minutes  
      tempo = 650; // Manuel pour les tests
    }
    
    void Affichage()
    {
      // Lecture du capteur DHT22
      float temp = dht.readTemperature();   // Lecture température
      float humi = dht.readHumidity();      // Lecture humiidité
    
      //if (isnan (humi) || isnan (temp))     // Vérification du fonctionnement du capteur
      /* {
         lcd.setCursor(0, 4);
         lcd.print ("Erreur de fonctionnement du capteur !!!");
    
         //return;
        }*/
      // Affichage température
      lcd.setCursor(0, 0);
      lcd.print("T: ");
      lcd.setCursor(3, 0);
      lcd.print(temp);
      lcd.print((char)223);                 // caractère °
      lcd.print("C");
    
      // Affichage humidité
      lcd.setCursor(0, 1);
      lcd.print("H: ");
      lcd.setCursor (3, 1);
      lcd.print(humi);
      //Serial.println (" %");
      lcd.print(" %");
      // Affichage consigne température
      lcd.setCursor(12, 0);
      lcd.print("Cons:");
      lcd.setCursor (18, 0);
      lcd.print(ConsigneTemp);
      // Affichage consigne humidité
      lcd.setCursor(12, 1);
      lcd.print("Cons:");
      lcd.setCursor (18, 1);
      lcd.print(ConsigneHumi);
      // Affichage état chauffage (température)
      lcd.setCursor(0, 2);
      lcd.print("Cha:");
      lcd.setCursor (5, 2);
      lcd.print("");
      // Affichage état humidificateur
      lcd.setCursor(8, 2);
      lcd.print("Hum:");
      lcd.setCursor (13, 2);
      lcd.print("");
      // Affichage état lumière
      lcd.setCursor(0, 3);
      lcd.print("Lum:");
      lcd.setCursor (5, 3);
      lcd.print("");
      // Affichage état ventilateur
      lcd.setCursor(8, 3);
      lcd.print("Ven:");
      lcd.setCursor (13, 3);
      lcd.print("");
      //Affichage du mode : Ete ou Hiver (F ou C)
      lcd.setCursor(16, 2);
      lcd.print("Mode");
    
    
      Serial.print("Tempo : ");
      Serial.println(tempo);
      Serial.print("Relais lumière : ");
      delay(50);
      Serial.println(Lumi);
      Serial.println();
    }
    
    void Commande_relais()
    {
      // Commande des relais
      // 1°) Température
      if (temp >= ConsigneTemp)       // Si la mesure temp est > ou = à la consigne :
      {
        digitalWrite(relai_temp, LOW);// arrêt chauffage
      }
      else if (temp < (ConsigneTemp)) // Si la mesure temp est < à la consigne :
      {
        digitalWrite(relai_temp, HIGH); // allumage chauffage
      }
    
      // 2°) Humidité
      if (humi >= (ConsigneHumi + 2))      // Si la mesure humi est > ou = à la consigne +2.00 :
      {
        digitalWrite(relai_humi, LOW); // arrêt humidificateur
      }
      else if (humi < (ConsigneHumi))  // Si la mesure humi est < à la consigne :
      {
        digitalWrite(relai_humi, HIGH); // allumage humidificateur
      }
    
      // 3°) Ventilateur = ON, si la mesure tempé est > ou = à la consigne T°+2 OU si la mesure humi est > ou = à la consigne H%+2
      // dans notre cas : temp >= 22 et humi >= 57 si consigne T° = 20 et H% = 55.
      if (((temp) >= (ConsigneTemp + 2)) || ((humi) >= (ConsigneHumi + 5)))
      {
        digitalWrite(relai_vent, HIGH);       // Mise en marche du ventilateur
      }
      else                                    // sinon
      {
        digitalWrite(relai_vent, LOW);       // Arrêt ventilation
      }
    
      delay (TimePause);
    }
    
    void Affichage_etat_relais()   // Affichage sur LCD
    {
      etatChauffage = digitalRead(relai_temp);
      if ((etatChauffage) == HIGH)
      {
        lcd.setCursor(4, 2);
        lcd.print("ON ");
      }
      else
      {
        lcd.setCursor (4, 2);
        lcd.print("OFF");
      }
    
      etatHumidite = digitalRead(relai_humi);
      if ((etatHumidite) == HIGH)
      {
        lcd.setCursor(12, 2);
        lcd.print("ON ");
      }
      else
      {
        lcd.setCursor (12, 2);
        lcd.print("OFF");
      }
    
      etatVentilation = digitalRead(relai_vent);
      if ((etatVentilation) == HIGH)
      {
        lcd.setCursor(12, 3);
        lcd.print("ON ");
      }
      else
      {
        lcd.setCursor (12, 3);
        lcd.print("OFF");
      }
    
      Lumi = digitalRead(relai_lumi);
      if ((Lumi) == HIGH)
      {
        lcd.setCursor(4, 3);
        lcd.print("ON ");
      }
      else
      {
        lcd.setCursor (4, 3);
        lcd.print("OFF");
      }
    }
    
    void Ete()
    {
      Serial.println("Ete ");
      // Allumage de 19:00 à 07:00 (Ete) d'où extinction de 07:00 à 19:00.
      if ((tempo >= 420) && (tempo < 1140) && (lectureLdr == 0)) //si tempo >=7:00 et <19:00 et relais lumière = ON
        //on éteint
      {
        (digitalWrite(relai_lumi, HIGH));
        delay (300);
        (digitalWrite(relai_lumi, LOW));
        Serial.println("Extinction ");
        lcd.setCursor (17, 3);
        lcd.print("F");
        return;
      }
    }
    
    void Hiver()
    {
      Serial.println("Hiver ");
      if ((tempo >= 600) && (tempo < 960) && (lectureLdr == 1)) // Extinction de 10:00 (600) à 16:00 (960)  (Hiver)
      {
        (digitalWrite(relai_lumi, HIGH));
        delay (300);
        (digitalWrite(relai_lumi, LOW));
        lcd.setCursor (17, 3);
        lcd.print("C");
        return;
      }
    }
    
    void loop()  // Boucle -----------------------------------------------------------------
    {
      {    Rtc();  }
      {    Ldr();  }
      {    Affichage();  }
      {    Commande_relais();  }
      {    Affichage_etat_relais();  }
      {
        if (digitalRead(positionInter) == 1) {
          Serial.println("position inter : zéro ");
          Ete();
        }
        else
        {
          Serial.println("position inter : Un ");
          Hiver();
        }
      }
      delay (TimePause);
    }
    Dernière modification par Antoane ; 15/05/2018 à 15h24. Motif: Ajout balises code

  4. #4
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Faut mettre ton programme entre balise [code]ici ton code[/code]
    Elle est où ta commande du télérupteur ?
    J'aime pas le Grec

  5. A voir en vidéo sur Futura
  6. #5
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    La commande du télérupteur se fait par un digitalWrite(relai_lumi, HIGH) ==> le télérupteur est alimenté, suivi d'un délai puis un digitalWrite(relai_lumi, LOW) pour remettre le télérupteur au repos.
    Par la suite je ferais la même punition pout les télérupteurs de chauffage et de d'humidificateur. Seul le ventilateur d'extraction d'air sera commandé par un petit relais 5volts 10Ampères. Dans ce dernier cas, pas de problème, c'est binaire.

    Comme ça pour les balises? c'est aussi mon baptême sur un forum... il faut un début à tout.
    Code:
    // Les 3 lignes qui suivent ne sont plus d'actualité mais sont gardées pour mémoire
    // Version avec gestion par interruption externe (bouton Ete/Hiver)
    // ==> déclenchement sur un front montant ou un front descendant.
    // ==> libération de la broche 2 (INT0) pour ce bouton et décallage des autres broches
    #include <DS1302.h>
    #include <Wire.h>
    #include <LiquidCrystal.h>
    #include "DHT.h"
    
    //Définition des constantes
    byte ConsigneHumi = 50;      // Consigne d'humidité % mini  à modifier selon besoin
    byte ConsigneTemp = 21;      // Consigne température ° mini à modifier selon besoin
    //  Affectation des PINs
    const int TimePause = 3000;         //Actualisation des valeurs toutes les 3 secondes
    int positionInter = 2;
    // Pin 3,4 et 5 = raccordement DS1302
    // Pin 6 libre
    // Pin 7 pour la sonde DTH22 (température et humdidité)
    char relai_lumi = 8;                // relais lumière à pin 8 Arduino
    char relai_temp = 9;                // Relier le pin IN2 du relais à pin 9 Arduino
    char relai_humi = 10;               // Relier le pin IN1 du relais à pin 10 Arduino
    char relai_vent = 11;               // Relier le pin IN1 du relais vent à pin 11 Arduino
    int lectureLdr;
    int etatChauffage = LOW;
    int etatHumidite = LOW;
    int etatVentilation = LOW;
    int lectureEh1;
    int lectureEh2;
    int temp;
    int humi;
    int tempo;
    int lecture;
    int Bascule;
    int Lumi = 0;
    int valLdr;
    //volatile int bascule = LOW;     // Déclaration d'une variable volatile (state) pour interruption (idem ligne 1)
    //int basculer;
    
    // Définition du capteur
    #define DHTPIN 7             // Sonde placée en broche 7 de l'Arduino
    #define DHTTYPE DHT22        // DHT22 = sonde T° et H%
    DHT dht(DHTPIN, DHTTYPE);
    
    // Définition du capteur de lumière
    #define LDR A0               // LDR placée en broche A0 de l'Arduino
    
    // Configuration du LCD
    LiquidCrystal lcd(32, 30, 28, 26, 24, 22); // Afficheur 20 colonnes x 4 lignes
    // 32 = RS, 30 = E, 28 = DB4, 26 = DB5, 24 = DB6, 22 = DB7.
    
    // Init DS1302
    DS1302 rtc(3, 4, 5);        //3=RST, 4=DAT, 5=CLK.
    
    //Init structure Time - data
    Time t;
    
    void setup()  //-----------------------------------------------------------------------------
    {
      //Réglage de l'horloge en mode exécution  et dévérouillage de la protection écriture
      rtc.halt(false);
      rtc.writeProtect(false);
    
      // Initialisation de la transmission série
      Serial.begin(9600);
    
      //Les lignes qui suivent sont à dé-commenter si l'on veut effectuer une mise à l'heure et actualiser le jour
      //rtc.setDOW(FRIDAY);         // définition du jour : LUNDI
      //rtc.setTime(17, 9, 0);     // définition de l'heure 12:00:00 (format 24hr)
      //rtc.setDate(5, 5, 2018);   // définition de la date au 23 avril 2018
    
      //Désignation des broches Arduino en sortie pour les relais.
      pinMode(relai_temp, OUTPUT);
      pinMode(relai_humi, OUTPUT);
      pinMode(relai_vent, OUTPUT);
      pinMode(relai_lumi, OUTPUT);
      pinMode(positionInter, INPUT);   //Définition de l'interrupteur en entrée
    
      lcd.begin(20, 4);            // Initialisation du LCD 20 caractères x 4 lignes
      delay(10);                   /* pause rapide pour laisser le temps d'initialisation
                                      Message d'initialisation envoyé au LCD.*/
      lcd.setCursor(0, 0);
      lcd.print("Salut !");
      lcd.setCursor(0, 1);
      lcd.print("Init...");
    
      dht.begin();                 // Initialisation du capteur DHT22
    
      // RàZ du LCD
      //lcd.clear();
      //Pause
      //delay (TimePause);
    
      delay(500);
    }
    
    void Ldr()
    {
      //valLdr = analogRead(Ldr);
      //Serial.print("Valeur de Ldr = ");
      //Serial.println(valLdr);
      if (valLdr < 340)
      {
        lectureLdr = 0;
        Serial.print("lectureLdr0 = ");
        Serial.println(lectureLdr);
      }
      else
      {
        lectureLdr = 1;
        Serial.print("lectureLdr1 = ");
        Serial.println(lectureLdr);
      }
    }
    
    void Rtc()
    {
      //Gestion date et heure
      //serial.println(rtc.getTimeStr());
      // récupération des donnees du DS1302 (horloge tepms réel suavegarde par pile)
      t = rtc.getTime();
      //tempo = ((t.hour * 60) + t.min);	 // Calcul du nombre de minutes  
      tempo = 650; // Manuel pour les tests
    }
    
    void Affichage()
    {
      // Lecture du capteur DHT22
      float temp = dht.readTemperature();   // Lecture température
      float humi = dht.readHumidity();      // Lecture humiidité
    
      //if (isnan (humi) || isnan (temp))     // Vérification du fonctionnement du capteur
      /* {
         lcd.setCursor(0, 4);
         lcd.print ("Erreur de fonctionnement du capteur !!!");
    
         //return;
        }*/
      // Affichage température
      lcd.setCursor(0, 0);
      lcd.print("T: ");
      lcd.setCursor(3, 0);
      lcd.print(temp);
      lcd.print((char)223);                 // caractère °
      lcd.print("C");
    
      // Affichage humidité
      lcd.setCursor(0, 1);
      lcd.print("H: ");
      lcd.setCursor (3, 1);
      lcd.print(humi);
      //Serial.println (" %");
      lcd.print(" %");
      // Affichage consigne température
      lcd.setCursor(12, 0);
      lcd.print("Cons:");
      lcd.setCursor (18, 0);
      lcd.print(ConsigneTemp);
      // Affichage consigne humidité
      lcd.setCursor(12, 1);
      lcd.print("Cons:");
      lcd.setCursor (18, 1);
      lcd.print(ConsigneHumi);
      // Affichage état chauffage (température)
      lcd.setCursor(0, 2);
      lcd.print("Cha:");
      lcd.setCursor (5, 2);
      lcd.print("");
      // Affichage état humidificateur
      lcd.setCursor(8, 2);
      lcd.print("Hum:");
      lcd.setCursor (13, 2);
      lcd.print("");
      // Affichage état lumière
      lcd.setCursor(0, 3);
      lcd.print("Lum:");
      lcd.setCursor (5, 3);
      lcd.print("");
      // Affichage état ventilateur
      lcd.setCursor(8, 3);
      lcd.print("Ven:");
      lcd.setCursor (13, 3);
      lcd.print("");
      //Affichage du mode : Ete ou Hiver (F ou C)
      lcd.setCursor(16, 2);
      lcd.print("Mode");
    
    
      Serial.print("Tempo : ");
      Serial.println(tempo);
      Serial.print("Relais lumière : ");
      delay(50);
      Serial.println(Lumi);
      Serial.println();
    }
    
    void Commande_relais()
    {
      // Commande des relais
      // 1°) Température
      if (temp >= ConsigneTemp)       // Si la mesure temp est > ou = à la consigne :
      {
        digitalWrite(relai_temp, LOW);// arrêt chauffage
      }
      else if (temp < (ConsigneTemp)) // Si la mesure temp est < à la consigne :
      {
        digitalWrite(relai_temp, HIGH); // allumage chauffage
      }
    
      // 2°) Humidité
      if (humi >= (ConsigneHumi + 2))      // Si la mesure humi est > ou = à la consigne +2.00 :
      {
        digitalWrite(relai_humi, LOW); // arrêt humidificateur
      }
      else if (humi < (ConsigneHumi))  // Si la mesure humi est < à la consigne :
      {
        digitalWrite(relai_humi, HIGH); // allumage humidificateur
      }
    
      // 3°) Ventilateur = ON, si la mesure tempé est > ou = à la consigne T°+2 OU si la mesure humi est > ou = à la consigne H%+2
      // dans notre cas : temp >= 22 et humi >= 57 si consigne T° = 20 et H% = 55.
      if (((temp) >= (ConsigneTemp + 2)) || ((humi) >= (ConsigneHumi + 5)))
      {
        digitalWrite(relai_vent, HIGH);       // Mise en marche du ventilateur
      }
      else                                    // sinon
      {
        digitalWrite(relai_vent, LOW);       // Arrêt ventilation
      }
    
      delay (TimePause);
    }
    
    void Affichage_etat_relais()   // Affichage sur LCD
    {
      etatChauffage = digitalRead(relai_temp);
      if ((etatChauffage) == HIGH)
      {
        lcd.setCursor(4, 2);
        lcd.print("ON ");
      }
      else
      {
        lcd.setCursor (4, 2);
        lcd.print("OFF");
      }
    
      etatHumidite = digitalRead(relai_humi);
      if ((etatHumidite) == HIGH)
      {
        lcd.setCursor(12, 2);
        lcd.print("ON ");
      }
      else
      {
        lcd.setCursor (12, 2);
        lcd.print("OFF");
      }
    
      etatVentilation = digitalRead(relai_vent);
      if ((etatVentilation) == HIGH)
      {
        lcd.setCursor(12, 3);
        lcd.print("ON ");
      }
      else
      {
        lcd.setCursor (12, 3);
        lcd.print("OFF");
      }
    
      Lumi = digitalRead(relai_lumi);
      if ((Lumi) == HIGH)
      {
        lcd.setCursor(4, 3);
        lcd.print("ON ");
      }
      else
      {
        lcd.setCursor (4, 3);
        lcd.print("OFF");
      }
    }
    
    void Ete()
    {
      Serial.println("Ete ");
      // Allumage de 19:00 à 07:00 (Ete) d'où extinction de 07:00 à 19:00.
      if ((tempo >= 420) && (tempo < 1140) && (lectureLdr == 0)) //si tempo >=7:00 et <19:00 et relais lumière = ON
        //on éteint
      {
        (digitalWrite(relai_lumi, HIGH));
        delay (300);
        (digitalWrite(relai_lumi, LOW));
        Serial.println("Extinction ");
        lcd.setCursor (17, 3);
        lcd.print("E");
        return;
      }
    }
    
    void Hiver()
    {
      Serial.println("Hiver ");
      if ((tempo >= 600) && (tempo < 960) && (lectureLdr == 1)) // Extinction de 10:00 (600) à 16:00 (960)  (Hiver)
      {
        (digitalWrite(relai_lumi, HIGH));
        delay (300);
        (digitalWrite(relai_lumi, LOW));
        lcd.setCursor (17, 3);
        lcd.print("H");
        return;
      }
    }
    
    void loop()  // Boucle -----------------------------------------------------------------
    {
      {    Rtc();  }
      {    Ldr();  }
      {    Affichage();  }
      {    Commande_relais();  }
      {    Affichage_etat_relais();  }
      {
        if (digitalRead(positionInter) == 1) {
          Serial.println("position inter : zéro ");
          Ete();
        }
        else
        {
          Serial.println("position inter : Un ");
          Hiver();
        }
      }
      delay (TimePause);
    }
    Dernière modification par Antoane ; 15/05/2018 à 15h24. Motif: Ajout balises code

  7. #6
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Citation Envoyé par Ndrmnr Voir le message
    La commande du télérupteur se fait par un digitalWrite(relai_lumi, HIGH) ==> le télérupteur est alimenté, suivi d'un délai puis un digitalWrite(relai_lumi, LOW) pour remettre le télérupteur au repos.
    NON
    Le télérupteur change d'état !

    Code:
    // Les 3 lignes qui suivent ne sont plus d'actualité mais sont gardées pour mémoire
    // Version avec gestion par interruption externe (bouton Ete/Hiver)
    // ==> déclenchement sur un front montant ou un front descendant.
    // ==> libération de la broche 2 (INT0) pour ce bouton et décallage des autres broches
    #include <DS1302.h>
    #include <Wire.h>
    #include <LiquidCrystal.h>
    #include "DHT.h"
    
    //Définition des constantes
    byte ConsigneHumi = 50;      // Consigne d'humidité % mini  à modifier selon besoin
    byte ConsigneTemp = 21;      // Consigne température ° mini à modifier selon besoin
    //  Affectation des PINs
    const int TimePause = 3000;         //Actualisation des valeurs toutes les 3 secondes
    int positionInter = 2;
    ............................................................................
    
     
    void loop()  // Boucle -----------------------------------------------------------------
    {
      {    Rtc();  }
      {    Ldr();  }
      {    Affichage();  }
      {    Commande_relais();  }
      {    Affichage_etat_relais();  }
      {
        if (digitalRead(positionInter) == 1) {
          Serial.println("position inter : zéro ");
          Ete();
        }
        else
        {
          Serial.println("position inter : Un ");
          Hiver();
        }
      }
      delay (TimePause);
    }
    J'aime pas le Grec

  8. #7
    mag1

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Bonjour,

    Pourquoi un inter été/hiver si la DS1302 donne le mois de l'année (si on l'initialise)

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  9. #8
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Je pense que le problème resta le même, pour commander le télérupteur il faut une impulsion et je n'ai à ma disposition qu'un interrupteur. Par contre je penses deviner ce que tu sous entend, à une date précise (et décodée) il faut basculer le télérupteur mais là aussi il faut générer une impulsion avec un interrupteur. Je me trompe ?
    Ndrmnr

  10. #9
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    C'est quoi pour toi un télérupteur ? Un lien WEB sur le produit ?
    J'aime pas le Grec

  11. #10
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Ben oui, il faut dans un premier temps l'alimenter, une pause et le désexciter. Je ne pense pas qu'un télérupteur aime un digitalWrite(HIGH) en permanence, c'est comme quand tu appuie sur un bouton poussoir et que tu restes appuyé sur celui-ci, ton télérupteur va faire entendre une musique de 50 Hz. Va-t-il aimer cela, je ne le pense pas.
    Ndrmnr

  12. #11
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    "C'est quoi pour toi un télérupteur ? Un lien WEB sur le produit ? "(DAUDET78)
    Ce que je vais utiliser est un télérupteur monophasé : 4 bornes, 2 bornes servent d'interrupteur pour agir sur un équipement électrique de 230V. Les 2 autres bornes également branchées sur le secteur alimentent la bobine du télérupteur.
    Quand la bobine est alimentée, le télérupteur bascule dans une position x et reste dans cette position au relâchement de la commande. Un autre appui pour ré-alimenter la bobine va faire basculer le télérupteur dans une position y.
    Dans toute habitation quand tu as plus de 2 interrupteurs (va et viens) tu utilises un télérupteur auquel tu raccordes 3 (ou plus) boutons poussoirs (de mémoire il me semble qu'il y ait une limite au nombre de BP).
    https://www.123elec.com/legrand-cx3-...RoCBp8QAvD_BwE
    a+
    Ndrmnr

  13. #12
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Citation Envoyé par Ndrmnr Voir le message
    Quand la bobine est alimentée, le télérupteur bascule dans une position x et reste dans cette position au relâchement de la commande. Un autre appui pour ré-alimenter la bobine va faire basculer le télérupteur dans une position y.
    Donc tu es conscient que ton affirmation est fausse ?
    Citation Envoyé par Ndrmnr Voir le message
    La commande du télérupteur se fait par un digitalWrite(relai_lumi, HIGH) ==> le télérupteur est alimenté, suivi d'un délai puis un digitalWrite(relai_lumi, LOW) pour remettre le télérupteur au repos.
    Et pourquoi un télérupteur ? Comme il mémorise son dernier état, il faudrait, au démarrage du programme que le µC puisse savoir l'état du télérupteur .

    Pourquoi ne pas utiliser un bon vieux relais ??
    J'aime pas le Grec

  14. #13
    freepicbasic

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Si tu utilise la pin relai_temp comme une sortie tu n'as pas le droit
    de la transformer
    en une entrée en faisant ça ;
    Code:
      etatChauffage = digitalRead(relai_temp);
    supprime ces lignes qui perturbent !


    Et met ton flag à jour quand tu écris !
    Comme ceci;
    Code:
      if (temp >= ConsigneTemp)       // Si la mesure temp est > ou = à la consigne :
      {
        digitalWrite(relai_temp, LOW);// arrêt chauffage
        etatChauffage = LOW; 
      }
      else if (temp < (ConsigneTemp)) // Si la mesure temp est < à la consigne :
      {
        digitalWrite(relai_temp, HIGH); // allumage chauffage
        etatChauffage = HIGH; 
      }
    A+, pat

  15. #14
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Je ne pense pas que mon affirmation soit fausse. Je m'explique :
    par exemple dans :
    Code:
    void Hiver()
    {
      Serial.println("Hiver ");
      if ((tempo >= 600) && (tempo < 960) && (lectureLdr == 1)) // Extinction de 10:00 (600) à 16:00 (960)  (Hiver)
      {
        (digitalWrite(relai_lumi, HIGH));
        delay (300);
        (digitalWrite(relai_lumi, LOW));
        lcd.setCursor (17, 3);
        lcd.print("H");
        return;
      }
    }
    1°) je fais monter le relais "relai_lumi" à 1,
    2°) le relais reste alimenté pendant 300 ms,
    3°) je (relâche) dé-alimente le relais "relai_lumi" il retombe au repos mais le télérupteur lui ne bouge pas. Il faudra un nouveau relai_lumi à 1, une tempo et un relai_lumi à 0 pour refaire basculer le télérupteur.
    Je ne sais pas si je suis assez clair? Tu peux me dire ce que tu en penses? Merci
    Ndrmnr

  16. #15
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Citation Envoyé par Ndrmnr Voir le message
    Je ne sais pas si je suis assez clair? Tu peux me dire ce que tu en penses?
    Je ne sais pas quand tu as appelle cette routine .
    Mais si tu l'appelles et que tempo est entre 600 et 900 , tu changes l'état de ton télérupteur à chaque appel
    Citation Envoyé par Daudet
    Pourquoi ne pas utiliser un bon vieux relais ??
    Une réponse ?
    J'aime pas le Grec

  17. #16
    freepicbasic

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Si j'ai bien compris il n'utilise pas de télérupteur mais de simples relais !
    Mais bon il faudrait éclaircir...

    Si c'est de vrai télérupteurs , il faudra effectivement envoyer une impulsion, mais le problème c'est qu'il faudra un retour sur une pin différente pour savoir si c'est dans le bon sens.

    Et si c'est de l'alternatif , il faudrait surement un optocoupleur ou autre chose ou un condo et diode , etc...
    Il vaudrait mieux isoler !
    A+, pat

  18. #17
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Pourquoi ne pas utiliser un bon vieux relais ??
    à la place des télérupteurs?
    C'est une solution mais je ne sais pas s'il existe des relais qui peuvent se mettre dans un coffret. Je fais un tour sur le net pour voir ça, c'est vrai que ça simplifierait la donne, je n'y avait tout simplement pas pensé.
    A+
    Ndrmnr

  19. #18
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Salut freepicbasic,
    Si c'est de vrai télérupteurs , il faudra effectivement envoyer une impulsion, mais le problème c'est qu'il faudra un retour sur une pin différente pour savoir si c'est dans le bon sens.
    j'avais envisagé une LDR pour vérifier que l'éclairage était ou non en marche. Ce retour se faisait sur la pin A0 et en fonction du seuil de luminosité (réglable à la ligne 102 (void Ldr()))
    En fait je crois que je vais m'orienter vers la solution de DAUDET78, j'ai trouvé des relais que l'on peut intégrer à un tableau électrique.
    Merci
    A+
    Ndrmnr

  20. #19
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Citation Envoyé par Ndrmnr Voir le message
    En fait je crois que je vais m'orienter vers la solution de DAUDET78, j'ai trouvé des relais que l'on peut intégrer à un tableau électrique.
    Et ça remplace un relais et un télérupteur ......
    J'aime pas le Grec

  21. #20
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Reste à voir la consommation de ces relais car dans le cas où le courant est trop important pour une pin Arduino, il me faudra intercaler un optocoupleur alors que j'ai déjà les relais qui eux peuvent en commander des plus gros.
    Ton idée va quand même me faire investir près de 75€ alors que si j'avais trouvé une solution software c'et été plus sympa...
    Merci à vous.
    Ndrmnr

  22. #21
    mag1

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Citation Envoyé par Ndrmnr Voir le message
    Reste à voir la consommation de ces relais car dans le cas où le courant est trop important pour une pin Arduino, il me faudra intercaler un optocoupleur alors que j'ai déjà les relais qui eux peuvent en commander des plus gros.
    Ton idée va quand même me faire investir près de 75€ alors que si j'avais trouvé une solution software c'et été plus sympa...
    Merci à vous.
    Ndrmnr
    Il y a des relais statiques pas chers...

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  23. #22
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Oui, j'y ai pensé mais je crois qu'il leur adjoindre un radiateur ce qui dans un tableau électrique, un milieu clos, me fait réfléchir. C'est vrai, vu le prix j'en ai commandé mais j'ai des doutes et j'ai plus confiance aux brontosaures que sont les relais électromagnétiques. Je ferai des essai vu le prix, il faut essayer.
    Merci mag1
    A+
    Ndrmnr

  24. #23
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Fait un p'tit schéma de la liaison entre ton µC et le relais (donne un lien WEB sur la datasheet du relais)
    J'aime pas le Grec

  25. #24
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    à DAUDET78, pour l'instant je n'ai pas branché les relais, j'ai simplement mis des LED sur les pin 8, 9, 10 et 11 de l'Arduino
    page petits relais : https://www.banggood.com/fr/5V-4-Cha..._warehouse=USA
    Page GROS relais : https://www.planete-domotique.com//n...32_20_230v.pdf
    a+
    Ndrmnr

  26. #25
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Tu as besoin d'UN SEUL TYPE de relais en fonction des courant/tension à couper
    J'aime pas le Grec

  27. #26
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Les petits relais bleus supportent théoriquement 10 A sous 230 v mais je me méfie de leurs possibilités réelles, c'est pourquoi trois d'entre eux vont commander les contacteurs 20 A (chauffage, éclairage et humidificateur). Le ventilateur d'extraction sera quant à lui directement commandé via un petit relais bleu. Cela me laisse des marges de sécurité et une durabilité dans le temps. Tout au moins je le pense.

  28. #27
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Citation Envoyé par Ndrmnr Voir le message
    chauffage, éclairage et humidificateur
    Qui consomment combien ?
    J'aime pas le Grec

  29. #28
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Pour les lampes, j'envisage à terme 2 ou 3 fois 600 watts, l'humidificateur je ne sais pas encore mais comme c'est une résistance je pense que ça doit consommer aussi. Pour le radiateur soufflant il fait 2400 W soit près de 10A.

  30. #29
    DAUDET78

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    Voici une liste de relais DIN commandable en 12V DC (éliminer les moins de 15A) :
    http://fr.farnell.com/webapp/wcs/sto...2572,210365583
    J'aime pas le Grec

  31. #30
    Ndrmnr

    Re : Gestion d'un télérupteur à l'aide d'un relais via une carte Arduino

    D'accord avec toi, je vais regarder ça de plus près.
    Merci à+

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. [Autre] Aide module de relais arduino-looper switcher guitare
    Par chewbii dans le forum Électronique
    Réponses: 3
    Dernier message: 17/04/2018, 20h07
  2. Commande de la carte relais "PIFACE RELAY EXTRA" (Arduino)
    Par dimdim69 dans le forum Électronique
    Réponses: 19
    Dernier message: 08/11/2015, 21h49
  3. Réponses: 15
    Dernier message: 22/05/2014, 13h32
  4. Relais, telerupteur ou autres ??
    Par Jeffmorel dans le forum Électronique
    Réponses: 7
    Dernier message: 31/07/2012, 10h54
  5. Petit projet de domotique carte arduino + relais 220v
    Par invite52d12a2f dans le forum Électronique
    Réponses: 9
    Dernier message: 04/04/2012, 14h11
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...