Effectuer une action qu'une seule fois dans le loop() ?


bonjour et bonne fête  8), après moult recherche, j'en arrive la conclusion que c'est la jungle dans l'information, et que par conséquent je n'ai pas réussi trouver ce que je cherchais...

donc pour faire claire et ne pas trop vous faire perdre du temps, voilà ce que je veut :

lecture de la valeur de ma photorésistance

si elle dépasse 500
alors actionner le moteur dans le sens horaire, une seul fois pendant x secondes puis le moteur stop jusqu'à au prochain changement d'état.
sinon si elle ne dépasse pas 500
alors actionner le moteur dans le sens anti-horaire une seule fois pendant x secondes puis le moteur stop jusqu'à au prochain changement d'état.

le étant de contrôler le moteur avec une lampe
si ça reste allumé le moteur ouvre une trappe.
si ça s'éteint il la ferme.

j'ai donc réussis pwm le moteur pour avoir la longueur d'action que je souhaitais, malheureusement le moteur tourne en boucle...
code: [select]

const int monter = 2; // connecte au pin 7 du h-bridge
const int descendre = 3; // connecte au pin 2 du h-bridge
const int onoff = 9;   // connecte au pin 1 du h-bridge
int capteur1 = a0; // capteur de lumière
int lum1 = 0;


void setup()
{
  pinmode(monter, output);
  pinmode(descendre, output);
  pinmode(onoff, output);
  digitalwrite(monter,low);
  digitalwrite(descendre, low);
}
void loop()
{         
  lum1 = analogread(capteur1); // lecture de la valeur du capteur1.

  if (lum1 > 500)// si lecture est supérieur à 500 le moteur monte en accélérant.
    {
      digitalwrite(monter, high);
      digitalwrite(descendre, low);
      moteuraccelerationpwm();
    }
 
  if (lum1 < 500) // si lecture est inférieur 500 le moteur descend en ralentissant.
    {
    digitalwrite(monter,low);
    digitalwrite(descendre, high);
    moteurdescelerationpwm();
    }
}

void moteuraccelerationpwm()
{
  // acceleration
  for( int = 80; i<= 90; i++ )
  {
    analogwrite( onoff, );
    delay(50); // delay pour avoir un progression
   
  }
}

void moteurdecelerationpwm()
{
  // deceleration
  for( int = 90; i>=80; i-- )// (déclaration valeur instruction (ici, = 31% pwm); while (tant que est plus grand que 0; alors décrémente)
  {
    analogwrite( onoff, );
    delay(50); // delay pour avoir un progression
   
  }
}


je pense que le problème ne vient pas de mes deux fonctions "moteurdecelerationpwm()" et "moteuraccelerationpwm()" mais du loop qui part du principe que si la lumière on/off alors effectue cette action en boucle...
donc comment faire pour que la lecture déclenche l'action qu'une seule fois, mais qu'un changement d'état la fasse repartir ?

bonjour,
tu mets une variable en plus qui prend une valeur style
code: [select]

int valid = 0;
....
....
.....
if (lum1 > 500 && valid == 0)
{
      digitalwrite(monter, high);
      digitalwrite(descendre, low);
      moteuraccelerationpwm();
valid = 1;
    }
 
  if (lum1 < 500 && valid ==1 ) // si lecture est inférieur 500 le moteur descend en ralentissant.
    {
    digitalwrite(monter,low);
    digitalwrite(descendre, high);
    moteurdescelerationpwm();
valid = 0;
    }





Arduino Forum > International > Français (Moderators: jfs, Snootlab) > Effectuer une action qu'une seule fois dans le loop() ?


arduino

Comments

Popular posts from this blog

opencv3, tbb and rasp pi 2 - Raspberry Pi Forums

small ethernet problem - Raspberry Pi Forums

Multithumb configuration params not working? - Joomla! Forum - community, help and support