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.
Tienda España | Tienda Mexico | |
---|---|---|
![]() | Kit inicio UNO | Kit inicio UNO |
![]() | Kit Inicio Mega | Kit Inicio Mega |
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.
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:
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
En este curso arduino hemos aprendido lo siguiente:
- 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.
Hola, este programa resolvería el problema de histeresis ? o faltaria agregar algunas lineas de codigo para que no se quede en un bucle cuando detecte cruce de umbral?
gracias
Como seria el codigo para añadirle una pantalla LCD 16×2?
Aquí tienes cómo usar un lcd 16×2 https://www.prometec.net/bus-i2c/
Buen dia, es mi primera vez usando arduino y me preguntaba como podria con este mismo proyecto hacer que ademas muestre el voltaje y la temperatura en una pantalla LCD
Hola Alan, echa un ojo aquí y si tienes algún problema nos comentas.
Hola, muy buenas.
Me dio un error, abrir la programación de Arduino, conecte todo y subi el programas (todo bien hasta ahora), pero cuando el sensor de temperatura llega al nivel para encender los ventiladores estos se encienden y no se apagan, la temperatura que me marca pasa de 25 a rondar entre los 40 y 50.
Sabrías decir una posible solución?.
Muchas gracias y un saludo.
Has mirado si el sensor se calienta? Puede ser algún cable que esté mal conectado.
Buenas tardes, soy novato, y no se muy bien de todo lo que hablan, si tengo un ventilador de 24 volts, aparte de los 5 volts del arduino debo usar una fuente de poder de 24 volts para que pueda girar el ventilador?
Eso es Elías, y necesitarías un relé o un transistor acorde.
Hola .. como le podria hacer para controlar la temperatura pero regulando una resistencia y un ventilador todo elmtiempo encendido
No se si te entiendo Hector
Hola, buenas noches, soy nuevo en Arduino y utilice tu programa para probarlo, pero el ventilador me gira el mismo tiempo que para, y la duración de estos 2 depende del delay, no me funciona con el sensor de temp.
Puedes ver si lee correctamente la temperatura en el monitor serie?
comproba que el sensor funcione con el primer programa , y te de medidas similares
quiero conectarlo a uno de 12 volt
NO tendras problema, ya que usas la base del transistor para regular el motor pero puedes conecta el emisor a 12v directamente
hola que pasa si conecto un ventilador de mayor voltaje?
EL circuito funciona igual, pero tienes que conectar 12V en la pata del transistor en lugar de 5V
Buenas noches, Muy buen aporte y aplicable para otros circuitos como autos, casas, etc. Observando el circuito me gustaría aclarar algo que note en el transistor. Este es del tipo npn, por lo tanto controlaría el cable GND del ventilador. La función seria la misma solo esta ese detalle.
Saludos.
Hola amigo, veras este control lo logre hacer hasta modulando la potencia de una ampolleta para variar la temperatura del sensor… Pero lo tengo que hacer con control PID y he buscado información pero es demasiado ambigua, y no he encontrado como usar la librería PID de arduino… Sabes como se podría hacer esto?
Hola Víctor la librería es sencilla de usar, lo más difícil es conseguir los valores óptimos para kp, ki y kd. ¿Estás familiarizado con el PID?
buen dia soy estudiante es la primera ves que uso arduino y copee el codigo y me aparece esto
temperatura:13: error: ‘Buffer’ does not name a type
Buffer[ index] = temp ;
Lo que te dice el compilador es que no reconoce Buffer. Deberias tener una linea previa que dijera
float Buffer[N] ;
Si descargas el programa que tienes en esa misma pagina lo encontraras completo