Compréhension d'un programme

Bonjour,

Pour mes besoins de manipulation, j'ai acheté un capteur ORP dont le fournisseur donne ce code d'exemple :

/*
# This sample codes is for testing the ORP meter V1.0.
 # Editor : YouYou
 # Date   : 2013.11.26
 # Product: ORP meter
 # SKU    : SEN0165
*/
#define VOLTAGE 5.00    //system voltage
#define OFFSET 0        //zero drift voltage
#define LED 13         //operating instructions

double orpValue;

#define ArrayLenth  40    //times of collection
#define orpPin 1          //orp meter output,connect to Arduino controller ADC pin

int orpArray[ArrayLenth];
int orpArrayIndex=0;

double avergearray(int* arr, int number){
  int i;
  int max,min;
  double avg;
  long amount=0;
  if(number<=0){
    printf("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 setup(void) {
  Serial.begin(250000);
  pinMode(LED,OUTPUT);
}

void loop(void) {
  static unsigned long orpTimer=millis();   //analog sampling interval
  static unsigned long printTime=millis();
  if(millis() >= orpTimer)
  {
    orpTimer=millis()+20;
    orpArray[orpArrayIndex++]=analogRead(orpPin);    //read an analog value every 20ms
    if (orpArrayIndex==ArrayLenth) {
      orpArrayIndex=0;
    }
    orpValue=((30*(double)VOLTAGE*1000)-(75*avergearray(orpArray, ArrayLenth)*VOLTAGE*1000/1024))/75-OFFSET;

    //convert the analog value to orp according the circuit
  }
  if(millis() >= printTime)   //Every 800 milliseconds, print a numerical, convert the state of the LED indicator
  {
    printTime=millis()+800;
    Serial.print("ORP: ");
    Serial.print((int)orpValue);
        Serial.println("mV");
        digitalWrite(LED,1-digitalRead(LED));
  }
}

Le programme fonctionne mais j'ai dû mal à en comprendre certains aspects.
Pourriez-vous m'éclairer sur les points suivants :

  • dans la définition de la fonction averagearray, que signifie l'étoile après int ?
  • pour la mesure, dans la boucle loop on remplit un tableau de 40 valeurs de tensions analogiques permettant de calculer une "moyenne" : j'ai bien compris que si le nombre de mesures est inférieure à 5 on calculait la moyenne de ces 5 mesures mais je ne vois pas comment est calculé dans le cas >5
  • sur mes programmes précédents, j'utilise systématiquement une moyenne pour afficher une mesure du style
for (int i = 0 ; i < cycles ; i++)
      {
        mesure += analogRead(orpPin) ;  
      }
      orpValue=((30*(double)VOLTAGE*1000)-(75*mesure*VOLTAGE*1000/1024))/75-OFFSET;

y-a-t-il une raison de ne pas procéder "bêtement" ainsi ?

merci pour votre aide

que c'est un pointeur. (on va passer un tableau sans doute, c'est un pointeur sur le premier élément du tableau)

ils ne font pas une vraie moyenne des valeurs, ils replacent une valeur qui potentiellement est trop petite ou trop grande par le min ou max connu précédemment. ça évite de biaiser trop le résultat si vous avez une valeur vraiment hors norme qui est sans doute une erreur de mesure (je suppose que le processus échantillonné évolue doucement)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.