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);
}
}
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
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