pH non concordant (Arduino Uno)

Bonjour,

Je travaille en laboratoire et tente de construire un pH-mètre avec Arduino Uno qui permettrait de monitorer le pH au cours du temps. Je suis novice en la matière et certains phénomènes me sont incompréhensibles. Pourriez-vous m'aider ?

Donc j'ai connecté une sonde pH à mon Arduino Uno, au niveau calibration j'ai bien compris et avec 4 Tampons de références c'est OK pas de souci, ils sont bons. J'ai testé aussi comme vu sur le net avec du jus de citron et du lait et c'est plutôt bon également.

Une fois que je teste en labo avec des solutions ayant une certaine molarité et tamponnée à différents pH (Ex. 50mM phosphate pH3.0 ou 5.8 ou 6.5), il se passe un shift, et ce shift semble tout de même égal pour 2 solutions testées. Donc ma calibration faite au départ ne va plus, je dois réadapter la valeur de "calibration_value", ce qui d'un point de vue "valeurs acceptables" en labo me semble mal parti. Je me disais que peut-être pour chaque type de solutions ayant des pouvoirs tampons différents je devrai faire une calibration correspondante (?) Mais tout pH-mêtre n'a pas besoin de cela donc...
Il a peut-être un moyen d'améliorer cela ?

Et également, j'ai lancé un test en situation réelle d'une solution avec des mesures prises au cours du temps contenant un composé qui se solubilisera petit à petit. Au départ le pH de la solution est fixée à pH3.0 et devrait légèrement descendre jusqu'environ 2.6-2.7 de pH. Au lieu de ça les valeurs données par ma sonde augmente jusqu'à ~4.0. Et les valeurs de potentiel varient assez fort.
Comment pourrais-je faire pour isoler mon signal de perturbations extérieures (ou même de la solution même) ?

D'avance merci pour vos suggestions.

Sev

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans “Les bonnes pratiques du Forum Francophone”

Mince, désolée.

Merci :slightly_smiling_face:

Il faudrait en dire plus sur : la sonde utilisée, les bibliothèques et le code.

Bonjour lesept,

J'utilise une sonde pHC3359-8 (Microélectrode combinée de Radiometer analytical) Sonde pH, avec ce pH sensor module-ci : pH sensor module
et j'ai utilisé ce code-ci adapté en fonction de la calibration que j'obtenais :

[code]
float calibration_value = 20.0;
int phval = 0; 
int const potPin=A0;
int potVal;
unsigned long int avgval; 
int buffer_arr[200],temp;
void setup() 
{
 Serial.begin(9600);
}
void loop() {
  potVal=analogRead(potPin);
  Serial.print("potVal, ");
  Serial.print(potVal);
  
 for(int i=0;i<200;i++) 
 { 
 buffer_arr[i]=analogRead(A0);
 delay(30);
 }
 for(int i=0;i<199;i++)
 {
 for(int j=i+1;j<200;j++)
 {
 if(buffer_arr[i]>buffer_arr[j])
 {
 temp=buffer_arr[i];
 buffer_arr[i]=buffer_arr[j];
 buffer_arr[j]=temp;
 }
 }
 }
 avgval=0;
 for(int i=2;i<8;i++)
 avgval+=buffer_arr[i];
 float volt=(float)5/1024 *avgval/6;
 float phVal = -5.82 * volt + calibration_value;
 Serial.print(", pHVal, ");
 Serial.println(phVal);
 delay(450000);
}
[/code]

Voilà, c'est mieux je crois, merci :slight_smile:

Il vaut mieux le copier dans ta réponse, en utilisant les balises CODE (le bouton </>)
Ca donne ça :

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Aussi, j'ai un ami technicien ayant quelques bases en electronique qui m'a suggéré de connecter directement le pH sensor module à une terre (d'une prise de mur). Vous pensez que c'est une bonne idée ?

Je ne sais pas, je ne connais pas ce matériel. Comment est-ce connecté pour l'instant ?
Comment le montage est-il alimenté ?

J'ai lu le code. Pour ce que je comprends il fait une série de mesures toutes les 45 secondes.
La série fait 200 valeurs : il les trie en ordre croissant, retient les 8 plus basses valeurs, écarte les deux plus faibles de ces 8 et fait la moyenne des 6 qui restent.
Est-ce bien ça ?

Je viens de trouver un code similaire ici (on en trouve d'autres en cherchant un peu) :

C'est connecté effectivement comme dans le lien, à savoir :
image

Oui, j'ai trouvé pas mal d'autres aussi, ce qui m'a permis de pouvoir avancer un peu, mais mon souci s'est présenté ensuite :wink:

En fait ce n'est pas toutes les 45 secondes mais toutes les 7.5minutes (450000millis).

Ah bon, pourquoi les 8 plus basses ? Je n'avais pas compris cela ainsi mais plutôt la moyenne sur 6 valeurs centrales (sur les 200 prises). Maintenant 200 c'est un peu beaucoup je dois dire :slight_smile: . Je réduirai ce nombre de mesures.

Les "temp", "buffer_arr[i]" & "buffer_arr[j]" j'ai un peu de mal à bien les saisir, mais je pense que c'est ce qui donne l'ordre chronologique à toutes les valeurs. Je ne sais pas ce que cela signifie exactement ?

Tu as 200 valeurs rangées dans l'ordre croissant. Tu ne retiens ici que les numéros 2 à 7 (sachant que ça commence à 0).
Ton problème vient peut-être de là : si sur 200 mesures, tu en as (par exemple) 20 qui sont fausses et qui donnent des valeurs très petites, tu feras ta moyenne sur elles.

Pour l'histoire de la mise à la terre : normalement c'est déjà fait. Le G de ta sonde est relié au GND de l'Arduino qui lui même est relié au GND de l'alimentation qui doit avoir une prise de terre. Si elle n'en as pas, alors c'est vrai que ce n'est pas relié. Mais je ne sais pas si ça améliorera les choses de relier la sonde à la terre...

Rien ne permet de le dire, on ne sait pas comment son montage est alimenté. Si c’est un chargeur usb de téléphone par exemple, c’est de la classe 2 et donc pas de mise à la terre.

Faut pas oublier que en amont d’un disjoncteur de distribution EDF, le neutre est à la terre.

C'est pour ça que j'ai ajouté cette phrase. J'ai demandé comment le montage est alimenté dans le post 8...

Ah oui effectivement je n'avais pas compris cela comme ça, du coup oui, je réessayerai en mettant moins de mesures.

L'Arduino est connecté à mon PC via USB, et avec une prise 12v aussi. Les 2 ne sont pas nécéssaire il me semble mais cela influence aussi le signal (si je retire le 12v mes valeurs changeaient, alors je l'ai laissé pour l'instant tout le temps).

Merci !

Regardes le schéma d’alimentation de la uno qui est disponible sur leur site.
S’il n’y a rien sur Vin, Vcc = le 5 V USB provenant du PC
S’il y a du 12 V sur Vin, Vcc = le 5 V du régulateur de la carte.

D’après toi les deux 5 V sont-ils égaux ?
La norme USB est 5 V +/- 5%.
Si ton PC donne entre 4,75 V et 5,25 V il n’y a rien a dire.

Si tu veux être indépendant du PC il faut alimenter par Vin

hello

for (int i = 2; i < 8; i++)

pourquoi faire 200 mesures pour ne moyenner que les 2,3,4,5,6,7 plus petites?
ça m'intrigue.
instinctivement, j'aurai moyenné au milieu, les 97,98,99,100,101 et 102

for (int i = 97; i <103; i++)

Ce serait surtout intéressant de comprendre pourquoi il faut tant de mesures…

Oui je ne comprennais pas bien le code :sweat_smile: . Les 200 mesures n'ont aucun intérêt de cette manière. J'ai cru que cela faisait une moyenne sur ces 200 mesures (et mis autant pour avoir moins de variation en fait). Le reste m'étais un peu mystérieux, je ne voyais pas le lien. Merci pour les éclaircissements :slight_smile:

Je tenterai de cette façon moyennée au milieu comme tu l'indiques.

Et je le ferai avec moins de mesures finalement :wink:
Merci

J'ai juste branché l'arduino au 12V et à l'USB du PC.
arduino

Je ne sais pas ce que le PC donne par contre en V, ne sachant comment je peux vérifier cela.
Et j'ai besoin de la connection au PC pour transférer les données directement dans un fichier Excel.

Si l’appareil est de bonne facture, pourquoi avoir besoin de plus d’une lecture… que conseille la spécification ?

Tous les pHmètres ont une tolérance à indiquer au niveau stabilité du signal. Par exemple pour un pH-mètre Radiometer on indique qu'il faut un Drift < 50mV (il me semble) pour pouvoir prendre la mesure. On peut lui indiquer 0, 10, 25, 100,... si on veut.
Donc je me dis qu'avec Arduino, il faut un minimum de temps de stabilisation du signal aussi, et donc faire une moyenne pour être plus juste par rapport à la valeur réelle. Mais peut-être que je me trompe ?