Problème avec code de trappe de poulailler

Bonjour, à vous, j’ai un soucis avec mon code d’ouverture de ma trappe de poulailler.
J’utilise un module L298n, un capteur de luminosité et un arduino uno pour actionner mon moteur dans un sens ou dans l’autre. En fontion d’un seuil de luminosité ( ici 800), le moteur doit ouvrir la trappe, s’arrêter 19 secondes plus tard et attendre gentiment le soir pour refermer et s’arreter à nouveau 19 s plus tard.

J’envisage d’utiliser des contacteurs de fin de course, mais je voulais d’abord introduire les notions de temps pour gérer les arrêts.

Ca fait plusieurs heures que je cherche, mais je m’arrache les cheveux .
Pouvez vous me mettre sur la voix , sil vous plait

merci beaucoup

////
// Ouverture d’une trappe de poulailler
// zimmermann frédéric
// 18 01 2015
//

unsigned long intervaltravail = 19000;
unsigned long temps ;

int PinLumiere=0; //Broche Analogique de mesure d’éclairement
int PinSeuilLumiere=3; //Broche Numérique mesure d’éclairement
int tension=0; //Mesure de tension (valeur élevée si sombre)
int eclaire =0; //0 ou 1 (0=éclairé>seuil, 1=ombre<seuil)
int ENB = 11; // Reglage vitesse moteur
int IN3 = 8; // pont en H moteur A
int IN4 = 9; // pont en H moteur A

void setup(){ // Initialisation
Serial.begin(9600); //Connection série à 9600 baud
pinMode(PinLumiere, INPUT); //pin A0 en entrée analogique
pinMode(PinSeuilLumiere, INPUT); //pin 3 en entrée numérique
pinMode(ENB,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);

}

void loop() { //boucle principale
tension = analogRead(PinLumiere); // Lit la tension analogique
eclaire = digitalRead(PinSeuilLumiere);
Serial.println(tension); // afficher la mesure
//Serial.print(" ");
//Serial.println(eclaire); //0 ou 1
delay(400); //delai entre 2 mesures 400ms

if (tension < 800) // si il fait jour

{

digitalWrite(ENB, HIGH); // on ouvre la trappe
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);

temps =millis();

{
if (millis() - temps >= intervaltravail) // si on depasse 19 s on eteint le moteur
{
digitalWrite(ENB, LOW);

}}}}

Pourquoi pas juste un delay() ?

delay(intervaltravail);
digitalWrite(ENB, LOW);

le delay me bloque les mesure du seuil de lumière

Est ce utile de mesurer la lumière pendant que le moteur tourne ?

Et j'aimerai que la trappe se ferme , et reste fermée jusqu'à ce que le seuil redescende en dessous des 800 ( donc le jour). J'ai tout essayé , les for, while

Non Christian, ce n'est pas utile . Tu pensais à quoi ?

Et en fait, mon le capteur mesure contamment la lumière

Je crois que ce serait utile de définir une variable qui indiquerait l'état actuel de la trappe: "fermée", "en train de s'ouvrir", "ouverte", ou "en train de se fermer".

Ça éviterait d'ouvrir une trappe déjà ouverte ou de refermer une trappe déjà fermée.

De plus, l'assignation "temps =millis();" devrait se faire uniquement au moment ou la trappe passe de l'état "fermée" à l'état "en train de s'ouvrir", et ne pas changer aussi longtemps que la trappe est en train de s'ouvrir (en ce moment, "temps" change de valeur à chaque passage dans la boucle pourvu qu'il fasse jour, donc l'écart n'atteindra jamais 19 secondes).

j’'ajouterai une variable sur l’état

boolean ouverte=false

je testerai, en plus, l’état

if ((tension < 800) && (ouverte == false)) // si il fait jour

on ouvre et on change l’état

digitalWrite(ENB, HIGH);        // on ouvre la trappe
ouverte=true

on calcule le temps (remonter le if d’un cran…)

if ((millis() - temps >= intervaltravail) && (ouverte == true)) // si on depasse 19 s on eteint le moteur

bien sûr, pas testé.
Mais grosso modo, c’est ce que je ferai…

bonjour,

1/ déjà un truc zarbi, tu fait fonctionner ton capteur lumière à l’envers?
en principe plus il fait “jour”, plus la valeur monte.
1023 = jour
inférieur à environ 200, il fait nuit.

2/ si tu utilise des fin de course, pourquoi te prendre la tête avec 19s

mais un truc comme ca en passant, s’il y a un gros nuage ou un orage, ta luminosité va chuter, donc la porte se fermer et les poupoules enfermées dehors :slight_smile:

sans rtc pour valider le temps et lumière, tu pourrais faire un truc comme ca
si porte ouverte, tant que temps ouvert < 12h, on n’active plus le moteur (12h est un exemple)
si porte fermée, tant que temps fermé < 12h, idem

+1 sauf pour le 1

Il n'y a rien de zarbi dans le choix qu'il a fait. Rien n'a jamais imposé que la tension la plus élevée doit obligatoirement correspondre au niveau logique 1. C'est juste une habitude qui plait bien à nos neurones mais que rien ne justifie.

68tjs: +1 sauf pour le 1

Il n'y a rien de zarbi dans le choix qu'il a fait. Rien n'a jamais imposé que la tension la plus élevée doit obligatoirement correspondre au niveau logique 1. C'est juste une habitude qui plait bien à nos neurones mais que rien ne justifie.

toutes les photorésitances que j'ai pu utiliser jusque là fonctionnent sur ce principe et tous les exemples sont basés sur ce principe. mais bon, certaines fonctionnent peut être à l'inverse.

Il est interdit d’interdire :grin:
Ce n’est pas le fait d’inverser qui empêchera de fonctionner.
Et heureuseument que chez Philips ils ont inversés sans quoi l’I2C n’existerait pas.

Merci pour votre aide à tous, cependantt je n’arrive pas à compiller mon programme il me renvoie une erreur :

Trappe_poullailler:31: error: expected unqualified-id before ‘void’

////
// Ouverture d’une trappe de poulailler
// zimmermann frédéric
// 18 01 2015
//

int PinLumiere=0; //Broche Analogique de mesure d’éclairement
int PinSeuilLumiere=3; //Broche Numérique mesure d’éclairement
int tension=0; //Mesure de tension (valeur élevée si sombre)
int eclaire =0; //0 ou 1 (0=éclairé>seuil, 1=ombre<seuil)
int ENB = 11; // Reglage vitesse moteur
int IN3 = 8; // pont en H moteur A
int IN4 = 9; // pont en H moteur A
int fin_coursebas = 2; // bouton pin 2
int fin_coursehaut = 4; // bouton pin 2

boolean trappe_ferme = false;
boolean trappe_ouverte = false;
boolean trappe_en_mouvement = false;
boolean nuit = false;
boolean jour = false,

void setup() {

pinMode(PinLumiere,INPUT); //pin A0 en entrée analogique
pinMode(PinSeuilLumiere,INPUT); //pin 3 en entrée numérique
pinMode(ENB,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(fin_coursebas,INPUT);
pinMode(fin_coursehaut,INPUT);

}

void loop() { //boucle principale

// lecture état capteur fin de course bas

if (digitalRead(fin_coursebas) == LOW)
{trappe_ferme = true;} // la trappe est fermé

else {trappe_ferme = false;} //sinon ouverte

// lecture état capteur fin de course haut

if (digitalRead(fin_coursehaut) == LOW)
{trappe_ouverte = true;} // la trappe est ouverte

else {trappe_ouverte = false;} // sinon fermé

// si la trappe est ni fermé, ni ouverte, elle est en mouvement

if ((digitalRead(fin_coursebas) == HIGH ) && (digitalRead(fin_coursehaut) == HIGH ))
{ trappe_en_mouvement = true; } // la trappe est en mouvement

// il fait nuit
if (analogRead(tension) > 800 )
{ nuit = true;}

// il fait jour
if (analogRead(tension) < 800 )
{ jour = true;}

// si il fait nuit

if (nuit == true && trappe_ouverte == true)
{moteurfermeture();}

// si il fait jour

if (jour == true && trappe_ferme == true)
{ moteurouverture();}

}
void moteurouverture(){

digitalWrite(ENB, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);

if (trappe_ouverte == true)
{ digitalWrite(ENB, LOW);}}

void moteurfermeture()
{

digitalWrite(ENB, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);

if (trappe_ferme == true)
{ digitalWrite(ENB, LOW);}}

Bonjour,

boolean jour = false,

C’est faux, il faut :

boolean jour = false;  //point virgules et non virgule

Si tu mettais ton code entre balises code cela serait plus simple pour ceux qui veulent t’aider :wink:

Bonjour,
l’Arduino n’est pas tres stable dans ses mesures analogiques. Tu risques, a certains moments, de voir la porte s’ouvrir, se fermer etc etc.
Il faut introduire un hysteresis dans ta mesure.
Exemple :
si > 820 alors nuit
si < 780 alors jour
si > 780 et < 820 ne rien faire

Jacques

Merci, mais j'avais trouvé entre temps, cependant mon code ne marche pas, la trappe s'est ouverte, puis refermé et maintenant plus rien !

Comment mettre le code dans les balises code ?

Comment mettre le code dans les balises code ?

tu as une balise au dessus des émoticones “<>”

merci pour vos réponse, mais j’ai tj des problèmes, je n’arrive pas à arrêter la trappe .
De plus je ne trouve pas les balises code .

////
// Ouverture d’une trappe de poulailler
// zimmermann frédéric
// 18 01 2015
//

int PinLumiere=0; //Broche Analogique de mesure d’éclairement
int PinSeuilLumiere=3; //Broche Numérique mesure d’éclairement
int tension=0; //Mesure de tension (valeur élevée si sombre)
int eclaire =0; //0 ou 1 (0=éclairé>seuil, 1=ombre<seuil)
int ENB = 11; // Reglage vitesse moteur
int IN3 = 8; // pont en H moteur A
int IN4 = 9; // pont en H moteur A
int fin_coursebas = 2; // bouton pin 2
int fin_coursehaut = 4; // bouton pin 2

boolean trappe_ferme = false;
boolean trappe_ouverte = false;
boolean trappe_en_mouvement = false;
boolean nuit = false;
boolean jour = false;

void setup() {

Serial.begin(9600); //Connection série à 9600 baud
pinMode(PinLumiere,INPUT); //pin A0 en entrée analogique
pinMode(PinSeuilLumiere,INPUT); //pin 3 en entrée numérique
pinMode(ENB,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(fin_coursebas,INPUT);
pinMode(fin_coursehaut,INPUT);

}

void loop() { //boucle principale
tension = analogRead(PinLumiere); // Lit la tension analogique
eclaire = digitalRead(PinSeuilLumiere);
Serial.begin(9600); //Connection série à 9600 baud
Serial.println(tension);
delay (400);

// lecture état capteur fin de course bas

if (digitalRead(fin_coursebas) == LOW && digitalRead(fin_coursehaut) == HIGH)
{ trappe_ferme = true;} // la trappe est fermé

// lecture état capteur fin de course haut

if (digitalRead(fin_coursehaut) == LOW && digitalRead(fin_coursebas) == HIGH)
{trappe_ouverte = true;} // la trappe est ouverte

// si la trappe est ni fermé, ni ouverte, elle est en mouvement

if (digitalRead(fin_coursebas) == HIGH && digitalRead(fin_coursehaut) == HIGH )
{ trappe_en_mouvement = true; } // la trappe est en mouvement

// il fait nuit
if (analogRead(tension) > 800 )
{ nuit = true;}

// il fait jour
if (analogRead(tension) < 800 )
{ jour = true;}

// si il fait nuit et la trappe est ouverte

if (nuit == true && trappe_ouverte == true)
{
moteurfermeture(); // on ferme
}

// si il fait jour et trappe fermé

if (jour == true && trappe_ferme == true)
{
moteurouverture(); // on ouvre

}

}
void moteurouverture(){

digitalWrite(ENB, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}

void moteurfermeture()

{digitalWrite(ENB, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);

}

void moteurarret()
{digitalWrite(ENB, LOW);}

Tu n'appelles jamais moteurarret(). Mais peut-être que tu ne sais pas où le mettre. Tu devrais ajouter une variable supplémentaire au démarrage des moteurs pour mémoriser que tu es en cours d'ouverture ou de fermeture. et t'en servir pour les arrêter lorsque les fins de course s'activent.