Sonde de pH pour piscine / SEN 0161 / Edit : Convertir sous CAN ?

Bonjour je travaille actuellement sur une maquette de piscine et je mets en place une sonde de pH. Dans le dossier technique du composant je retrouve un programme mais celui ci est vraiment long et je voudrai savoir s’il y a la possibilité de le réduire et bien même m’expliquer que fait chaque ligne de programmation. Je comprends la base mais la plupart des lignes je ne comprends pas.
Merci d’avance pour vos réponses.

/*
 # This sample code is used to test the pH meter V1.0.
 # Editor : YouYou
 # Ver    : 1.0
 # Product: analog pH meter
 # SKU    : SEN0161
*/
#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 800
#define ArrayLenth  40    //times of collection
int pHArray;   //Store the average value of the sensor feedback
int pHArrayIndex=0;    
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=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;
    }
    avg = amount/number;
    return avg;
  }else{
    if(arr){
      min = arr;
    }
    else{
      min=arr;
    }
    for(i=2;i<number;i++){
      if(arr<min){
        amount+=min;        //arr<min
        min=arr;
      }else {
        if(arr>max){
          amount+=max;    //arr>max
          max=arr;
        }else{
          amount+=arr; //min<=arr<=max
        }
      }//if
    }//for
    avg = (double)amount/(number-2);
  }//if
  return avg;
}

Up!

J'ai pu comprendre ce que fais tout le début du programme mais je suis vraiment bloqué au niveau des calculs.

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;
}

S'il y a la possibilité que vous m'expliquez ce que le programme fait à partir d'ici.

Cette fonction calcule une moyenne :

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;
  }

Elle reçoit un tableau d'entiers (arr) et le nombre de valeurs (number) sur lesquelles calculer la moyenne : si le nombre est négatif ou nul, on ne calcule rien.

  if(number<5){   //less than 5, calculated directly statistics
    for(i=0;i<number;i++){
      amount+=arr[i];
    }
    avg = amount/number;
    return avg;
  }

S'il y a 5 données ou moins, elle calcule la moyenne, sinon :

else{
    if(arr[0]<arr[1]){
      min = arr[0];max=arr[1];
    }
    else{
      min=arr[1];max=arr[0];
    }

Elle affecte à min et max les deux premières valeurs du tableau (min : la plus petite, max l'autre)

    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
        }

Elle fait la moyenne des valeurs en mettant à jour les variables min et max. A la fin, min contient la plus petite valeur du tableau, max la plus grande.
Dans ce calcul de moyenne, si la données courante est inférieure à la valeur min courante, c'est cette valeur min qui est prise pour le calcul de la moyenne et pas la valeur courante (idem pour max). C'est bizarre, puisque l'on compare avec le min des valeurs précédentes et pas le min global du tableau... Je ne comprends pas bien à quoi ça sert.

      }//if
    }//for
    avg = (double)amount/(number-2);
  }//if
  return avg;
}

Fin de la fonction

Merci de ta réponse ça m'a beaucoup aidé. Je voudrai savoir s'il y a la possibilité de convertir tout ce programme et le mettre en CAN ?

En classe j'ai travaillé plusieurs heures pour le mettre sous CAN mais le problème c'est que je suis bloqué pour faire le programme. Est-ce qu'on peut m'éclaircir, comment je pourrai commencer ?

Merci d'avance :slight_smile: