porte de poulailler automatique

Bonjour tout le monde, je viens chercher un peu d’aide. Bricoleur touche à tout sans connaissance en programmation , je me suis lancer dans la création d’un système pour ouvrir la porte(système guillotine) d’un poulailler de manière automatique.
Je voudrais faire un système simple basé sur une photorésistance pour l’ouverture et la fermeture en automatique et rajouter un bouton poussoir pour forcer le mouvement en cas de besoin, une Led témoin de fermeture.

j ai créer le montage pour faire un prototypage et commencé à coder, mais j 'ai un problème, l’ouverture et la fermeture calé sur la luminosité fonctionne très bien( du coup je sais que mes fonctions ouverture et fermeture fonctionne), mais je n’arrive pas a faire fonctionner mon bouton poussoir.
y a truc qui coince quelque part…

cote matériel j’ai utilisé:
une carte arduino uno
un shield moteur drv8835
une photorésistance avec résistance de 10kohm
un petit moteur(je comptais faire tout ma programmation et mon codage et après caler le temps de fonctionnement pour monter et baisser la porte guillotine)

int photo_res=5;// declaration capteur de lumiere
int photo_val;// varriable de stockage de la valeur du capteur de lumiere

//bibiotheque moteur
#include <DRV8835MotorShield.h>
#define Led_pin 13
DRV8835MotorShield motors;

int bouton_ouverture=1;// declaration bouton d'ouverture
int bouton_fermeture=2;// declaration bouton de fermeture
boolean etat_ouverture;// stockage de l'etat du bouton ouverture
boolean etat_fermeture;// stockage de l'etat du bouton fermeture
int led_fermeture= 11;// déclartion de la led temoin de fermeture
boolean etat_porte;// stockage de l'etat de la porte

void setup() {
  
 Serial.begin(9600);
  pinMode(bouton_fermeture,INPUT_PULLUP);
  pinMode(bouton_ouverture,INPUT_PULLUP);
  pinMode(Led_pin,OUTPUT);
  pinMode(led_fermeture,OUTPUT);

ouverture_porte();// mise en ouverture a l'etat initial
  etat_porte=true;// variable de l'etat de la porte mise a l'ouverture
Serial.println("etat initial porte ouverte");
Serial.println("programme en fonction");
}


void loop() {
 photo_val=analogRead(photo_res);// stockage de la resistance du capteur de lumiere en temps reel
 etat_fermeture=digitalRead(bouton_fermeture);//stockage de l'etat du bouton d'ouverture en temps reel
 etat_ouverture=digitalRead(bouton_ouverture);// stockage de l'etat du bouton de fermeture en temps reel
 Serial.println(photo_val);
  Serial.print("etatbouton fermeture=");
 Serial.println(etat_fermeture);
  Serial.print("etat bouton ouverture=");
 Serial.println(etat_ouverture);
  Serial.print("etat porte=");
   Serial.println( etat_porte);
    
 delay(1000);
    
  // fermeture automatique de nuit
  
  if (photo_val<200)//condition de nuit, valeur a corrgier
  {if (etat_porte==true)
    {fermeture_porte();
    Serial.println(photo_val);
      Serial.println("etat fermeture automatique de la porte");
    }}

// ouverture automatique le matin

  else if (photo_val>200)// condition d'apparition du jour
  {if (etat_porte==false)// condition que la porte soit en position fermee
      {ouverture_porte();
      Serial.println(photo_val);
      Serial.println("etat ouverture automatique de la porte");
      }}

// ouverture de la porte sur commande du bouton d'ouverture

else if (etat_ouverture<0)
{if (etat_porte==false)// condition de pression du bouton d'ouverture
    {ouverture_porte();
      Serial.println("etat ouverture de la porte sur commande du bouton");
     }}

// fermeture sur commande du bouton de fermeture

else if (etat_fermeture<0)
{if (etat_porte==true)// condition de pression sur le bouton de fermeture
    {fermeture_porte();
      Serial.println("etat fermeture de la porte sur commande du bouton");
    }}



    
// clignotement de la led temoin de fermeture quand la porte est en position fermee

if (etat_porte== false)
  {digitalWrite(led_fermeture,HIGH);
  delay(200);
  digitalWrite(led_fermeture,LOW);
  delay(1000);
}}

// gestion de l'ouverture a regler
void ouverture_porte()// fonction qui gere l'ouverture de la porte
{
for (int speed=0; speed<=400;speed++)
  {motors.setM1Speed(speed);
  delay(2);
  }
for (int speed=400;speed>=0;speed--)
  {motors.setM1Speed(speed);
  delay(2);
  }
 etat_porte=true; 
  }

void fermeture_porte()// fonction qui gere la fermeture de la porte
{
for (int speed=0; speed<=400;speed++)
  {motors.setM1Speed(speed);
  delay(2);
  }
for (int speed=400;speed>=0;speed--)
  {motors.setM1Speed(speed);
  delay(2);
  }
  etat_porte=false;}

et normalement vous allez me répondre oui mais dès que tu vas ferme la porte avec le bouton poussoir, elle va se ré-ouvrir en automatique, exact , je comptais introduire une temporisation dans les condition d’ouverture automatique, j 'y es pas réfléchi complétement mais c est en cours…

merci par avance a ceux qui voudront bien m’aider même si ça leur parait facile …

else if (etat_ouverture<0)

Valeur négative impossible, etat_ouverture ou etat_fermeture vaudra HIGH ou LOW.

Tu as une suite de if else if. Si le premier if est exécuté, le programme ne vérifie pas les else.

Donc, si les boutons sont prioritaires sur les cellules, mets tes tests de boutons avant ceux des cellules.
Sinon, autre solution : tu testes les boutons en dehors du if / else if des cellules.

merci pour la réponse , effectivement , j'ai mis les boutons en premier et ça fonctionne!!

hbachetti:

else if (etat_ouverture<0)

Valeur négative impossible, etat_ouverture ou etat_fermeture vaudra HIGH ou LOW.

J’imagine que HIGH qui vaut 1 peut être aussi compris comme -254 donc négatif… ?

Non.

int digitalRead(uint8_t pin)
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);

	if (port == NOT_A_PIN) return LOW;

	// If the pin that support PWM output, we need to turn it off
	// before getting a digital reading.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	if (*portInputRegister(port) & bit) return HIGH;
	return LOW;
}

digitalRead retourne LOW ou HIGH, qui ne peuvent être inférieurs à zéro.
Même si la pin n'est pas une pin valide, la valeur retournée est LOW.

Alors pourquoi dit-il que ça fonctionne avec ses tests ?

Il a du modifier ...
Essaie. Tu verras.

hbachetti , j’avoue que tu m’a perdu sur tes derniers posts, effectivement j’ai remplacé par high et low pour faire fonctionner mais j’ai encore pas mal de soucis que je suis entrain d’essayer de corriger.

Je suis repartis sur une architecture différente pour faire fonctionner mon code et je me retrouve devant un message d’erreur de ce type:

C:\Users\Moi\Desktop\pouailler\code_poulailler_1.5\code_poulailler_1.5.ino: At global scope:

code_poulailler_1.5:41:15: error: expected initializer before 'automatique'

 void fonction automatique() 

               ^

exit status 1
expected initializer before 'automatique'

sur un code qui ressemble a ça maintenant:

int photo_res=5;// declaration capteur de lumiere
int photo_val;// varriable de stockage de la valeur du capteur de lumiere

//bibiotheque moteur
#include <DRV8835MotorShield.h>
#define Led_pin 13
DRV8835MotorShield motors;

int bouton_ouverture=1;// declaration bouton d'ouverture
int bouton_fermeture=2;// declaration bouton de fermeture
boolean etat_ouverture;// stockage de l'etat du bouton ouverture
boolean etat_fermeture;// stockage de l'etat du bouton fermeture
int led_fermeture= 11;// déclartion de la led temoin de fermeture
boolean etat_porte;// stockage de l'etat de la porte

void setup() {
  
 Serial.begin(9600);
  pinMode(bouton_fermeture,INPUT_PULLUP);
  pinMode(bouton_ouverture,INPUT_PULLUP);
  pinMode(Led_pin,OUTPUT);
  pinMode(led_fermeture,OUTPUT);

ouverture_porte();// mise en ouverture a l'etat initial
  etat_porte=true;// variable de l'etat de la porte mise a l'ouverture
Serial.println("etat initial porte ouverte");
Serial.println("programme en fonction");
}


void loop() {
fonction automatique();
if (etat_porte==false)
{digitalWrite(led_fermeture,HIGH);
delay(100);
digitalWrite(led_fermeture,LOW);
delay(2000);}
}


void fonction automatique() 
{etat_fermeture=digitalRead(bouton_fermeture);//stockage de l'etat du bouton d'ouverture en temps reel
 etat_ouverture=digitalRead(bouton_ouverture);// stockage de l'etat du bouton de fermeture en temps reel
 photo_val=analogRead(photo_res);// stockage de la resistance du capteur de lumiere en temps reel
 
    // fermeture automatique de nuit 
  if (photo_val<200)//condition de nuit, valeur a corrgier
  {if (etat_porte==true)
      {fermeture_porte();
    Serial.println(photo_val);
      Serial.println("etat fermeture automatique de la porte");
    }}

// ouverture automatique le matin
  else if (photo_val>200)// condition d'apparition du jour
  {if (etat_porte==false)// condition que la porte soit en position fermee
        {ouverture_porte();
      Serial.println(photo_val);
      Serial.println("etat ouverture automatique de la porte");
      }}
else if (etat_ouverture==LOW)
{fonction bouton ouverture();}// si le bouton ouverture est presse renvoie vers la fonction d'ouverture
else if (etat_fermeture==LOW)
{fonction bouton fermeture();}// si le bouton fermture est presse renvoie vers la fonction fermeture
}


void fonction bouton ouverture()  { 
  etat_fermeture=digitalRead(bouton_fermeture);//stockage de l'etat du bouton d'ouverture en temps reel
 etat_ouverture=digitalRead(bouton_ouverture);// stockage de l'etat du bouton de fermeture en temps reel
 unsigned long previousMillisinterval_test=0;
 unsigned long interval_test=180000;
 
if (etat_porte==true)// si porte est ouverte renvoie sur la fonction automatique  
{fonction automatique();}
else if (etat_porte==false)// condition que la porte soit fermée
  {fonction ouverture();}// la porte s'ouvre

else if (etat_fermeture==LOW)// si le bouton fermeture est presse alors que la porte repasse en automatique
{fonction automatique();}
else if (photo_val>200)//si il fait jour

// temporisation non bloquante
{unsigned long currentMillis=millis();//mise a zero du compteur
  if (currentMillis>previousMillisinterval_test+interval_test)// si t plus 3min 
  {if (photo_val<200)// si maintenant il fait nuit
  {fonction automatique();}// si nuit retour fonction automatique()
  else fonction bouton ouverture();} //sinon fonction bouton ouverture() 
  } }  


void fonction bouton fermeture() {
  etat_fermeture=digitalRead(bouton_fermeture);//stockage de l'etat du bouton d'ouverture en temps reel
 etat_ouverture=digitalRead(bouton_ouverture);// stockage de l'etat du bouton de fermeture en temps reelif (etat_porte==false)// si porte est fermée renvoie sur la fonction automatique  
  unsigned long previousMillisinterval_test=0;
 unsigned long interval_test=180000;
 
if (etat_porte==false)//si la porte est deja fermée
{fonction automatique();}// retour à la fonction automatique
else if (etat_porte==true)// si la porte est ouverte
  {fonction fermeture();}// la porte se ferme
else if (etat_ouverture==LOW)// si le bouton ouverture est presse 
{fonction automatique();} // la porte repasse en mode automatique
else if (photo_val>200)si il fait jour

// temporisation non bloquante
{unsigned long currentMillis=millis();//mise a zero du compteur
  if (currentMillis>previousMillisinterval_test+interval_test)// si t plus 3min 
  {if (photo_val<200)// si maintenant il fait nuit
  {fonction automatique();}// si nuit retour fonction automatique()
  else fonction bouton ouverture();} //sinon fonction bouton fermeture() 
  }   
  if (etat_porte==false)
{digitalWrite(led_fermeture,HIGH);
delay(100);
digitalWrite(led_fermeture,LOW);
  delay(2000);}
  }

 


// gestion de l'ouverture a regler
void ouverture_porte()// fonction qui gere l'ouverture de la porte
{
for (int speed=0; speed<=400;speed++)
  {motors.setM1Speed(speed);
  delay(2);
  }
for (int speed=400;speed>=0;speed--)
  {motors.setM1Speed(speed);
  delay(2);
  }
 etat_porte=true; 
  }

  

void fermeture_porte()// fonction qui gere la fermeture de la porte
{
for (int speed=0; speed<=400;speed++)
  {motors.setM1Speed(speed);
  delay(2);
  }
for (int speed=400;speed>=0;speed--)
  {motors.setM1Speed(speed);
  delay(2);
  }
  etat_porte=false;
  }

code qui dois etre encore truffé d’erreurs mais j’arrive pas à finir ma vérification et mes tests à cause de cette foutu erreur…

Un nom de fonction ne peut pas contenir d'espace : donc "fonction automatique" et "fonction bouton ouverture" ne sont pas des noms valides : tu peux remplacer les " " par des "_" : "fonction_bouton_ouverture" et tu n'auras plus ces erreurs de compilation.

ok merci

salut je suis de retour

Décidément j’ai du mal, je crois que j’avais sous estimé les petits problèmes!!

j’ai bien avancé sur la fonction automatique, elle fonctionne bien,mais lorsque j’essaye d’introduire les boutons poussoirs, c’est plus compliqué… j’ai un problème, mes boutons poussoirs fonctionnent mais je voudrais mettre une temporisation pour que la porte ne se ré-ouvre pas immédiatement si je lui ai dis de se fermer et là pour passer de la pensée à la réalité ça coince
(dans le code j 'ai mis trois min pour les tests mais dans la realité je partirais plus sur 3h)

int photo_res=5;// declaration capteur de lumiere
int photo_val;// varriable de stockage de la valeur du capteur de lumiere

//bibiotheque moteur
#include <DRV8835MotorShield.h>
#define Led_pin 13
DRV8835MotorShield motors;

int bouton_ouverture=1;// declaration bouton d'ouverture
int bouton_fermeture=2;// declaration bouton de fermeture
boolean etat_ouverture;// stockage de l'etat du bouton ouverture
boolean etat_fermeture;// stockage de l'etat du bouton fermeture
int led_fermeture= 11;// déclartion de la led temoin de fermeture
boolean etat_porte;// stockage de l'etat de la porte

void setup() {
  
 Serial.begin(9600);
  pinMode(bouton_fermeture,INPUT_PULLUP);
  pinMode(bouton_ouverture,INPUT_PULLUP);
  pinMode(led_fermeture,OUTPUT);

fonction_ouverture();// mise en ouverture a l'etat initial
  etat_porte=true;// variable de l'etat de la porte mise a l'ouverture
  etat_ouverture=HIGH;//mise a l'etat initial  
  etat_fermeture=HIGH;//
Serial.println("etat initial porte ouverte");
Serial.println("programme en fonction");
}


void loop() {
etat_fermeture=digitalRead(bouton_fermeture);//stockage de l'etat du bouton d'ouverture en temps reel
etat_ouverture=digitalRead(bouton_ouverture);// stockage de l'etat du bouton de fermeture en temps reel
        
fonction_automatique();
if (etat_ouverture==LOW)// si le bouton ouverture est pressé
{if (etat_porte==false)// si la porte est fermée
{fonction_bouton_ouverture();}}// renvoie vers la fonction d'ouverture

else if (etat_fermeture==LOW)// si le bouton fermeture est préssé
 {if (etat_porte==true)// si la porte est ouverte
 {fonction_bouton_fermeture();}}//  renvoie vers la fonction fermeture
 
  if (etat_porte==false)
{digitalWrite(led_fermeture,HIGH);
delay(100);
digitalWrite(led_fermeture,LOW);
delay(2000);}
}


void fonction_automatique() 
{ 
 photo_val=analogRead(photo_res);// stockage de la resistance du capteur de lumiere en temps reel

 
    // fermeture automatique de nuit 
  if (photo_val<200)//condition de nuit, valeur a corrgier
  {if (etat_porte==true)
      {fonction_fermeture();
    Serial.println(photo_val);
      Serial.println("etat fermeture automatique de la porte");
    }}

// ouverture automatique le matin
  if (photo_val>200)// condition d'apparition du jour
  {if (etat_porte==false)// condition que la porte soit en position fermee
        {fonction_ouverture();
      Serial.println(photo_val);
      Serial.println("etat ouverture automatique de la porte");
      }}
  
}


void fonction_bouton_ouverture()  { 
  Serial.println(" bascule fonction bouton ouverture");
  etat_fermeture=digitalRead(bouton_fermeture);//stockage de l'etat du bouton d'ouverture en temps reel
 etat_ouverture=digitalRead(bouton_ouverture);// stockage de l'etat du bouton de fermeture en temps reel
 unsigned long previousMillisinterval_test=0;
 unsigned long interval_test=180000;
 
  fonction_ouverture();// la porte s'ouvre

 if (etat_fermeture==LOW)// si le bouton fermeture est presse alors que la porte repasse en automatique
{fonction_automatique();}
else if (photo_val>200)//si il fait jour

// temporisation non bloquante
{unsigned long currentMillis=millis();//mise a zero du compteur
  if (currentMillis>=previousMillisinterval_test+interval_test)// si t plus 3min 
  {if (photo_val<200)// si maintenant il fait nuit
  {fonction_automatique();}// si nuit retour fonction automatique()
  else fonction_bouton_ouverture();} //sinon fonction bouton ouverture() 
  } }  


void fonction_bouton_fermeture() {
  Serial.println("fonction bouton fermeture");
  etat_fermeture=digitalRead(bouton_fermeture);//stockage de l'etat du bouton d'ouverture en temps reel
 etat_ouverture=digitalRead(bouton_ouverture);// stockage de l'etat du bouton de fermeture en temps reelif (etat_porte==false)// si porte est fermée renvoie sur la fonction automatique  
  unsigned long previousMillisinterval_test=0;
 unsigned long interval_test=180000;


fonction_fermeture();// la porte se ferme
 if (etat_ouverture==LOW)// si le bouton ouverture est presse 
{fonction_automatique();} // la porte repasse en mode automatique
else if (photo_val>200)//si il fait jour

// temporisation non bloquante
{unsigned long currentMillis=millis();//mise a zero du compteur
  if (currentMillis>=previousMillisinterval_test+interval_test)// si t plus 3min 
  {if (photo_val<200)// si maintenant il fait nuit
  {fonction_automatique();}// si nuit retour fonction automatique()
  else fonction_bouton_fermeture();} //sinon fonction bouton fermeture() 
  }   
  if (etat_porte==false)
{digitalWrite(led_fermeture,HIGH);
delay(100);
digitalWrite(led_fermeture,LOW);
  delay(2000);}
  }

 // gestion de l'ouverture a regler
void fonction_ouverture()// fonction qui gere l'ouverture de la porte
{
for (int speed=0; speed<=400;speed++)
  {motors.setM1Speed(speed);
  delay(2);
  }
for (int speed=400;speed>=0;speed--)
  {motors.setM1Speed(speed);
  delay(2);
  }
 etat_porte=true; 
  }

  

void fonction_fermeture()// fonction qui gere la fermeture de la porte
{
for (int speed=0; speed<=400;speed++)
  {motors.setM1Speed(speed);
  delay(2);
  }
for (int speed=400;speed>=0;speed--)
  {motors.setM1Speed(speed);
  delay(2);
  }
  etat_porte=false;
  }