Partage
  • Partager sur Facebook
  • Partager sur Twitter

Allumer la lumière avec Arduino

Erreur lumière

    10 octobre 2021 à 10:37:24

    Bonjour j'ai essayé d'automatiser l'allumage de la lumière de ma chambre par un Arduino, j'ai un module ultrason d'arduino (HC-SRO4) que je n'utiliser pas donc j'ai décidé de m'en servir comme capteur, la première partie du code marcher bien quand je passer devant le capteur et donc la longueur entre mon mur et l'arduino était moins de 60cm la lumière s'allumer mais elle s'allumer aussi la journée donc j'ai décidé de créer une fonction heure en seconde et donc si il n'es pas entre 28800 seconde (8h) et 61200 seconde (17h) la lumière s'allume (c'est pour que la lumière s'allume que lorsque il fait nuit), (j'ai prévu dans le futur de m'acheter un photodiode pour ne plus avoir à régler l'heure de l'arduino a chaque fois) mais maintenant la lumière clignote au lieu de s'étendre et il s'allume quand je passe devant alors que il est entre 8h et 17h je ne sais pas comment régler ça, si quelqu'un pouvait m'aider ça m'arrangerait bien.

    Voici mon code Arduino :

    const byte TRIGGER = 12; // broche TRIGGER
    const byte ECHO = 13; // broche ECHO
    #define etat 11
    bool flag;
    
    const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = 8m à 340m/s
    
    const float SOUND_SPEED = 340.0 / 1000;
    
    long heure = 0;
    void setup() {
      
      Serial.begin(115200);
      pinMode(etat, OUTPUT);
      pinMode(TRIGGER, OUTPUT);
      digitalWrite(TRIGGER, LOW);
      pinMode(ECHO, INPUT);
      pinMode(1, OUTPUT);
      pinMode(2, OUTPUT);
      flag = false;
      heure = 36000;
    }
    void loop() {
      /* 1 envoie une impulsion HIGH de 10 us sur broche trigger */
      digitalWrite(etat, HIGH);
      digitalWrite(TRIGGER, HIGH);
      delayMicroseconds(10);
      digitalWrite(TRIGGER, LOW);
      
      /* 2 Mesure le temps entre l'envoi de l'impulsion et son echo */
      long measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT);
      
      /* 3 calcul la distance a partir du temps mesuré */
      
      float distance_mm = measure / 2.0 * SOUND_SPEED;
      Serial.println(distance_mm / 10.0, 2);
      if ( (distance_mm > 600) && (heure>28800) && (heure<61200) ){
        flag = true;
        digitalWrite(2, HIGH);
        digitalWrite(1, LOW);
        delay(500);
      } else {
        if (flag){
          flag = false;
          digitalWrite(2, LOW);
          digitalWrite(1, HIGH);
        } else {
          flag = true;
          digitalWrite(2, HIGH);
          digitalWrite(1, LOW);
        }
        delay(500);    
      }
      delay(1000);
      heure = heure + 1;
    }



    -
    Edité par HrayrMirzoyan 10 octobre 2021 à 10:55:55

    • Partager sur Facebook
    • Partager sur Twitter
      11 octobre 2021 à 14:05:06

      Incrémenter une variable avec un delay de 1000, ça semble plutôt logique mais cela ne prend pas en compte le temps d'exécution du programme.

      Par exemple, quand tu fais un delay(500), cela retarde de 0.5s et ta variable heure ne le prend pas en compte.

      Pareil pour la fonction pulseIn qui bloque ton programme un certain temps et donc décale petit à petit ton heure.

      Je te conseille plutôt d'utiliser la fonction millis() qui renvoit le nombre de millis seconde écoulé depuis le lancement du programme.

      En devisant par 1000, tu auras le nombre de seconde, sans décalage, ce qui est plutôt intéressant.

      -----

      Ensuite, plutôt que de faire un delay 1000 qui va bloquer ton programme pendant une seconde et te risquer de faire perdre des passages, tu ferais mieux de faire un delay de 50 de façon à faire tes lectures beaucoup plus souvent.

      Ainsi, tu ne risquera pas de rater un passage.

      Par contre, il est possible que tu détectes plusieurs fois de suite la main, ce qui aurait pour effet de faire clignoter ton ampoule.

      Du coup, tu ferais mieux de faire un changement de l'ampoule que si il y a un changement dans la détection.

      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2021 à 2:14:19

        Je ne suis pas électronicien (juste curieux).
        Pour la photo-diode, ne pourrais-tu pas avoir le même genre de problème?
        La lumière risque d'osciller quand il fait sombre durant le jour? Il faudra prévoir un seuil.
        Une bascule de Schmitt serait sans doute appropriée.
        Pour les heures, si tu veux aller plus loin, il faudrait tenir compte de la date et de ta lattitude.
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          17 novembre 2021 à 14:24:15

          Ce genre de détection n'est pas aussi aisé que ça à réaliser, mais effectivement ton mode te temporisation est un peu scabreux comme te l'a fais remarquer Lorrio, chaque instruction exécutée va prendre un certains nombre de cycle d'horloge et donc créera un décalage temporel (ça me rappel l'époque de l'assembleur ou pour faire un delay 1000 il fallait faire décrémenter des registres dans des boucles imbriquées en calculant le nombre de cycle horloge du processeur). 

          Pour ta photorésistance tu pourrais créer un système à hystérésis en faisant des plages dans ton programme afin de ne pas avoir ta lumière qui clignote sans arrêts quand tu as une luminosité au niveau de ton pivot. Moi je te conseillerais de passer par une RTC dans ton système si tu veux avoir les horaires, plus simple et plus précis. 

          • Partager sur Facebook
          • Partager sur Twitter

          Allumer la lumière avec Arduino

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown