Pt100 e Smartec UTI

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();
  }
}