/* Solución a la obtención de la temperatura medida por una RTD Pt100 basada en los modelos inversos definidos en
https://www.analog.com/en/technical-articles/rtd-measurement-system-design-essentials.html
*/
float r;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
r = 20.0;
}
void loop() {
// put your main code here, to run repeatedly:
float N = analogRead(A0); // Obtiene el valor digital del ADC para la tensión que llega a A0
float v = 5*N/1024; // Convierte N a tensión
r = v/0.01; // Obtiene el valor de la resistencia de la RTD Pt100 (supuesto que ha sido alimentada con 10 mA)
Serial.print (id()); Serial.print(" ");
Serial.print(r); Serial.print (" "); Serial.println(t(r)); // Visualiza la información obtenida
}
int id(){
int d8 = digitalRead(8);
int d7 = digitalRead(7);
int d6 = digitalRead(6);
int d5 = digitalRead(5);
int identificador = d8*8+d7*4+d6*2+d5;
return identificador;
}
float t2(float r){
// Calcula la temperatura medida por una RTD Pt100, para resistencias >= 100 ohmios.
// Coeficientes de la Ecuación de Callendar R = R0(1 + A*t + B*t^2)
float R0 = 100.0;
float A = 3.908E-3;
float B = -5.775E-7;
// Obtención Coeficientes Ecuación de 2º grado ax^2 + bx + c = 0, correspondiente a la ecuación de Callendar
float a = R0*B;
float b = R0*A;
float c = R0 - r;
return (-b+sqrt(b*b-4*a*c))/(2*a); // Devuelve una solución de la ecuación de 2º grado
}
float t1(float r){
// Aproximación polinómica del modelo inverso de la RTD PT100 para temperaturas negativas (Ecuación Callendar van Dusen) R = R0(1 + A*t + B*t^2 + C*(t-100)*t^3)
return -1.6030E-13*pow(r,6) + 2.0936E-10*pow(r,5) - 3.6239E-8*pow(r,4) - 4.2504E-6*pow(r,3) + 2.5646E-3*pow(r,2) + 2.2233*r - 2.4204E2;
}
float t(float r){
// Calculo de la temperatura discriminando si la resistencia es mayor o menor que 100 ohmios
if ((r>=10.0)and(r<100.0))
{return t1(r);}
else if (r>=100.0){}
{return t2(r);};
}