Comment empêcher le changement d état a la mise sous tension d'un relais

bonjour a tous,

Voila je manque de savoir faire en programmation.Je consulte différentes revues et livres mais la pratique!!! Etant en déplacement toute la semaine pas facile de mettre en pratique.

Je suis sur un projet de commande d’ouverture de porte de garage par reconnaissance de tag.(RFID)

Lecture des tags RAS et intégration dans programme RAS, tout va bien sauf a la mise sous tension ou mon relais subit un changement d’état.Risque d’ouverture de porte après coupure de courant,a la remise sous tension.
Il me semble avoir lu ou vue sur un programme une boucle de protection permettant d y remédier.

Plus tard je regarderais pour ajouté un nom a chaque cartes.

Merci d’avance.

ouverture_porte.ino (2.15 KB)

Bonjour

Merci pour ces infos je regarde ce soir ce que cela donne !

Bonjour, Avec un peu de chance, il suffira simplement de supprimer ce code dans setup():

digitalWrite(relay, LOW); // or LOW if you have a regular relay
delay(800);

Comme le précise pepe il y a un risque que ça se produise quand même, parce que par défaut le pin de l'arduino est à l'état LOW, ce qui sera considéré par le relais comme un signal d'activation, mais je suppose (en fait si c'est du copiage de code aucune certitude) que le delay(800) a son utilité et que le relais ne considère le signal que si il est actif pendant une certaine durée. Dans ce cas, on peut espérer que digitalWrite(relay,HIGH); (je mettrai ce code en tout début de setup(), pour ne pas perdre de temps) permette au relai de ne pas considérer le signal non désiré à la mise sous tension, car ce dernier est actif sur une période trop courte. À essayer avant d'ajouter un pMOS en entrée du relais.

Bonjour,

pepe: void setup() {  digitalWrite(Dn, LOW);  pinMode(Dn, OUTPUT); ... }

Personnellement j'inverserais digitalWrite et pinMode. (voir post #7 de pepe)

Merci pour toutes ses interventions je regarderais ce soir et vous donnerais la solution retenue.

Enfin, biensur si j'ai du temps devant moi!

Encore merci.

Messieurs,

Il est vrai que ce n'est pas très claire mes explications.

Le relais doit permettre de fermer un circuit (boucle) comme un simple bouton poussoir.(aucune tension) La partie temps c'est moi qui l'ai rajoutée : delay(800);[temps de prise en compte opérateur de porte] digitalWrite(relay,HIGH); delay(5000);[temps ou le relais ne peut changer d'état, évite les contre ordres]

Je vous remercie et je regarde ce soir après le boulot.

Messieurs,

Merci a tous, problème résolu.

Il fallait bien enlever une partie du code dans void setup.
Donc quand je mais sous tension, a l’initialisation de la carte RAS le relais de change pas d’état.
Essai avec passage de badge, j’ai bien mon relais activé pendant 0,8s puis est bien bloqué pendant 5s.

Encore merci a tous.

/*
* source: http://www.electroschematics.com/11301/arduino-rfid-reader-rc522-access-control-system/
* Read a card using a mfrc522 reader on your SPI interface
* Pin layout should be as follows (on Arduino Uno):
* MOSI: Pin 11 / ICSP-4
* MISO: Pin 12 / ICSP-1
* SCK: Pin 13 / ISCP-3
* SS: Pin 10
* RST: Pin 9
*/
 
#include <SPI.h>
#include <RFID.h>
 
#define SS_PIN 10
#define RST_PIN 9
 
RFID rfid(SS_PIN,RST_PIN);
 
int startAlarm = false;
int relay = 7;
 
int serNum[5];
 
int cards[][5] = {
  {80,12,38,131,249}, // card 1
  {43,174,208,171,254}, // card 2
  {107,154,226,171,184}, // card 3
  {203,244,247,172,100}, // card 4
  {91,64,239,171,95} // card 5
};

bool access = false;
 
void setup(){
 
    Serial.begin(9600);
    SPI.begin();
    rfid.init();
    pinMode(relay, OUTPUT);
    digitalWrite(relay,HIGH);
  
}
 
void loop(){
    
    if(rfid.isCard()){
    
        if(rfid.readCardSerial()){
            Serial.print(rfid.serNum[0]);
            Serial.print(",");
            Serial.print(rfid.serNum[1]);
            Serial.print(",");
            Serial.print(rfid.serNum[2]);
            Serial.print(",");
            Serial.print(rfid.serNum[3]);
            Serial.print(",");
            Serial.print(rfid.serNum[4]);
            Serial.println("");
            
            for(int x = 0; x < sizeof(cards); x++){
              for(int i = 0; i < sizeof(rfid.serNum); i++ ){
                  if(rfid.serNum[i] != cards[x][i]) {
                      access = false;
                      break;
                  } else {
                      access = true;
                  }
              }
              if(access) break;
            }
           
        }
        
       if(access){
          Serial.println("Bonjour"); 
          digitalWrite(relay, LOW); // HIGH with regular relay  
          delay(800);
          digitalWrite(relay,HIGH);
          delay(5000);   
       } else {
           Serial.println("Entree intredite!");  
            digitalWrite(relay, HIGH);  // LOW with regular relay        
       }        
    }
    
    
    
    rfid.halt();
 
}

Avec plaisir Coyerco, Mais ne soit pas aussi formel, la nétiquette veux que tu ne nous appelle pas messieurs, mais "les gars" par exemple. On n'est pas des partenaires du boulot, disons qu'on est juste tes amis, on t'aide gratuitement, parce que ça nous fait plaisir. Et à ce sujet, il est de bon ton d'insérer [résolu] au début du titre de la discussion. L'électronique c'est indispensable, mais le but d'un micro-contrôleur, c'est justement aussi de pouvoir facilement modifier le comportement (donc sans toucher à l’électronique). Tu as donc bien fait d'essayer d'abord ma solution, (même si j'avais eu tort) commenter/ décommenter une ligne de code ça prends 30s, refaire un circuit 30mn (en considérant qu'on a les composants). Effectivement, c'est pas très "propre", pas très "pro", de jouer sur l'inertie du relais, mais on parle d'une porte de garage de particulier, pas celle du camion des pompiers. Le but c'est que ça marche sans trop s’embêter...