/*  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);};
}