Ecco un pò di codice:
#include <stdio.h>
#include "pins_arduino.h"
#include <LiquidCrystal.h>
#define UTI_PIN 5
#define UTI_RESISTANCE_REF 1000
float TempStorage[20] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; //Contiene le ultime 20 rilevazioni
float 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 ArrayMax = 19; // Dimensione massima 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
delay(3000);
}
int ReadUTI(uint8_t pin, float * 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};
float 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()
{
float temp;
if(ReadUTI(UTI_PIN,&temp,UTI_RESISTANCE_REF)) {
float TempNorm = 2.596415876*temp-264.95648; //Formula ricavata dalla calibrazione a 0 e 100 °C
if (CurPos<ArrayMax){CurPos++;} else { CurPos=0; } //Gestisce la posizione del cursore all'interno dell'array
TempStorage[CurPos]=TempNorm; //Registra la temperatura all'interno dell'array
if (MediaCount<23) {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 < 23) { //Stampa la media solo se l'array è completamente pieno
Serial.print("Inizializzazione Sensore (");
Serial.print(CurPos);
Serial.print(")");
Serial.print("\n");
lcd.setCursor(0, 1);
lcd.print("Init");
} else {
Serial.print(Media);
Serial.print("\n");
lcd.setCursor(0, 1);
lcd.print(Media);
}
}
void loop()
{
if ((millis()- samplingMillis) > samplingTime) {
samplingMillis = millis();
readTemp();
}
if ((millis()- printMillis) > printTime) {
printMillis = millis();
printTempMedia();
}
}