o Unir un sensor de temperatura y un ventilador.
o Calculando la temperatura con float.
o Usando el ventilador para disminuir la temperatura.
o Ilustrar la idea de un buffer circular
MATERIAL REQUERIDO.
Hemos ido viendo hasta ahora como utilizar un sensor de temperatura y también como
usar un pequeño transistor para mover un motor de CC, pero no los habíamos mezclado.
En esta sesión haremos un pequeño ejemplo de control, usando un sensor LM35DZ para
determinar la temperatura y un ventilador de 5V, para que cuando la primera alcance un
valor crítico, usemos el segundo a fin refrigerar el circuito.
Veremos que la regulación de un sistema tan sencillo no tiene grandes problemas y por
eso esta sesión esta mas pensada como un ejercicio de control sencillo y que como una
regulación en toda regla.
Además el parámetro que buscamos controlar, la temperatura, tiene la virtud de variar con
lentitud, lo que nos deja mucho tiempo para reaccionar y no tener que preocuparnos por
cuestión de reaccionar con precisión en tiempo real.
Vamos por tanto a montar un circuito sencillo con el sensor de temperatura y otro
independiente con un transistor para controlar el motor del ventilador en la misma
protoboard.
Vamos a montar un pequeño circuito que lea la temperatura de un sensor, imprima el valor
en la consola y encienda un diodo cuando esta sobrepase un cierto umbral.
Para conectar el sensor de temperatura LM35DZ y el transistor 2N2222, os incluyo el
detalle de sus pines aquí
Ya hemos visto en sesiones previas como usar un sensor LM35DZ, pero si alguno queréis
revisarlo podéis hacerlo aquí: Sensor de temperatura.
Vamos a empezar probando el sensor para comprobar que funciona correctamente, y para
ello vamos a usar este programa:
const int Sensor = 0 ; // Pin que lee la temperatura
void setup()
{ Serial.begin(115200); }
void loop()
Serial.println(temp) ;
delay(200);
Usamos la puerta Analog0 que definimos como una constante sensor, y en el loop leemos
la puerta y convertimos el valor de la lectura a grados centígrados (Recordad que la razón
de hacerlo así la vimos en la sesión de los sensores de temperatura) e imprimimos sin más
el valor de la temperatura. Deberías ver algo parecido a esto:
El sensor LM35DZ tiene un margen de error de alrededor de ± 0,5 grados y por eso las
lecturas tienen oscilación, dando diferencias de hasta un grado.
El baile de las lecturas se debe a que el mundo real nunca es perfecto y hay cosas que
van desde la incertidumbre de la medida causada por el propio sensor hasta los errores en
los convertidores de nuestro Arduino (Que no son los mejores del mundo) e incluso
interferencias electromagnéticas espurias.
Todo ello se confabula para que tengamos ese molesto baile de cifras en la medida y
aunque en este caso no tiene importancia puede convenirnos filtrar este tipo de errores y
para ello podemos promediar las n ultimas lecturas y presentar esto como el valor de la
temperatura.
Para ello podemos guardarlas digamos 8 últimas lecturas y promediarlas, con lo que
aplanaremos fuertemente los errores, y la manera más sencilla es usar un buffer
circular (O Ring Buffer)
La forma de apuntar a la posición a escribir es una variable llamada Índex que empieza en
0 y cada vez que escribe en la posición correspondiente se incrementa en 1 ¿Y cómo
evitamos que pase del valor máximo aceptable? Pues tomando el resto del valor de Índex
con respecto al número de posiciones del array.
index = ++index % 8 ;
Una vez que apuntamos correctamente a la posición a escribir y después de los N valores
iniciales en los que la temperatura promedio será falsa (Porque aún no hemos leído N
valores) tendremos en Buffer las ultimas N lecturas y el resto es aritmética:
int index = 0 ; // Posicion a escribir
index = ++index % N ;
float Tmedia = 0 ;
Serial.println( Tmedia / N) ;
Aquí os dejo el programa complete, por si quieres jugar con el: Prog_130_2. Para N = 32
podéis ver algo así:
Podéis ver que la temperatura baila mucho menos y el baile desciende a medida que
aumentáis el número de muestras que promediáis, pero cuidado, cuanto más crece N
también crece el tiempo que tardáis en responder a los cambios ( Para N = 32 a 5
muestras por segundo hay más de 6 segundos de tiempo de reacción).
Aunque con una temperatura ambiente eso no es grave, puede haber ocasiones
en que lo sea, por ejemplo porque un quemador arranca, y en 6 segundos le sobra tiempo
para chamuscar lo que sea que estemos controlando, así que ojo.
INCLUYENDO EL VENTILADOR.
void setup()
{ Serial.begin(115200);
pinMode(control, OUTPUT) ;
void loop()
Serial.println(temp) ;
digitalWrite(control, HIGH);
else
digitalWrite(control, LOW);
delay(200);