Partage
  • Partager sur Facebook
  • Partager sur Twitter

Projet terminal STI2D : Aquarium

    13 avril 2018 à 8:45:30

    Bonjour à vous.

    Je me présente à vous car j'aurai besoin d'aide sur mon projet de terminal STI2D dans lequel je dois automatisé un aquarium à l'aide d’Arduino

    Nous sommes 3 sur ce projet et j'ai pas mal avancé sur ma partie, le seul problème c'est que je suis bloqué en ce moment... Je dois pouvoir réaliser plusieurs tâches les unes après les autres sauf que cela ne marche pas. De plus j'aimerais, si possible, avoir votre avis sur mon programme (data sheet + mes ajustements avec les contraintes).

    Merci beaucoup.

    Programme ::

    #define SensorPin A0
    #define Offset 0.00
    #define LED 13
    #define samplingInterval 20
    #define printInterval 3000
    #define ArrayLenth 40
    
    int pHArray[ArrayLenth];
    int pHArrayIndex=0;
    int Relais = 6;// Variable du relais
    int Lampe = 8; // variable de la lampe
    int time;
    int h;
    int Diffuseur = 4; // Variable du diffuseur de CO2
    int pHvalue = 2; // Variable du pH
    
    void setup() {
      pinMode(Relais, OUTPUT); // relais en mode OUTPUT
      pinMode(Diffuseur, OUTPUT); // diffuseur en mode OUTPUT
      pinMode(LED, OUTPUT);
      Serial.begin(9600); // Communication série
      Serial.println( " Que notre écosystème vive ! ");
      Serial.println( "Expérimentation du pH !" );
      gestionLampe(); // fonction qui gère tout le fonctionnement de la lampe
      gestionDiffuseur(); // fonction qui gère tout le fonctionnement du diffuseur
    }
    void loop() {
       static unsigned long samplingTime = millis();
      static unsigned long printTime = millis();
      static float pHValue,voltage;
      if(millis()-samplingTime > samplingInterval)
     
      {
          pHArray[pHArrayIndex++]=analogRead(SensorPin);
          if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
          voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
          pHValue = 3.5*voltage+Offset;
          samplingTime=millis();
      }
      if(millis() - printTime > printInterval)   //Every 800 milliseconds, print a numerical, convert the state of the LED indicator
      {
      Serial.print("Voltage:");
            Serial.print(voltage,2);
            Serial.print("    pH value: ");
      Serial.println(pHValue,2);
            digitalWrite(LED,digitalRead(LED)^1);
            printTime=millis();
      }
    }
    double avergearray(int* arr, int number){
      int i;
      int max,min;
      double avg;
      long amount=0;
      if(number<=0){
        Serial.println("Error number for the array to avraging!/n");
        return 0;
      }
      if(number<5){   //less than 5, calculated directly statistics
        for(i=0;i<number;i++){
          amount+=arr[i];
        }
        avg = amount/number;
        return avg;
      }else{
        if(arr[0]<arr[1]){
          min = arr[0];max=arr[1];
        }
        else{
          min=arr[1];max=arr[0];
        }
        for(i=2;i<number;i++){
          if(arr[i]<min){
            amount+=min;        //arr<min
            min=arr[i];
          }else {
            if(arr[i]>max){
              amount+=max;    //arr>max
              max=arr[i];
            }else{
              amount+=arr[i]; //min<=arr<=max
            }
          }//if
        }//for
        avg = (double)amount/(number-2);
      }//if
      return avg;
        }
    }
    void gestionLampe() {
      if (time = 11) {
        digitalWrite(Lampe, HIGH);
        Serial.println( " La lampe est allumée" );
      }
      {
      if (time = 17) {
        digitalWrite(Lampe, LOW);
        Serial.println( " La lampe est éteinte " );
      }
     }
    }
    void gestionDiffuseur() {
    {
      if (pHvalue<6)
        digitalWrite(Diffuseur, LOW);
        Serial.println( " Arrêt du diffuseur - pH trop acide " );
    }
    {
      if (pHvalue>8)
        digitalWrite(Diffuseur, HIGH);
        Serial.println( " Diffuseur en action - pH trop basique " );
    }
    {
      if (6<pHvalue<8)
        digitalWrite(Diffuseur, HIGH);
        Serial.println( " Diffuseur en action - pH adéquate " );
    }
    }



    Pour le "time" j’attends que mes compagnons fasse leur programme afin de pouvoir compléter le programme.

    -
    Edité par lorrio 13 avril 2018 à 10:12:07

    • Partager sur Facebook
    • Partager sur Twitter
      13 avril 2018 à 10:17:47

      Que veux tu dire exactement par "je suis bloqué" et "ça ne marche pas" ???

      Ce serait bien que tu nous dises ce que tu aimerais que ça fasse et ce que tu nous expliques ce que ton programme actuel fait réellement.

      Ainsi, on pourra te donner des pistes de corrections de ton programme pour que celui-ci fasse ce que tu as envie.

      En attendant, je ne peux que te conseiller de revoir un peu les cours à propos des conditions.

      // EXEMPLE 1:
      
      // Code incorrect : 
      if ( val = 15 ) {
      
      // Code correct :
      if ( val == 15 ) {
      
      // EXEMPLE 2:
      
      // Code incorrect : 
      if ( 10 < val < 20 ) {
      
      // Code correct :
      if ( ( 10 < val ) && ( val < 20 ) ) {
      
      
      
      



      • Partager sur Facebook
      • Partager sur Twitter
        13 avril 2018 à 11:33:39

        Merci de votre réponse ainsi que de votre éventuelle aide

        Une fois que je lance mon programme, tout se lance de façon direct. C'est à dire qu'il n'y a pas succession d'étapes mais seulement application du programme en 1 coup et cela répété à l'infini.

        L'idée de mon projet est de rendre mon aquarium autonome à l'aide d'arduino, ma partie est la suivante

        -Suivant le pH, activer ou non le "Diffuseur" de CO2 (pH<6 = acide -> Arrêt du diffuseur ; 6<pH<8 = neutre -> Activation du diffuseur ; pH>8 = basique -> Activation du diffuseur)

        ( code récupéré sur la datasheet - Qui lui ne fait que récupérer les valeurs du pH présent dans l'aquarium :"https://www.dfrobot.com/wiki/index.php/PH_meter(SKU:_SEN0161)#Introduction")

        -Suivant l'heure de la journée (cycle circadien) activer ou éteindre la lampe

        Si besoin, j'ai la fiche descriptive de mon projet si je ne suis pas assez claire

        -
        Edité par DzoopDouv 13 avril 2018 à 11:43:38

        • Partager sur Facebook
        • Partager sur Twitter
          13 avril 2018 à 17:05:14

          Salut !

          Alors ton code s'exectue en boucle c'est normal, tu initialise les variables à chaque boucle donc retour à 0. Il faut donc déclarer t'es variable en dehors de la boucle

          int pHArray[ArrayLenth];
          int pHArrayIndex=0;
          int Relais = 6;// Variable du relais
          int Lampe = 8; // variable de la lampe
          int time;
          int h;
          int Diffuseur = 4; // Variable du diffuseur de CO2
          int pHvalue = 2; // Variable du pH
          
          unsigned long samplingTime;
          unsigned long printTime;
          void loop() {
             static float pHValue,voltage;
          
          ....
          
          }

          En suite il y a une erreur au niveau des {}

          void gestionDiffuseur() {
            if (pHvalue < 6){
              digitalWrite(Diffuseur, LOW);
              Serial.println( " Arrêt du diffuseur - pH trop acide " );
            }
            else if (pHvalue > 8)
              digitalWrite(Diffuseur, HIGH);
              Serial.println( " Diffuseur en action - pH trop basique " );
            }
            else{
              digitalWrite(Diffuseur, HIGH);
              Serial.println( " Diffuseur en action - pH adéquate " );
            }
          }
          • Partager sur Facebook
          • Partager sur Twitter
            15 avril 2018 à 17:24:40

            Attention au fait que tu déclares 2 fois la variable pHvalue (une fois à la ligne 15, une fois à la ligne 28).

            Du coup, la variable static pHvalue de loop remplace la variable globale pHvalue de l'espace globale, uniquement à l’intérieur de loop.

            En clair, la fonction loop va modifier sa variable pHvalue tandis que la fonction gestionDiffuseur va utiliser la variable pHvalue globale qui elle, n'aura pas été modifiée.

            • Partager sur Facebook
            • Partager sur Twitter
              3 mai 2018 à 15:43:00

              Excusez-moi pour mon manque de présence sur le site... Suite à différentes histoires familiales l'accès à internet et les sorties furent assez difficiles..

              Bref passons.

              Bien que mon programme ne soit pas au point, suis-je en soit sur la bonne voie pour répondre à la demande de mon projet ? Oui il me faut revoir les notions sur "if" et sur la déclaration de ma variable, je m'y remet de suite.

              • Partager sur Facebook
              • Partager sur Twitter
                4 mai 2018 à 8:18:31

                C'est-à-dire qu'il me faut par exemple définir une variable : "int vc = 6;" et remplacer dans mon 'if' ceci :

                ----


                if (pHArray[ArrayLenth] < vc) {
                  digitalWrite(diffuseur, LOW);
                  Serial.begin(9600);
                  Serial.print("pH : acide");
                }
                else
                {
                  digitalWrite(diffuseur, HIGH);
                  Serial.begin(9600);
                  Serial.print("pH : Adéquate");
                }

                Le programme ce compil bien car je l'ai rajouté dans la grande boucle plutôt que de la mettre à part et tout faire planter. Seulement mon message ne s'affiche pas Alors que le programme ce compil bien ! Aucune de mes phrases ne s'affiche "pH : Adéquate" alors qu'il est censé être "Adéquate" puisque dans ma mesure, celui ci est à 7.40

                --

                Pour le moment j'ai repris la datasheet et m'occupe de l'activation ou non du diffuseur.

                --

                #define SensorPin A0            //pH meter Analog output to Arduino Analog Input 0
                #define Offset 0.00            //deviation compensate
                #define LED 13
                #define samplingInterval 20
                #define printInterval 3000
                #define ArrayLenth  40    //times of collection
                
                int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
                int pHArrayIndex=0;  
                int diffuseur = 10;
                int vc = 6;
                
                void setup(void)
                {
                  pinMode(LED,OUTPUT);  
                  Serial.begin(9600);  
                  Serial.println("pH meter experiment!");    //Test the serial monitor
                }
                void loop(void)
                {
                  static unsigned long samplingTime = millis();
                  static unsigned long printTime = millis();
                  static float pHValue,voltage;
                  if(millis()-samplingTime > samplingInterval)
                  {
                      pHArray[pHArrayIndex++]=analogRead(SensorPin);
                      if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
                      voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
                      pHValue = 3.5*voltage+Offset;
                      samplingTime=millis();
                  }
                  if(millis() - printTime > printInterval)   //Every 800 milliseconds, print a numerical, convert the state of the LED indicator
                  {
                  Serial.print("Voltage:");
                        Serial.print(voltage,2);
                        Serial.print("    pH value: ");
                  Serial.println(pHValue,2);
                        digitalWrite(LED,digitalRead(LED)^1);
                        printTime=millis();
                  }
                }
                double avergearray(int* arr, int number){
                  int i;
                  int max,min;
                  double avg;
                  long amount=0;
                  if(number<=0){
                    Serial.println("Error number for the array to avraging!/n");
                    return 0;
                  }
                  if(number<5){   //less than 5, calculated directly statistics
                    for(i=0;i<number;i++){
                      amount+=arr[i];
                    }
                    avg = amount/number;
                    return avg;
                  }else{
                    if(arr[0]<arr[1]){
                      min = arr[0];max=arr[1];
                    }
                    else{
                      min=arr[1];max=arr[0];
                    }
                    for(i=2;i<number;i++){
                      if(arr[i]<min){
                        amount+=min;        //arr<min
                        min=arr[i];
                      }else {
                        if(arr[i]>max){
                          amount+=max;    //arr>max
                          max=arr[i];
                        }else{
                          amount+=arr[i]; //min<=arr<=max
                        }
                      }//if
                    }//for
                    avg = (double)amount/(number-2);
                  }//if
                  return avg;
                
                if (pHArray[ArrayLenth] < vc) {
                  digitalWrite(diffuseur, LOW);
                  Serial.begin(9600);
                  Serial.print("pH : acide");
                }
                else
                {
                  digitalWrite(diffuseur, HIGH);
                  Serial.begin(9600);
                  Serial.print("pH : Adéquate");
                }
                }

                Est-ce bien

                pHArray[ArrayLenth]

                 Que je dois mettre dans mon "if" ?

                -
                Edité par DzoopDouv 4 mai 2018 à 9:44:00

                • Partager sur Facebook
                • Partager sur Twitter
                  4 mai 2018 à 20:58:49

                  Ton code qui affiche ACIDE ou ADEQUATE ce trouve dans la fonction avergearray, ce n'est pas logique.

                  En effet, une fonction qui calcul une valeur moyenne n'est pas censé affiché quoi que ce soit.

                  Son rôle, c'est de calculer une moyenne, c'est tout, que ce soit une moyenne de PH ou une moyenne de luminosité.

                  Bref, ce bout de code n'a rien à faire là.

                  Et surtout, ce bout de code se trouve APRES le return donc la fonction s'arrête avant d'exécuter ces lignes, ce qui explique pourquoi tu ne vois rien.

                  Pour bien faire, ces lignes devraient être dans le loop, en même temps que l'affichage de la tension et du PH.

                  Profites en aussi pour supprimer le Serial.begin qui n'a rien à faire là puisqu'il est déjà dans Setup.

                  Et pour finir, autant utiliser la valeur moyenne calculée précédemment pour le test du if ;)

                  Bref, cela donne le code suivant :

                  // [...]
                  
                  void loop(void)
                  {
                  	static unsigned long samplingTime = millis();
                  	static unsigned long printTime = millis();
                  	static float pHValue,voltage;
                  	if(millis()-samplingTime > samplingInterval)
                  	{
                  		pHArray[pHArrayIndex++]=analogRead(SensorPin);
                  		if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
                  		voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
                  		pHValue = 3.5*voltage+Offset;
                  		samplingTime=millis();
                  	}
                  	if(millis() - printTime > printInterval)
                  	{
                  		Serial.print("Voltage:");
                  		Serial.print(voltage,2);
                  		Serial.print("    pH value: ");
                  		Serial.println(pHValue,2);
                  		if (pHValue < vc) {
                  			digitalWrite(diffuseur, LOW);
                  			Serial.println("pH : acide");
                  		}
                  		else
                  		{
                  			digitalWrite(diffuseur, HIGH);
                  			Serial.println("pH : Adéquate");
                  		}
                  		digitalWrite(LED,digitalRead(LED)^1);
                  		printTime=millis();
                  	}
                  }
                  
                  double avergearray(int* arr, int number)
                  {
                  	// [...]
                  }
                  



                  -
                  Edité par lorrio 4 mai 2018 à 21:00:15

                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 mai 2018 à 16:40:28

                    Merci bien pour votre aide, j'ai pu le placer dans le programme comme vous m'avez dit

                    #define SensorPin A0            //pH meter Analog output to Arduino Analog Input 0
                    #define Offset 0.00            //deviation compensate
                    #define LED 13
                    #define samplingInterval 20
                    #define printInterval 3000
                    #define ArrayLenth  40    //times of collection
                    
                    int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
                    int pHArrayIndex=0;  
                    int diffuseur = 10;
                    int pHValue;
                    
                    void setup(void)
                    {
                      pinMode(LED,OUTPUT);  
                      Serial.begin(9600);  
                      Serial.println("Experimentation en marche !");    //Test the serial monitor
                    }
                    void loop(void)
                    {
                      static unsigned long samplingTime = millis();
                      static unsigned long printTime = millis();
                      static float pHValue,voltage;
                      if(millis()-samplingTime > samplingInterval)
                      {
                          pHArray[pHArrayIndex++]=analogRead(SensorPin);
                          if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
                          voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
                          pHValue = 3.5*voltage+Offset;
                          samplingTime=millis();
                      }
                      if(millis() - printTime > printInterval) 
                      {
                      Serial.print("  Tension:");
                            Serial.print(voltage,2);
                            Serial.print("    valeur pH: ");
                      Serial.println(pHValue,2);
                            digitalWrite(LED,digitalRead(LED)^1);
                           printTime=millis();
                             if (pHArray[ArrayLenth] > 6) 
                    {
                      digitalWrite(diffuseur, HIGH);
                      Serial.println("       pH : Adéquate");
                      delay(3000);
                    }
                    else
                    {
                      digitalWrite(diffuseur, LOW);
                      Serial.println("    pH : Acide");
                      delay(3000);
                    }
                      }
                    }
                    double avergearray(int* arr, int number){
                      int i;
                      int max,min;
                      double avg;
                      long amount=0;
                      if(number<=0){
                        Serial.println("Error number for the array to avraging!/n");
                        return 0;
                      }
                      if(number<5){ 
                        for(i=0;i<number;i++){
                          amount+=arr[i];
                        }
                        avg = amount/number;
                        return avg;
                      }
                    else
                      {
                        if(arr[0]<arr[1]){
                          min = arr[0];max=arr[1];
                        }
                        else{
                          min=arr[1];max=arr[0];
                        }
                        for(i=2;i<number;i++){
                          if(arr[i]<min){
                            amount+=min;        
                            min=arr[i];
                          }
                       else 
                          {
                            if(arr[i]>max){
                              amount+=max; 
                              max=arr[i];
                            }
                         else
                            {
                              amount+=arr[i]; 
                            }
                          }
                        }
                        avg = (double)amount/(number-2);
                      }
                      return avg;
                    }
                    

                    Désormais il me faudrait transférer ces données à une "Raspberry Pi 3", j'ai choisi de le faire par USB car l'arduino uno étant alimentée en 5V et la raspberry en 3.3V j'ai pas envi de griller quoi que ce soit en i2c..

                    Comment puis-je m'y prendre ? J'ai vu différents sujet sur ceci sur internet et je compte les exploiter également mais je tiens à avoir votre aide !

                    De plus pour finir ma partie il me faudrait à l'aide d'une horloge présente sur la raspberry pi 3 (je ne sais pas comment la faire) définir un cycle circadien pour dire que de 11h00 à 17h00 la lampe de l'aquarium est allumée puis de 17h00 à 11h00 celle ci est éteinte.

                    Donc pour résumé :

                    • Comment transférer des données Arduino Uno à Raspberry Pi 3 par USB
                    • Programmer une horloge avec une Raspberry Pi 3
                    • Transférer l'heure présente sur Raspberry Pi 3 à l'Arduino Uno afin de faire mon cycle circadien

                    Merci de votre aide encore une fois !

                    -
                    Edité par DzoopDouv 5 mai 2018 à 16:40:40

                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 mai 2018 à 18:30:46

                      Actuellement, tu te sert du Serial de l'arduino pour envoyer des informations de debug tel que "Tension: xxx", "PH Adéquate"...

                      Quand l'arduino sera branché en USB à la RPI, tu ne verras donc plus ces informations.

                      En revanche, la Rpi pourra les voirs ;)

                      En effet, l'arduino sera reconnu par la RPi comme un port COM classique, exactement comme le fait windows.

                      Tu devrais donc avoir un périphérique du genre /dev/ttyAMC0 ou /dev/ttyUSB0.

                      Libre à toi d'utiliser le Serial pour envoyer ce que tu veux et ainsi faire le dialogue entre tes 2 cartes.

                      L'arduino pourrait très bien utiliser Serial.print pour envoyer des données que la RPi pourra réccupérer en lisant le fichier /dev

                      Tandis que la RPi pourra envoyer des commandes en écrivant sur le fichier /dev et l'arduino pourra les récupérer avec Serial.read

                      Le plus simple serait de faire des commandes basées sur des lettres du genre si la RPi envoie la lettre "A", alors l'arduino allume la lampe.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 mai 2018 à 9:52:07

                        Merci bien Lorrio ! J'ai récupéré une Raspberry Pi 3 auprès de mon camarade et je vais m'essayer à faire le programme sans que cela bug !

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 mai 2018 à 16:56:43

                          J'ai ma Arduino UNO connecté à la Raspberry Pi 3 comme étant "dev/tty/ACM0" ! Désormais je dois dire transférer mes données à la raspberry pi 3. Quel serait le code qui me permettrait de transférer mes données ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 mai 2018 à 13:17:46

                            Tout dépend de quel langage de programmation tu utilises.

                            Si tu utilises python, il y a la lib pySerial qui permet de gérer facilement un port série (ouverture, lecture, écriture).

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 mai 2018 à 14:32:22

                              Et si j'utilise python avec la "lib pySerial" que devrais-je marquer des 2 cotés afin de pouvoir communiquer des 2 côtés ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 mai 2018 à 15:38:15

                                Coté arduino, tu as la classe Serial avec les fonctions que tu as déjà utilisée : Serial.available, Serial.read, Serial.print...

                                Coté python, c'est globalement la même chose avec serial, open, write, read...

                                Tu trouveras pleins d'exemple sur google ;)

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Projet terminal STI2D : Aquarium

                                × 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