

Arduino (IoT): RTD PT 100 Sensores Industriales Parte II

En el tutorial anterior vimos como obtener resultados de un sensor industrial, PT100. 3 puntos importantes a recalcar:
- PT100 es un sensor muy sensible. De hecho PT100 viene de “Pt” el símbolo para platino, que es un elemento usado por su confiabilidad. Su resistencia varia de manera constante y confiable a lo largo de un gran rango de temperaturas. Es esta resistencia la que medimos para obtener nuestros datos.
- La resistencia del circuito esta ligada al Voltage pero los voltajes son muy sensibles a ruido y podríamos confundir ruido de las lineas de transmisión con mediciones reales. Por tanto usamos la corriente que es mucho mas estable y también esta relacionada a la R y V, según V=IR. Para medir la corriente usamos un transmisor 4/20mA current loop. Este aparato mide corriente y esa corriente es la que usamos para calcular la resistencia y convertirla a temperatura.
- Uno de los puntos mas importantes de cualquier medición es que las mediciones son instantáneas. Es decir, se toman en un instante y muchas cosas pueden pasar entre un instante y otro. Esto da como resultado varianzas que deben ser eliminadas. Para ello es importante tomar varias muestras y obtener un promedio. Existen cómputos estadísticos mas sofisticados que se pueden emplear para eliminar ruido y valores extremos pero por ahora veremos el mas sencillo, el promedio.
Realmente lo que debemos hacer es tomar varias muestras a lo largo del tiempo, almacenarlas y tomar un promedio de ellas. En programación podemos almacenar un gran grupo de datos en una estructura llamada arreglos, o arrays. En Arduino definimos un array asi:
float analogVals[numReadings];
Aqui decimos que el array de nombre analogVals sera te valores tipo float y tendrá un cierto numero de elementos o items según la cantidad numReadings.
//Array vars
const unsigned int numReadings = 100;
float analogVals[numReadings];
unsigned int i = 0;
Aqui definimos el valor de numReadings en 100 y creamos un valor contador “i” iniciando con valor 0. Este lo usaremos para incrementarlo cada vez que agreguemos un nuevo valor de temperatura al array y lo compararemos contra el numReadings de 100. Al llegar a 100 valores, tomaremos el promedio.
analogVals[i] = f1;
if (i>=numReadings) {
//2. get average and go to test logic
float theAvgIs = average(analogVals,i);
//3. call logic
logicAction(theAvgIs);
i=0; //reset
} else {
i++;
}
Dentro del loop, almacenamos el valor del sensor, f1 y lo almacenamos en la primera posición del array analogVals[0] porque i empieza en 0.
Luego hacemos una prueba, si “i” ya llego a ser mayor o igual a 100, promediamos, de otra manera, solo le sumamos 1 a i, usando i++, y ahora i = 1 y volvemos al loop para tomar otra medicion.
Eventualmente cada vez que tomemos una medición y le sumemos 1 a i, i llegara a 100. En ese momento ya hemos almacenado 100 valores en nuestro array y podemos hacer cálculos.
float average (float * array, int len){
float sum = 0L ;
for (int i = 0 ; i < len ; i++)
sum += array [i] ;
return ((float) sum) / len ;
}
En ese entonces llamamos esta función pasándole el array completo y su numero de elementos. Esta función suma los valores del arreglo y los va almacenando en la variable sum. Al final divide ese total entre len, el valor de items en el array para darnos un promedio y lo regresa al loop.
Regresando al loop ponemos ese valor en theAvgIs y lo pasamos a la función siguiente para tomar una decision sobre la lectura:
void logicAction(float thisIsIt){
if (thisIsIt > 20.0){
//its hot
Serial.println(“done…>20”);
Serial.println(thisIsIt);
} else {
//its cold
Serial.println(“done…<20”);
Serial.println(thisIsIt);
}
}
Aqui vemos que si el valor pasado es > a 20, esta caliente y si es menor a 20 esta frío. En ese caso tomaríamos la accion en base a cada posibilidad, como cerrar válvulas, incrementar calor de la caldera etc.
Al final los resultados son:

Como podemos observar, al calentar el sensor arriba de 20, la respuesta cambia y podríamos tomar las acciones necesarias.
Recordemos que hay otras mejoras; por ejemplo aquí esperamos a volver a llenar el array con 100 valores nuevos para obtener un nuevo promedio y poder comparar con lo deseado y tomar acciones. Esperar 100 mediciones es bastante tiempo. Podríamos ir llenando valores nuevos para reemplazar los mas viejos en el array, y tomar otro promedio al tener 10 nuevos y 90 viejos. Así el promedio se actualizaría mas seguido y podríamos tomar mejores decisiones.