Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide TIPE

projet arduino

    2 février 2021 à 17:33:28

    Bonjour, 

    je suis actuellement en classe de CPGE PTSI, je dois donc faire un projet sur deux ans avec pour thèmes les enjeux sociétaux.

    Pour ma part j'ai donc choisi de réaliser un système de lampadaire plus économe en énergie. J'aimerais réaliser ça grâce à une carte arduino. J'ai commencer à écrire mon programme sur le logiciel Tinkercad. J'ai donc deux capteurs PIR un chaque bout de la rue fixé sur des lampadaires. Quand un des deux détecte une présence les lampadaires s'allume en cascade dans un sens et dans l'autre pour l'autre capteur. Pour cela j'ai donc utilisé des boucles IF, dans cette on pourra voir les différents phases d'allumage de mes lampadaires. Cependant j'aimerais que quand mon cycle d'éclairage est en cours si le deuxième capteur détecte lui aussi une présence alors toutes les leds s'allument. Mon problème est donc celui ci, je n'arrive pas à faire que toutes les leds s'allument quand un des capteurs à déjà détecté une valeur et que l'autre en détecte une nouvelle.

    Merci pour votre aide.

    Voici mon code et une photo du circuit :

    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2021 à 18:59:18

      Il y a une balise prévue pour insérer du code, ce serait beaucoup plus simple et pratique que d'avoir à insérer de multiples images.

      Ensuite,  je dirais que ton problème réside dans l'utilisation des delay, qui est inadapté dans ton cas.

      En effet, delay est bien pratique mais pendant que l'arduino fait un delay, il ne fait rien d'autre à part attendre, donc il ne test pas l'état des capteurs.

      Il serait beaucoup plus logique d'utiliser la fonction millis et de faire tes calculs là dessus.

      Cette fonction millis renvoie le nombre de milli-seconde écoulées depuis le lancement du programme, ce qui est très pratique.

      Dès qu'un capteur s'active, il te suffit de sauvegarder la valeur actuelle de millis dans une variable pour l'utiliser ensuite.

      Reste ensuite à comparer cette valeur avec la nouvelle valeur pour en déduire combien de temps il s'est écoulé et agir en conséquence.

      Voici un petit exemple :

      // Sauvegarde de millis lors de l'activation du capteur 1, ou 0 si non activé
      uint32_t timeSensor1 = 0;
      
      
      void loop() {	
      
      	// Récupération de millis()
      	uint32_t timeNow = millis();
      
      	// Si capteur 1 actif
      	if ( capteur 1 actif ) {
      		// On sauvegarde
      		timeSensor1 = timeNow;
      	}
      
      	// Si le capteur a été activé, alors on agit
      	if ( timeSensor1 != 0 ) {
      		
      		// On calcul depuis combien de temps.
      		uint32_t timeElaps = ( timeNow - timeSensor1 );
      
      		// Si moins de 1s
      		if ( timeElaps < 1000 ) {
      			Serial.print("Le capteur est actif depuis moins de 1s");
      		}
      		// Si entre 1 et 2s:
      		else if ( timeElaps < 2000 ) {
      			Serial.print("Le capteur a ete active entre 1 et 2s");
      		}
      		// Sinon, on désactive
      		else {
      			timeSensor1 = 0;
      		}
      	
      	}
      
      }

      Tu remarqueras qu'il n'y a aucun appel à la fonction delay donc aucun moment où le processeur est bloqué.

      Du coup, il va passer son temps à tester le capteur et faire les séries de if/elseif en boucle.

      Tu peux donc parfaitement gérer une multitude de capteurs en simultané en utilisant simplement des variables différentes.

      Et tu peux aussi savoir si 2 capteurs ont été activé avec un if du genre : if ( (timeSensor1 != 0) && (timeSensor2 != 0) ) {

      -
      Edité par lorrio 2 février 2021 à 19:01:29

      • Partager sur Facebook
      • Partager sur Twitter
        7 avril 2021 à 8:24:43

        Bonjour, 

        grâce à votre aide j'ai pu avancer dans mon programme. Cependant je suis à nouveau confronté à un problème, en effet j'ai donc un if qui teste si mon capteur détecte un mouvement et ensuite ma fonction millis se lance et allume mes leds, malheureusement cela ne fonctionne pas. Je pense que le capteur détecte bien une valeur mais elle ne reste pas éternellement donc mon millis ne tourne pas assez longtemps pour allumer toutes les leds. Je cherche donc une solution pour palier à ce soucis, j'aimerais donc détecter une présence grâce à mon capteur et après ça lancer l'allumage de mes leds avec millis.

        const int analogInPin2 = A1;   
        const int analogInPin = A0;   
        
        int Broche_Sortie;
        
        int Broche_Entree;
        
        int sensorValue = 0;          
        int outputValue = 0;          
        int sensorValue2 = 0;          
        int outputValue2 = 0;
        
        int Sortie_LED = 3;
        
        unsigned long Temps_Actuel;
        unsigned long Temps_Precedent = 0;
        
        long Intervalle = 3000;
        
        void setup() {
         
          pinMode(analogInPin, INPUT);
          pinMode(analogInPin2, INPUT);
          
          for (Broche_Entree = 3; Broche_Entree <= 6; Broche_Entree++){
            pinMode(Broche_Entree, OUTPUT);
          }
          
          for (Broche_Sortie = 7; Broche_Sortie <= 10; Broche_Sortie++){
            pinMode(Broche_Sortie, OUTPUT);
          }
        
          Serial.begin(9600);
        
        }
        void loop() {
         
        
          
          
         
          sensorValue = analogRead(analogInPin);
          sensorValue2 = analogRead(analogInPin2);          
          
          
          outputValue = map(sensorValue, 0, 1023, 0, 255);
          outputValue2 = map(sensorValue2, 0, 1023, 0, 255); 
          
        
        
         if (outputValue > 0)
          {
          Temps_Actuel = millis();
          
          if (Temps_Actuel - Temps_Precedent >= Intervalle){
          digitalWrite(Sortie_LED,HIGH);
          Temps_Precedent = Temps_Actuel;
          Sortie_LED++;
          }
          }	
          Serial.print("Temps Actuel : ");
          Serial.print(Temps_Actuel);
          
          Serial.print(" Temps Precedent : ");
          Serial.print(Temps_Precedent);
          
          Serial.print(" Etat Broches Sorties : ");
          Serial.print(digitalRead(3));
          
          Serial.print(digitalRead(4));
          
          Serial.print(digitalRead(5));
          
          Serial.print(digitalRead(6));
          
        }  
        • Partager sur Facebook
        • Partager sur Twitter
          8 avril 2021 à 8:11:07

          Dans ton code, tu as ceci :

          if (outputValue > 0) {
          	Temps_Actuel = millis();
          	if (Temps_Actuel - Temps_Precedent >= Intervalle) {
          		digitalWrite(Sortie_LED,HIGH);
          		Temps_Precedent = Temps_Actuel;
          		Sortie_LED++;
          	}
          } 

          Donc ton programme ne s'occupe de la gestion de la LED que si le capteur est actif, ce qui explique ton problème.

          Ce qu'il te faudrait faire, c'est lancer ton timer millis sur activation du capteur, puis ignorer l'état du capteur ensuite.

          Un truc dans ce genre :

          // Si le capteur est actif,
          if (outputValue > 0) {
          	// Et que le timer est à l'arrêt,
          	if (Temps_Precedent == 0) {
          		// Alors on lance le timer !!!
          		Temps_Precedent = millis();
          	}
          }
          
          // Ensuite, dans tous les cas, peu importe l'état du capteur
          // Si le timer a été lancé, alors on s'en occupe
          if (Temps_Precedent != 0) {
          	Temps_Actuel = millis();
          	if (Temps_Actuel - Temps_Precedent >= Intervalle) {
          		digitalWrite(Sortie_LED,HIGH);
          		Temps_Precedent = Temps_Actuel;
          		Sortie_LED++;
          	}
          }
          

          Il te faudra aussi rajouter un if pour couper le timer (remettre Temps_Precedent à 0) une fois que tu auras allumé toutes tes LEDs.


          • Partager sur Facebook
          • Partager sur Twitter

          Aide TIPE

          × 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