Attendre une certaine valeur d'un capteur

Bonjour, vraiment tout nouveau dans le monde de l'arduino, je ne comprends pas comment on peux pauser en attendant une certaine valeur d'un capteur.

L'histoire:

Je fais un montage simple, un moteur en 12V, une plaque relais, une résistance photo, et le tout est une porte qui se ferme ou qui s'ouvre suivant la luminosité.

Dans le setup je déclare mes sorties relais, et ma variable capteur ''lux''
Dans mon loop, Je lis la valeur lux, si elle est plus haute que le crépuscule, je High mes sorties relais, délais et les coupe.

J'attends que ma valeur lux soit plus petite que mon crépuscule et je ferme....

J'utilise 3 relais pour inverser la polarité de mon moteur.

La question est la, comment j'attends ma valeur lux >= crépuscule avant de fermer ma porte, et comment j'attends l'inverse pour ouvrir???

J'ai essaye avec un while, il ne ne lis plus le lux, j'ai essaye avec un if dans un if puis reset software ça ne marche pas.....

Je ne veux pas que ca loope sans cesse, juste un truc simple pour juste attendre la valeur d'un capteur avant d'effectuer une action unique, jusqu’à une prochaine valeur.....

C'est pourtant la base je le sais mais je ne vois pas comment faire...

Merci d'avance pour vos retours!

met ton code ici, ca sera plus facile pour comprendre le probleme...

ouai mais vous allez rigoler.....

void setup()
{
int lux = analogRead(A0); //capeur LDR
  pinMode( 3 , OUTPUT); //mes 3 relais pour iverser polarite
  pinMode( 4 , OUTPUT);

  pinMode( 5 , OUTPUT);
 
  Serial.begin(9600);
 
 
    
}
 
void loop()
{
  int lux = analogRead(A0); 
    Serial.println(lux);
    
    
    if 
    
    
    (( (lux) >=  (300) ))
    
    //300 c'est ma valeur du crepuscule
 
     { digitalWrite( 3 , LOW );
       digitalWrite( 4 , HIGH );
       digitalWrite( 5 , HIGH ); 
       delay (2000); 
       
       digitalWrite( 3 , HIGH );
       digitalWrite( 4 , HIGH );
       digitalWrite( 5 , HIGH );
       delay (2000);
       
       
       //ici je veux attendre que mon lux soit <= a 300
    
 
      digitalWrite( 3 , LOW );
      digitalWrite( 4 , LOW);
      digitalWrite( 5 , LOW );  
      delay (2000); 
      digitalWrite( 3 , HIGH );
      digitalWrite( 4 , HIGH);
      digitalWrite( 5 , HIGH );
      delay (2000);
      
      //ici attendre que mon lux soit >=300 pour looper
  }

il faut faire ta mesure de lumière en permanence et mettre une variable qui mémorise l’état ou tu es
du genre …

....
byte jour=0;
void setup()
{
....
}
void loop()
{
int lux = analogRead(A0);
// Serial.println(lux);
    
if (lux >=  300  && jour ==0){
	jour=1;
	les 3 relais ...
	delay (2000);
}
if (lux <=  200  && jour ==1){
	jour=0;
	les 3 relais ...
	delay (2000);
}
les 3 relais au repos
delay (60000);//tu peux mettre un plus grand délais
}

bonjour,
il serait bon déjà de te familiariser avec les exemples de l’ide pour voir les déclarations de variables, etc…

pour plus de compréhension, on donne des noms aux variables et assigne une pin.
c’est plus parlant que analogread A0, surtout si on a plusieurs détecteurs, moteurs, etc…

prends un crayon, un papier, mets tes exigences à plat.
les conditions, etc…

pourquoi mettre un delay(600000) voir plus grand???

loop
lecture sonde
si lux >350 =====> mettre relais en position
si lux =<250 =====> mettre relais en position
sinon mettre relais en position

void setup()
{
int lux = analogRead(A0); //capeur LDR
/*  reste du code */      
}
 
void loop()
{
  int lux = analogRead(A0); 
/*reste du code */

Pourquoi tu déclares 2 fois la variable lux ?
A chaque fois comme elle est déclarée à l’intérieur d’une fonction elle ne sera accessible (on dit visible) qu’a l’intérieur de cette fonction.
Soit tu déclare lux avant setup() et elle sera globale et accessible de partout dans ton programme, soit tu la déclare dans une fonction (ou une boucle) et elle ne sera visible que dans la fonction (ou dans la boucle)

Il faut que tu te documentes sur la portée des variables et de leur durée d’existance car il n’y a pas de règle générale.
Par exemple si tu fais :

for (int i =0, i<=10, i++)
{/* code*/}

la variable i ne sera visible qu’à l’intérieur de la boucle for et disparaîtra de la mémoire à la sortie de la boucle alors que si tu l’avais déclaré globale elle serait toujours en mémoire.

Un grand merci pour tous vos retours.

J’ai pu avancer un peu sur le code du coup, j’ai compris la déclaration de fonctions, ou la placer pour quelle soit pris en compte dans une ou toutes les parties du code, et j’ai compris comment une variable stockée me permet d’éviter de pauser ou sortir d’une boucle.

J’ai donc réussi grâce à votre aide à faire ce que je voulais, voici le code

byte jour=0;              //variable stockée

 // mes 3 fonctions:
 
void Fermeture()
  {    digitalWrite( 3 , LOW );
       digitalWrite( 4 , HIGH );
       digitalWrite( 5 , HIGH );
 }
 
void Ouverture()
  {    digitalWrite( 3 , LOW );
       digitalWrite( 4 , LOW);
       digitalWrite( 5 , LOW );
 }
 
void Repos()
    
     { digitalWrite( 3 , HIGH );
       digitalWrite( 4 , HIGH );
       digitalWrite( 5 , HIGH );
    }





void setup()
{



  pinMode( 3 , OUTPUT); //mes 3 relais pour iverser polarite
  pinMode( 4 , OUTPUT);
  pinMode( 5 , OUTPUT);
 
  Serial.begin(9600);
  

}
 
void loop()
{
   int lux = analogRead(A0); //capeur LDR
    Serial.println(lux);
    
    
   if (lux >=  300  && jour ==0)
   
   {
	jour=1;
	
        Fermeture();
	delay (2000);
        Repos();
      
       }
 
    if (lux <=  280  && jour ==1)
    
    {
	jour=0;
	
        Ouverture();
	delay (2000);
        Repos(); 
       
       }
       
   }

Il y a encore quelque-chose que je ne comprends pas, si je déclare mon Lux avant ou pendant mon Setup, je n’ai pas de lecture du A0. j’ai l’ai donc décalé dans mon Loop et la ça marche…Pourtant si je déclare une variable avant les fonctions, elle devrait etre prise en compte dans toutes les fonctions non?

Encore merci pour votre aide!

Bartolonew:
Pourtant si je déclare une variable avant les fonctions, elle devrait etre prise en compte dans toutes les fonctions non?

Bonjour,

Oui, si tu ne la redéclares pas dans la fonction. Si tu la redéclares dans la fonction, c'est celle qui est déclarée dans fonction qui est prioritaire.

pour la déclarer avant le setup : int lux = 0;
puis dans loop : lux = analogRead(A0);

mais comme tu as fait c'est bon a condition de ne pas avoir besoin de cette variable dans une autre fonction

Bartolonew:
Je ne veux pas que ca loope sans cesse, juste un truc simple pour juste attendre la valeur d’un capteur avant d’effectuer une action unique, jusqu’à une prochaine valeur

Il n’y a pourtant pas de problème à ce que ta board boucle sans cesse, elle est meme prévue pour ça.

Par contre si c’est pour des soucis d’autonomie, il est possible de la mettre en sommeil et prévoir un réveil au moment opportun

rjnc38:
pour la déclarer avant le setup : int lux = 0;
puis dans loop : lux = analogRead(A0);

mais comme tu as fait c'est bon a condition de ne pas avoir besoin de cette variable dans une autre fonction

Ah ok c'est un raccourci....Donc on reprends, si je déclare int lux=0 avant le setup, cette valeur est declaree pour toutes les fonctions. Si je déclare int lux = analogRead(A0) dans le loop, elle ne sera prise en compte que dans celui-ci?

Jambe:
Il n'y a pourtant pas de problème à ce que ta board boucle sans cesse, elle est meme prévue pour ça.

Par contre si c'est pour des soucis d'autonomie, il est possible de la mettre en sommeil et prévoir un réveil au moment opportun

Oui oui je sais bien il me manquais la fameuse valeur jour=0 pour stocker le dernier état, sans cette connaissance impossible d'imaginer une fonction unique, un arrêt de celle-ci et une veille jusqu'au trig d'une autre action....

Bartolonew:
Ah ok c'est un raccourci....Donc on reprends, si je déclare int lux=0 avant le setup, cette valeur est declaree pour toutes les fonctions. Si je déclare int lux = analogRead(A0) dans le loop, elle ne sera prise en compte que dans celui-ci?

oui relire la réponse de 68tjs en #6

Bon tout roule, j'ai finalisé mon code avec encore quelques petites améliorations, testé avec succès, un grand merci à vous tous qui m'avez aiguillé, aidé et renseigné, je suis fier et heureux de faire partie de la communauté arduino....

Allez merci encore!