problème de prog arduino pour un volet électrique automatique d'un poulailler

Bonjour à tous, je suis actuellement sur un petit projet d’automatisation d’un volet électrique pour un poulailler. J’ai déjà conçu la carte électronique mais le problème réside dans la programmation de l’arduino.

J’ai sur ma carte 2 relais qui sont à l’etat bas de base et je commande ces relais via une photorésistance.
Il y a un relais pour fermer le volet et un relais pour ouvrir le volet.
Dans mon raisonnement, si la photorésistance atteint un seuil de 200 et moins (valeur analogique de la photorésistance de nuit) le relais 1 doit être à l’etat haut pendant 10 secondes (le temps de la descente du volet) puis doit revenir à l’etat bas. Même chose pour la monté du volet (800 et plus pour le jour). Mais c’est justement là où est le problème je n’arrive pas à arrêter la boucle pour que les relais ne soient alimentés que pendant les 10 secondes demandées.

Je veux que le relais par exemple la nuit se déclenche pendant 10 s puis d’éteint si il fait toujours nuit (200 et moins) et même chose pour le jour.

voici le code que j’ai expérimenté mais il ne fonctionne pas comme je le veux:

int photoresistPin = 0; // photorésistance connecté au pin A0
int lecturephotoresist; // variable de lecture de la photorésistance
int relais1 = 7;
int relais2 = 6;
void setup(void)
{

Serial.begin(9600);
pinMode(relais1, OUTPUT); //relais en sortie
pinMode(relais2, OUTPUT);
}

void loop(void)
{
lecturephotoresist = analogRead(photoresistPin);

if (lecturephotoresist < 200)

{
Serial.println(" - soir");
digitalWrite(relais1, HIGH); // fermer le store
delay(10000);
while (lecturephotoresist < 200)
{
digitalWrite(relais1, LOW);
}
}
else if (lecturephotoresist > 800)
{
Serial.println(" - matin");
digitalWrite(relais2, HIGH); // ouvrir le store
delay(10000);

while (lecturephotoresist > 800)
{
digitalWrite(relais2, LOW);
}
}
}

Merci pour votre aide :slight_smile:

Bonjour,

C'est bien simple: il suffit de ne pas fermer le store s'il est déjà fermé et de ne pas l'ouvrir s'il est déjà ouvert. Pour cela il suffit d'un boolen qui mémorise l'état du store.

Cela veut donc dire que je n'ai pu besoins de la boucle while ?

Je vais essayer de faciliter ma question avec un organigramme

Mon but est de stopper la boucle une fois la condition l’action de la condition rempli. C’est à dire que je veux faire marcher 10 seconde mon relais 1 puis que cela s’arrête. Je n’ai pas trop compris l’objectif du boolean, avec quoi je mémorise l’état du store.

merci de ta réponse :slight_smile:

ton organigramme est bien ce que j’avais compris
l’objectif du booleen est de ne pas actionner le relais de fermeture si le store est déjà fermé et inversement

int photoresistPin = 0; // photorésistance connecté au pin A0
int lecturephotoresist; // variable de lecture de la photorésistance
int relais1 = 7;
int relais2 = 6;
void setup(void)
{

  Serial.begin(9600);
  pinMode(relais1, OUTPUT); //relais en sortie
  pinMode(relais2, OUTPUT);
}

bool storeOuvert = true;

void loop(void)
{
  lecturephotoresist = analogRead(photoresistPin);

  if (lecturephotoresist < 200)
  {
    if (storeOuvert)
    {
      Serial.println(" - soir");
      digitalWrite(relais1, HIGH); // fermer le store
      delay(10000);
      digitalWrite(relais1, LOW);
      storeOuvert = false;
    }
  }

  if (lecturephotoresist > 800)
  {
    if (!storeOuvert)
    {
      Serial.println(" - matin");
      digitalWrite(relais2, HIGH); // ouvrir le store
      delay(10000);
      digitalWrite(relais2, LOW);
      storeOuvert = true;
    }
  }
}