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 esta totalmente comentado.
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.
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.
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.
Todas las salidas que controlan los equipos que proporcionan el calor, frió luz y el ventilador se manejan mediante microreles, capaces de manejar una corriente máxima de 10A en sus contactos. Estos reles son inversores, por lo que se puede obtener la función inversa dependiendo de en que contactos conectemos el equipo en cuestión. Como las salidas del PIC no proveen la corriente suficiente para excitar el rele, se han intercalo una resistencia de 1K5 y un pequeño transistor que provee la corriente necesaria al rele. El diodo 1N4001 que protege al transistor de la corriente inversa que se genera en las bobinas de los reles 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 ultimo una resistencia que alimenta un LED utilizado como piloto, para saber que el circuito se encuentra alimentado.
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 ultimo 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 oxigeno 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 reles. Deberá ser cuidadoso en esto, recordando siempre que esta 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 microreles deberemos intercalar un rele 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.
Como ejemplo, hemos confeccionado un software que se puede modificar con facilidad, ya que esta 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 mas) que mediante el contenido de algunas variables comentadas en el código permiten elegir que parte del día el sistema mantendrá la temperatura en el valor deseado, que 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 apago.
– El ventilador esta 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 esta 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. Seria 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 articulo emplea con éxito este circuito para controlar salas de cría de semillas, regular la temperatura de oficinas, etc.
‘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 “(www.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