G025 Sensor de Temperatura LM35DZ y un Ventilador

 ADM
Descripción
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, y ahora vamos a mezclar ambos circuitos.

Vamos a usar 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, servirá para mostrar un ejemplo de control y reacción.

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.

Cuando no tienes tiempo de reacción tendríamos que hablar de cosas como el control PID, pero ahora no es el momento. 

Materiales
Placa de Arduino 
1 Resistencia de 330
1 Transistor NPN 2N2222
1 Sensor de temperatura LM35DZ
1 Ventilador de ordenador
Protoboard, Cables para conexiones, un cable USB para conectar Arduino al PC y sirve además de alimentación para el sensor
1 Fuente de alimentación que proporciones 12V para alimentar el ventilador

Esquema

Vamos a montar un pequeño circuito que lea la temperatura de un sensor, y active el ventilador cuando esta sobrepase un cierto umbral.


Montaje

IMPORTANTE, en el caso de este montaje lo importane es que el ventilador esté frente al sensor, para que este se enfríe y vuelva a parar el ventilador.  No está así puesto por motivos de claridad en el montaje.  Al igual que si el circuito se monta para una aplicación real el ventilado debe estar orientado a enfriar aquello que calienta a sensor.

Código
Probando el sensor de temperatura 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:

int Sensor = 0 ;             // Pin que lee la temperatura
int umbral = 22 ;            // 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;
  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)

No hay comentarios:

Publicar un comentario