Anda di halaman 1dari 10

OBJETIVOS


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.

Arduino Uno o similar. Esta sesión acepta cualquie

Una Protoboard más cables.

Un diodo LED y una resistencia de 330Ω.

Un transistor 2N2222. Comprobad que lleva rotulada


temperatura es similar.

Un ventilador de 5V o un motor de corriente continu


Un Sensor de temperatura LM35DZ o similar.Compr
porque es fácil confundirlo con un transistor.

UN CIRCUITO CON SENSOR Y ACTUADOR

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.

Como no disponemos de ningún sistema a refrigerar, nos conformaremos con enfriar el


propio sensor, lo que no resulta especialmente provechoso, pero sin duda, nos servirá para
mostraros un ejemplo de control y reacción, en el mejor espíritu de un sistema automático,
tal como un regulador de temperatura con nuestros Duinos.

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.

 Hace mucho tiempo, cuando empecé a trabajar en cosas de estas, y alguien


preguntaba qué era eso de trabajar en tiempo real, definíamos el tiempo real como el
margen que tenías para reaccionar y controlar el parámetro díscolo antes de que algo caro
se fuera al guano.
 Cuando estás en un marrón así, las técnicas que vamos a aplicar aquí no valdrían
y tendríamos que empezar a hablar de cosas como el control PID, pero por ahora es
pronto, así que mejor lo dejamos aquí.

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.

ESQUEMA ELECTRÓNICO DEL CIRCUITO.

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í

Aquí tenemos el esquema electrónico del circuito:


Y el circuito para protoboard sería muy sencillo también:
PROBANDO EL SENSOR DE TEMPERATURA.

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()

{ int lectura = analogRead(Sensor);

float voltaje = 5.0 /1024 * lectura ;

float temp = voltaje * 100 ;

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.

PARA LOS QUE VAN A POR NOTA

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.

Buffer[ index] = temp ;

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

const int N = 16 ; // Numero de muestras a considerar

float Buffer[N] ; // Array donde guardamos las lecturas


Buffer[ index] = temp ;

index = ++index % N ;

float Tmedia = 0 ;

for (int i=0 ; I < N ; i++)

Tmedia = Tmedia + Buffer[i] ;

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.

Ya tenemos montado el sensor de temperatura y ahora vamos a programar el control de


arranque y apagado del motor / Ventilador, definiendo un valor umbral a partir del cual
queremos ventilar el sensor. Veamos un posible programa: Prog_130_1
int Sensor = 0 ; // Pin que lee la temperatura

int umbral = 30 ; // Temparatura que arranca el ventilador

const int control = 9 ; // Gobierna el ventilador

void setup()

{ Serial.begin(115200);

pinMode(control, OUTPUT) ;

void loop()

{ int lectura = analogRead(Sensor);

float voltaje = 5.0 /1024 * lectura ;

float temp = voltaje * 100 -5 ;

Serial.println(temp) ;

if (temp >= umbral)

digitalWrite(control, HIGH);

else

digitalWrite(control, LOW);

delay(200);

La única novedad es que comprobamos que la temperatura medida es inferior al umbral


prefijado y si no es así, arrancamos el ventilador para refrescar el sensor.
 Fijaros que al alcanzar el umbral, disparamos el ventilador a tope de modo digital.
Es decir todo o nada. En una situación real probablemente convendría hacer un control
proporcional de la velocidad del ventilador en función de lo lejos que esta del punto que
buscamos ( Aquí es donde entran las cuestiones de control PID)
 Os propongo que hagáis un ejemplo en el que la velocidad del ventilador sea
proporcional a la diferencia entre la temperatura umbral y la temperatura medida.
Aquí tenéis un pequeño vídeo mostrando el montaje:

Anda mungkin juga menyukai