porte de poulailler

Bonjour,
Je réalise une porte de poulailler automatique, qui s'ouvrira en fonction de la luminosité.
en matériel :

  • arduino uno
  • shield monster motor
  • moteur d'essuie-glace

niveau cinématique, pour ouvrir la porte le moteur tourne dans un sens et enroule une corde, l'inverse pour fermer la porter. 2 contacts de fin de course : porte fermée, porte ouverte.

Je me suis inspiré des différentes réalisations trouvées sur le forum, mais j'ai adapté le programme.

Si vous pouvez me dire ce que vous en pensez ?

/*

SI PORTE FERMEE & JOUR

    OUVERTURE

SINON SI PORTE OUVERTE & NUIT

    FERMETURE

*/

#define CS_THRESHOLD 15  // Definition of safety current (Check: "1.3 Monster Shield Example").

// moteur
#define MOTOR_A1_PIN 7
#define MOTOR_B1_PIN 8

// contacts fin de course
#define contactFermee_PIN 9 // broche pour contact fin de course porte fermée
#define contactOuverte_PIN 10 // broche pour contact fin de course porte ouverte

int luminositePin = A0; // pin pour la photo résistance
int luminosite = 0; // variable de luminosite
int seuil = 100; // seuil de luminosité pour déclencher les actions de la porte
int fermee = 0;
int ouverte  = 0;
int jour;
int nuit;


void setup() {
  // put your setup code here, to run once:
  // définition des PINs
    pinMode(MOTOR_A1_PIN, OUTPUT);
    pinMode(MOTOR_B1_PIN, OUTPUT);
    pinMode(luminositePin, INPUT);
    pinMode(contactFermee_PIN, INPUT);
    pinMode(contactOuverte_PIN, INPUT);

}

void loop() {
  // put your main code here, to run repeatedly:

  luminosite = analogRead(luminositePin); // lecture de la valeur de la photo résistance


  // pour ouvrir la porte
  if (luminosite > seuil && digitalRead(contactFermee_PIN)==LOW)
  {
     jour = jour + 1;
     nuit = 0;
     delay(1000);
     if (jour > 15) 
     {
      jour = 0;
      ouverture();
     }
  }
  

  // pour fermer la porte
  if (luminosite < seuil && digitalRead(contactOuverte_PIN)==LOW)
  {
    nuit = nuit + 1;
    jour = 0;
    delay(1000);
    
    if (nuit > 15)
    {
      nuit = 0;
      fermeture();
    }
    
  }
  
}

void ouverture() {

  while (digitalRead(contactOuverte_PIN)==LOW)
  {
    digitalWrite(MOTOR_A1_PIN, LOW); 
    digitalWrite(MOTOR_B1_PIN, HIGH);
  }

  
  
}

void fermeture() {
    while (digitalRead(contactFermee_PIN)==LOW)
  {
    digitalWrite(MOTOR_A1_PIN, HIGH);
    digitalWrite(MOTOR_B1_PIN, LOW);
  }
  
}

d'avance merci !

ce serait bien d'arrêter les moteurs une fois la porte ouverte ou fermée, non? :slight_smile:

vos contacteurs seront câblés comment? pas d'INPUT_PULLUP dans le code et semblent actifs à HIGH.

J-M-L:
ce serait bien d'arrêter les moteurs une fois la porte ouverte ou fermée, non? :slight_smile:

vos contacteurs seront câblés comment? pas d'INPUT_PULLUP dans le code et semblent actifs à HIGH.

ah oui, pas bête d'arrêter les moteurs à la fin :slight_smile:

les contacteurs seront reliés par fil sur la carte arduino ... j'ai pris ces modèles :

contacteur

pour le "INPUT_PULLUP" je ne sais pas ce que c'est ...

carmelo42:
les contacteurs seront reliés par fil sur la carte arduino ... j'ai pris ces modèles :

contacteur

pour le "INPUT_PULLUP" je ne sais pas ce que c'est ...

vaudrait mieux lire un peu des tutos alors si vous ne voulez pas griller votre Arduino et vos poules :slight_smile:

commencez par le tuto d'eskimon sur les boutons (et tous ses autres tutos sont bien aussi)

ok merci je vais lire ça !
j'ai modifié le programme en m'inspirant d'un tuto sur l'utilisation du motor shield :
ça donne ça maintenant :

/*

SI PORTE FERMEE & JOUR

    OUVERTURE

SINON SI PORTE OUVERTE & NUIT

    FERMETURE

*/
#define BRAKE 0
#define CW    1
#define CCW   2
#define CS_THRESHOLD 15  // Definition of safety current (Check: "1.3 Monster Shield Example").
short usSpeed = 150;  //default motor speed
unsigned short usMotor_Status = BRAKE;
#define PWM_MOTOR_1 5
#define MOTOR_1 0


// moteur
#define MOTOR_A1_PIN 7
#define MOTOR_B1_PIN 8

// contacts fin de course
#define contactFermee_PIN 9 // broche pour contact fin de course porte fermée
#define contactOuverte_PIN 10 // broche pour contact fin de course porte ouverte

int luminositePin = A0; // pin pour la photo résistance
int luminosite = 0; // variable de luminosite
int seuil = 100; // seuil de luminosité pour déclencher les actions de la porte
int fermee = 0;
int ouverte  = 0;
int jour;
int nuit;


void setup() {
  // put your setup code here, to run once:
  // définition des PINs
    pinMode(MOTOR_A1_PIN, OUTPUT);
    pinMode(MOTOR_B1_PIN, OUTPUT);
    pinMode(luminositePin, INPUT);
    pinMode(contactFermee_PIN, INPUT);
    pinMode(contactOuverte_PIN, INPUT);

}

void loop() {
  // put your main code here, to run repeatedly:

  luminosite = analogRead(luminositePin); // lecture de la valeur de la photo résistance


  // pour ouvrir la porte
  if (luminosite > seuil && digitalRead(contactFermee_PIN)==LOW)
  {
     jour = jour + 1;
     nuit = 0;
     delay(1000);
     if (jour > 15) 
     {
      jour = 0;
      ouverture();
     }
  }
  

  // pour fermer la porte
  if (luminosite < seuil && digitalRead(contactOuverte_PIN)==LOW)
  {
    nuit = nuit + 1;
    jour = 0;
    delay(1000);
    
    if (nuit > 15)
    {
      nuit = 0;
      fermeture();
    }
    
  }
  
}

void ouverture() {
  Reverse();
  while (digitalRead(contactOuverte_PIN)==LOW)
  {
    
  }
  Stop;
  
/* original
  while (digitalRead(contactOuverte_PIN)==LOW)
  {
    digitalWrite(MOTOR_A1_PIN, LOW); 
    digitalWrite(MOTOR_B1_PIN, HIGH);
  }

  digitalWrite(MOTOR_A1_PIN, LOW); 
  digitalWrite(MOTOR_B1_PIN, LOW);
  */
}

void fermeture() {
  Forward();
  while (digitalRead(contactFermee_PIN)==LOW)
  {
    
  }
  Stop;

  /* original :
    while (digitalRead(contactFermee_PIN)==LOW)
  {
    digitalWrite(MOTOR_A1_PIN, HIGH);
    digitalWrite(MOTOR_B1_PIN, LOW);
  }

  digitalWrite(MOTOR_A1_PIN, LOW); 
  digitalWrite(MOTOR_B1_PIN, LOW);
  */
}

void Forward()
{
  Serial.println("Forward");
  usMotor_Status = CW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
}

void Reverse()
{
  Serial.println("Reverse");
  usMotor_Status = CCW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
}

void Stop()
{
  Serial.println("Stop");
  usMotor_Status = BRAKE;
  motorGo(MOTOR_1, usMotor_Status, 0);
}



void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)         //Function that controls the variables: motor(0 ou 1), direction (cw ou ccw) e pwm (entra 0 e 255);
{
  if(motor == MOTOR_1)
  {
    if(direct == CW)
    {
      digitalWrite(MOTOR_A1_PIN, LOW); 
      digitalWrite(MOTOR_B1_PIN, HIGH);
    }
    else if(direct == CCW)
    {
      digitalWrite(MOTOR_A1_PIN, HIGH);
      digitalWrite(MOTOR_B1_PIN, LOW);      
    }
    else
    {
      digitalWrite(MOTOR_A1_PIN, LOW);
      digitalWrite(MOTOR_B1_PIN, LOW);            
    }
    
    analogWrite(PWM_MOTOR_1, pwm); 
  }

}

je vais aller voir cette histoire de poule'up :wink:

ah oui, effectivement, sans résistance de pull-up c'est mal !

donc si j'ai bien compris :

  • j'active la résistance de pull-up interne pour chacun de mes 2 capteurs de fin de course, et par contre le fonctionnement logique est inversé : si j'attendais LOW, maintenant j'attends HIGH, et vice versa.

Voici mon code revisité :

/*

SI PORTE FERMEE & JOUR

    OUVERTURE

SINON SI PORTE OUVERTE & NUIT

    FERMETURE

*/
#define BRAKE 0
#define CW    1
#define CCW   2
#define CS_THRESHOLD 15  // Definition of safety current (Check: "1.3 Monster Shield Example").
short usSpeed = 150;  //default motor speed
unsigned short usMotor_Status = BRAKE;
#define PWM_MOTOR_1 5
#define MOTOR_1 0


// moteur
#define MOTOR_A1_PIN 7
#define MOTOR_B1_PIN 8

// contacts fin de course
#define contactFermee_PIN 9 // broche pour contact fin de course porte fermée
#define contactOuverte_PIN 10 // broche pour contact fin de course porte ouverte

int luminositePin = A0; // pin pour la photo résistance
int luminosite = 0; // variable de luminosite
int seuil = 100; // seuil de luminosité pour déclencher les actions de la porte
int fermee = 0;
int ouverte  = 0;
int jour;
int nuit;


void setup() {
  // put your setup code here, to run once:
  // définition des PINs
    pinMode(MOTOR_A1_PIN, OUTPUT);
    pinMode(MOTOR_B1_PIN, OUTPUT);
    pinMode(luminositePin, INPUT);
    pinMode(contactFermee_PIN, INPUT_PULLUP);
    pinMode(contactOuverte_PIN, INPUT_PULLUP);

}

void loop() {
  // put your main code here, to run repeatedly:

  luminosite = analogRead(luminositePin); // lecture de la valeur de la photo résistance


  // pour ouvrir la porte
  if (luminosite > seuil && digitalRead(contactFermee_PIN)==HIGH)
  {
     jour = jour + 1;
     nuit = 0;
     delay(1000);
     if (jour > 15) 
     {
      jour = 0;
      ouverture();
     }
  }
  

  // pour fermer la porte
  if (luminosite < seuil && digitalRead(contactOuverte_PIN)==HIGH)
  {
    nuit = nuit + 1;
    jour = 0;
    delay(1000);
    
    if (nuit > 15)
    {
      nuit = 0;
      fermeture();
    }
    
  }
  
}

void ouverture() {
  Reverse();
  while (digitalRead(contactOuverte_PIN)==HIGH)
  {
    
  }
  Stop;
  
/* original
  while (digitalRead(contactOuverte_PIN)==LOW)
  {
    digitalWrite(MOTOR_A1_PIN, LOW); 
    digitalWrite(MOTOR_B1_PIN, HIGH);
  }

  digitalWrite(MOTOR_A1_PIN, LOW); 
  digitalWrite(MOTOR_B1_PIN, LOW);
  */
}

void fermeture() {
  Forward();
  while (digitalRead(contactFermee_PIN)==HIGH)
  {
    
  }
  Stop;

  /* original :
    while (digitalRead(contactFermee_PIN)==LOW)
  {
    digitalWrite(MOTOR_A1_PIN, HIGH);
    digitalWrite(MOTOR_B1_PIN, LOW);
  }

  digitalWrite(MOTOR_A1_PIN, LOW); 
  digitalWrite(MOTOR_B1_PIN, LOW);
  */
}

void Forward()
{
  Serial.println("Forward");
  usMotor_Status = CW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
}

void Reverse()
{
  Serial.println("Reverse");
  usMotor_Status = CCW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
}

void Stop()
{
  Serial.println("Stop");
  usMotor_Status = BRAKE;
  motorGo(MOTOR_1, usMotor_Status, 0);
}



void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)         //Function that controls the variables: motor(0 ou 1), direction (cw ou ccw) e pwm (entra 0 e 255);
{
  if(motor == MOTOR_1)
  {
    if(direct == CW)
    {
      digitalWrite(MOTOR_A1_PIN, LOW); 
      digitalWrite(MOTOR_B1_PIN, HIGH);
    }
    else if(direct == CCW)
    {
      digitalWrite(MOTOR_A1_PIN, HIGH);
      digitalWrite(MOTOR_B1_PIN, LOW);      
    }
    else
    {
      digitalWrite(MOTOR_A1_PIN, LOW);
      digitalWrite(MOTOR_B1_PIN, LOW);            
    }
    
    analogWrite(PWM_MOTOR_1, pwm); 
  }

}

  Stop; <-- manque des parenthèses si vous voulez arrêter le moteur :slight_smile:

Pour éviter les fluctuations de la porte si la luminosité oscille juste au niveau du seuil, on ferme par exemple à 98% du niveau du seuil et on ouvre à 102% du seuil. entre les deux c'est une zone floue - on laisse comme c'est .

les pins c'est mieux en const byte

int luminositePin = A0; // pin pour la photo résistance

ça sert à quoi?

int fermee = 0;
int ouverte  = 0;

manque le Serial.begin() dans le setup....

et deux trois autres bricoles - mais c'est bien vous avancez

encore merci J-M-L pour les indications !

j'ai modifié le code :

#define BRAKE 0
#define CW    1
#define CCW   2
#define CS_THRESHOLD 15  // Definition of safety current (Check: "1.3 Monster Shield Example").
short usSpeed = 150;  //default motor speed
unsigned short usMotor_Status = BRAKE;
#define PWM_MOTOR_1 5
#define MOTOR_1 0


// moteur
#define MOTOR_A1_PIN 7
#define MOTOR_B1_PIN 8

// contacts fin de course
#define contactFermee_PIN 9 // broche pour contact fin de course porte fermée
#define contactOuverte_PIN 10 // broche pour contact fin de course porte ouverte

const byte luminositePin = A0; // pin pour la photo résistance
int luminosite = 0; // variable de luminosite
int seuilJour = 200; // seuil de luminosité pour le jour
int seuilNuit = 100; // seuil de luminosité pour la nuit
int jour;
int nuit;


void setup() {
  // put your setup code here, to run once:
  // définition des PINs
    Serial.begin(9600);
    pinMode(MOTOR_A1_PIN, OUTPUT);
    pinMode(MOTOR_B1_PIN, OUTPUT);
    pinMode(luminositePin, INPUT);
    pinMode(contactFermee_PIN, INPUT_PULLUP);
    pinMode(contactOuverte_PIN, INPUT_PULLUP);

}

void loop() {
  // put your main code here, to run repeatedly:

  luminosite = analogRead(luminositePin); // lecture de la valeur de la photo résistance


  // pour ouvrir la porte
  if (luminosite > seuilJour && digitalRead(contactFermee_PIN)==HIGH)
  {
     jour = jour + 1;
     nuit = 0;
     delay(1000);
     if (jour > 15) 
     {
      jour = 0;
      ouverture();
     }
  }
  

  // pour fermer la porte
  if (luminosite < seuilNuit && digitalRead(contactOuverte_PIN)==HIGH)
  {
    nuit = nuit + 1;
    jour = 0;
    delay(1000);
    
    if (nuit > 15)
    {
      nuit = 0;
      fermeture();
    }
    
  }
  
}

void ouverture() {
  Reverse();
  while (digitalRead(contactOuverte_PIN)==HIGH)
  {
    
  }
  Stop();
  
}

void fermeture() {
  Forward();
  while (digitalRead(contactFermee_PIN)==HIGH)
  {
    
  }
  Stop();

}

void Forward()
{
  Serial.println("Forward");
  usMotor_Status = CW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
}

void Reverse()
{
  Serial.println("Reverse");
  usMotor_Status = CCW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
}

void Stop()
{
  Serial.println("Stop");
  usMotor_Status = BRAKE;
  motorGo(MOTOR_1, usMotor_Status, 0);
}



void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)         //Function that controls the variables: motor(0 ou 1), direction (cw ou ccw) e pwm (entra 0 e 255);
{
  if(motor == MOTOR_1)
  {
    if(direct == CW)
    {
      digitalWrite(MOTOR_A1_PIN, LOW); 
      digitalWrite(MOTOR_B1_PIN, HIGH);
    }
    else if(direct == CCW)
    {
      digitalWrite(MOTOR_A1_PIN, HIGH);
      digitalWrite(MOTOR_B1_PIN, LOW);      
    }
    else
    {
      digitalWrite(MOTOR_A1_PIN, LOW);
      digitalWrite(MOTOR_B1_PIN, LOW);            
    }
    
    analogWrite(PWM_MOTOR_1, pwm); 
  }

}

Je reçois la carte Motor Shield demain normalement, mais je vais faire des tests avec des leds cet après midi :slight_smile:

j'ai reçu la carte motor shield, et j'ai effectué le montage : ça fonctionne :slight_smile:

Reste plus qu'à rendre le cablage propre et installer tout ça dans le poulailler !

encore merci :slight_smile: