Partage
  • Partager sur Facebook
  • Partager sur Twitter

aide au contrôle de mon script

    1 juin 2015 à 16:11:31

    Bonjour j ai créé un script pour contrôler une carte relais 2 modules, soit par consigne de température soit manuellement, tout fonctionne.

    Mais pourriez vous me dire si vous y voyez une simplification ou une correction à apporter, pour ne pas avoir de problème futur !

    merci 

    #include <OneWire.h> 
    #define RELAY_1 2
    #define RELAY_2 4
    #define RELAY_ON 0
    #define RELAY_OFF 1
    #define vibreur_on 1
    #define vibreur_off 0
    const int broche_OneWire=7; 
    const int buttonPin1 = 12; 
    const int buttonPin2 = 13; 
    const int vibreur = 10;
    const int buttonPin3 = 8; 
    const int modeLecture=0xBE;
    const int lancerMesure=0x44;
    int posRELAY=0;
    int buttonState1 = 0;         // variable for reading the pushbutton status
    int buttonState3 = 0;         // variable for reading the pushbutton status
    int posbuttonState1 = 0;
    int posbuttonState2 = 0;
    int posbuttonState3 = 0;
    int buttonState2 = 0;         // variable for reading the pushbutton status
    byte data[12]; 
    byte adresse[8]; 
    int tempet=0; 
    float tempetf=0.0; 
    int dureePause = 2000000;
    
    OneWire  capteur(broche_OneWire);  
    
    
    void setup()   { 
    
    
     pinMode(9, OUTPUT);
     digitalWrite(RELAY_1, RELAY_OFF);
      digitalWrite(RELAY_2, RELAY_OFF);
      digitalWrite(vibreur, vibreur_off);
      pinMode(RELAY_1, OUTPUT);   
      pinMode(RELAY_2, OUTPUT); 
    pinMode(vibreur, OUTPUT);
      pinMode(buttonPin1, INPUT);     
      pinMode(buttonPin2, INPUT);
      pinMode(buttonPin3, INPUT);     
      
    
    Serial.begin(9600); 
    Serial.println("**** Detection du capteur **** ");
    
    while (capteur.search(adresse)== false) 
    {
    
      
      Serial.println("Aucun capteur 1-wire present sur la broche ! "); 
      delay (1000); 
    }
    
    
    
    {
      
    
      Serial.println("Aucun capteur 1-wire present sur la broche ! "); 
      delay (1000); 
    }
    
    
      Serial.print ("1 capteur 1-wire present avec code adresse 64 bits : ");
    
    
      
       for(int i = 0; i < 8; i++) { 
    
        if (adresse[i]<16) Serial.print('0'); 
        Serial.print(adresse[i], HEX); 
        Serial.print(" ");
      }
    
      Serial.println();
    
      
      if (adresse[0]==0x28)
      {
        Serial.println ("Type du capteur present : Capteur temperature DS18B20.");
      }
      else
      {
        Serial.println ("Le capteur present n'est pas un capteur de temperature DS18B20.");
      }
    
    
    
      if (capteur.crc8( adresse, 7) == adresse[7]) 
      {
        Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : VALIDE !");
      }
      else
      {
        Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : NON VALIDE !");    
      }
    
      //------- message final détection ----
      Serial.println("----- fin de la recherche du capteur ----");
      Serial.println("");
    
    
    }
    
    
    
    void loop()
    
    { 
      
       capteur.reset(); 
      capteur.select(adresse); 
      capteur.write(lancerMesure,1); 
    
    delay(1000);     
      capteur.reset(); 
      capteur.select(adresse); 
      capteur.write(modeLecture,1); 
    
    
    
    for ( int i = 0; i < 9; i++) {           
        data[i] = capteur.read();             
      }
    
    
    Serial.println("");
    
    
    
    //----- test de validité des valeurs reçues par contrôle du code CRC  ----
    
    Serial.println("");
    Serial.println("---- test de controle de validite des donnees recues ---- ");
    
      // le dernier (9ème) octet de la RAM est un code de contrôle CRC
      // à l'aide de la fonction crc8 on peut vérifier si ce code est valide
      if (capteur.crc8( data, 8) == data[8]) // vérification validité code CRC des valeurs reçues
      {
        Serial.println ("Verification du code CRC de ce resultat : VALIDE !");
      }
      else
      {
        Serial.println ("Verification du code CRC de ce resultat  : NON VALIDE !");    
      }
    
    
    Serial.println("");
    Serial.println("---- calcul de la temperature ---- ");
    
    //---- extraction du résultat de la mesure à partir des registres de la RAM ---
    data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles
    tempet=data[1]; // bits de poids fort
    tempet=tempet<<8;
    tempet=tempet+data[0]; // bits de poids faible
    
    
    
    
    tempetf=float(tempet)*6.25;
    tempetf=tempetf/100.0;
    
    
    Serial.print ("Mesure Finale =");
    Serial.print (tempetf,2);
    Serial.println (" Degres Celsius. ");
    
    
      buttonState1 = digitalRead(buttonPin1);
    
      if ((buttonState1 == HIGH)&& (posbuttonState2 == 0)&&( posbuttonState3 == 0)) {     
       
       
        digitalWrite(RELAY_1, RELAY_ON);
              posbuttonState1 = 1;
           
              delay(6000);
             Serial.println ("MONTEE MANUELLE VOLET ");
    
      digitalWrite(RELAY_1, RELAY_OFF);
    
      posbuttonState1 = 0;
      posbuttonState3 = 0;
      } 
      else {
       
        digitalWrite(RELAY_1, RELAY_OFF); 
            buttonState1 = 0;
      }
        buttonState2 = digitalRead(buttonPin2);
    
    
      if ((buttonState2 == HIGH)&& (posbuttonState1 == 0)&&( posbuttonState3 == 0)) {     
         
    
        digitalWrite(RELAY_2, RELAY_ON);
              posbuttonState2 = 1;
          delay(6000);
             Serial.println ("DESCENTE MANUELLE VOLET ");
    
      digitalWrite(RELAY_2, RELAY_OFF);
    
        posbuttonState2 = 0;
    
    
      } 
      else {
        digitalWrite(RELAY_2, RELAY_OFF); 
            buttonState2 = 0;
            posbuttonState3 = 0;
      }
    
    
    
    {
          buttonState3 = digitalRead(buttonPin3);
    
      if (buttonState3 == HIGH) {
     
       
              posbuttonState3 = 1;
                Serial.println ("SECURITE DESACTIVEE ");
               delay(10000);
    }  
    
      if (buttonState3 == LOW) {
            
            
             posbuttonState3 = 0;
    } 
    }
    
        if ( ( tempetf > 21 ) && ( posRELAY == 0 )&&(posbuttonState3 == 1) ) {  
    
    
                 analogWrite(9, 20);      // Almost any value can be used except 0 and 255
                               // experiment to get the best tone
      delay(1500);          // wait for a delayms ms
      analogWrite(9, 0);       // 0 turns it off
      delay(1000);          // wait for a delayms ms   
                  analogWrite(9, 20);      // Almost any value can be used except 0 and 255
                               // experiment to get the best tone
      delay(1500);          // wait for a delayms ms
      analogWrite(9, 0);       // 0 turns it off
      delay(1000);          // wait for a delayms ms   
             digitalWrite(RELAY_1, RELAY_ON);
              Serial.println ("MONTEE AUTOMATIQUE VOLET ");
        delay(6000);
      digitalWrite(RELAY_1, RELAY_OFF);
             
    
            posRELAY = 1;
                   
        }
         
        if ( ( tempetf < 19 ) && ( posRELAY == 1 )&&(posbuttonState3 == 1) ) {  
          
                 analogWrite(9, 20);      // Almost any value can be used except 0 and 255
                               // experiment to get the best tone
      delay(2000);          // wait for a delayms ms
      analogWrite(9, 0);       // 0 turns it off
      delay(1000);          // wait for a delayms ms 
                 analogWrite(9, 20);      // Almost any value can be used except 0 and 255
                               // experiment to get the best tone
      delay(2000);          // wait for a delayms ms
      analogWrite(9, 0);       // 0 turns it off
      delay(1000);          // wait for a delayms ms    
                   analogWrite(9, 20);      // Almost any value can be used except 0 and 255
                               // experiment to get the best tone
      delay(2000);          // wait for a delayms ms
      analogWrite(9, 0);       // 0 turns it off
      delay(1000);          // wait for a delayms ms 
                 analogWrite(9, 20);      // Almost any value can be used except 0 and 255
                               // experiment to get the best tone
      delay(2000);          // wait for a delayms ms
      analogWrite(9, 0);       // 0 turns it off
      delay(1000);          // wait for a delayms ms 
    
           
                digitalWrite(RELAY_2, RELAY_ON);
        delay(6000);
           Serial.println ("DESCENTE AUTOMATIQUE VOLET ");
    
      digitalWrite(RELAY_2, RELAY_OFF);
             
                posRELAY = 0;
                     
        }
     
    } 



    • Partager sur Facebook
    • Partager sur Twitter
      1 juin 2015 à 17:11:41

      et par la même occasion si quelqu un pourrai m aider pour savoir ou mettre un porte fusible pour sécuriser mon montage car derrière mes relais il y à un moteur en 220v
      • Partager sur Facebook
      • Partager sur Twitter
        1 juin 2015 à 21:24:59

        Bonsoir,

        Une première amélioration consiste à avoir des indentations propres, c'est difficile à lire avec des indentations fantaisistes.

        Pour le fusible, il doit être placé sur la phase en série avec le contact du relais. Attention, le 220VAC est très dangereux, une isolation très soignée doit être réalisée pour ne jamais pouvoir être en contact avec les liaisons et raccordement coté secteur.

        • Partager sur Facebook
        • Partager sur Twitter
          2 juin 2015 à 8:35:02

          Tu devrais passer en revue toutes tes variables pour supprimer ce qu'il ne te sert plus.

          • Le vibreur qui tu n'utilises jamais (tu le mets à off au setup puis tu n'y touches plus)
          • La variabledureePause
          • ...
          • Partager sur Facebook
          • Partager sur Twitter
            2 juin 2015 à 11:12:18

            Bonjour d'accord merci pour vos informations
            • Partager sur Facebook
            • Partager sur Twitter
              2 juin 2015 à 11:28:43

              et pour le branchement de ma carte double relais ci dessous, le branchement est il correct car certain dise que le jumper ne doit pas être présent si j alimente la carte avec une alim extérieure, mais ma carte est alimenté par l'arduino.

              et est il préférable pour vous d'avoir une alimentation extérieure pour la carte relay ?

              -
              Edité par tiofay 2 juin 2015 à 11:29:28

              • Partager sur Facebook
              • Partager sur Twitter
                2 juin 2015 à 11:38:56

                La référence de ton shield pourrait être utile car il en existe des dizaines de shields relais.

                Il faut aussi nous montrer où vont les différents fils si tu veux que l'on te valide à 100% le câblage.

                En tout cas, je suis assez perplexe concernant les couleurs (du rouge pour du GND, je n'ai jamais vu ça).

                -
                Edité par lorrio 2 juin 2015 à 11:39:30

                • Partager sur Facebook
                • Partager sur Twitter
                  2 juin 2015 à 11:47:48

                  pour les couleurs je n y est pas prété attention car pour le moment je ne me suis pas préoccupé de cela mais j y regarderai et pour le montage voici ci dessous 

                  (mes 2 GND sont branchés est ce gênant?)

                  a gauche interrupteur de securité a droite montée et descente manuelle

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 juin 2015 à 12:12:28

                    En théorie, ce n'est pas gênant.

                    Mais sans la référence du shield ou les schémas électrique de celui-ci, c'est impossible de te le confirmer à 100%.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 juin 2015 à 12:18:05

                      j ai cherché je n est pas de reference exacte j ai donc mis la photo
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 juin 2015 à 13:53:36

                        dans mon loop j utilise au niveau hard 2 bouton inverseur et il possible de n utiliser qu un bouton pour faire la montee manuelle et le descente plutot que 2 en modifiant le script suivant

                        buttonState1 = digitalRead(buttonPin1);
                        
                        if ((buttonState1 == HIGH)&& (posbuttonState2 == 0)&&( posbuttonState3 == 0)) {     
                           
                          digitalWrite(RELAY_1, RELAY_ON);
                            posbuttonState1 = 1;
                          delay(6000);
                          Serial.println ("MONTEE MANUELLE VOLET ");
                          digitalWrite(RELAY_1, RELAY_OFF);
                            posbuttonState1 = 0;
                            posbuttonState3 = 0;
                          } 
                        else {
                           
                          digitalWrite(RELAY_1, RELAY_OFF); 
                            buttonState1 = 0;
                          }
                            buttonState2 = digitalRead(buttonPin2);
                        
                        
                        if ((buttonState2 == HIGH)&& (posbuttonState1 == 0)&&( posbuttonState3 == 0)) {     
                            digitalWrite(RELAY_2, RELAY_ON);
                              posbuttonState2 = 1;
                              delay(6000);
                                 Serial.println ("DESCENTE MANUELLE VOLET ");
                                 digitalWrite(RELAY_2, RELAY_OFF);
                        
                            posbuttonState2 = 0;
                        
                        
                          } 
                          else {
                            digitalWrite(RELAY_2, RELAY_OFF); 
                                buttonState2 = 0;
                                posbuttonState3 = 0;
                          }



                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 juin 2015 à 14:19:41

                          Et comment comptes tu faire pour savoir dans quel sens il faut aller ?

                          Je demande ça parce qu'avec deux boutons, je vois très bien comment faire : un bouton pour monter ; un bouton pour descendre

                          Mais avec un seul bouton, j'avoue qu'il faut être devin pour savoir si l'utilisateur veut que le volet monte ou descende.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 juin 2015 à 16:08:12

                            oui c est vrai !

                            mais je pense m'être mal exprimé en gros ce que je veux dire c est que je suis obligé de mettre une fois position haute pour donner l ordre de contact puis une fois basse pour éviter de donner à nouveau un signal au relais

                            il ne font donc pas que j oubli de repositionner mon interrupteur en position basse!!.

                            Ou alors il faudrait que j'utilise un interrupteur a impulsion comme celui ci 

                            qui donnerait le top au relais qu une fois et ce qui me permettrai aucun oubli "position basse"

                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 juin 2015 à 16:13:36

                              J'avoue que je ne comprends toujours pas ce que tu veux faire exactement...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                2 juin 2015 à 16:21:26

                                mon interrupteur comme ceci 

                                lorsque que veux activer la montée il faut que je le mette en position "HIGH" puis le basculer de suite en position "LOW",

                                car sinon mon relais s'enclenchera sans cesse, donc soit mon script n'est pas correct soit pour simplifier je modifie la partie HARD en changeant pour un interrupteur à impulsion

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  2 juin 2015 à 18:07:10

                                  C'est parce ce que tu code se base sur des états : if (buttonState1 == HIGH)

                                  Du coup, temps que le bouton reste en position HIGH, le contenu de ton if sera exécuté.

                                  Si tu veux qu'il ne soit exécuté qu'une seule fois, il faut faire une détecter de front à l'aide d'une variable de mémorisation ;)

                                  int etatActuel;
                                  int etatPrecedant;
                                  
                                  void loop() {
                                  
                                      etatActuel = digitalRead();
                                  
                                      if ( ( etatActuel == HIGH ) && ( etatPrecedant == LOW ) ) {
                                  
                                          // ICI: ton code à faire lorsque le bouton vient d'être placé en position HIGH
                                  
                                      }
                                  
                                      if ( ( etatActuel == LOW) && ( etatPrecedant == HIGH) ) {
                                  
                                          // ICI: ton code à faire lorsque le bouton vient d'être placé en position LOW
                                  
                                      }
                                  
                                      etatPrecedant = etatActuel;
                                  
                                  }



                                  -
                                  Edité par lorrio 2 juin 2015 à 18:09:40

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  aide au contrôle de mon script

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown