sonda ph impazzita

salve ragazzi ,altro pacco ricevuto dopo lo stop covid e quindi altro problema ...
stavolta è la sonda del ph a dare i numeri , ho provato vari sketch ma non riesco mai a venirne a capo ...

dunque componenti acquistati :

https://www.amazon.it/TXYFYP-Misuratore-Analogico-Monitoraggio-Schermatura/dp/B086TW9CBW/ref=sr_1_12?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=txyfyp&qid=1588933110&sr=8-12

https://www.amazon.it/Soluzione-calibrazione-buffer-polvere-Buffer/dp/B084P86JTM/ref=sr_1_5?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=calibrazione+ph&qid=1588933172&sr=8-5

ho provato questo sketch ma il risultato inizialmente erano valore veramente sballati e fra le tre soluzioni avevo alcune rilevate molto più alte e altre rilevate molto più basse e quindi era difficile arrivare ad un coefficiente di regolazione esatto così ho provato a regolare il potenziometro posto sulla scheda ; all inizio i valori hanno iniziato a variare fino a quando sul monitor seriale ho iniziato a visualizzare solo il valore minimo con tensione a 0 volt e i valore massimo con tensione a 5 volt a prescindere dal fatto che la sonda fosse immersa nel liquido o meno

#define SensorPin A0 //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.25  //deviation compensate
#define LED 13
#define samplingInterval 20
#define printInterval 1000
#define ArrayLenth  40    //times of collection
int pHArray[ArrayLenth];   //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[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;
}

così ho provato a cambiare sketch con un altro che avevo precedentemente provato e poi cambiato perche la sonda mi rilevava valori sbagliati e quindi se raggiungevo il setpoint in una soluzione le altre erano completamente fuori setpoint; e mentre prima questo sketch mi leggeva dei valori pressochè similari alla realtà ,adesso anche con questo sketch mi legge un valore di 0.54 a prescindere che la sonda sia immersa o meno nel liquido

void setup(){
 Serial.begin(9600);
 Serial.println("PH meter");
}

float misura;
void loop()

{
  misura=0;
for(int i = 0; i < 10; i++);{
  misura+=analogRead(A0);
   delay(10);
}
  
    misura=misura/10.0;
    float ph=(float)misura*(5.0/1024);
    ph=3.3* ph;
  Serial.print("ph:");
  Serial.print(ph , 2);
  Serial.println("");
  delay(1000);
  
   }

quindi mi ritrovo a disturbare gente più esperta di me sperando che con il vostro aiuto riesca a risolvere il problema ...

Non so come funzioni questa sonda, ma quelle professionali (a setto poroso) utilizzate nelle piscine hanno un tempo di risposta piuttosto alto, anche 30-40 secondi per dare una risposta corretta e stabile, forse devi solo attendere che la sonda legga correttamente il PH, credo che ruotare "a caso" il potenziometro posto sulla scheda non sia stato un buon affare... leggi bene la documentazione della scheda e regola correttamente il potenziometro, per i test dell'acqua delle piscine la taratura della sonda viene fatta con tre (o più) campioni, uno acido (con PH conosciuto), uno basico (con PH conosciuto) ed uno neutro (solitamente acqua distillata o deionizzata), come vada poi settata la curva non so ma credo la risposta sia lineare, certamente nella documentazione ci sarà indicata la curva di risposta.

Il primo sketch non so dove l'hai pescato ma così come è scritto non funziona di certo... nella funzione loop() setti samplingTime e printTime al tempo attuale e subito dopo lo confronti con il tempo attuale più un delta (20 nel tuo caso) quindi il confronto sarà sempre falso e non aggiorni mai i valori nell'array pHArray[], stessa cosa appena dopo per la stampa del valore. Ricontrolla bene e vedrai che risolvi (posso suggerirti di settare le variabili samplingTime e printTime come globali ed aggiornarle solo quando effettivamente fai la lettura o la stampa)

io stavo valutando di lasciare immersa nell acqua la sonda a tempo indeterminato fino la rottura della sonda stessa ....quindi la lettura dovrebbe avvenire in continuazione... seguendo questo ideale , cosa e come dovrei cambiare?

Di preciso non posso dirti se la lettura sarà accurata, bisogna leggere la documentazione per una conferma, magari prendi spunto dal video che ti linko Misuratore di pH con Arduino - Video 254 - YouTube, è il primo che ho trovato con google, ce ne sono parecchi comunque, che mi sembra spiegato abbastanza facilmente tutto, se vuoi fare una media dei valori, come suggerito anche nel video, basterà che salvi i campioni in un array a scorrimento, sommi tutti i valori e li dividi per il numero di campioni, tutto in float (double come hai indicato tu esiste solo in schede particolari programmabili con l'arduino IDE, normalmente si usa float per i valori decimali)

il link di youtube che mi hai citato è quello da cui ho preso il secondo sketch ,ho contattato il creatore del video per chiedere il suo aiuto e mi ha detto che così su due piedi non sapeva come aiutarmi perchè non sapeva se la sonda fosse passiva o attiva ...(non ho più saputo cosa rispondergli)

sapresti aiutarmi a capire questo?
altra domanda: il tipo del video mi ha detto di usare un tester per ricalibrare il potenziometro in posizione corretta come dovrei posizionare il tester e quali valori dovrei cercare di raggiungere girando il potenziometro?

Una sonda "passiva" ha due terminali, e' in pratica una specie di "batteria" la cui tensione di uscita dipende dal PH della soluzione in cui la immergi (ed ovviamente necessita di una schedina esterna con amplificatore a bassissimo rumore per amplificare i pochi millivolt che ti da) ... una "attiva" ha almeno tre o quattro fili, dipende dai modelli, perche' ha la sezione di prima amplificazione e correzione della curva a bordo, quindi serve anche alimentarla ... altre volte quelle attive hanno connettori DIN, oppure addirittura batteria interna (di solito sono quelle piu "moderne" con interfaccia BLE, per leggerle a distanza)

A proposito, forse questo foglio sulla manutenzione delle sonde PH ti potrebbe interessare

https://it.hach.com/asset-get.download-it.jsa?id=51715478068

Qui dovresti trovare tutto quello che ti seve in fondo nella sezione Documents