In ogni caso prova questo codice se puoi, ho portato il campionamento a 20 secondi ed immagazzino ogni volta il valore della resistenza e non della temperatura:
#include <stdio.h>
#include "pins_arduino.h"
#include <LiquidCrystal.h>
#define UTI_PIN 5
#define UTI_RESISTANCE_REF 1000
double TempStorage[40]; //Contiene le rilevazioni
int ArrayMax = 39; // Dimensione massima array: dimensione TempStorage - 1
double Media = 0.0; //Contiene il valore della temperatura media
int MediaCount = 0; //Contatore che permette il calcolo della media solo dopo aver riempito completamente l'array
int CurPos = 0; //Contiene la posizione corrente nell'array
LiquidCrystal lcd(12, 11, 6, 4, 3, 2);
unsigned long samplingMillis, printMillis;
int samplingTime = 500; //In ms, frequenza di campionamento
int printTime = 1000; //in ms, frequenza di stampa dei dati
void setup()
{
Serial.begin(9600);
pinMode(UTI_PIN, INPUT);
Serial.print("Avvio PT100");
Serial.print("\n");
lcd.begin(16, 2);
lcd.print("PT100");
CurPos=-1; //Inizializzo la posizione nell'array
for (int i=0;i<= ArrayMax;i++) { //Inizializzo array a zero
TempStorage[i] = 0.0;
}
delay(3000);
}
int ReadUTI(uint8_t pin, double * temp,int refRes) //Ottimizzato per PT100 4 fili - Modalità 5 (4 fasi)
{
int state = HIGH;
int i,startindex=-1;
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
uint8_t stateMask = (state ? bit : 0);
unsigned long width[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
double nOff=0,nAB=0,nCD=0,nBC=0,nDF=0;
while ( (*portInputRegister(port) & bit) != stateMask)
;
for(i=0;i<10;i++) {
while ( (*portInputRegister(port) & bit) == stateMask)
width[i]++;
while ( (*portInputRegister(port) & bit) != stateMask)
width[i]++;
}
for(i=1;i<10;i++) {
if(i<6) {
if(width[i]<width[i+2]&&width[i]<width[i+3]&&width[i]<width[i+4]&&width[i+1]<width[i+2]&&width[i+1]<width[i+3]&&width[i+1]<width[i+4]) {
startindex=i;
i=10;
}
}
}
if(startindex!=-1) {
nOff=width[startindex]+width[startindex+1];
nAB=width[startindex+2];
nCD=width[startindex+3];
nBC=width[startindex+4];
*temp=((nCD-nOff)/(nAB-nOff))*refRes;
return 1;
}
else {
return 0;
}
}
void readTemp()
{
double temp;
if(ReadUTI(UTI_PIN,&temp,UTI_RESISTANCE_REF)) {
if (CurPos<ArrayMax){CurPos++;} else { CurPos=0; } //Gestisce la posizione del cursore all'interno dell'array
TempStorage[CurPos]=temp; //Registra la temperatura all'interno dell'array
if (MediaCount<(ArrayMax+4)) {MediaCount++;} //Calcola la media solo se l'array è stato riempito completamente
else {
Media =0.0;
for (int i=0;i<=ArrayMax;i++) { Media = Media + TempStorage[i];}
Media = Media / (ArrayMax+1);
}
}
else {
printTempError(); //Se l'UTI non riceve alcuna temperatura, restituisce errore
}
}
void printTempError()
{
Serial.print("Not Found");
Serial.print("\n");
lcd.setCursor(0, 1);
lcd.print("NotFound");
}
void printTempMedia()
{
if (MediaCount < (ArrayMax+4)) { //Stampa la media solo se l'array è completamente pieno
Serial.print("Inizializzazione Sensore: ");
Serial.print(CurPos);
Serial.print("\n");
lcd.setCursor(0, 1);
lcd.print("Init");
} else {
//double TempNorm = 2.596415876*Media-264.95648; //Formula ricavata dalla calibrazione a 0 e 100 °C
double TempNorm = 2.624704336*Media-266.3919005;
//double TempNorm = (0.0000000000004 * pow(Media,6)) - (0.0000000002 * pow(Media,5)) + (0.00000007 * pow(Media,4)) - (0.00002 * pow(Media,3)) + (0.0038 * pow(Media,2)) + (2.1705 * Media) - 241.09;
//TempNorm = TempNorm - ((-0.00008 * pow(TempNorm,2)) + (-0.0086 * TempNorm) - 0.6422);
Serial.print(TempNorm);
Serial.print(" - ");
Serial.print(Media);
Serial.print("\n");
lcd.begin(16, 2);
lcd.print(Media);
lcd.setCursor(0, 1);
lcd.print(TempNorm);
}
}
void loop()
{
if ((millis()- samplingMillis) > samplingTime) {
samplingMillis = millis();
readTemp();
}
if ((millis()- printMillis) > printTime) {
printMillis = millis();
printTempMedia();
}
}