Go Down

Topic: problème de "delay" (Read 412 times) previous topic - next topic

Vaevictis

Bonjour.
En premier lieu merci de votre indulgence.
Je ne suis pas pertinent du tout sur le sujet, et je manque cruellement de bases sur arduino.
Néanmoins, j'essaie mais je suis certainement très brouillon..

Bon, ceci étant dit, j'ai un système de porte qui se ferme avec 3 conditions, heure, lumière, buttée.
La fermeture s'arrête lorsqu'une autre butée est atteinte.
Le matin ça s'ouvre etc.
Vous l'avez compris, c'est une porte de poulailler.
Ca marche, et je pourrais m'en satisfaire.

Mais non..
Je voudrais que le système soit temporisé, et ajouter un "delay" entre l'atteinte des 3 conditions et le démarrage de la fermeture. C'est ce que j'ai mis dans la partie "SOIR"
J'ai donc mis un "delay" de 20000 dans mon exemple après les conditions if d'heure et de lumière et de buttée..
Ca marche, la fermeture s'active bien après la temporisation.
MAIS, lorsque la butée de fin de course est atteinte, le STOP reprend également ce "delay" et le moteur continue de tourner.
Je ne vois pas pourquoi, et j'ai atteint mes limites sur le sujet.
Merci d'avance pour votre aide et encore votre indulgence.




Code: [Select]

void loop() {
  //module RTC
  ds1302_struct rtc;
  char buffer[80];     // the code uses 70 characters.

  // Read all clock data at once (burst mode).
  DS1302_clock_burst_read( (uint8_t *) &rtc);

  sprintf( buffer, "Time = %02d:%02d:%02d, ", \
           bcd2bin( rtc.h24.Hour10, rtc.h24.Hour), \
           bcd2bin( rtc.Minutes10, rtc.Minutes), \
           bcd2bin( rtc.Seconds10, rtc.Seconds));
  Serial.println(buffer);

  sprintf(buffer, "Date(day of month) = %d, Month = %d, " \
          "Day(day of week) = %d, Year = %d", \
          bcd2bin( rtc.Date10, rtc.Date), \
          bcd2bin( rtc.Month10, rtc.Month), \
          rtc.Day, \
          2000 + bcd2bin( rtc.Year10, rtc.Year));




  int ldr = analogRead(A0);
    int coursehaut = digitalRead(6);
  int coursebas = digitalRead(7);
int voyantrouge = digitalRead(6);
  int voyantvert = digitalRead(7);


  if (voyantvert == HIGH)
  {
    digitalWrite(10, HIGH);
    delay(100);
    digitalWrite(10, LOW);

  }
  if (voyantrouge == HIGH)
  {
    digitalWrite(8, HIGH);
    delay(100);
    digitalWrite(8, LOW);
    }
  //Serial.println(ldr);
  Serial.println("course haut");
  Serial.println(coursehaut);
  Serial.println("course bas");
  Serial.println(coursebas);
  Serial.println("ldr");
  Serial.println(ldr);
  delay(1000);
  //MATIN
  if ( ((rtc.h24.Hour10 ==  0 & rtc.h24.Hour == 7 ) || (  rtc.h24.Hour10 == 0  &  rtc.h24.Hour == 8) || (  rtc.h24.Hour10 == 0  & rtc.h24.Hour == 9 ) || (  rtc.h24.Hour10 == 0  & rtc.h24.Hour == 9)) && ( ldr > 50) && (coursehaut == 0 ))
  {
    ouverture();
    Serial.println("dehors!");
  }
  if( ((rtc.h24.Hour10 == 0  & rtc.h24.Hour == 7 ) || (  rtc.h24.Hour10 == 0  &  rtc.h24.Hour == 8) || (  rtc.h24.Hour10 == 0  & rtc.h24.Hour == 9 ) || (  rtc.h24.Hour10 == 0  & rtc.h24.Hour == 9))&& (coursehaut==1))
  {
    stop();
    }

//SOIR
if ( ((rtc.h24.Hour10 == 1 & rtc.h24.Hour == 9 & rtc.Minutes10 == 4) || (  rtc.h24.Hour10 == 2  &  rtc.h24.Hour == 0 & rtc.Minutes10 == 4) || (  rtc.h24.Hour10 == 2  & rtc.h24.Hour == 1 & rtc.Minutes10 == 1 ) || (  rtc.h24.Hour10 == 2  & rtc.h24.Hour == 2 & rtc.Minutes10 == 3)) && ( ldr <=0 ) && (coursebas == 0))
{
  delay (20000);
  fermeture();
  Serial.println("on rentre!");
 
}
if( ((rtc.h24.Hour10 == 1 & rtc.h24.Hour == 9 ) || (  rtc.h24.Hour10 == 2  &  rtc.h24.Hour == 0) || (  rtc.h24.Hour10 == 2  & rtc.h24.Hour == 1 ) || (  rtc.h24.Hour10 == 2  & rtc.h24.Hour == 2)) &&(coursebas == 1))
{
  stop();
}


}

void ouverture()
{
  digitalWrite(In1, LOW); // moteur tourne d'un sens
  digitalWrite(In2, HIGH);
  analogWrite(MotEn, 200);

}

void fermeture()
{
  digitalWrite(In1, HIGH); // moteur tourne sens inverse
  digitalWrite(In2, LOW);
  analogWrite(MotEn, 80);


}

void stop()
{
  analogWrite(MotEn, 0); // moteur enable plus alimenté

}

J-M-L

#1
Sep 09, 2017, 11:21 am Last Edit: Sep 09, 2017, 01:36 pm by J-M-L
Bonjour

Vous devriez redéfinir précisément ce que vous voulez effectuer et quand. si la porte est en mouvement d'ouverture, peu importe l'heure vous devez attendre le signal du capteur haut pour arrêter le moteur. Si la porte est en mouvement de fermeture, idem mais en bas.

Je ne comprends pas trop la nécessité du délai puisque vous gérez l'heure... commencez 20 secondes plus tard...

Sinon

Utilisez HIGH et LOW pas 0 et 1 dans le code

nommez les pins par exemple const byte ledRougePin = 6; et faites alors un voyantrouge = digitalRead(ledRougePin); cest plus lisible (je changerais aussi le nom de voyantrouge en etatVoyantRouge) idem pour les autres

Indentez (ctrl-T) le code correctement pour la lisibilité

Utilisez && au lieu de & pour le ET logique (& c'est pour un ET au niveau des bits, ça fonctionne par accident dans votre cas)

Ne mettez pas deux test identiques dans des OU logique, ça ne sert à rien (cf rtc.h24.Hour10 == 0  & rtc.h24.Hour == 9)

Utilisez < et > au lieu de tester toutes les valeurs entre deux extrêmes


Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vaevictis

Bonjour et merci pour ce retour.
Si je souhaite mettre  une temporisation, c'est que le passage à zéro lux détecté par la LDR ne correspond pas forcément au bon vouloir de rentrer des bestioles.
Elles trainent parfois un peu.

Quand au choix horaire pour la fermeture, le principe est que le test se fasse par exemple à 19h..et x minutes jusqu'à ce que la lumière ait suffisamment baissé, ensuite on teste à 20h etc.

Ca marche, visiblement par chance, mais tant mieux.

Par contre mon "délay" qui devrait être d'une vingtaine de minutes ( et non pas 20000 comme je l'ai mis dans le code  pour exemple) perturbe le "stop" des consignes du soir, la consigne STOP prend aussi le DELAY avant de s'activer.

Pour le reste comme je l'ai dit, je suis persuadé que ce que j'ai fait est brouillon et sans doute pas très ortodoxe, mais mon problème pour l'instant est ailleurs.
Si je ne résouds pas ce problème, je peux faire démarrer les test horaires plus tard, mais du coup je perds l'intérêt du test de lumière.



J-M-L

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up