bclose

Sensor de temperatura y ventilador

Ejemplo sencillo de control de temperatura
tienda online prometec

Objetivos

 

 

    • Unir un sensor de temperatura y un ventilador.
    • Calculando la temperatura con float.
    • Usando el ventilador para disminuir la temperatura.
    • Ilustrar la idea de un buffer circular

 

Material requerido.

ArduinoUNO Arduino Uno o similarEsta sesión acepta cualquier otro modelo.
Img_3_4Img_3_6 Una Protoboard más cables.

Img_3_5
Un diodo LED y una resistencia de 330Ω.
2N2222 Un transistor 2N2222. Comprobad que lleva rotulada esta referencia, porque el sensor de temperatura es similar.
Motor CC  Un ventilador de 5V o un motor de corriente continua.
Sensor de temperatura Un Sensor de temperatura LM35DZ o similar.Comprobad que lleva rotulada esta referencia, 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í

Detalle pines
Pines del LM35DZ

Aquí tenemos el esquema electrónico del circuito:

Esquema electronico

Y el circuito para protoboard sería muy sencillo también:

Esquema de protoboard

 

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:

Consola Arduino

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)

Buffer circular

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í:

Consola arduino

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:

 

 

Resumen de la sesión

 

 

    • Mezclamos en un único proyecto un sensor y un actuador para conseguir control.
    • Presentamos la idea de buffer circular para promediar las lecturas instantáneas.
    • Vimos un principio de regulación de temperatura.

 
 
 

 

 

 

 

 

 

(86) Comments

  • Muy buena explicación amigo, yo quiero hacer este proyecto pero con pid, el problema es que no se cómo meterle el código pid al código del sensor, podrías echarme una mano amigo gracias.

    • Hola Gerson, busca una librería que se llama PID para Arduino que te lo pone bastante sencillo. Lo más difícil es buscar los valores correctos para lñs constantes. UN saludo.

  • Hola:

    Lo primero felicitaros por el trabajo tan estupendo que hacéis en prometec. ¡Es fantástico!

    Tengo un problema replicando este circuito, lo he montado tal cual está, salvo que he utilizado un DHT11 en vez del LM35DZ. Lo que me ocurre es que, una vez que enciendo el ventilador, el sensor DHT11 comienza a dar fallos de lectura. He probado a dejarle una pequeña pausa, a ver si leía correctamente, pero sigue sin funcionar. Solo he conseguido que lea correctamente si apago el ventilador.

    Supongo que será problema de las interferencias que genera el ventilador al girar ¿Cómo puedo “protegerlo” para que funcione? Muchísimas gracias por vuestra ayuda.

    Un saludo

    • Hola Vicente, si estás utilizando la misma tierra para ambos componentes, prueba a separarlas y usar una diferente para cada uno y nos cuentas. Un saludo.

      • Muchas gracias!

        Lo he probado y han mejorado mucho las lecturas, aunque sigue dando algún fallo de vez en cuando.

        Un saludo

        • Me alegro mucho Vicente. Un saludo.

    • SamCas

    Buenas a todos!
    Lo primero, enhorabuena por los tutoriales, son muy ilustrativos.

    Mi duda es relativa a la resistencia de 330 Ohm en la Base. ¿Por qué es necesario colocarla? ¿Es un valor calculado? He visto varias configuraciones, con 330 Ohm, con 1K Ohm y SIN resistencia. ¿Es necesario, o recomendable, controlar la corriente en la Base?

    Muchas gracias y un saludo

    • Buenos días Samuel, es necesario poner una resistencia entre la pata del Arduino y la base del transistor. Sabiendo el transistor que vamos a usar tenemos que calcular la resistencia que vamos a poner. Para ello tenemos que saber saber qué hFe (ganancia de corriente). Puedes verlo en el datasheet.

      Después con la fórmula (si no me equivoco) (Voltaje-0,7)/Ic/hfe puedes calcular la resistencia, y seleccionar la que esté más cercana al valor que te salga. Un saludo.

    • No es importante el valor de la resistencia en la base para este caso. Ambos valores funcionaran correctamente ya que no hay carga en la base, lo unico que buscamos es que no sea cero

    • Julian Barragan

    Hola que tal, tengan un cordial saludo de parte mia,

    La presente es para informarle que tengo un problema al hacer el hardware del ventilador, en su practica yo repito las mismas faces hechas por ello tengo fiel confianza en que me funcionara….. pero al terminar la parte fisica, el arduino me presenta un problema al conectar a 5V en el arduino….. Estoy repitiendo el mismo paso y siempre me forma el problema en el pin 5V, ya que cuando conecto el arduino con el computador este se queda apagado ( no enciende ninguna luz ) y cuando quito el pin 5V hay si me enciende…. Me gustaria saber cual es el preblema

    • Si te entiendo bien, Julian, tiene toda la pinta de que hay un corto circuito en alguna parte de las conexiones. Revisalo y me dices

    • Lluc Plans

    buenos días he montado el circuito todo igual pero en vez de poner una resistencia de 330 he puesto 3 en serie de 100 porque no tenia de 330, el sensor me marca la temperatura correctamente pero cuando el valor es mayor al indicado previamente el ventilador no se enciende. Me podríais ayudar por favor? Muchas gracias

    • Hola Lluc, he mirado por si acaso el programa y está bien así que debes tener algún problema en las conexiones. De todas formas dale un golpecito al ventilador que a veces le cuesta arrancar. un saludo.

  • Se podría hacer lo mismo utilizando el sensor de temperatura DHT11 en vez del LM35DZ y utilizando la Raspberrry Pi 3 en vez de Arduino?

    • Sí podrías hacerlo, y realizar la programación en Phyton. Un saludo.

    • Yomo

    Trato de que encienda además con un botón y se apague con el mismo, además claro de el sensor alguien que me pueda ayudar???

    • Hola Yomo, necesitarías crear una variable que, por ejemplo se ponga a 1 cuando enciendas el ventilador y a 0 cuando esté apagado. De esa forma sólo tienes que leer el pulsador, y si está a 0 la variable que encienda el ventilador y ponga la variable a 1, y si está a 1 que lo apahgue y la ponga a 0. Un saludo.

    • Hola Yomo,

      EL truco es que crees una variable global llamada encendido y le das el valor false. CUando pulsas el botonlo pones a True y haces lo que sea.
      Cuando vuelves a pulsar el boton lo pnes a false.

      El resto del programa simplemente hace lo que sea en funcion del valor

  • Necesito una aclaración. Me sucedió lo mismo cuando leí la sesión 15. Creo entender que los pines 0 y 1 son digitales y se utilizan para transmisión de puerto serie. En este caso necesitamos utilizar las entradas analógicas, ¿Porqué declaramos el sensor en el pin 0 y no en A0? Si poniendo solo 0 basta, como sabe arduino que pin utilizar? ¿Analógico o digital?
    Saludos

  • buenas tardes , estoy intentando hacer una practica con un sensor de temperatura LM335 , consiste en en leer la temperatura y si supera de la temp de consigna se encienda un led ( ventilador ) y si desciende de dicha temperatura se enciende otro led ( calefaccion),pero no funciona , he realizado este programa , alguien me puede ayudar , gracias

    int Sensor = 0 ; // Pin que lee la temperatura
    int umbral = 15 ; // Temparatura que arranca el ventilador
    const int vent = 9 ; // Gobierna el ventilador
    const int calef = 10 ; // Gobierna la calefaccion

    void setup()
    { Serial.begin(9200);
    pinMode(vent, OUTPUT) ;
    pinMode(calef, 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(vent, HIGH);
    Serial.print(“VENT ON”);
    delay(1000);
    else
    digitalWrite(vent, LOW);
    Serial.print(“VENT OFF”);
    delay(1000);

    }
    {

    if (temp < umbral)
    digitalWrite(calef, HIGH);
    Serial.print("calefaccion ON");
    delay(1000);
    else
    digitalWrite(calef, LOW);
    Serial.print("calefaccion OFF");
    delay(1000);
    }
    }

    • Hola Silleta, no sé si es problema del copy paste pero tienes los if sin llaves, así que sólo entra dentro la primera instrucción, deberían ser así:

      if (temp > umbral)
      {
      digitalWrite(vent, HIGH);
      Serial.print(“VENT ON”);
      delay(1000);
      }
      else
      {
      digitalWrite(vent, LOW);
      Serial.print(“VENT OFF”);
      delay(1000);
      }

      if (temp < umbral) { digitalWrite(calef, HIGH); Serial.print("calefaccion ON"); delay(1000); } else { digitalWrite(calef, LOW); Serial.print("calefaccion OFF"); delay(1000); }

  • Hola mucho gusto soy estudiante y estoy trabajando en un proyecto similar pero busco que el ventilador se encienda y se apague a una temperatura determinada.
    Sera que me puedes ayudar o explicar de como hacer para que este funcione.

    • Hola Maicol, eso es exactamente lo que hace el último de los programas el Prog_130_1. Lo enciende a partir de cierta temperatura y lo apaga por debajo de ella.

  • hola mi consulta es que si se podria conectar a un cooler de 12v y como se hace.si podes responderme al correo mejor

    • Hola Pablo te respondo por aquí para que pueda servir de ayuda a más gente (y también al mail), podrías conectarlo a través de un transistor igual que en esta sesión, pero necesitas una fuente de alimentación externa de 12V, ya que Arduino sólo te da 5. Un saludo.

  • Hola seria posible adaptarlo para hacer un termostato para casa es decir casi lo mismo pero que en ve de encender un ventilador accione un relé y conecte la caldera, también se necesitaria una pantalla, y luego controlarlo por wifi o por botones locales
    Soy novato en esto y queria que fuera mi primer proyecto.

    De momento he comprado esto:

    Mira lo que he encontrado en AliExpress
    http://s.aliexpress.com/6rIZVBfq

    Mira lo que he encontrado en AliExpress
    http://s.aliexpress.com/IruYrQfQ

    arduino nano
    Display
    Sensor de temperatura y humedad
    Esp8266
    Pcb de un rele de 5v /220v
    Botones

    Si pudiera ayudarme a realizarlo, gracias de uno que intenta aprender!

    • Pues claro que podras hacerlo, y ademas cambiando muy poquito del ejemplo que hemos postado

    • Jorge

    Gracias por la atención. Como agregar otro valor umbral para controlar otro dispositivo? Por ejemplo, quiero mantener 25 grados y accionar un enfriador a los 26 y un calentador a los 24? Muchas gracias.

    • Hola Jorge,

      Podrias hacer algo asi:

      if (temp >= 26)
      digitalWrite(control, HIGH);
      else if (temp <= 24) digitalWrite(control, LOW);

        • Jorge

        Muchas gracias por la pronta respuesta. Saludos.

  • a mi el LM 35 me marca 423.50 a que se debe me podría indicar se lo va a agradecer pero funciona el circuito

    • Hola Efrain, probablemente tengas algún problema en el montaje o si no debería estar en la conversión que hacemos de la lectura a la temperatura.Un saludo.

  • Como le puedo poner un Relé

    Ya arme el circuito y funciona, pero mi maestro me dijo que le pusiera un relé, que le integre uno al circuito

    • Hola Antonio, tienes aquí una sesión en la que hablamos de los relés. Si tienes problemas coméntanos: https://www.prometec.net/reles/

      Un saludo.

    • Si uso un relé tendré que modificar el código, o no?

      • Tendrías que cambiar el montaje y poner el relé entre el transistor y el ventilador. El programa creo que te serviría el mismo tal cual. Un saludo.

  • Podría usar un Motor DC?
    Es que tengo un proyecto, y necesito que un sensor haga que el motor gire, con arduino

    • Hola antonio, el motor del ejemplo es de DC

  • tienen alguna idea para poder regular la temperatura con un potenciometro que al decirle cierta temperatura la aplique

    • Hola Eulises, para fijar una temperatura con el potenciómetro puedes usar la función map(). Funciona de forma que adapta un rango de valores a otro, en este caso los valores 0 a 1023 de la entrada del potenciómetro al rango de temperaturas que quieras abarcar. Algo así:

      valor_temp = map(valor_pot,0,1023,temp_min,temp_max);

      Un saludo.

    • Esteban

    Hola qué tal este circuito serviría para 3 ventiladores pero de 12V

    • El circuito sí te serviría pero necesitarías a una fuente de alimentación de 12V externa en vez de los 5V de Arduino.

    • No estoy seguro de entenderte Esteban

    • Alexis

    Gracias por el tutorial. Sabe cómo podría controlar el movimiento del ventilador. Que vaya más lento o más rápido?

    • En vez de mandar un HIGH o un LOW a la base del transistor para encender y apagar el ventilador, utiliza un pin PWM y mandas un valor entre 0 y 255 para controlar la velocidad del mismo. Un saludo.

    • Hola Alexis, bastaria con unsar una señal PWM o de modulacion de pulsos para regular la velocidad del motor de un modo mas fino tienes algunos tutos al respecto en la nuestra web

Give a Reply

WordPress Anti-Spam by WP-SpamShield