El proyecto que vamos a describir hace uso de un microcontrolador pequeño, de la familia 16F de Microchip y un sensor de temperatura Dallas DS1820 para mantener la temperatura (y opcionalmente la iluminación) de un recinto dentro de los parámetros establecidos por su programa. Este tipo de circuitos es ideal para la utilización en hogares o, mejor aún, en invernaderos o cámaras de cría de diferentes animales. Se pueden seleccionar los tiempos de encendido y apagado de las luces y del sistema de ventilación, como así también seleccionar qué temperatura deseamos a lo largo del día. Como si fuera poco, el sistema se encarga de encender la calefacción o el aire acondicionado según corresponda.

Además del circuito completo y la explicación paso a paso para su construcción, le brindaremos al lector un programa de ejemplo, realizado en el BASIC del PIC SIMULATOR IDE, que hace uso de todas estas posibilidades. Dicho programa podrá ser modificado fácilmente para adaptarse a situaciones particulares, ya que está totalmente comentado.

Control Electrónico de temperatura e iluminación
Vista lateral del conjunto terminado.

Interfaz con el usuario

Hemos utilizado como interfaz con el usuario un display de cristal líquido de dos líneas de 16 caracteres cada uno. Este se encarga de mostrar continuamente la hora, el programa elegido, la temperatura actual, la máxima y la mínima alcanzada, y también el estado (encendido o apagado) de cada una de sus salidas: calefactor, aire acondicionado, ventilador y luz.

Existen dos pulsadores, que se utilizan para seleccionar el programa elegido y para “resetear” (poner en cero) las temperaturas máximas y mínimas registradas.

Debido a que se lleva la cuenta del tiempo, se emplea un cristal de 4MHz que brinda una gran estabilidad en el tiempo, bastante mayor a la obtenida con el oscilador interno del microcontrolador.

El sensor DS1820

La temperatura se obtiene mediante un sensor DS1820, cuya principal característica es que, en lugar de transformar la temperatura en una tensión (tal como hacen la mayoría de los sensores de este tipo), posee un microcontrolador incorporado. Además, al ser interrogado nos devuelve directamente la temperatura leída en forma de una serie de bits. Este sensor merece un capítulo aparte, y será objeto de algún artículo en el futuro. Incorpora una pequeña memoria EEPROM interna que podemos utilizar para almacenar las temperaturas leídas, alarmas configurables, y una serie de funciones que son muy valiosas y poco habituales en estos sensores. Su costo es muy razonable para lo que son sus características, y no supera los 5 euros.

Salidas y alimentación

Todas las salidas que controlan los equipos que proporcionan el calor, el frío, la luz y el ventilador se manejan mediante microrelés, capaces de manejar una corriente máxima de 10A en sus contactos. Estos relés son inversores, por lo que se puede obtener la función inversa dependiendo de en qué contactos conectemos el equipo en cuestión. Como las salidas del PIC no proveen la corriente suficiente para excitar el relé, se ha intercalado una resistencia de 1K5 y un pequeño transistor que provee la corriente necesaria al relé. El diodo 1N4001 protege al transistor de la corriente inversa que se genera en las bobinas de los relés al desenergizarse.

La alimentación de este circuito se realiza a partir de 12V de corriente continua, obtenidas de una pequeña fuente universal como las que se pueden adquirir en cualquier comercio, y que sea capaz de proporcionar una corriente de unos 500mA. En el circuito podemos ver una etapa de alimentación que se encarga de filtrar el rizado que pueda haber en la fuente mencionada, un diodo que nos protege de conexiones con la polaridad invertida, un clásico regulador de voltaje LM7805 que reduce los 12V a 5V, necesarios para alimentar el display y el microcontrolador, y por último una resistencia que alimenta un LED utilizado como piloto, para saber que el circuito se encuentra alimentado.

Control Electrónico de temperatura e iluminación
Esquema eléctrico de nuestro proyecto.
Control Electrónico de temperatura e iluminación
PCB sugerido.

Construcción del circuito

No hay aspectos constructivos destacables respecto de otros proyectos similares que hemos encarado. Como siempre, empezaremos por fabricar nuestro PCB, para ello utilizaremos el “método de la plancha” explicado en NeoTeo (ver enlaces). Una vez terminado, procederemos con el armado de la plaqueta, colocando primero los componentes más bajos (zócalo, resistores, diodos) y por último los más altos (transistores, condensadores, etc.). No es mala idea dar una mano de barniz en aerosol al lado cobre de la placa, para protegerla de la corrosión, ya que el cobre expuesto al oxígeno del aire se sulfata muy fácilmente.

Uniremos eléctricamente el display y los pulsadores de control mediante cables flexibles. Nosotros utilizamos un trozo de cable plano como el utilizado en las disqueteras o discos rígidos ATA antiguos, que separamos en conductores individuales en algunos casos, y en otros directamente soldamos el display a la placa principal mediante pines de bronce (ver fotos).

Luego, antes de montar el microcontrolador, conviene alimentar la placa y medir con el multímetro (tester) que los pines 5 y 14 del zócalo tengan 0 y 5V.

Es una buena idea conseguir alguna caja plástica para albergar todo el proyecto, a la que le montaremos los controles y el display sobre el frente. Para ello se puede usar una herramienta de altas RPM tipo “Dremel”, como las usadas por los hobbystas. En esta etapa entran en juego las habilidades manuales de cada uno.

Por supuesto, el lector deberá hacer las conexiones de los electrodomésticos implicados a las borneras de los relés. Deberá ser cuidadoso en esto, recordando siempre que está manejando 110/220 Voltios de la red, que si no se respetan adecuadamente pueden resultar mortales. También hay que prestar atención al consumo de estos aparatos, ya que si superan los 10A proporcionados por los microrelés deberemos intercalar un relé de mayor corriente en sus contactos. Ni NeoTeo ni el autor se hacen responsables por los inconvenientes o accidentes que puedan ocurrir al construir o utilizar este proyecto.

Control Electrónico de temperatura e iluminación
Bornera donde conectar las cargas.
Control Electrónico de temperatura e iluminación
Vista del lado de las soldaduras.

El software de ejemplo

Como ejemplo, hemos confeccionado un software que se puede modificar con facilidad, ya que está perfectamente comentado en el propio código fuente, realizado con el BASIC del PIC SIMULATOR IDE (excelente entorno de programación), del que existe una versión de prueba que podemos utilizar para compilar el código propuesto.

Las características que hemos implementado son las siguientes:

  • Reloj de 24 horas, capaz de contar días, horas y minutos.
  • Lectura de la temperatura entregada por el sensor. Las rutinas necesarias para esto se encuentran al final del código, y pueden ser usadas en otros proyectos.
  • Tres programas (fácilmente se pueden ampliar a muchos más) que mediante el contenido de algunas variables comentadas en el código permiten elegir qué parte del día el sistema mantendrá la temperatura en el valor deseado, qué parte tendrá la iluminación encendida, etc.
  • Registro de las temperaturas máximas y mínimas, con posibilidad de resetearlas en cualquier momento.
  • Selección del programa en curso mediante un pulsador. En el display se exhibe la leyenda “P1”, “P2” y “P3”.
  • El sistema protege el mecanismo del aire acondicionado, no permitiendo su encendido hasta que no hayan transcurrido al menos 5 minutos desde que se apagó.
  • El ventilador está configurado para marchar cada vez que se enciende el calefactor, para que el aire del ambiente controlado tenga una temperatura uniforme (el aire acondicionado tiene su propio ventilador).
  • Se escriben en la EEPROM el valor del programa en curso, la hora actual, estado de las salidas y temperaturas extremas censadas, por si ocurre algún corte de energía. En ese caso, al reiniciarse el sistema se comienza desde el punto en que se produjo el corte.

Por supuesto, el programa tal como está difícilmente coincida con la necesidad de todos los lectores, por lo que se puede tomar como un ejemplo de partida para sus propios programas. Sería imposible publicar (por su extensión) un programa que contemple todas las posibilidades del hardware, como por ejemplo poner el reloj en hora, cambiar las características de cada programa desde el panel de control, etc.

El autor del artículo emplea con éxito este circuito para controlar salas de cría de semillas, regular la temperatura de oficinas, etc.

Código fuente del programa

'Ejemplo de programación del sistema de control electrónico
de luz y temperatura, especial para Neoteo.
'Versión con pulsador para seleccionar el programa 1,2 o 3
y Pulsador para resetear Max/Min
'-------------------------------------------
'Declaracion de Variables
Dim i As Byte ' Variable tipo Byte multiproposito
Dim j1 As Byte
Dim j2 As Byte
Dim auxw As Word ' Variable tipo Word multiproposito
Dim aux As Word ' Variable tipo Byte multiproposito
Dim text(16) As Byte
Dim tmax As Byte ' Valor de la temperatura Maxima Registrada en el ciclo
Dim tmin As Byte ' Valor de la temperatura Minima Registrada en el ciclo
Dim prog As Byte ' Programa en curso
Dim dias As Byte ' Dias en curso
Dim hora As Byte ' Hora en curso
Dim minu As Byte ' Minuto en curso
Dim segu As Byte ' Minuto en curso
Dim paso As Byte ' Segundos entre lecturas de Temperatura.
Dim pti1(3) As Byte 'Comienzo tiempo 1
Dim pti2(3) As Byte 'comienzo tiempo 2
Dim pte1(3) As Byte 'Temperatura Tiempo 1
Dim pte2(3) As Byte 'Temperatura Tiempo 2
Dim plu1(3) As Byte 'Luces Tiempo 1
Dim plu2(3) As Byte 'Luces Tiempo 2
Dim tiemp As Word 'Tiempo actual: Hora*60+Minutos
Dim aireok As Bit '1 = puedo usar el aire
Dim tiempf0 As Word 'tiempo que hace que prendí el aire
Dim comando As Byte 'Comando a enviar al DS1820
Dim tempe As Word 'Temperatura leida
Dim tempeaux(3) As Byte 'Temperatura auxiliar
Dim tempe1 As Byte 'PArte entera de la temperatura a mostrar
Dim tempe2 As Byte ' Decimales de la tempertatura a mostrar
Dim minua As Word ' minutos que lleva encendido el aire
Dim minu0 As Word ' minutos que lleva apagado el aire
'Valor Inicial de las Variables --------------------------------------------
'tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
'tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
'prog = 1 'Programa en curso
'dias = 0 'Dias en curso
'hora = 0 'Hora en curso
'minu = 0 'Minuto en curso
segu = 0 'Auxiliar, para calcular los minutos
paso = 1 'Segundos entre lecturas de Temperatura.
pti1(1) = 8 'Programa 1, tiempo 1 (Horas)
pti2(1) = 16 'Programa 1, tiempo 2 (Horas)
pte1(1) = 20 'Programa 1, Temperatura Tiempo 1
pte2(1) = 20 'Programa 1, Temperatura Tiempo 2
plu1(1) = 1 'Programa 1, Luces Tiempo 1 (1=ON)
plu2(1) = 0 'Programa 1, Luces Tiempo 2 (1=ON)
pti1(2) = 8 'Programa 2, tiempo 1 (Horas)
pti2(2) = 16 'Programa 2, tiempo 2 (Horas)
pte1(2) = 25 'Programa 2, Temperatura Tiempo 1
pte2(2) = 25 'Programa 2, Temperatura Tiempo 2
plu1(2) = 1 'Programa 2, Luces Tiempo 1 (1=ON)
plu2(2) = 0 'Programa 2, Luces Tiempo 2 (1=ON)
pti1(3) = 8 'Programa 3, tiempo 1 (Horas)
pti2(3) = 16 'Programa 3, tiempo 2 (Horas)
pte1(3) = 20 'Programa 3, Temperatura Tiempo 1
pte2(3) = 30 'Programa 3, Temperatura Tiempo 2
plu1(3) = 1 'Programa 3, Luces Tiempo 1 (1=ON)
plu2(3) = 0 'Programa 3, Luces Tiempo 2 (1=ON)
tiemp = 0 'Tiempo actual: Hora*60+Minutos.
tiempf0 = 0
aireok = 1
minua = 0 'Minutos que lleva encendido el Aire.
'---- Leo los valores de la EEPROM ----
Read 1, prog 'Programa actual
Read 2, dias 'Dias en curso
Read 3, hora 'Hora en curso
Read 4, minu 'Minuto en curso
Read 6, tmax
Read 7, tmin
'Inicializo Puertos
AllDigital

TRISA = %00010000 '0 = salida
TRISB = %11111111 '0 = salida
PORTB = 0 ' PORTB todo en 0
'Declaro los "alias" a usar en el programa:
Symbol ds1820pin = PORTA.4 'Puerto en que se conecta el DS1820
Symbol ds1820rw = TRISA.4 '1=Leer DS1820 / 0=Escribir DS1820
'Estado inicial Reles y Display. -------------------------------------------
Symbol ventilador = PORTA.3
Symbol luz = PORTA.2
Symbol frio = PORTA.0
Symbol calor = PORTA.1
Symbol pprog = PORTB.6
Symbol preset = PORTB.7
ventilador = 0
luz = 0
frio = 0
calor = 0
'Configuro el puerto para el LCD:
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 5
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Define LCD_RWREG = 0
Define LCD_RWBIT = 0
'Inicializo el LCD
Lcdinit 0 'Cursor apagado
WaitMs 500
Lcdout "Cont. automatico"
Lcdcmdout LcdLine2Home
Lcdout "(old.neoteo.com)"
WaitMs 5000
Lcdcmdout LcdClear
'Veo si es la primera vez que se conecta el aparato, para
'poner la eeprom en cero
If prog = 255 Then
 prog = 1
 Gosub cambioprog
Endif
'Veo si se pulso la tecla de cambio de programa--------

'Lcdout "P", #prog
For i = 1 To 25
 Gosub leopulsadores
 WaitMs 40
Next i
'----------------------------------------------------------
'-- CUERPO DEL PROGRAMA
'----------------------------------------------------------
loop:
 'Calculo la "hora" actual (cantidad de minutos)--------
 tiemp = hora * 60 + minu

 'Leo la temperatura del sensor ------------------------
 Gosub init1820 'Inicializo el sensor y...
 comando = 0xcc '..salteo la ROM.
 Gosub write1820

 comando = 0x44 'Comienzo la conversion A/D de la temperatura
 Gosub write1820
 WaitUs 2000 ' Espero a que termine la conversion

 Gosub init1820 'Inicializo el sensor y...
 comando = 0xcc '..salteo la ROM.
 Gosub write1820
 comando = 0xbe 'Pido que me envie lo que calculo el sensor...
 Gosub write1820
 WaitMs 750 ' Espero ...
 Gosub read1820 'Me lo devuelve en tempe1 y tempe2

 'Actualizo y muestro Tempe1, TMax y TMin --------------
 If tmax < tempe1 then
 tmax = tempe1
 Write 6, tmax
 Endif

 If tmin > tempe1 Then 
 tmin = tempe1
 Write 7, tmin
 Endif

 'Actualizo Hora y Minu , y los muestro ----------------
 segu = segu + paso
 If segu > 59 Then
 minu = minu + 1
 Write 4, minu
 segu = 0
 If minu > 59 Then
 minu = 0
 hora = hora + 1
 Write 3, hora
 If hora > 23 Then
 dias = dias + 1
 Write 2, dias
 tiempf0 = 0
 hora = 0
 Endif
 Endif
 Endif

'Enciendo/Apago la luz, Aire, etc del programa en curso

 auxw = pti1(prog) * 60
 If tiemp < auxw then 'estoy en la primera parte del dia

 'Enciendo/Apago la luz-------------------------------------------
 If plu1(prog) = 1 Then
 luz = 1
 Else
 luz = 0
 Endif

 'Enciendo/Apago fuente de calor----------------------------------
 If tempe1 < pte1(prog) then
 calor = 1
 'ventilador = 1
 Endif
 If tempe1 = pte1(prog) Then
 calor = 0
 'ventilador = 0
 Endif
 If tempe1 > pte1(prog) Then
 calor = 0
 'ventilador = 0
 Endif

 'Enciendo/apago fuente de FRIO ------------------------------------------
 If tempe1 > pte1(prog) And aireok = 1 Then 'si hace calor....
 frio = 1 '..lo enciendo y
 ventilador = 0
 Endif
 If tempe1 < pte1(prog) then
 frio = 0
 ventilador = 1
 tiempf0 = tiemp 'Tomo nota de la hora de apagado
 aireok = 0
 Endif

 Else 'Estoy en la segunda parte del dia
 'Enciendo/Apago la luz-------------------------------------------
 If plu2(prog) = 1 Then
 luz = 1
 Else
 luz = 0
 Endif

 'Enciendo/Apago fuente de calor----------------------------------
 If tempe1 < pte2(prog) then
 calor = 1
 'ventilador = 1
 Endif
 If tempe1 = pte2(prog) Then
 calor = 0
 'ventilador = 0
 Endif
 If tempe1 > pte2(prog) Then
 calor = 0
 'ventilador = 0
 Endif

 'Enciendo/apago fuente de FRIO ------------------------------------------
 If tempe1 > pte2(prog) And aireok = 1 Then 'si hace calor....
 frio = 1 '..lo enciendo y
 ventilador = 0
 Endif
 If tempe1 < pte2(prog) then
 frio = 0
 ventilador = 1
 tiempf0 = tiemp 'Tomo nota de la hora de apagado
 aireok = 0
 Endif 

 Endif '---Fin analisis Programa -------

 '---------------------------------------------------
 'Veo si pasaron 5 minutos de la ultima vez que se
 'apago el aire

 aux = tiempf0 + 4
 If tiemp > aux Then
 aireok = 1
 Endif
 If tiemp > 1438 Then 'casi medianoche
 aireok = 1
 Endif

 '---------------------------------------------------
 Lcdcmdout LcdClear
 Lcdcmdout LcdLine1Pos(1)
 Lcdout "P", #prog, " "

 If luz = 1 Then
 Lcdcmdout LcdLine1Pos(5)
 Lcdout "L"
 Endif
 If frio = 1 Then
 Lcdcmdout LcdLine1Pos(6)
 Lcdout "F"
 Endif
 If calor = 1 Then
 Lcdcmdout LcdLine1Pos(6)
 Lcdout "C"
 Endif
 If ventilador = 1 Then
 Lcdcmdout LcdLine1Pos(7)
 Lcdout "V"
 Endif

 Lcdcmdout LcdLine1Pos(9)
 Lcdout "00:00:00"
 If minu > 9 Then
 Lcdcmdout LcdLine1Pos(15)
 Else
 Lcdcmdout LcdLine1Pos(16)
 Endif
 Lcdout #minu

 If hora > 9 Then
 Lcdcmdout LcdLine1Pos(12)
 Else
 Lcdcmdout LcdLine1Pos(13)
 Endif
 Lcdout #hora

 If dias > 9 Then
 Lcdcmdout LcdLine1Pos(9)
 Else
 Lcdcmdout LcdLine1Pos(10)
 Endif
 Lcdout #dias

 'Veo si se movio la llave de cambio de programa--------
 Gosub leopulsadores
 Lcdcmdout LcdLine2Home
 Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
 WaitMs 180
Goto loop

End
leopulsadores:
 'Veo si se pulso la tecla o es un ruido -------
 If pprog = 1 Then
 WaitMs 50
 If pprog = 1 Then
 prog = prog + 1
 If prog = 4 Then
 prog = 1
 Endif
 Gosub cambioprog
 Endif
 Endif

 'Veo si se resetearon TMax y TMin
 If preset = 1 Then
 WaitMs 50
 If preset = 1 Then
 tmax = 0
 tmin = 99
 Endif

 Lcdcmdout LcdLine2Home
 Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
 Endif
Return

cambioprog:
 'Muestro el programa actual en el display
 Lcdcmdout LcdClear
 Lcdcmdout LcdLine1Pos(1)
 Lcdout "P", #prog
 Write 1, prog
 tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
 tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo 
 Write 6, tmax
 Write 7, tmin
 dias = 0 'Dias en curso
 hora = 0 'Hora en curso
 minu = 0 'Minuto en curso
 Write 2, dias
 Write 3, hora
 Write 4, minu
 segu = 0 'Auxiliar, para calcular los minutos
 tiempf0 = 1
 ventilador = 0
 luz = 0 'Rele Luces
 frio = 0 'Rele Frio
 calor = 0 'Rele Calor
Return
'-------------------------------------------------
'Inicializa el DS1820
'-------------------------------------------------
init1820:
 ds1820rw = 0 ' Pongo el pin como salida
 ds1820pin = 0 'Pongo en cero el pin del DS1820
 WaitUs 500 ' Espero mas de 480 us
 ds1820rw = 1 ' Pongo el pin como entrada
 WaitUs 100 ' Espero mas de 60 us a que "reaccione"
 WaitUs 500 ' Espero a que finalice de enviarme el estado
Return

'-------------------------------------------------
'Envia comandos al DS1820
'-------------------------------------------------
write1820:
 For aux = 1 To 8 'Recorro los 8 bits de "Comando"
 If comando.0 = 0 Then
 Gosub write0
 Else
 Gosub write1
 Endif
 comando = ShiftRight(comando, 1)
 Next aux
Return

'-------------------------------------------------
'Envia un cero al DS1820
'-------------------------------------------------
write0:
 ds1820rw = 0 ' Pongo el pin como salida
 ds1820pin = 0
 WaitUs 60 'hay que mantener bajo el pin mas 60 us
 ds1820rw = 1
Return

'-------------------------------------------------
'Envia un uno al DS1820
'-------------------------------------------------
write1:
 ds1820rw = 0 ' Pongo el pin como salida
 ds1820pin = 0
 WaitUs 1 'hay que mantener bajo el pin menos de 15 60 us
 ds1820rw = 1
 WaitUs 60 'espero el resto del tiempo...
Return

'-------------------------------------------------
'Lee temperatura del DS1820
'-------------------------------------------------
read1820:
 For aux = 1 To 16 ' los 16 bits de temp (word)
 tempe = ShiftRight(tempe, 1)
 Gosub readbit
 Next aux
 'Calculo la temperatura(tempe1) y las decimas (tempe2)
 tempe1 = ShiftRight(tempe.LB, 1)
 tempe1 = 128 - tempe1

 If tempe.0 = 1 Then
 tempe2 = 0
 Else
 tempe2 = 5
 Endif
Return

'-------------------------------------------------
'Lee un bit del DS1820
'-------------------------------------------------
readbit:
 tempe.15 = 1
 ds1820rw = 0 ' Pongo el pin como salida
 ds1820pin = 0
 WaitUs 1
 ds1820rw = 1
 If ds1820pin = 1 Then
 tempe.15 = 0
 Endif
 WaitUs 60
Return
Control Electrónico de temperatura e iluminación
El proyecto funcionando.

Más información Más información>>>>>>

Control Electrónico de temperatura e iluminación
Control Electrónico de temperatura e iluminación