problema con ph sensor valori sballati

Buona sera a tutti ho comperato questo prodotto : http://www.robotics-3d.com/component/virtuemart/analog-ph-meter-kit ma ho grandi problemi ha farli fare una lettura consona, ho seguito e provato a fare la calibrazione come descritto in wiki, quando lo provo lo sketch sia per calibrazione sia sw che hw riesco a mettere i dati giusti, ma appena ricarico il mio sketch mi da valori anomali: questo è il mio sketch:

#include <OneWire.h>

#include <Wire.h>
#include <DallasTemperature.h>
#include <PCF8574_HD44780_I2C.h>
#include <Time.h>
#include <DS3232RTC.h>
#include <RTClib.h>
#include <SPI.h>
#include <Ethernet.h>

 
int rele5 = 43; // pin a cui è connesso il LED
boolean acceso = false; 

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip( 192, 168, 1, 6 ); 
EthernetServer server(80);

PCF8574_HD44780_I2C lcd(0x3F, 20, 4);



long Pompa_Accesa_in_data=0;
const unsigned long quanto_tempo_deve_restare_accesa_la_pompa = 300000;
long inizio_accensione_arduino= 0; 
unsigned long quanto_tempo_deve_restare_spento_skim_avvio_arduino = 300000;
int pompa_spenta =0;

int oraAlba = 9;
int minAlba = 10;
long albas;
int durataAlbas = 720;
int oraTramonto = 18;
int minTramonto = 10;
long tramontos;
int durataTramontos = 720;
long nows;
int delayR = 0;
int delayG = 120;
int delayB = 240;
int delayUV = 360;
int delayW = 360;

//LED
int pinR = 2;
int pinG = 3;
int pinB = 4;
int pinW = 5;
int pinUV = 6;

//RELE
float rele1 = 35;
float rele2 = 37;
int rele3 = 39;
int rele4 = 41;

int rele6 = 45;
int rele7 = 47;
int rele8 = 49;

const int buttonPin = 7;     
const int but2 = 9;     

int buttonState = 0;
int buttonState2 = 0;

//menu 

/*int Menu=0; // VARIABILE CHE IDENTIFICA IL MENU' IN USO

const int buttonPingiu = 22; // pin Giu
const int buttonPinsu= 24; // pin Su
const int buttonPinok = 26; // pin OK
const int buttonPinPiu = 30; // pin modifica più
const int buttonPinMeno = 32; // pin modifica meno

int lastButtonokState = LOW;   // the previous reading from the Enter input pin
int lastButtongiuState = LOW;   // the previous reading from the Esc input pin
int lastButtonsuState = LOW;   // the previous reading from the Left input pin
int lastButtonPiuState = LOW;   // 
int lastButtonMenoState = LOW;   //

long lastEnterDebounceTime = 0;  // the last time the output pin was toggled
long lastEscDebounceTime = 0;  // the last time the output pin was toggled
long lastLeftDebounceTime = 0;  // the last time the output pin was toggled
long lastRightDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 500;    // the debounce time

//Variabili del menu 


void menuUseEvent(MenuUseEvent used)
{
 
    Serial.println("menuUseEvent found Dealy (D)");
  }



void menuChangeEvent(MenuChangeEvent changed)
{
  Serial.print("Menu change ");
  Serial.print(changed.from.getName());
  Serial.print(" ");
  Serial.println(changed.to.getName());
}


//        MENU' IMPOSTAZIONI
MenuItem menu1Item3 = MenuItem("Item3");
MenuItem menuData=MenuItem("Data/Ora");
MenuItem menuOra=MenuItem("Ora");

*/

char buffer1[20];
char buffer2[20];

//ALLARMI
float riscaldatore = 22.0; // allerta temperatura acqua bassa 
float alertacqua = 27.0; // ventola tangenziale
float alertplafo = 45.0;  // alerta plafoniera temperatura troppo alta 
float tempSoglia = 38.0; //temperatura ventole plafo 

#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tmp_address;
float temp0=0;
float temp1=0;
int numberOfDevices;


#define SensorPin A0          //pH meter Analog output to Arduino Analog Input 0
#define Offset -1.30          //deviation compensate
#define LED 13
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth  40    //times of collection
int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
int pHArrayIndex=0;    
unsigned long int avgValue;  //Store the average value of the sensor feedback
float b;
int buf[10],temp;



void setup() {
  
  pinMode(rele1,OUTPUT);
  pinMode(rele2, OUTPUT);
  pinMode(rele3, OUTPUT);
  pinMode(rele4,OUTPUT);
  pinMode(rele5,OUTPUT);
  pinMode(rele6,OUTPUT);
  pinMode(rele7,OUTPUT);
  pinMode(rele8,OUTPUT);
  pinMode(buttonPin, INPUT);
  pinMode(but2, INPUT);
 
  digitalWrite(rele1,LOW);
  digitalWrite( rele2, LOW);
  digitalWrite( rele3, HIGH );
  digitalWrite(rele4, LOW);
  digitalWrite(rele5,0);
  digitalWrite(rele6, LOW);
  digitalWrite(rele7, LOW);
  digitalWrite(rele8, LOW);
 
  /*
  //BUTTON
  
  pinMode(buttonPinMeno, INPUT);
  pinMode(buttonPinPiu, INPUT);
  pinMode(buttonPinok, INPUT);
  pinMode(buttonPinsu, INPUT);
  */
  
  
  Serial.begin(9600);

Wire.begin();

  sensors.begin();
   Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
setSyncProvider(RTC.get);   // the function to get the time from the RTC
    if(timeStatus() != timeSet) 
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time");      

   lcd.init();           // LCD Initialization
  lcd.backlight( );      // Backlight ON
  lcd.clear();          // Clear the display
    

  numberOfDevices = 1;

pinMode(pinR, OUTPUT);
  pinMode(pinG, OUTPUT);
  pinMode(pinB, OUTPUT);
  pinMode(pinW, OUTPUT);
  pinMode(pinUV, OUTPUT);

 pinMode(13,OUTPUT);  
  Serial.begin(9600);  
  Serial.println("Ready");    //Test the serial monitor

inizio_accensione_arduino= millis();

 
}

void loop() 
{

if (millis() >= (quanto_tempo_deve_restare_spento_skim_avvio_arduino + inizio_accensione_arduino))    {
    digitalWrite(rele3, LOW);
    }
 
 
   for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  { 
    buf[i]=analogRead(SensorPin);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }
  
  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 = 7.0*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;
  }
  
  
  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  float phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;                      //convert the millivolt into pH value
  Serial.print("    pH:");  
  Serial.print(phValue,2);
  Serial.println(" ");
  digitalWrite(13, HIGH);       
  delay(800);
  digitalWrite(13, LOW); 
  
  lcd.setCursor(10,0);
  lcd.println("PH");  
  lcd.setCursor( 13,0);
  lcd.println(phValue);
  
  // prendo ora attuale
  DateTime now = RTC.get();
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(0,0);
  lcd.print( buffer1 );
  
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,1);
  lcd.print( buffer2 );
  Serial.println(buffer1);
  Serial.println(buffer2);

  // Richiesta temperatura
sensors.requestTemperatures(); // Comando per misurare la temp.
  temp0 = sensors.getTempCByIndex(0);
  lcd.setCursor(0,2); // Colonna 0, Riga 2
  lcd.print("acqua:");
  lcd.setCursor (6, 2);
  lcd.print(temp0);
Serial.println(temp0);
  
  temp1 = sensors.getTempCByIndex(1);
  lcd.setCursor (0,3); //Colonna 0, Riga 3
  lcd.print("plafo:");
  lcd.setCursor (6,3);
  lcd.print(temp1);
  Serial.println(temp1);

buona sera mi spiego meglio, allora io devo misurare il ph nel mio acquario, metto la sonda nell acqua distillata e poi la asciugo e uso sketch per calibrazione ph con potenziometro. metto a sonda in ph 4 aspetto un po e poi con potenziometro e offset calibro e mi da 4.01, pulisco la sonda con acqua distillata e la metto in ph 10 anche li uso potenziometro e offset fino ad avere 10, poi carico il mio sketch e mi da valori sballati tipo 3-4 che posso fare help me

per calibrare non puoi usare sempre il potenziometro offset per raggiungere i valori dei calibratori. Devi usare offset e slope.
Dopo la calibrazione se misuri i 2 calibratori cosa leggi? 4 e 10 oppure valori diversi?

Misurando l' acqua con delle striscette PH cosa leggi?

ciao Uwe

dopo la calibrazione se ritesto i flaconi mi da valori sballati, l'acqua con i test fatti è 7.9, che cosa è lo slope?

marco3020:
che cosa è lo slope?

Ok. trovato il problema.

Una retta nel sistema di coordinate cartesiane é caratterizzata dal offset (spostamento della retta nel punto y=0 della retta al punto X=0|y=0) e il slope (pendenza).

Per calibrare il pH-ometro devi settare sia l' offset che lo slope.
Cosa dicono le istruzioni della Tua scheda?

Ciao Uwe

Buona sera grazie dell'aiuto mi spieghi come settare lo slope io ho un arduino 2560

Hai provato di leggere questo?
https://www.dfrobot.com/wiki/index.php/PH_meter(SKU:_SEN0161)

Ciao Uwe

si ho provato entrambi i metodi sia via sw che hw non so più che fare non capisco dove è il problema

ho testato con lo sketch hw usando il metodo suggerito dal produttore per vedere se va bene il ph sensor, e mettendo una pinzetta sul sensore mi da 1.98 v può essere il ph sensor difettoso?

Se hai letto le istruzioni c'è scritto che per l'offset hai bisogno di un buffer pH7, dopodiché puoi usare un altro buffer, nel tuo caso il 10 perché la misura che ti aspetti nell'acquario è superiore a 7. A che so io non si può fare la calibrazione usando il 10 e il 4 contemporaneamente. In effetti il buffer 4 non ti serve.

Quando misuri il pH nell'acqua non ci deve essere alcun altro sensore tipo un conducimetro.

Ricorda che dovrai misurare anche la temperatura, c'è un link proprio in fondo che parla di questo. Se la temperatura dei buffer è intorno ai 25 gradi puoi ignorare la compensazione.

Leggi bene la pagina linkata da uwe, se lasci il sensore perennemente immerso nell'acqua avrai una deriva.
Preservation: Electrode reference preservation solution is the 3N KCL solution.

I buffer non durano in eterno. Devi usare buffer freschi.

ho un ph 6.86, e sono abbastanza freschi e tenuti bene, la temperatura sicuramente non è 25 con sto freddo che fa come faccio a sapere quale è?.
se voglio sapere se arduino ha qualche problema che test posso fare?
io in acqua ho solo un termometro il (bs18b20), delle pompe di movimento, skimmer,pompa risalita, riscaldatore. grazie a tutti per l'aiuto

marco3020:
...
io in acqua ho solo un termometro il (bs18b20), delle pompe di movimento, skimmer,pompa risalita, riscaldatore. grazie a tutti per l'aiuto

Uhm ... non vorrei sbagliarmi, ma ... la sonda PH sfrutta la semipermeabilita' della membrana di vetro (la pallina che contiene il gel) come "batteria", che reagendo a diversi PH, produce tensione, ma parliamo di MICROVOLT, amplificati poi dal circuito ... mi viene il dubbio che se una qualsiasi delle altre cose che hai in acqua avesse anche solo una microscopica perdita di elettricita' verso l'acqua, ed il tuo PH-metro avesse le masse in comune con il resto, gli elettrodi potrebbero venire sballati da tali perdite ...

Magari sbaglio, ma potresti fare una semplice prova per escluderlo ? ... misurare la stessa acqua, ma in un bicchiere, non fisicamente a contatto con il resto della vasca, e vedere se quelle variazioni ci sono anche cosi, o se si riducono o spariscono ?

Come ho scritto prima, per calibrare l'offset serve un buffer a pH 7, come scritto anche nelle istruzioni.
La retta che lega pH e le microtensioni generate a pH 7 dovrebbe passare per lo zero ma, trattandosi di piccolissime correnti, tra tolleranze e imperfezioni così non è, da cui la regolazione dell'offset.
Una volta che la retta passa, grazia alla regolazione, dallo zero dobbiamo farla passare per il punti a pH10 o pH4, quindi ne variamo l'inclinazione, slope in inglese. Quindi va usato un buffer o l'altro. Se ti aspetti un'acqua acidula (e di solito è così a causa della CO2 disciolta) va usato il buffer pH4.

Ora non conosco come correggere la misura per la temperatura, ma se cerchi in rete troverai sicuramente queste informazioni. Anche sul buffer ci dovrebbe essere una tabella pH/Temperatura, se non ricordo male.

Gli strumenti che ho usato io avevano il termometro integrato ma si trattava di strumenti costosi.

Il motivo della degradazione e della deriva è dovuto al fatto che all'interno c'è un elettrodo di riferimento che deve stare in comunicazione elettrica diretta con l'esterno, non mediata da un altro conduttore. Di solito c'è un setto poroso in ceramica o un foro piccolissimo a seconda delle tecnologie impiegate. Purtroppo per tale collegamento avviene un passaggio osmotico per cui il liquido all'interno si contamina. La velocità di tale contaminazione dipende dal tempo e dal liquido dove viene immerso il sensore.

Un'ottima pubblicazione gratuita sulla misura del pH è questa dell'USGS, il Servizio Geologico degli USA.
https://water.usgs.gov/owq/FieldManual/Chapter6/6.4_ver2.0.pdf

buongiorno ho provato a ricalibrare con lo sketch hw con ph 7.0 e poi ho provato a testare la mia acqua in un vasetto di vetro per vedere se sono le correnti degli apparecchi a dar fastidio e ho visto che non è cosi .
Ora calibrando solo con ph 7 mi dice che nell’acqua ho 6.40 e giu di li ma in vasca ho testato con la penna ph e ho 7.9 non capisco cosa fare

Mi sa che è la penna pH che falla, non sono esperto di acquari ma un acquario con acqua alcalina mi sembra strano. Se poi si tratta dell'acqua di rubinetto ancor di più. Nella bolletta ci dovrebbero essere le analisi medie dell'acqua e ci dovrebbe essere anche il pH.
Però posso sempre sbagliarmi. Oppure hai un'acquario marino? In questo caso il valore dovrebbe essere intorno a 8 e quindi la penna ha ragione e devi usare i buffer 7 e 10.

Visto che hai i buffer fai un test della penna. Ricordati di lavare sempre in acqua distillata.

ho un acquario marino infatti, ho usato buffer 7 e 10 cmq per calibrare

Allora ha ragione la penna. Non è che percaso quando il kit ti è arrivato il bulbo era asciutto? Normalmente tali sensori sono venduti con un cappuccio di gomma pieno di liquido.

Altra cosa. I buffer e la calibrazione, come scritto nel PDF USGS, dipendono anche dalla concentrazione di sali nell'acqua. Ora non vorrei che il buffer che possiedi è pensato per acque dolci e non molto saline come quella del tuo acquario.
Però non mi aspetterei un errore di un pH.
La temperatura non dovrebbe influenzare più di tanto, secondo quanto scritto qui
http://reagecon.com/pdf/technicalpapers/Effects_of_Temperature_on_pH_v4-_TSP-01-2.pdf
andando sotto i 25 ti troveresti ad avere alcuni centesimi in più.

Dopo che effettui la taratura se riprovi col buffer 10 ottieni 10?

buongiorno io ho dei buffer con ph 4,7,10 e penso che siano standard sia per marino che per dolce, la sonda è arrivata dentro una soluzione di kncl.
se misuro dopo aver portarto il ph 10 in acqua del mio acquario mi da 6.30 e giu di li,

Intendevo di misurare daccapo nel buffer dopo la calibrazione.

C'è evidentemente qualcosa che non va ma non riesco a capire cosa, non possedendo anche il il kit.

problema risolto era la sonda starata ora va bene grazie a tutti, volevo chiedere per la libreria pcf con libreria menwiz per pulsantiera qualcuno sa aiutarmi?