Controlador Acuario Con Arduino Dukatus

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 73

Controlador De Acuario Electrnico Con Arduino

Hola:
Pretendo describir en este post como he construido una especie de pequea computadora para controlar
un acuario de 270L de agua dulce, sobre este tema hay muchsima informacin en internet y todos ellos
est!n reali"ados con una pequesima placa, con un microprocesador llamada #rduino $es una placa de
licencia libre%, las hay de &arios tipos y de &arios precios, la m!s com'n es la #rduino ()* que ronda los
20+ yo e elegido en cambio la #rduino ,ega que ronda los -.+ pero porque no me quera quedar corto y
quera que pudiera ser en un futuro ampliable el controlador/
# primera &ista puede parecer que este tipo de monta0e sea algo demasiado complicado para alguien que
no sepa de electrnica y programacin, pero les puedo asegurar que son muchas las personas que sin
estos conocimientos est!n montando controladores de este tipo unos menos comple0os y otros m!s pero
todos se guan por lo que &en montar a los dem!s y consultar en foros del tema/
#rduino ,12# 23.0 #4,12#23.0 #56 (78 8oard 35 9 (78 :able
4eniendo en cuenta que lo que hay comerciali"ado como ordenador, son cosas como el Profilu;, que solo
la unidad central cuesta unos .00+, merece la pena mir!rselo/
*tra cosa que hay que tener en cuenta es que los precios que he dicho son de artculos comprados en
1spaa, yo en cambio los e comprado en 1bay por menos de la mitad/
8ueno el controlador que e montado tiene las siguientes caractersticas:
:ontrol de la temperatura del acuario y sus calentadores/
:ontrol de la temperatura de la tapa del acuario y los &entiladores de esta/
:ontrol de la temperatura del depsito y su calentador para los cambios de agua/
:ontrol del PH y la electro<&!l&ula del :*2/
:ontrol del llenado de agua de smosis o agua de llu&ia del depsito, con alarma de ni&el que a&isa y
desconecta el llenado/
:ontrol del llenado del acuario desde el deposito/
:ontrol de las luces L1=s dimeando las luces a su hora de encendido y apagado, creado de esta forma el
amanecer y el anochecer, controlado dos fases de luces L1=s de >-? @ A.>? lo que equi&ales a mucho
mas de B.0? de lu" de fluorescentes/ C una tercera fase que controla la lu" de luna/
#dem!s lle&a una tar0eta 7= en la cual me &a grabando todos los e&entos que se producen, tanto
encendidos, apagados y errores, para poder luego sacar estadsticas de ello/
1ste controlador lo tengo montado con este acuario que detallo aqu
7e puede hacer mucho m!s sencillo, por e0emplo que controle solo la lu" y la temperatura del acuario,
pero a m me dio por querer complicarme la &ida, os puedo decir tambiDn que se un poco de electrnica y
soy programador, pero hace B meses no saba la e;istencia de estos dispositi&o y hoy tengo uno
funcionando y de mara&illa/
*s &oy a poner un enlace a los distintos tipo de #rduino que hay, que se me haba ol&idado 0e0e0e0e/
http:EEarduino/ccEenE,ainEHardFare
A
1l esquema general del monta0e es este

y el frontal del controlador a quedado as:
7i os interesa sigo con la
descripcin detallada de todo
el monta0e y programacin/
8ueno empecemos, el
controlador est! basado en un
microprocesador muy popular
y barato el cual es el cerebro
de todo el controlador, este
tiene cone;iones digitales y
analgicas, as como
cone;iones 7PG y serie/
Para los nefitos del tema:
Las conexiones digitales son aquellas que solo funcionan mandando o recibiendo una seal de 7G o )*,
siendo el )* que la cone;in tenga menos de 2& y el s que la cone;in tenga 3&, con esto podemos
gestionar salidas que mane0en un 6elD, un transistor de potencia o un led, si la cone;in es de entrada
podemos gestionar, un pulsador, en sensor de &arios tipos como flotadores o sensores de presin y
algunas cosas m!s, el que sea la cone;in de salida o entrada lo definimos nosotros,
Las conexiones analgicas son las encargadas de mane0ar seales en las cuales detectamos &ariaciones
2
de tensin o generamos &ariaciones de tensin, dependiendo si las configuramos como entrada o salida,
un uso puede ser mane0ar un motor, un sensor de temperatura, entre estas hay un pequeo grupo que son
P?, $Pulse ?a&e ,odulation, modulacin de onda por pulsos% las cuales son para controlar una salida
escalonada desde 0 a 233, las cuales son perfectas para mane0ar un flu0o de corriente como puede ser el
dimeo$encendido escalonado% de las luces de nuestro acuario/
SPI $ 7erial Peripherical Gnterface% es un protocolo de comunicaciones que &a por un bus de tres lneas,
sobre el cual se transmiten paquetes de informacin de > bits/ :ada una de estas tres lneas porta la
informacin entre los diferentes dispositi&os conectados al bus/ :ada dispositi&o conectado al bus puede
actuar como transmisor y receptor al mismo tiempo, por lo que este tipo de comunicacin serial es full
duple;/ =os de estas lneas trasfieren los datos $una en cada direccin% y la tercer lnea es la del relo0/
#lgunos dispositi&os solo pueden ser transmisores y otros solo receptores, generalmente un dispositi&o
que tramite datos tambiDn puede recibir/
1n mi caso yo mane0o la tar0eta 7= de 22b para leer y escribir/
Puertos Serie estos son unos pines para la comunicacin serie $67<2B2% equi&alentes al puerto serie de
P:, pero que en &e" de un conector de H puntas como el P: son de 2 cone;iones $4I% trasmisin y $6I%
reseccin, el n'mero de puertos serie depende del modelo #rduino, lo normal es A menos el ,ega que
tiene -, hay que tener en cuenta que los #rduino la mayora &iene con un Puerto (78 para la
programacin y comunicacin con el, en el caso de los que solo tienen A puerto serie, este es el mismo
que utili"a el (78/
1n mi monta0e los puertos serie se utili"an para comunicarse con la pantalla L:= y el sensor de PH/
1l #rduino ,ega que es el utili"ado para este controlador es este:
,icro<controlador #4megaA2>0
5olta0e de funcionamiento 35
5olta0e de entrada $recomendado% 7<A25
5olta0e de entrada $limite% .<205
Pines 1E7 digitales 3- $A- proporcionan salida P?,%
Pines de entrada analgica A.
Gntensidad por pin -0 m#
Gntensidad en pin B/B5 30 m#
,emoria Jlash A2> K8 de las cuales - K8 las usa el gestor de arranque$bootloader%
76#, > K8
11P6*, - K8
5elocidad de relo0 A. ,H"
B
Alimentacin
1l #rduino ,ega puede ser alimentado &a la cone;in (78 o con una fuente de alimentacin e;terna/ 1l
origen de la alimentacin se selecciona autom!ticamente/
Las fuentes de alimentacin e;ternas $no<(78% pueden ser tanto un transformador o una batera/ 1l
transformador se puede conectar usando un conector macho de 2/Amm con centro positi&o en el conector
hembra de la placa/ Los cables de la batera puede conectarse a los pines 2nd y 5in en los conectores de
alimentacin $P*?16%
La placa puede traba0ar con una alimentacin e;terna de entre . a 20 &oltios/ 7i el &olta0e suministrado es
inferior a 75 el pin de 35 puede proporcionar menos de 3 5oltios y la placa puede &ol&erse inestable, si
se usan mas de A25 los reguladores de &olta0e se pueden sobrecalentar y daar la placa/ 1l rango
recomendado es de 7 a A2 &oltios/
7eguirD e;plicando los accesorios que se le puede conectar al #rduino/
Sensor de temperatura
:omo sensor de temperatura hay muchos modelos, el mas simple son las resistencias )4: o P4:, son
unas resistencias que &aran su &alor seg'n la temperatura y su lectura es analgica y cada sonda ocupara
una entrada analgica, pero el m!s fiable para obtener
una lectura digital de temperatura es el integrado
=7A>820 de la gente de =allas/
1l =7A>820 es otra mara&illa de integrado, tiene un
tamao min'sculo y solamente tres patas/

)o necesita alimentacin e;clusi&a, se puede
alimentar en modo par!sito por la misma lnea de
datos/
Para comunicarse con el #rduino utili"a el protocolo A<Fire utili"ando una sola entrada digital de Dste $en
mi caso la 7, P?,% y se utili"a esa 'nica entrada para todas las sondas que quieras poner en lnea/
Para alimentarlo en modo par!sito hay que poner una resistencia de -/7K a 35cc $lo que se llama un pull<
up % en esa misma entrada digital/

Para poder usar el =7A>820 como sonda hay que hacer un pequeo traba0o con ella, sold!ndole un cable
y encapsul!ndola en un tubito sellado de silicona para que no le afecte el agua, yo compre un integrado
$7+% para probarlo y cuando ya tena la sonda echa con bastante traba0o y poca satisfaccin del resultado,
me dieron un enlace de 1bay para comprarla ya echa la sonda y adem!s a -+, con B m de cable, por
supuesto compre unas cuantas/
-
1n mi controlador e instalado B, y muy f!cil de conectar y programar, ya que se conectan todas en
paralelo/
Bm =igital =7A>820 4emp probe sensor thermometer 6ohs
#qu tenDis algunas im!genes del sensor


7ensor de nivel (Boya)
1l sensor de ni&el $una simple bolla% es de lo m!s simple, de echo es simplemente un interruptor que se
acciona por una boya que se mue&e al contacto con el agua/
Liquid ?ater Le&el 7ensor Hori"ontal Jloat 7Fitch


1l cual se conecta a una entrada digital del #rduino,
desde la cual podemos saber si esta acti&a o no/

3
Sensor de P
Ca sD que el PH siempre se ha utili"ado con aparatos electrnicos bastantes caro, pero con el #rduino esto
es mucho m!s sencillo, en el mercado $sobre todo por internet% hay muchos sensores de PH y de otras
m!s cosas como de *6P, 1: y de o;genos disuelto en el agua/
1n el caso de mi monta0e, yo solo puse un sensor de PH y de los modelos que hay me decid por uno de
#tlas<7cientific el PH 7tamp con unas caractersticas muy altas y lo principal de f!cil a0uste, el coste B0+
con los gastos de en&i desde (7#/
Pagina del sensor
=ocumentacin

7e conecta al #rduino por uno de sus puertos serie,
por lo que es lo mismo 2 pines uno de 4I y otro de
6I/
La sonda de cristal que usa el sensor y que
conocer!n de otros aparatos de control de PH se
puede conseguir barata tambiDn por 1bay/
1sta por e0emplo &iene con dos botes de tapo de PH
- y PH 7 para poder a0ustarla
http:EEro&er/ebay/comEro&erE0EeAA00///87#LB#(7LB#AA2B
Los dos botes de tapn son importantes, pues lo necesitamos para a0ustar la sonda, un tapn de PH es un
lquido que tiene un PH fi0o el cual nos sir&e para a0ustar el sensor/
1ste sensor es muy simple el a0uste, basta con meter la sonda en el bote de PH - y mandarle una orden a
tra&Ds del #rduino, para que el 7ensor se a0uste Dl solo, lo mismo con el PH7/
:on este sensor podemos desde el #rduino controlar y mostrar el PH y actuar en consecuencias, por
e0emplo abrir o cerrar la electro &!l&ula del :*2/
Los rel!s
Los relDs es una parte importante de nuestro sistema ya que son los encargados de encender y apagar los
aparatos de nuestro acuario, para poder controlar desde el #rduino un relD es necesario un circuito
amplificador que consta de una resistencia y un transistor, adem!s de un diodo de proteccin/
.
Pero actualmente es poco
rentable montarnos una placa
de relDs ya que solo un relD nos
puede costar B+ o -+, en
cambio en 1bay tenemos placas
ya montadas de por e0emplo -
relDs a 3+ con gastos de en&i y
todo/
Podemos encontrar placas de relDs de -, > y A. relDs, yo me decid para mi monta0e por una de > relDs/
La placa la conecte de la siguiente forma/

4enDis que tener en cuenta que yo estoy describiendo el controlador que yo he creado y con los
perifDricos que yo he decidido, &osotros tenDis que decidir que dese!is controlar y que accesorios usar,
con lo cual puede ser m!s pequeo o m!s grande/
7
"eclado
1l teclado es una parte importante del controlador ya que es con lo que nos comunicamos con el #rduino,
de la misma forma que nos comunicamos con los P:, por e0emplo para configurar a que temperatura
queremos el acuario o a quD hora se inicia el encendido de las luces/
He &isto monta0es del #rduino con tan solo 2
pulsadores como teclado y otros con un teclado de A.
teclas, todo depende de lo que queramos hacer, hay
que tener en cuenta que si ponemos menos pulsadores
que mo&imientos, tendremos que programar mas/
Para accionar un pulsador o tecla con el #rduino, es
igual que la cone;in de la bolla, la bolla lo que hace
es cerrar un contacto al accionarse, lo mismo que
nosotros al pulsar un pulsador/
=e esta forma podemos decidir cuantos pulsadores o teclas queremos en nuestro monta0e, en mi caso me
decid por . pulsadores, uno para el *K, otro para salir, 2 para el m!s y menos, para aumentar o disminuir
los &alores y 2 para derecha e i"quierda que me ser&a para mo&erme por la pantalla/

4ambiDn podDis decidiros por un teclado de los muchos que hay, de . aA. teclas, suelen ser m!s f!cil de
programar/

>
La pantalla
La pantalla es la parte del monta0e en la que &eremos el estado e informacin del controlador, adem!s de
ser&irnos para &er las operaciones que queramos hacer con el controlador, por e0emplo la configuracin
de los par!metros de funcionamiento como a que temperatura queremos el acuario o a que hora se
enciende y apagan las luces/
Lo normal es que la pantalla sea una L:= de cristal
liquido, las mas comunes son de caracteres y se definen por
cuantos caracteres caben en cada lnea y cuantas lneas
tiene/
http:EEFFF/ebay/esEitmE230>H>AB>727///H>-/mA-H7/l2.-H
4ambiDn las hay gr!ficas las cuales se definen por puntos $p;eles% de resolucin de la pantalla, como por
e0emplo la que yo utili"o en mi monta0e, una de A2>;.-
puntos, teniendo en cuenta que cada car!cter ocupa >;.
puntos esto nos da unos AH caracteres por lnea y > lneas, y
tambiDn tiene la posibilidad de pintar lneas, circulo,
rect!ngulos y figuras/
http:EEFFF/ebay/esEitmEL:=A2>.-<L:=///@itemBa.abAc.-f
4ambiDn hay otro tipos de pantallas mas comple0as como las
gr!ficas a todo color y las t!ctiles, pero estas son mas caras y
mas comple0as, de echo la gente usa hasta las pantallas de los
m&iles, pero esto nos hace falta tener bastante mas
e;periencia para usar esta opciones/
http:EEFFF/ebay/esEitmEA7070HB37H72///H>-/mA-H7/l2.-H
H
Las pantallas son el elemento que m!s
cone;iones utili"an ya que para mandar la
informacin a una de esta pantalla suele rondar
por > cone;iones m!s la alimentacin/
Hay otro sistema de cone;in que se utili"a,
aunque tambiDn ralenti"a un poco el pintado de
la pantalla, y es un modulo que tiene algunas
pantallas de comunicacin serie, estos mdulos
nos permite mane0ar la pantalla con tan solo
una cone;in o dos, mas la alimentacin,
encarg!ndose el modulo de con&ertir las
ordenes del serie a ordenes de > hilos/
1stas pantallas las &eremos que en la definicin
de su nombre le incluyen la denominacin de
MserieN/

Lectora de tar#eta de memoria SD
1ntre las miles de cosas que podemos conectar a un #rduino, est! la
lectora de memoria 7=, este componente nos permite leer y escribir
en una tar0eta 7= la informacin que queramos/
1ste componente es raro que os haga falta ya que es muy especifico
y yo lo utili"o apro&echando mis conocimientos de programacin
para que el #rduino baya escribiendo en unos archi&os de te;to todo los e&entos y errores que ocurran
durante todo el funcionamiento del #rduino, para luego pasarlos al ordenador a tra&Ds de un programa
echo por mi el cual me saca estadsticas del funcionamiento del acuario, de esta forma puedo saber por
e0emplo en que momentos del da se acti&an mas los calentadores que tiempo total al da est!n
funcionando y algunas cosas mas/
El relo# de tiempo real$
C por ultimo &eremos el modulo de relo0, este modulo es en si un relo0
el cual lle&a una pequea pila de forma que una &e" puesto en hora
aunque le cortemos la fuente de alimentacin el mantendr! siempre la
hora actual, este modulo una &e" puesto en hora solo nos ser&ir! para
preguntarle en cualquier momento que fecha es
o que hora es, algo esencial para nuestro
controlador, por e0emplo para saber a que hora
encender las luces o apagarlas/
http:EEFFF/ebay/esEitmE=7AB07<64:<
,///@itemAHcb--0f>e
1l modulo de relo0 se comunica con el #rduino
por dos cone;iones a tra&Ds del protocolo G2:,
un sistema de comunicacin soportado por
algunas de las cone;iones del #rduino/
A0
El control de luces
7e me ol&idaba un componente, el mas importante de todos el control de las luces, sobre este tema se a
hablado mucho por internet, el sistema que mas utili"an la mayora es unos transformadores dimeables
que por cierto son bastante caro y para dimear estos utili"an circuitos con un integrado regulador que le
da una seal a los trasformadores de 0& a A0&/
Para mi siempre e &isto esto como algo demasiado complicado y caro, por lo que me decid por un
sistema mas directo de dimeo, utili"ando una fuente de alimentacin normal para leds y dimeando en su
salida con un solo transistor/
1l sistema es simple partiendo de un transformador especfico para leds
como este/
*btenemos los A2& o 2-& para alimentar nuestros leds, y
para dimearlos intercalamos un transistor de potencia
entre este transformador y los leds, encarg!ndose este de
regular el &olta0e que le llegan a los leds, de esta forma
tenemos el efecto tan deseado para nuestro acuario de
amanecer y anochecer/

1n mi monta0e yo uso B transistores porque e di&idido las luces en B fases 2 en los leds de iluminacin y
la tercera para la lu" de luna/

AA
Programacin del Arduino
8ueno una &e" que conocemos la mayora de los perifDricos que puede lle&ar nuestro #rduino, &eremos
como programarlo para que haga todo lo que deseemos, )*, no podemos programarlo para que haga
dinero pero si para que nos controle nuestro acuario como nosotros deseemos/
Para programar el #rduino de utili"a un programa que es como un editor de te;to, pero con algunas
opciones especifica, denominado como G=1 de programacin el cual es gratuito, lo hay para ?indoFs,
,ac y Linu;, os lo podDis descargar de aqu/
(n &e" descargado el archi&o comprimido lo descomprimimos en un directorio y ya lo tenemos listo para
usar/
Ca solo nos falta instalar el dri&er del #rduino para poder mane0arlo por (78, para ello basta con
conectar el #rduino al P: con su cable (78 y el P: nos pedir! que si busca el dri&er, le diremos que no
que lo que queremos es que lo busque en una carpeta determinada, y esta es el subdirectorio del G=1 de
#rduino denominado Mdri&ersN, con esto nos instalara el dri&er y tendremos todo listo para empe"ar/
Pensaba escribir un gran tocho describiendo los primeros paso de programacin y de como utili"ar el
G=1, pero es algo ya esta demasiado escrito por todas parte y me0or descrito de lo que lo podra hacer yo,
por lo que me0or os de0o unos enlaces a unos tutoriales que lo e;plican todo mucho me0or, a sin adem!s
los podDis tener para consultas, adem!s de otros enlaces importantes/
Pagina oficial de #rduino, hay documentacin, e0emplos y libreras para poder mane0ar todo tipo de
perifDricos, adem!s de una gua detallada del lengua0e de programacin/$en ingles%
http:EEarduino/ccE
Pagina ofician de #rduino en 1spaol con lo mismo que la de ingles pero menos actuali"ado/
http:EEarduino/ccEesE
Pagina de descarga del G=1 del #rduino/
http:EEarduino/ccEesE,ainE7oftFare
Pagina del foro del #rduino, tiene un apartado en espaol, bastante acti&o/
http:EEarduino/ccEforumEinde;/php
5arios tutorial del G=1 de #rduino y de programacin del #rduino/
#rduinoOuserOmanualOes/pdf
,anualOProgramacionO#rduino/pdf
#rduinoOprogramingOnotebooPO17/pdf
#rduino/O:ircuitosOb!sicosOdeOentrada<salida/pdf
#rduino4utorial/pdf
libreto/pdf
La alimentacin de Arduino
#ntes de empe"ar a conectar cosas al #rduino, tenemos que tener en cuenta las limitaciones que tenemos
seg'n la forma de alimentar el #rduino, como ya di0imos lo podemos alimentar a a tra&Ds del cable de
(78 con lo cual tendremos poca potencia por que esta cone;in nos dar! unos 230 m#, teniendo en
cuenta que ya la placa del #rduino consume unos 30 m# y que cada pin de el soporta un consumo de -0
m# con lo que con pocas cosas que conectemos nos quedaremos sin potencia/
7i lo conectamos por el conector de alimentacin e;terna tendremos que alimentarlo con un &olta0e entre
.& y A2&, esto es gracias a un integrado regulador de 3& que tiene instalado el #rduino, el cual con&ierte
A2
el &olta0e de entrada a una salida constante de 3&, claro que
el &olta0e que sobra el integrado lo tiene que disipar en
forma de calor, adem!s del calor que le produce el consumo
que pasa por el, con lo cual tenemos que a la larga nos
permite alimentarlo con otro &olta0e pero con casi el mismo
consumo que el (78 si no queremos quemar el integrado
de entrada/
Lo mas con&eniente si conectamos muchas cosas es alimentarlo directamente a 3& por el conector
P*?16, de esta forma no tendremos problemas de consumo y podremos conectar todo lo que queramos,
pero siempre que uno de los aparatos conectados necesite alimentacin se conecte esta a los 3& de la
alimentacin directamente, adem!s hay que tener en cuenta que el #rduino solo soporta un consumo
interno de -00 m#, por lo que todas las seales de salida 0untas del #rduino no tienen que superar ese
&alor/
Conectando nuestro primer artilugio al Arduino (La sonda de temperatura)
:omo ya &imos al principio del post, como sonda de temperatura lo me0or que hay es el integrado de B
patillas =7A>820 de la casa =allasE,a;im es un termmetro digital de H a A2 bits que se conecta a tra&Ds
de un bus A<Fire, mide la temperatura en grados :elsius, tiene una operacin de temperatura que &a del
rango de <33Q: a 9A23Q:/
1l =7A>820 es un circuito integrado con forma de transistor, tiene tres pines de los cuales dos sir&en de
alimentacin $2)= y 5dd% y el otro $=R% es el que se conecta al bus/ 1ste sensor puede funcionar
tambiDn sin alimentacin, con lo que se conoce como
alimentacin par!sita/ 1n este modo de funcionamiento
la alimentacin la saca directamente de la lnea =R por
lo que solo se necesitan dos cables $=R y 2)=%/

:ada uno de ellos dispone de un identificador 'nico de
.- bits, lo que permite que puedan coe;istir &arios
sensores en un 'nico bus A<Fire/ 1l bus A<Fire puede ser
de hasta A00 metros de largo por lo que la colocacin de
los sensores respecto del mdulo no debera ser un
problema, adem!s no requiere de elementos e;ternos, el
cable de cone;in tiene que ser apantallado/


La programacin de este dispositi&o es muy simple y
para ello tenemos una librera especifica la M=allas4emperatureN/
AB
(na librera es unos archi&os con funciones que nos
permiten mane0ar determinadas caractersticas del
#rduino o de un componente conectado al #rduino/
1stas librera deben de estar en un subdirectorio
dentro del directorio que tiene el G=1 de #rduino especficos para ellas llamado MlibrariesN, si mir!is en
este directorio &erDis que hay muchos subdirectorios de di&ersas libreras, el G=1 del #rduino cada &e"
que lo e0ecutamos mira estos directorios para registrar todas las libreras/
7i e0ecutamos el G=1 del #rduino y nos &amos al men' M7PetchN y a MGmport LibraryN &eremos todas las
libreras registrada en el G=1, si le damos a una de ellas, nos escribir! en el cdigo la llamada a esta
librera para poder usarla/
:onque empecemos e0ecutemos el G=1 y al arrancar ya tendremos abierto el editor con un nue&o archi&o,
empe"aremos aadiendo dos libreras que nos hace falta para mane0ar el =7A>820 que son la
M*ne?ie/hN que ya trae el G=1 en su instalacin y la M=allas4emperature/hN que no descargaremos y
copiaremos de este del 1nlace/
Para aadirlas lo podemos hacer d!ndole al men' M7Petch<SGmport Library<S *ne?ieN y M7Petch<
SGmport Library =allas4emperatureN o simplemente escribiendo
Tinclude U*ne?ire/hS
Tinclude U=allas4emperature/hS
# continuacin definiremos el pin al que hemos conectado nuestroEs =7A>820 en mi caso al pin 7/
Tdefine PG)OPO41,P16 7
Luego declararemos una &ariable publica que apunte a nuestro controladorEs =7A>820, de esta forma
EE =irecciones de los sensores de temperatura
=e&ice#ddress #gua4ermo, 4apa4ermo, =epo4ermoV
Co aqu declaro B &ariables porque tengo B sensores montados, de esta forma cada &e" que quiera consultar
algunos de mis sensores los llamare a cada uno por sus nombres/
Luego declaramos las &ariables que nos permite mane0ar un ob0eto de tipo =allas4emperature/
*ne?ire one?ire$ PG)OPO41,P16 %V
=allas4emperature sensors$Wone?ire%V
=e esta forma declaramos una cone;in *)1?G61 llamada Mone?ireN que apunta a nuestro sensor y esta
se la pasamos a MsensorsN para crearlo, que es un ob0eto =allas4emperature, estas dos &ariable las podDis
llamar como &osotros quer!is, estos nombres son solo los que yo decid/
A-
La funcin setup$%
1n ella declararemos que el pin 7 es de entrada de datos
&oid setup$%
X
EEpin 7 es de entrada de datos
pin,ode$PG)OPO41,P16, G)P(4 %V
EEGniciamos el controlador del controladorEs =7A>820
sensors/begin$%V
EE:ompruebo que estDn todos los sensores/
EE:uidado, ya que al llamar a Msensors/get#ddress$%N, lo que hacemos es definir que
EE&ariable es cada sensor, por e0emplo definimos que el sensor )Q0 es =epo4ermo/
if $sensors/get=e&ice:ount$% U B% 7erial/println $ YJaltan sensores de temperaturaN%V
if $Zsensors/get#ddress$=epo4ermo, 0%% 7erial/println $YJalta el sensores de temperatura del
=epositoY%V
if $Zsensors/get#ddress$#gua4ermo, A%% 7erial/println $ MJalta el sensores de temperatura del
aguaY%V
if $Zsensors/get#ddress$4apa4ermo, 2%% 7erial/println $ YJalta el sensores de temperatura de la
tapaY%V
EEdefinimos sus mnimo y m!;imo de temperatura para cada uno, de forma que los
EEcalentadores se enciendan cuando la temperatura ba0e a los 2./23 grados y se apaguen
EEcuando lleguen a los 2./73 grados, y los &entiladores de la tapa se enciendan al llegar
EE a los B0/00 grados y se apaguen al llegar a los 2H/30 grados/
sensors/setHigh#larm4emp$ #gua4ermo, 2./73 %V
sensors/setLoF#larm4emp$ #gua4ermo, 2./23 %V
sensors/setHigh#larm4emp$ =epo4ermo, 2./73 %V
sensors/setLoF#larm4emp$ =epo4ermo, 2./23 %V
sensors/setHigh#larm4emp$ 4apa4ermo, B0/00 %V
sensors/setLoF#larm4emp$ 4apa4ermo, 2H/30 %V
[
8ien con esto ya tenemos definido nuestro inicio del #rduino el cual nos &a a iniciar y configurar nuestros
sensores/
#hora &eremos como leer la temperatura con nuestros sensores/
&oid loop$%
X
float 4emperatura#cuario, 4emperatura=eposito, 4emperatura4apaV
EELlamamos a la funcin request4emperatures$% de nuestro controlador de sensores
EEpara que se prepare a nuestra llamada de lectura/
sensors/request4emperatures$%V
EEllamamos a get4emp:$% pas!ndole la &ariable del sensor que queremos leer
EE y esta funcin nos de&ol&er! la temperatura de el sensor llamado/
4emperatura#cuario @ sensors/get4emp:$ #gua4ermo %V EE #:(#6G*
4emperatura4apa @ sensors/get4emp:$ 4apa4ermo %V EE 4#P#
4emperatura=eposito @ sensors/get4emp:$=epo4ermo%V EE =1P*7G4*
EEahora que tenemos las temperaturas de nuestros sensores podemos hacer con
A3
EEellas los que queramos, por e0emplo sacarlas por una pantalla/
EE# continuacin comprobaremos si se a acti&ado alguna alarma de temperatura en nuestros
sensores
if $sensors/has#larm$#gua4ermo%%
X
EE 7e a acti&ado una alarma, comprobamos cual y actuamos/
if $ sensors/get4emp:$#gua4ermo% U sensors/getLoF#larm4emp$#gua4ermo % %
X
EE 1ncendemos el calentador del acuario
[
if $ sensors/get4emp:$#gua4ermo% S sensors/getHigh#larm4emp$#gua4ermo% %
X
EE#pagamos el calentador del acuario
[
[
if $sensors/has#larm$=epo4ermo%%
X
if $ sensors/get4emp:$=epo4ermo% U sensors/getLoF#larm4emp$=epo4ermo%%
X
EE 1ncendemos el calentador del deposito
[
if $ sensors/get4emp:$=epo4ermo% S sensors/getHigh#larm4emp$=epo4ermo%%
X
EE #pagamos el calentador del deposito
[
[
if $sensors/has#larm$4apa4ermo%%
X
if $ sensors/get4emp:$4apa4ermo% S sensors/getHigh#larm4emp$4apa4ermo%%
X
EE 1ncendemos los &entiladores de la tapa
[
if $ sensors/get4emp:$4apa4ermo% U sensors/getLoF#larm4emp$4apa4ermo%%
X
EE #pagamos los &entiladores de la tapa/
[
[
[
1n este enlace tenDis el cdigo/
1n la pr;ima hablaremos de la pantalla L:= importante para &er lo que pasa y optimi"aremos este cdigo
para que sea m!s efecti&o/
A.
La pantalla
:omo ya &imos al principio del post lo normal es que la pantalla sea una L:= de cristal liquido, las mas
comunes son de caracteres y se definen por cuantos caracteres caben en cada lnea y cuantas lneas tiene/
Para comunicarnos con ellas tenemos que hacerlo por un bus de datos de -bit o >bit en definiti&a por -
cables o >, los cuales ir!n conectados a los pines digitales del #rduino, lo normal es que con -bit se
puedan mane0ar casi todas/
#dem!s del bus de datos tendremos que conectar algunos cables m!s, como son registro (%S) que es el
que controla en quD parte de la memoria del L:= est!s escribiendo datos, el cual ira a otro pin digital del
#rduino, tambiDn conectaremos el pin de lecturaEescritura (%&') que selecciona el modo de lectura o el
de escritura, este a no ser que nos queramos meter en reprogramacin de los caracteres de la pantalla lo
pondremos a masa $polo negati&o%/
Luego nos queda el pin para habilitar (E&ena(le) que habilita los registros, el cual ira a otro pin digital del
#rduino, tambiDn tendremos que conectar un potencimetro de A0K *hm conectado entre el positi&o y el
negati&o de la alimentacin y con su punto central al pin ()*) para regular el contraste de la pantalla/
C por ultimo los cables de alimentacin negati&o y positi&o de 3& para la pantalla y suele ser tambiDn
necesario para pines de retroiluminacin (B+lt, y B+lt-), encender y apagar la retro<iluminacin/
1n definiti&a:
1l bus de datos
D* \
D. \
D/ \ >8it/
D0 \
D1 \ \
D2 \ -8it/ \
D3 \ \
D4 \ \
%S :ontrol del direccionamiento de memoria/
%' 7eleccin de modo lecturaEescritura/
E Habilitacin de los registros/
)* :ontraste de la pantalla/
B+lt, Positi&o alimentacin de la retro<iluminacin/
B+lt- )egati&o alimentacin de la retro<iluminacin/
)DD Positi&o alimentacin de la pantalla/
)SS )egati&o alimentacin de la pantalla/

Para conectar esta pantalla aparte de en lo escrito anteriormente tenDis toda la informacin de cone;in y
la librera para mane0arla en el playground de la pagina de #rduino, en este enlace
http:EEarduino/ccEplaygroundE:odeEL:=A2>.-/
La mayora de estas pantallas est!n basada o son compatibles con el controlador itac5i D1146* y
para mane0arlas el #rduino ya trae una librera llamada Liquid:rystal y que es muy simple de usar/
Tinclude ULiquid:rystal/hS EE#adimos la librera en nuestro cdigo/
A7
EEGniciali"amos nuestra &ariable de la pantalla con la librera diciDndole en que pines de control
hemos conectado la pantalla/
EE1l orden de los pin es < 67, 1, =0, =A, =2, =B
Liquid:rystal ,iPantalla$A2, 2, A0, H, >, 7%V
&oid setup$&oid%
X
EE Ponemos en marcha la pantalla diciDndole cuantos caracteres tiene de largo la pantalla y cuantas
lneas tiene,
EEen este caso A.;2 caracteres, el ultimo es siempre por defecto un A/
,iPantalla/begin$A., 2, A%V
[
&oid loop$&oid%
X
EEPonemos el cursor en la posicin que queremos escribir, en escala de caracteres y lnea/
,iPantalla/set:ursor$0,0%V
EEPintamos en la posicin de la pantalla que nos pusimos el te;to/
,iPantalla/print$YHola mundoN%V
EE)os ponemos ahora en el principio de la segunda lnea/
,iPantalla/set:ursor$0,0%V
EEy pintamos el otro mensa0e/
,iPantalla/print$Y:omo estas, yo bien/Y%V
[
Pero no todas las pantallas tienen tanto MguasaN para conectarla, las hay tambiDn que se conectan por serie
o lo que es lo mismo con tan solo - cables/
1stas pantallas son iguales que las que &an conectada en paralelo,
como la descrita anteriormente, solo cambia que tienen un modulo
conectado a todas sus patillas adosado en su espalda que traduce las
ordenes que se le mandan por serie, los - cables son positi&o y
negati&o de alimentacin y A emisor de datos y A receptor de datos/
Pantalla con el modulo para comunicacin en serie en su espalda/
Para programar esta pantalla nos har! falta otro tipo de librera, la cual siempre depender! del modulo que
tenga de comunicacin serie, estas libreras se descargan siempre del mismo sitio donde las compremos y
si no con una simple b'squeda de su nombre nos saldr!n/
:omo e0emplo pondremos la que yo e utili"ado en mi monta0e una L:= gr!fica de A2>;.- y serie, esta
pantalla tiene su propia librera pero la &erdad es que no me gusto nada y me ice la ma propia, mas &ers!til
y efecti&a/
A>
*s la podDis descargar de este enlace/
Tinclude YL:=A2>;.-/hY EE#adimos la librera en nuestro cdigo/
EEGniciali"amos nuestra &ariable de la pantalla con la librera sin par!metros ningunos/
L:=A2>;.-:lass ,iPantalla $%V
Pero tener en cuenta que al funcionar con un puerto serial tenemos que editar la librera y modificarla si
deseamos utili"ar otro puerto serial que no sea el por defecto del #rduino/
Por e0emplo si utili"ados un #rduino mega y queremos utili"ar el puerto serial A tendremos que cambiar el
M7erialN por M7erialAN/
&oid setup$&oid%
X
EE =efinimos el tiempo de espera entre cada orden a la pantalla/
,iPantalla/7et=elay$200%V EE,ilisegundos
EE =efinimos el brillo que queremos en la pantalla de 0 a A00/
,iPantalla/8rillo$70%V
[
&oid loop$&oid%
X
EE8orramos la pantalla entera/
Lcd/:ls$%V
EE1scribimos en la posicin que indiquemos, la posicin &a en escala de puntos A2> ; .- puntos/
,iPantalla/?riteIC$ 6elo0/=ate4ime$%, A0, .A%V
[
Para este tipo de pantallas tambiDn tenemos otras rdenes como:
EE8orrar una "ona determinada de la pantalla
&oid 8orrar$byte desdeO;, byte desdeOy, byte hastaO;, byte hastaOy%V
EE#cti&ar o desacti&ar un punto de la pantalla/
&oid Pi;el$byte ;, byte y, byte modo%V
EEPosicionar el cursor en unas coordenadas de la pantalla/
&oid 2otoIC$byte ;, byte y%V
EE1scribir en la pantalla en la posicin actual del cursor/
&oid ?rite$char] st%V
&oid ?rite$int st%V
&oid ?rite$long st%V
&oid ?rite$float st%V
&oid ?rite$float st, int decimales%V
EE1scribir en la pantalla en la posicin que le digamos/
&oid ?riteIC$char] st, byte ;, byte y%V
&oid ?riteIC$int st, byte ;, byte y%V
&oid ?riteIC$long st, byte ;, byte y%V
&oid ?riteIC$float st, byte ;, byte y%V
&oid ?riteIC$float st, byte ;, byte y, int decimales%V
AH
EE=ibu0ar en la pantalla un rectangulo/
&oid 6ectangulo$byte ;A, byte yA, byte ;2, byte y2%V
EE=ibu0ar en la pantalla un circulo/
&oid :irculo$byte :entroI, byte :entroC, byte 6adio, byte modo%V
EE=ibu0ar en la pantalla una linea/
&oid Linea$int ;A, int yA, int ;2, int y2, int "%V
EE=ibu0ar en la pantalla un grafico/
&oid Gmagen$ int desdeO;, int desdeOy, int ancho, int alto, int modo, P6*2,1, progOuintA.Ot
]array%V
8ueno pues tras esto nos pondremos a crear ya nuestro monta0e inicial, uniendo nuestro sensor de
temperatura y nuestra pantalla en un monta0e y un cdigo/
Para esto escribiremos el comien"o de nuestro programa, estructur!ndolo bien para poder seguirlo sin
perdernos, ni liarnos/
)o puedo dar una clase de programacin, pero os aseguro que si me segus cualquiera de &osotros podrDis
crear &uestra programacin a medida para &uestro monta0e/
)o es difcil, solo es entretenido y muy gratificante/
Hoy un poco de programacin, un par de post antes &imos la programacin de los sensores de temperatura,
para lo cual puse el siguiente cdigo/
Tinclude U*ne?ire/hS
Tinclude U=allas4emperature/hS
Tdefine PG)OPO41,P16 7
=e&ice#ddress #gua4ermo, 4apa4ermo, =epo4ermoV EE =irecciones de los sensores de temperatura
*ne?ire one?ire$ PG)OPO41,P16 %V
=allas4emperature sensors$Wone?ire%V
&oid setup$%
X
pin,ode$PG)OPO41,P16, G)P(4 %V
EEGniciamos el controlador del controladorEs =7A>820
sensors/begin$%V
EE:ompruebo que estDn todos los sensores/
EE:uidado, ya que al llamar a Msensors/get#ddress$%N, lo que hacemos es definir que
EE&ariable es cada sensor, por e0emplo definimos que el sensor )Q0 es =epo4ermo/
if $sensors/get=e&ice:ount$% U B% 7erial/println$ YJaltan sensores de temperaturaN%V
if $Zsensors/get#ddress$=epo4ermo, 0%% 7erial/println$YJalta el sensores de temperatura del
=epositoY%V
if $Zsensors/get#ddress$#gua4ermo, A%% 7erial/println$YJalta el sensores de temperatura del aguaY%V
if $Zsensors/get#ddress$4apa4ermo, 2%% 7erial/println$YJalta el sensores de temperatura de la tapaY%V
EEdefinimos sus mnimo y m!;imo de temperatura para cada uno, de forma que los
EEcalentadores se enciendan cuando la temperatura ba0e a los 2./23 grados y se apaguen
20
EEcuando lleguen a los 2./73 grados, y los &entiladores de la tapa se enciendan al llegar
EE a los B0/00 grados y se apaguen al llegar a los 2H/30 grados/
sensors/setHigh#larm4emp$ #gua4ermo, 2./73 %V
sensors/setLoF#larm4emp$ #gua4ermo, 2./23 %V
sensors/setHigh#larm4emp$ =epo4ermo, 2./73 %V
sensors/setLoF#larm4emp$ =epo4ermo, 2./23 %V
sensors/setHigh#larm4emp$ 4apa4ermo, B0/00 %V
sensors/setLoF#larm4emp$ 4apa4ermo, 2H/30 %V
[
&oid loop$%
X
float 4emperatura#cuario, 4emperatura=eposito, 4emperatura4apaV
EELlamamos a la funcin request4emperatures$% de nuestro controlador de sensores
EEpara que se prepare a nuestra llamada de lectura/
sensors/request4emperatures$%V
EEllamamos a get4emp:$% pas!ndole la &ariable del sensor que queremos leer
EE y esta funcin nos de&ol&er! la temperatura de el sensor llamado/
4emperatura#cuario @ sensors/get4emp:$ #gua4ermo %V EE #:(#6G*
4emperatura4apa @ sensors/get4emp:$ 4apa4ermo %V EE 4#P#
4emperatura=eposito @ sensors/get4emp:$=epo4ermo%V EE =1P*7G4*
EEahora que tenemos las tempreaturas de nuestros sensores podemos hacer con
EEellas los que queramos, por e0emplo sacarlas por una pantalla/
EE# continuacin comprobaremos si se a acti&ado alguna alarma de temperatura en nuestros
sensores
if $sensors/has#larm$#gua4ermo%%
X
EE 7e a acti&ado una alarma, comprobamos cual y actuamos/
if $ sensors/get4emp:$#gua4ermo% U sensors/getLoF#larm4emp$#gua4ermo % %
X
EE 1ncendemos el calentador del acuario
[
if $ sensors/get4emp:$#gua4ermo% S sensors/getHigh#larm4emp$#gua4ermo% %
X
EE#pagamos el calentador del acuario
[
[
if $sensors/has#larm$=epo4ermo%%
X
if $ sensors/get4emp:$=epo4ermo% U sensors/getLoF#larm4emp$=epo4ermo%%
X
EE 1ncendemos el calentador del deposito
[
if $ sensors/get4emp:$=epo4ermo% S sensors/getHigh#larm4emp$=epo4ermo%%
X
EE #pagamos el calentador del deposito
[
[
if $sensors/has#larm$4apa4ermo%%
X
2A
if $ sensors/get4emp:$4apa4ermo% S sensors/getHigh#larm4emp$4apa4ermo%%
X
EE 1ncendemos los &entiladores de la tapa
[
if $ sensors/get4emp:$4apa4ermo% U sensors/getLoF#larm4emp$4apa4ermo%%
X
EE #pagamos los &entiladores de la tapa/
[
[
[
1ste cdigo esta bien pero si seguimos programando as, escribiendo todo de forma seguida dentro de la
funcin Msetup$%N y Mloop$%N, cuando lle&emos la mitad del cdigo escrito nos ser! casi imposible seguir el
hilo de lo que hace el cdigo, por lo cual lo ideal es repartir el cdigo en funciones, las cuales se declaran
igual que Msetup$%N y Mloop$%N, pero con otros nombre que nosotros decidamos, hay que tener en cuenta por
e0emplo que las &ariables que declaremos dentro de una funcin, solo podremos acceder a ella dentro de la
funcin y estas de reiniciaran cada &e" que salgamos de la funcin/
7iguiendo este termino, modificaremos el cdigo ya escrito, quitando el cdigo de iniciacin de los
sensores de temperatura de la funcin Msetup$%N y poniendo este cdigo dentro de una funcin que
llamaremos MGniciar4emperaturas$%N y dentro de Msetup$%N pondremos tan solo la llamada a esta funcin,
tambiDn el cdigo de comprobacin de la temperatura que esta en Mloop$%N lo quitaremos y lo pondremos
dentro de otra funcin que llamaremos M,irar4emperaturas$%N y dentro de Mloop$%N pondremos una
llamada a esta funcin, espero que esto este claro para los que est!n pegados en programacin/
1ste nue&o cdigo lo guardaremos con otro nombre como M)uestro:ontrolador/inoN, este fichero ser!
nuestro proyecto de controlador y a partir de ahora le iremos aadiendo todo el cdigo que &allamos
a&an"ando para controlar todo/
Tinclude U*ne?ire/hS
Tinclude U=allas4emperature/hS
Tdefine PG)OPO41,P16 7
=e&ice#ddress #gua4ermo, 4apa4ermo, =epo4ermoV EE =irecciones de los sensores de temperatura
*ne?ire one?ire$ PG)OPO41,P16 %V
=allas4emperature sensors$Wone?ire%V
&oid setup$%
X
pin,ode$PG)OPO41,P16, G)P(4 %V
Gniciar4emperaturas$%V EEGniciamos los sensores de temperatura/
[
&oid loop$%
X
,irar4emperaturas$%V EE,iramos la temperaturas
[
&oid Gniciar4emperaturas$%
X
EEGniciamos el controlador del controladorEs =7A>820
22
sensors/begin$%V
EE:ompruebo que estDn todos los sensores/
EE:uidado, ya que al llamar a Msensors/get#ddress$%N, lo que hacemos es definir que
EE&ariable es cada sensor, por e0emplo definimos que el sensor )Q0 es =epo4ermo/
if $sensors/get=e&ice:ount$% U B% 7erial/println$ YJaltan sensores de temperaturaN%V
if $Zsensors/get#ddress$=epo4ermo, 0%% 7erial/println$YJalta el sensores de temperatura del
=epositoY%V
if $Zsensors/get#ddress$#gua4ermo, A%% 7erial/println$YJalta el sensores de temperatura del aguaY%V
if $Zsensors/get#ddress$4apa4ermo, 2%% 7erial/println$YJalta el sensores de temperatura de la tapaY%V
EEdefinimos sus mnimo y m!;imo de temperatura para cada uno, de forma que los
EEcalentadores se enciendan cuando la temperatura ba0e a los 2./23 grados y se apaguen
EEcuando lleguen a los 2./73 grados, y los &entiladores de la tapa se enciendan al llegar
EE a los B0/00 grados y se apaguen al llegar a los 2H/30 grados/
sensors/setHigh#larm4emp$ #gua4ermo, 2./73 %V
sensors/setLoF#larm4emp$ #gua4ermo, 2./23 %V
sensors/setHigh#larm4emp$ =epo4ermo, 2./73 %V
sensors/setLoF#larm4emp$ =epo4ermo, 2./23 %V
sensors/setHigh#larm4emp$ 4apa4ermo, B0/00 %V
sensors/setLoF#larm4emp$ 4apa4ermo, 2H/30 %V
[
&oid ,irar4emperaturas$%
X
float 4emperatura#cuario, 4emperatura=eposito, 4emperatura4apaV
EELlamamos a la funcin request4emperatures$% de nuestro controlador de sensores
EEpara que se prepare a nuestra llamada de lectura/
sensors/request4emperatures$%V
EEllamamos a get4emp:$% pas!ndole la &ariable del sensor que queremos leer
EE y esta funcin nos de&ol&er! la temperatura de el sensor llamado/
4emperatura#cuario @ sensors/get4emp:$ #gua4ermo %V EE #:(#6G*
4emperatura4apa @ sensors/get4emp:$ 4apa4ermo %V EE 4#P#
4emperatura=eposito @ sensors/get4emp:$=epo4ermo%V EE =1P*7G4*
EEahora que tenemos las tempreaturas de nuestros sensores podemos hacer con
EEellas los que queramos, por e0emplo sacarlas por una pantalla/
EE# continuacin comprobaremos si se a acti&ado alguna alarma de temperatura en nuestros
sensores
if $sensors/has#larm$#gua4ermo%%
X
EE 7e a acti&ado una alarma, comprobamos cual y actuamos/
if $ sensors/get4emp:$#gua4ermo% U sensors/getLoF#larm4emp$#gua4ermo % %
X
EE 1ncendemos el calentador del acuario
[
if $ sensors/get4emp:$#gua4ermo% S sensors/getHigh#larm4emp$#gua4ermo% %
X
EE#pagamos el calentador del acuario
[
[
2B
if $sensors/has#larm$=epo4ermo%%
X
if $ sensors/get4emp:$=epo4ermo% U sensors/getLoF#larm4emp$=epo4ermo%%
X
EE 1ncendemos el calentador del deposito
[
if $ sensors/get4emp:$=epo4ermo% S sensors/getHigh#larm4emp$=epo4ermo%%
X
EE #pagamos el calentador del deposito
[
[
if $sensors/has#larm$4apa4ermo%%
X
if $ sensors/get4emp:$4apa4ermo% S sensors/getHigh#larm4emp$4apa4ermo%%
X
EE 1ncendemos los &entiladores de la tapa
[
if $ sensors/get4emp:$4apa4ermo% U sensors/getLoF#larm4emp$4apa4ermo%%
X
EE #pagamos los &entiladores de la tapa/
[
[
[
#qu tenDis el cdigo final )uestro:ontrolador00A/"ip
#hora le aadiremos el cdigo para empe"ar a pintar en nuestra pantalla, para lo cual aadiremos a
nuestro cdigo la librera de nuestra pantalla y su iniciacin/
Por e0emplo para una pantalla de caracteres/
Tinclude U*ne?ire/hS
Tinclude U=allas4emperature/hS
Tinclude ULiquid:rystal/hS
Tdefine PG)OPO41,P16 7
Tdefine L:=O?G=4H A. EE#ncho de la pantalla
Tdefine L:=OH1G2H4 2 EE #lto de la pantalla
=e&ice#ddress #gua4ermo, 4apa4ermo, =epo4ermoV EE =irecciones de los sensores de temperatura
*ne?ire one?ire$ PG)OPO41,P16 %V
=allas4emperature sensors$Wone?ire%V
Liquid:rystal lcd$A2, 2, A0, H, >, 7%V EEGniciamos la pantalla
&oid setup$%
X
pin,ode$PG)OPO41,P16, G)P(4 %V
lcd/begin$L:=O?G=4H, L:=OH1G2H4,A%V EE#rrancamos nuestra pantalla
Gniciar4emperaturas$%V EEGniciamos los sensores de temperatura/
[
2-
C en la funcin M,irar4emperaturas$%N pondremos el cdigo para que pinte lo &alores de las temperaturas/
&oid ,irar4emperaturas$%
X
float 4emperatura#cuario, 4emperatura=eposito, 4emperatura4apaV
char data^A2_V EE5ariable para pasar el &alor de la temperatura a te;to/
EELlamamos a la funcin request4emperatures$% de nuestro controlador de sensores
EEpara que se prepare a nuestra llamada de lectura/
sensors/request4emperatures$%V
EEllamamos a get4emp:$% pas!ndole la &ariable del sensor que queremos leer
EE y esta funcin nos de&ol&er! la temperatura de el sensor llamado/
4emperatura#cuario @ sensors/get4emp:$ #gua4ermo %V EE #:(#6G*
4emperatura4apa @ sensors/get4emp:$ 4apa4ermo %V EE 4#P#
4emperatura=eposito @ sensors/get4emp:$=epo4ermo%V EE =1P*7G4*
EEahora que tenemos las temperaturas de nuestros sensores la pintamos en nuestra pantalla
lcd/set:ursor$0,0%V EE)os ponemos en el inicio de la pantalla
lcd/print$Y#2(#: Y%V
dtostrf$ data, -, 2, 4emperatura#cuario %V EE:on&ertimos el &alor de la temperatura a te;to con dos
decimales/
lcd/print$data%V EE Lo pintamos/
lcd/set:ursor$AA,0%V EE)os ponemos en la derecha de la pantalla
lcd/print$Y4#P#: Y%V
dtostrf$ data, -, 2, 4emperatura4apa %V EE:on&ertimos el &alor de la temperatura a te;to con dos
decimales/
lcd/print$data%V EE Lo pintamos/
lcd/set:ursor$0,A%V EE)os ponemos al inicio de la segunda lnea/
lcd/print$Y=1P*: Y%V
dtostrf$ data, -, 2, 4emperatura=eposito%V EE:on&ertimos el &alor de la temperatura a te;to con dos
decimales/
lcd/print$data%V EE Lo pintamos/
:on la pantalla A2>;.- conectada en paralelo/
Tinclude U*ne?ire/hS
Tinclude U=allas4emperature/hS
Tinclude YL:=A2>.-6/hY
Tdefine #6O7G`1$ a % si"eof$ a % E si"eof$ a^0_ %
Tdefine PG)OPO41,P16 7
=e&ice#ddress #gua4ermo, 4apa4ermo, =epo4ermoV EE =irecciones de los sensores de temperatura
*ne?ire one?ire$ PG)OPO41,P16 %V
=allas4emperature sensors$Wone?ire%V
&oid setup$%
X
pin,ode$PG)OPO41,P16, G)P(4 %V
L:=#/Gnitialise$%V EEGniciamos la pantalla
23
L:=#/:L1#6$%VEELimpiamos la pantalla
Gniciar4emperaturas$%V EEGniciamos los sensores de temperatura/
[
C ahora lo pintamos
EEahora que tenemos las temperaturas de nuestros sensores la pintamos en nuestra pantalla
L:=#/=isplay7tring$0,A, Y#2(#: Y, #6O7G`1$Y#2(#: Y%%V
dtostrf$ data, -, 2, 4emperatura#cuario %V EE:on&ertimos el &alor de la temperatura a te;to con dos
decimales/
L:=#/=isplay7tring$0,>, data, #6O7G`1$data%%V EE Lo pintamos/
delay$A00%V
L:=#/=isplay7tring$A,A, Y4#P#: Y, #6O7G`1$Y4#P#: Y%%V
dtostrf$ data, -, 2, 4emperatura4apa %V EE:on&ertimos el &alor de la temperatura a te;to con dos
decimales/
L:=#/=isplay7tring$A,>, data, #6O7G`1$data%%V EE Lo pintamos/
delay$A00%V
L:=#/=isplay7tring$A,A, Y=1P*: Y, #6O7G`1$Y4#P#: Y%%V
dtostrf$ data, -, 2, 4emperatura=eposito %V EE:on&ertimos el &alor de la temperatura a te;to con dos
decimales/
L:=#/=isplay7tring$A,>, data, #6O7G`1$data%%V EE Lo pintamos/
delay$A00%V
:on la pantalla A2>;.- conectada por serial/
Tinclude U*ne?ire/hS
Tinclude U=allas4emperature/hS
Tinclude YL:=A2>;.-/hY EE Libreria del L:=
Tdefine PG)OPO41,P16 7
=e&ice#ddress #gua4ermo, 4apa4ermo, =epo4ermoV EE =irecciones de los sensores de temperatura
*ne?ire one?ire$ PG)OPO41,P16 %V
=allas4emperature sensors$Wone?ire%V
L:=A2>;.-:lass Lcd$ AH, A> %V EE=eclaramos la pantalla
&oid setup$%
X
pin,ode$PG)OPO41,P16, G)P(4 %V
Lcd/7et=elay$200%V EE=eclaramos el tiempo en de espera entre cada orden/
Lcd/8rillo$70%V EE=efinimos el brillo que queremos en nuestra pantalla/
Gniciar4emperaturas$%V EEGniciamos los sensores de temperatura/
[
C ahora lo pintamos
EEahora que tenemos las temperaturas de nuestros sensores la pintamos en nuestra pantalla
Lcd/?riteIC$Y#:(#6G* :Y, 2, 30%V
Lcd/?riteIC$4emperatura#cuario, 37, 30 %V
2.
Lcd/?riteIC$Y4#P#=16#:Y, 2, -0%V
Lcd/?riteIC$4emperatura4apa, 37, -0 %V
Lcd/?riteIC$Y=1P*7G4*:Y, 2, B0%V
Lcd/?riteIC$4emperatura=eposito, 37, B0 %V
#qu tenDis el cdigo final )uestro:ontrolador002/"ip
=entro de poco pondrD la parte del relo0 y el teclado, pero mientras tanto para aclarar un poco las ideas a
los que est!n pensando como montar su propio controlador, le pongo unos enlaces de otra mucha gente que
esta montando tambiDn sus controladores, esperando que pod!is coger ideas de como conectar y enca0ar el
controlador en &uestro acuario/
1n espaol:
http:EEFFF/carballada/comEFordpress///<de<acuario<0Bb
http:EEcode/google/comEpEacuarinoE
http:EEarduino/trucados/comEacat@A
http:EEFFF/arduino/ccEcgi<binEyabb2ECa88/[email protected]
http:EEFFF/todomarino/comEforumEfor///ller<de<#rduino
1n ingles:
http:EEreefpro0ects/comEFiPiE,ainOPage
http:EEFFF/arduino/ccEcgi<binEyabb2ECa88/planum@A2-00000A>
http:EEFFF/nano<reef/comEforumsEinde;/[email protected]
http:EEFFF/n"mas/co/n"EforumE&ieFtopic/phpaf@7Wt@A0BBH
http:EEFFF/marineaquariumsa/comEshoFthread/[email protected]
http:EEFFF/arduino/ccEcgi<binEyabb2ECa88/planum@A2HA32A2-B
http:EEFFF/thereefuge/comEthreadsEa///nd<ansFers/7-3E
5erDis que la gente monta su controlador desde en un taperFare hasta en una ca0a echa en madera/
%elo# de tiempo real
Hoy &eremos como conectar y programar el modulo del relo0 para tener controlado la fecha y la hora,
como ya &imos anteriormente este es un modulo muy pequeo el cual tiene 3 cone;iones de las cuales
solamente usaremos - que son el positi&o, el negati&o, 7:L y 7=#, estas dos ultimas son las
correspondiente a una cone;in del protocolo G2:, las cuales para un #rduino (no son los pines
analgicos 7=# @ - y 7:L @ 3 en cambio en el #rduino ,ega los pines don el 7=# @ 20 y 7:L @ 2A/
Para mane0ar este relo0 hay &arias libreras en Gnternet pero la &erdad es que despuDs de probar &arias $sin
gustarme ninguna% me decid por crearme la ma propia un poco mas cmoda de usar y mas funcional/
*s la podDis descargar de este enlace 6elo0=7AB07/
(na descripcin r!pida de sus funciones :
&oid 7et=ate4ime$ int month=ay, int month, int year, int hour, int minute, int second %V EE1stablece
la la fecha y hora del relo0
&oid 2et=ate4ime$ int Wmonth=ay, int Wmonth, int Wyear, int Whour, int Wminute, int second %V
EE*btiene la fecha y hora en par!metros separados/
char ] =ate4ime$%VEE*btiene una cadena de te;to con la fecha y la hora/
char ] =ate$%VEE*btiene una cadena de te;to con la fecha/
char ] 4ime$%VEE*btiene una cadena de te;to con la hora y minutos/
27
int 2etHour$%VEE*btiene un entero con el &alor de la hora/
int 2et,inute$%VEE*btiene un entero con el &alor de los minutos/
int 2etCear$%VEE*btiene un entero con el &alor del ao/
int 2et,onth$%VEE*btiene un entero con el &alor del mes/
int 2et=ay$%VEE*btiene un entero con el &alor del da/
&oid 7et=ia7emana$ int =ia7emana %V EE1stablece el da de la semana$Lunes,,artesb/%/
int 2et=ia7emana$%V EE*btiene un entero con el &alor del da de la semana
char ] =ia)ame$%V EE*btiene una cadena con el nombre del da de la semana/
char ] ,es)ame$%VEE*btiene una cadena con el nombre del mes/
boolean GsLater$ int hour, int minute %V EE)o de&uel&e si la hora actual es mas tarde que la pasada/
boolean GsPre&ious$ int hour, int minute %V EE)o de&uel&e si la hora actual es mas temprana que la
pasada/
7u uso &iendo las funciones que tiene es bastante simple, empe"aremos aadiendo en nuestro 'ltimo
cdigo la llamada a la librera y tambiDn la librera U?ire/hS que tambiDn utili"a internamente/
Tinclude U?ire/hS
Tinclude U*ne?ire/hS
Tinclude U=allas4emperature/hS
Tinclude YL:=A2>;.-/hY EE Libreria del L:=
Tinclude Y6elo0=7AB07/hY EE Libreria del 6elo0
#s mismo declararemos la &ariable con la que utili"aremos el 6elo0=7AB07, en este caso simplemente la
llamaremos M6elo0N/
*ne?ire one?ire$ PG)OPO41,P16 %V
=allas4emperature sensors$Wone?ire%V
L:=A2>;.-:lass Lcd$ AH, A> %V EE=eclaramos la pantalla
6elo0=7AB07:lass 6elo0V EE=eclaracin de la &ariable del 6elo0
1n la funcin Msetup$%N aadiremos la iniciacin del sistema Fire para uso de nuestro 6elo0
Lcd/7et=elay$200%V EE=eclaramos el tiempo en de espera entre cada orden/
Lcd/8rillo$70%V EE=efinimos el brillo que queremos en nuestra pantalla/
?ire/begin$%V
4ambiDn aadiremos otra lnea para poner en hora nuestro relo0, pero esta lnea ser! solo para que se use
una sola &e", de forma que cuando se reinicie el #rduino y funcione le cargaremos otra &e" el mismo
cdigo pero sin esta lnea, ya que esta lnea te pondr! la fecha y hora del relo0 en cuanto se inicie el
#rduino y si lo apagas y inicias otra &e" te la &ol&er! a configurar la misma y entonces tendr! retraso el
relo0 como es normal/
Lcd/7et=elay$200%V EE=eclaramos el tiempo en de espera entre cada orden/
Lcd/8rillo$70%V EE=efinimos el brillo que queremos en nuestra pantalla/
?ire/begin$%V
6elo0/7et=ate4ime$ A>, 0A, A2, A>, A2, 00 %V
,as adelante &eremos como configurar la hora sin tener que armar este 0aleo/
Luego para que podamos &er en nuestra pantalla la fecha y la hora actual, es tan simple como poner en
nuestra funcin Mloop$%N una llamada a la funcin de pintar de nuestra pantalla pes!ndole lo que nos
de&uel&e la funcin 6elo0/=ate4ime$%/
&oid loop$%
2>
X
Lcd/?riteIC$ 6elo0/=ate4ime$%, A0, .A%V
,irar4emperaturas$%V EE,iramos la temperaturas
[
1sto nos imprimir! en nuestra pantalla algo como MA>E0AEA2 A.:B3:23N
#qu os de0o el cdigo de nuestro controlador modificado )uestro:ontrolador00B/"ip/
1n la pr;ima &eremos como guardar y leer nuestra configuracin desde la 1prom del #rduino, en esta
memoria, aunque le cortemos la corriente al #rduino, no se perder! lo que guardemos/
7uardar y leer nuestra con8iguracin desde la Eprom del Arduino
5amos a &er ahora como guardar y leer los datos de nuestra configuracin, como &imos anteriormente
con nuestro sensor de temperatura podemos controlar los calentadores, pero el &alor de temperatura que
deseamos tener si lo ponemos en el cdigo escrito, significa que cada &e" que queramos cambiar este
&alor deberemos editar el programa y cargarlo en nuestro #rduino/
1sto no es practico, por lo que lo ra"onable es que el &alor de temperatura deseado este en una &ariable la
cual si queremos cambiar, lo podemos hacer desde un men' en la pantalla, el problema que tiene esto es
que si se corta la lu" a nuestro #rduino se le borra el &alor de todas las &ariable como es natural, para
solucionar este problema tenemos la solucin muy practica, que es guardar los datos de nuestra
configuracin en la 1P6*, la memoria no &ol!til del #rduino que tiene 3A2 bytes de memoria, es poco
pero para nuestra configuracin nos sobra/
Para poder escribir y leer en la 1P6*, del #rduino tenemos la librera 11P6*,/h la cual ya &iene con
el G=1 del #rduino, esta librera es muy simple ya que solo tiene 2 funciones read$% y Frite$% , con lo cual
queda claro su mane0o/
Pero escribir en una 1P6*, tiene un problema, que no es como un disco de ordenador, no hay archi&os
ni directorios, solo un espacio de 3A2 bytes, por lo que si queremos guardar &arios datos tenemos que
saber la posicin de cada uno, para e&itar esto utili"aremos un tipo de dato llamado struct $estructura% que
es un grupo de &ariables unidas por una estructura de esta forma/
EE 1structura de los datos de configuracin
typedef struct :onfiguracioOstruct
X
float 4ermo#cuarioV EE4emperatura #cuario
float PHV EE5alor del PH
int Lu"HO*)V EEHora de encendido de la lu"
int Lu",O*)V EE,inutos de encendido de la lu"
[ 7truO:onfiguracionV
=e esta forma solo tendremos que guardar o leer en la 1P6*, la &ariable que definamos como
7truO:onfiguracion, conteniendo esta todas las &ariable de nuestra configuracin/
GmplementDmoslo en nuestro cdigo, aadiendo primero la librera a nuestro cdigo/
Tinclude U?ire/hS
Tinclude U*ne?ire/hS
Tinclude U=allas4emperature/hS EE Librera de los sensores de temperatura
2H
Tinclude U11P6*,/hS EE Librera para poder escribir en la eprom del #rduino
Tinclude Y6elo0=7AB07/hY EE Librera del 6elo0
Tinclude YL:=A2>;.-/hY EE Librera del L:=
#hora declaremos el tipo de estructura que tendr! nuestra configuracin/
EE 1structura de los datos de configuracin
typedef struct :onfiguracioOstruct
X
float 4ermo#cuarioV EE4emperatura #cuario
float 4ermo4apaV EE4emperatura 4apa
float 4ermo=epositoV EE4emperatura =eposito
float PHV EE5alor del PH
int Lu"AHO*)V EEHora de encendido de la lu" )QA
int Lu"A,O*)V EE,inutos de encendido de la lu" )QA
int Lu"AHO*JJV EEHora de apagado de la lu" )QA
int Lu"A,O*JJV EE,inutos de apagado de la lu" )QA
int Lu"2HO*)V EEHora de encendido de la lu" )Q2
int Lu"2,O*)V EE,inutos de encendido de la lu" )Q2
int Lu"2HO*JJV EEHora de apagado de la lu" )Q2
int Lu"2,O*JJV EE,inutos de apagado de la lu" )Q2
int Lu"BHO*)V EEHora de encendido de la lu" )QB
int Lu"B,O*)V EE,inutos de encendido de la lu" )QB
int Lu"BHO*JJV EEHora de apagado de la lu" )QB
int Lu"B,O*JJV EE,inutos de apagado de la lu" )QB
[ 7truO:onfiguracionV
C luego declaramos la &ariable de tipo 7truO:onfiguracion/
7truO:onfiguracion :J2V
#hora para poder asignar o leer un &alor de nuestra configuracin tan solo tendremos que hacer esto/
:J2/4ermo#cuario @ 27/00V
:J2/PH @ ./>V
Para que en caso de que no podamos leer la 1P6*, o sea la primera &e" que lo hagamos, le daremos a
nuestra estructura de configuracin unos &alores por defecto/
:J2/4ermo#cuario @ 27V
:J2/4ermo4apa @ B0/0V
:J2/4ermo=eposito @ 20/0V
:J2/PH @ 7/0V
:J2/Lu"AHO*) @ A3V
:J2/Lu"A,O*) @ 0V
:J2/Lu"AHO*JJ @ 2BV
:J2/Lu"A,O*JJ @ B0V
:J2/Lu"2HO*) @ A3V
:J2/Lu"2,O*) @ B0V
:J2/Lu"2HO*JJ @ 2-V
:J2/Lu"2,O*JJ @ 0V
:J2/Lu"BHO*) @ 2BV
:J2/Lu"B,O*) @ 30V
B0
:J2/Lu"BHO*JJ @ 2.V
:J2/Lu"B,O*JJ @ 0V
Luego escribiremos las funciones que leer! y grabara nuestra configuracin en la 1P6*,
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE 26#5# L# :*)JG2(6#:G*) 1) L# 1P6*,
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid 7al&ar:onfig$%
X
uint>Ot 5alor^si"eof$:J2%_V
memcpy$ W5alor, W:J2, si"eof$:J2%%V
for $int i @ 0V i U@ si"eof$5alor%V i99%
11P6*,/Frite$i, 5alor^i_%V
[
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE L11 L# :*)JG2(6#:G*) =1 L# 1P6*,
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid Leer:onfig$%
X
uint>Ot 5alor^si"eof$:J2%_V
for $int i @ 0V i U@ si"eof$:J2%V i99%
5alor^i_ @ 11P6*,/read$i%V
memcpy$ W:J2, W5alor, si"eof$:J2%%V
[
Luego todo es tan simple como que al iniciar el programa llamemos a la funcin Leer:onfig$% con lo cual
tendremos en la &ariable :J2 la estructura con los datos de nuestra configuracin, luego si cambiamos
alg'n &alor de nuestra configuracin llamaremos a 7al&ar:onfig$% y tendremos los cambios guardados/
#qu os de0o el cdigo de nuestro controlador modificado/ )uestro:ontrolador00-/"ip
8ueno &amos a &er como optimi"ar el cdigo de pintado en pantalla de nuestro controlador, como ya
di0imos las pantallas L:= no se borran solas,
por lo que si pintamos algo en ellas no
desaparece hasta que pintemos encima o lo
borremos, por lo cual tenemos que saber
siempre que pintamos y en donde pintamos,
para esto lo me0or es hacernos un esquema o
dibu0o de como queremos que quede nuestra
pantalla, teniendo en cuenta su tamao y
limitaciones/
BA
1sta es mi pantalla tal como la disee y esta ahora, si nos fi0amos bien en ella &eremos que esta di&idida
en &arias partes/
7i os fi0!is hay ciertas parte
que no e marcado, estas son
las parte est!ticas o lo que es
lo mismo las que no
cambian, lo mas efecti&o es
que todas esas partes se
pinten desde una funcin ya
que mientras no cambiemos
de pantalla, como &er!n a
continuacin
#l fotografiarla se me escapo el mensa0e del pie, pero quitando esto
podDis &er lo que pinta mi funcin de pintado de pantalla principal,
lo dem!s se pinta desde cada funcin encargada del &alor, por
e0emplo la temperatura se pinta en la funcin que llamamos para
leerla ,irar4emperaturas$% sabiendo siempre el lugar donde
pintarlo y el espacio que tenemos para ello, esto es importante los
&alores &ariables que pintamos tenemos que preocuparnos que
siempre tengan el mismo tamao, para que machaque lo que haba
antes/
5amos a aplicar esto en nuestro cdigo, lo primero crearemos 2 nue&as funciones la que pintara las partes
est!ticas de nuestra pantalla y otra de apoyo que se encargara de pintar a&isos y estado en el pie de la
pantalla/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE PG)4# () ,1)7#c1 1) 1L PG1 =1 L# P#)4#LL#
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid ,sgPie$ char ] msg %
X
Lcd/?riteIC$ msg, A0, >%V
[
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE PG)4# L# P#)4#LL# P6G):GP#L
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid PrintPant,ain$%
X
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
Lcd/Linea$ 0, 3B, A27, 3B, A%V
Lcd/Linea$ H0, A0, H0, 3B, A%V
Lcd/Linea$ 0, A0, A27, A0, A%V
Lcd/?riteIC$Y#:(#6G* :Y, 2, 30%V EE #ncho, #lto, ,odo
B2
Lcd/?riteIC$Y4#P#=16#:Y, 2, -0%V
Lcd/?riteIC$Y=1P*7G4*:Y, 2, B0%V
Lcd/?riteIC$YPH :Y, 2, 20%V
[
C pondremos la llamada a la funcin de pintar pantalla al inicio del programa/
&oid setup$%
X
pin,ode$PG)OPO41,P16, G)P(4 %V
Lcd/7et=elay$200%V EE=eclaramos el tiempo en de espera entre cada orden/
Lcd/8rillo$70%V EE=efinimos el brillo que queremos en nuestra pantalla/
PrintPant,ain$%V
,sgPie$ YGniciando 7istemaY %V
?ire/begin$%V
bbbbbbb/
bbbbbbb/
bbbbbbb/
Gniciar4emperaturas$%V EEGniciamos los sensores de temperatura/
,sgPie$ Y7istema funcionandoY %V
[
Ca solo nos queda quitar el te;to est!tico que est!bamos pintando en la pantalla y que esta repartido por el
cdigo/
&oid ,irar4emperaturas$%
X
float 4emperatura#cuario, 4emperatura=eposito, 4emperatura4apaV
EELlamamos a la funcin request4emperatures$% de nuestro controlador de sensores
EEpara que se prepare a nuestra llamada de lectura/
sensors/request4emperatures$%V
EEllamamos a get4emp:$% pas!ndole la &ariable del sensor que queremos leer
EE y esta funcin nos de&ol&er! la temperatura de el sensor llamado/
4emperatura#cuario @ sensors/get4emp:$ #gua4ermo %V EE #:(#6G*
4emperatura4apa @ sensors/get4emp:$ 4apa4ermo %V EE 4#P#
4emperatura=eposito @ sensors/get4emp:$=epo4ermo%V EE =1P*7G4*
EEahora que tenemos las temperaturas de nuestros sensores la pintamos en nuestra pantalla
Lcd/?riteIC$Y#:(#6G* :Y, 2, 30%V
Lcd/?riteIC$4emperatura#cuario, 37, 30 %V
Lcd/?riteIC$Y4#P#=16#:Y, 2, -0%V
Lcd/?riteIC$4emperatura4apa, 37, -0 %V
Lcd/?riteIC$Y=1P*7G4*:Y, 2, B0%V
Lcd/?riteIC$4emperatura=eposito, 37, B0 %V
Ruitaremos el cdigo que esta en a"ul/
#qu os de0o el cdigo de nuestro controlador modificado/ )uestro:ontrolador00-/"ip
BB
Los rel!s
Los relDs como ya os puse en un post anterior son un componente esencial en nuestro controlador/
Para poder controlarlos usaremos los pines digitales del #rduino de la siguiente forma
digital?rite$ PG)O:*)1:4#=*O1LO61L1, HG2H %V
con esto ponemos en I7 $acti&o positi&o, 3&% el pin donde esta conectado el relD y si le ponemos
digital?rite$ PG)O:*)1:4#=*O1LO61L1, L*? %V
lo ponemos en L9' $acti&o negati&o, 0&% con lo cual lo apagamos/
Pero hay una pega y es que si utili"amos las placas de relDs chinas anteriormente descritas, esta son de
acti&acin negati&a, o lo que es lo mismo que los relDs se acti&an con L9' y se desacti&an con I7,
los chinos son raros hasta para esto/
:omo esto puede ser un poco lioso a la hora de programar, por lo cual a la hora de hacer mi programa me
decid por programar una funcin que gestionara la acti&acin negati&a de los relDs y de paso pintar en la
pantalla unos cuadritos representando que relDs est!n acti&os y cuales no/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE #:4G5# * =17#:4G5# () 61L1 C L* PG)4# 1) L# P#)4#LL#
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid 7et6ele$ int Gnde;, int Pin, boolean 1stado %
X
int G @ ><Gnde;V
digital?rite$ Pin, Z1stado %V
if $1stado%
X
Lcd/6ectangulo$ H., -H<$G]3%, A0B, -><$G]3%%V
[
else
X
Lcd/Linea$ H., -H<$G]3%, A0B, -H<$G]3%, 0%V
Lcd/Linea$ H., -><$G]3%, A0B, -><$G]3%, 0%V
[
[
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE PG)4#6 174#=* =1 L*7 61L1 1) L# P#)4#LL# P6G):GP#L #L 61PG)4#6L#
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid 6ePintar6ele$%
X
byte Pines^_ @ X-2, -0, B>, B., B-, B0, B2, 2>[V
int GV
B-
for$ G@>V GSAV G<< %
X
if $Zdigital6ead$Pines^G_%%
X
Lcd/6ectangulo$ H., -H<$G]3%, A0B, -><$G]3%%V
[
else
X
Lcd/Linea$ H., -H<$G]3%, A0B, -H<$G]3%, 0%V
Lcd/Linea$ H., -><$G]3%, A0B, -><$G]3%, 0%V
[
[
[
1l mane0o de estas funciones es simple, el primer par!metro es el ndice indicador del relD, en mi caso
como tengo > y los pinto &erticalmente el primero de aba0o es el A y el ultimo de arriba el >, el segundo
par!metro es el pin donde esta conectado y el tercero el estado que le queremos dar, la funcin ya se
preocupa de la acti&acin negati&a de los relDs chinos/
7et6ele$ A, PG)O:*)1:4#=*O1LO61L1, HG2H %V EE#cti&amos y pintamos el relD )QA
7et6ele$ A, PG)O:*)1:4#=*O1LO61L1, L*? %V EE=esacti&amos y pintamos el relD )QA
Luego teniendo en cuenta que tendremos que poner mas adelante otras pantallas para configurar el
controlador, tenemos otra funcin que pintara en la pantalla el estado de todos los relDs, cuando &ol&amos a
pintar la pantalla principal/
6ePintar6ele$%V
Ca solo nos queda implementarlo en el cdigo de nuestro controlador, lo primero definir los pines donde
tenemos conectado nuestros relDs/
Tdefine PG)O=O61L1O:#L1)4#=*6 2> EE>
Tdefine PG)O=O61L1O:#L1)4=1P* B2 EE7
Tdefine PG)O=O61L1O1I46#4*617 B0 EE.
Tdefine PG)O=O61L1OL(:17 B- EE3
Tdefine PG)O=O61L1O:*2 B. EE-
Tdefine PG)O=O61L1O*7,*7G7 B> EEB
Tdefine PG)O=O61L1OLL(5G# -0 EE2
Tdefine PG)O=O61L1OLL1)#=* -2 EEA
Luego en el setup$% configurar estos pines como de salida/
pin,ode$ PG)O=O61L1O:#L1)4#=*6, *(4P(4 %V
pin,ode$ PG)O=O61L1O:#L1)4=1P*, *(4P(4 %V
pin,ode$ PG)O=O61L1O1I46#4*617, *(4P(4 %V
pin,ode$ PG)O=O61L1OL(:17, *(4P(4 %V
pin,ode$ PG)O=O61L1O:*2, *(4P(4 %V
pin,ode$ PG)O=O61L1O*7,*7G7, *(4P(4 %V
pin,ode$ PG)O=O61L1OLL(5G#, *(4P(4 %V
pin,ode$ PG)O=O61L1OLL1)#=*, *(4P(4 %V
B3
Pero aqu con los relDs chinos al ser de acti&acin negati&a, lo que pasara es que al definir los pines como
de salida el #rduino los pondr! a negati&o $ 0& % con lo cual acti&ara todos los relDs para corregir esto
pondremos un bucle J*6 para desacti&arlos, esto ser! muy r!pido por lo que no le dar! tiempo a funcionar
ning'n aparato conectado/
byte nV
for$n@2>V n U -BV n @ n 9 2%
X
digital?rite$ n, HG2H%V
[
La funcin 6ePintar6ele$% la tenemos que poner en nuestra funcin PrintPant,ain$% para que pinte los
recuadros de nuestros relDs al pintar la pantalla/
&oid PrintPant,ain$%
X
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
Lcd/Linea$ 0, 3B, A27, 3B, A%V
Lcd/Linea$ H0, A0, H0, 3B, A%V
Lcd/Linea$ 0, A0, A27, A0, A%V
Lcd/?riteIC$Y#:(#6G* :Y, 2, 30%V EE #ncho, #lto, ,odo
Lcd/?riteIC$Y4#P#=16#:Y, 2, -0%V
Lcd/?riteIC$Y=1P*7G4*:Y, 2, B0%V
Lcd/?riteIC$YPH :Y, 2, 20%V
6ePintar6ele$%V
[
8ien con esto ya tenemos definido todo lo necesario para poner en funcionamientos nuestros relDs,
empe"aremos por los relDs que controlan los calentadores, en la funcin Print4emperatura$%/
if $sensors/has#larm$#gua4ermo%%
X
if $ sensors/get4emp:$#gua4ermo% U sensors/getLoF#larm4emp$#gua4ermo% WW
digital6ead$PG)O=O61L1O:#L1)4#=*6%%
7et6ele$ >, PG)O=O61L1O:#L1)4#=*6, HG2H %V
if $ sensors/get4emp:$#gua4ermo% S sensors/getHigh#larm4emp$#gua4ermo% WW $Z
digital6ead$PG)O=O61L1O:#L1)4#=*6%%%
7et6ele$ >, PG)O=O61L1O:#L1)4#=*6, L*? %V
[
if $sensors/has#larm$=epo4ermo%%
X
if $ sensors/get4emp:$=epo4ermo% U sensors/getLoF#larm4emp$=epo4ermo% WW
digital6ead$PG)O=O61L1O:#L1)4=1P*%%
7et6ele$ 7, PG)O=O61L1O:#L1)4=1P*, HG2H %V
if $ sensors/get4emp:$=epo4ermo% S sensors/getHigh#larm4emp$=epo4ermo% WW $Z
digital6ead$PG)O=O61L1O:#L1)4=1P*%%%
7et6ele$ 7, PG)O=O61L1O:#L1)4=1P*, L*? %V
[
if $sensors/has#larm$4apa4ermo%%
X
if $ sensors/get4emp:$4apa4ermo% S sensors/getHigh#larm4emp$4apa4ermo% WW
digital6ead$PG)O=O61L1O1I46#4*617%%
B.
7et6ele$ ., PG)O=O61L1O1I46#4*617, HG2H %V
if $ sensors/get4emp:$4apa4ermo% U sensors/getLoF#larm4emp$4apa4ermo% WW $Z
digital6ead$PG)O=O61L1O1I46#4*617%%%
7et6ele$ ., PG)O=O61L1O1I46#4*617, L*? %V
[
:omo &erDis utili"o la funcin digital6ead$PG)% para a&eriguar si esta o no acti&o ya el relD/
1l cdigo modificado del controlador lo tenDis aqu/ )uestro:ontrolador00./"ip
El teclado$
1l teclado es un componente importantsimo para poder interactuar con el #rduino y como &imos en este
post hay &arias formas de componerlo/
Co me decid por este, 2 botones para mo&erme por la pantalla, 2 botones para aumentar o disminuir los
&alores, A para el *K y A para salir de los men's/

1sto lo que hace es poner acti&o $3&% el pin que este conectado el botn pulsado y lo mismo que us!bamos
para saber si estaba acti&o un relD, lo usaremos para saber si esta acti&o un pulsador, que era la funcin
digital6ead$PG)%/
1mpecemos a ir definiendo el cdigo de nuestro teclado, empecemos definiendo los pines de nuestro
teclado/
Tdefine PG)O=OK1CO*K BH
Tdefine PG)O=OK1CO=16 -A
Tdefine PG)O=OK1CO7#LG6 -B
Tdefine PG)O=OK1COG`R -3
Tdefine PG)O=OK1CO,#7 -7
Tdefine PG)O=OK1CO,1)*7 -H
B7
#hora en el setup$% defin!moslo como pines de entrada/
pin,ode$ PG)O=OK1CO*K, G)P(4 %V
pin,ode$ PG)O=OK1CO=16, G)P(4 %V
pin,ode$ PG)O=OK1CO7#LG6, G)P(4 %V
pin,ode$ PG)O=OK1COG`R, G)P(4 %V
pin,ode$ PG)O=OK1CO,#7, G)P(4 %V
pin,ode$ PG)O=OK1CO,1)*7, G)P(4 %V
Para empe"ar a usar nuestro teclado crearemos un men' con &arias opciones de configuracin, para lo cual
primero crearemos una funcin que pinte este men'/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE PG)4# P#)4#LL# =1 :*)JG2(6#:G*)
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid PrintPant:onfig$%
X
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
Lcd/?riteIC$Y:*)JG2(6#:G*)Y, 23, .A%V
Lcd/Linea$ 0, 3B, A27, 3B, A %V
Lcd/?riteIC$YJ1:H# C H*6#Y, A-, -H%V EE #ncho, #lto, ,odo
Lcd/?riteIC$Y41,P16#4(6#7Y, A-, BH%V
Lcd/?riteIC$YJGc#6 PH P#6# :*2Y, A-, 2H%V
Lcd/?riteIC$YH*6#6G* =1 L(:17Y, A-, AH%V
Lcd/?riteIC$Y61L17Y, A-, H%V
[
C ahora definamos la funcin que controlara el teclado, esta funcin comprobara si pulsamos el botn *K,
si lo pulsamos pintaremos la pantalla del men' con &arias opciones y nos mo&eremos por el, si en alg'n
momento pulsamos el botn 7alir, saldremos de este men' y &ol&eremos a la pantalla principal/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE 41:L#=* P6G):GP#L C =1 :*)JG2(6#:G*)
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid 4eclado$%
X
int Gnde;V
boolean 7alir @ 8alseV
if $digital6ead$PG)O=OK1CO*K%% EE7i hemos pulsado el botn *K entramos/
X
PrintPant:onfig$%V EE Pintamos la pantalla del men'
Gnde; @ AV
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V EE ,arca de en que posicin del men' estamos
delay$A000%V
EE# continuacin nos quedamos a la espera de que pulsemos alg'n botn/
Fhile$$Zdigital6ead$PG)O=OK1CO7#LG6%% WW $Z7alir%%
X
if $digital6ead$PG)O=OK1CO=16%% EE )os mo&emos para aba0o
B>
X
Lcd/?riteIC$ Y Y, -, 3H<$A0]Gnde;%%V
if $Gnde; @@ 3% Gnde; @ AV else 99Gnde;V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
delay$300%V
[
if $digital6ead$PG)O=OK1COG`R%% EE)os mo&emos para arriba/
X
Lcd/?riteIC$ Y Y, -, 3H<$A0]Gnde;%%V
if $Gnde; @@ A% Gnde; @ 3V else <<Gnde;V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
delay$300%V
[
if $digital6ead$PG)O=OK1CO*K%% EE10ecutamos la opcin del men' seleccionada/
X
sFitch $Gnde;%
X
case A:
EEPrint:onf6elo0$%V EEJuncin para configurar el relo0
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case 2:
EEPrint:onf4emperatura$%V EEJuncin para configurar las temperaturas
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case B:
EEPrint:onfPH$%V EEJuncin para configurar el PH
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case -:
EEPrint:onfLuces$%V EEJuncin para configurar el horario de las luces
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case 3:
EEPrint#cti&a6eles$%V EE Juncin para acti&ar y desacti&ar relDs
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
[
[
[
PrintPant,ain$%V
[
[
C como es natural en nuestra funcin loop$% pondremos una llamada a la funcin teclado$% para que lo
compruebe/
&oid loop$%
BH
X
Lcd/?riteIC$ 6elo0/=ate4ime$%, A0, .A%V
,irar4emperaturas$%V EE,iramos la temperaturas
4eclado$%V
[
Ca iremos escribiendo las respecti&as pantallas de configuracin del men'/
1ste sistema de men' y pantallas de configuracin tiene una pequea pega, que la mayora suele ob&iar, y
es que mientras estas dentro de un men', el resto del cdigo del #rduino no se esta e0ecutando o lo que es
lo mismo, no se e0ecuta la funcin loop$%, pero no hay pega ya que el la pr;ima entrega arreglaremos esta
pega y algunas mas/
1l cdigo modificado del controlador lo tenDis aqu/ )uestro:ontrolador007/"ip
La 8uncin loop()
La funcin loop como su nombre indica es un bucle infinito que se e0ecuta constantemente, lo que es
muchas &eces por segundo, lo 'nico que lo retrasa es el tiempo que tarde en e0ecutarse las instrucciones
de cdigo que metamos en ella, con lo cual nuestra funcin loop actual
Lcd/?riteIC$ 6elo0/=ate4ime$%, A0, .A%V
,irar4emperaturas$%V EE,iramos la temperaturas
4eclado$%V
Pintara la fecha y hora, leer! y pintara la temperatura y comprobara el teclado &arias &eces por segundo, lo
cual es una bestialidad y que puede dar errores de lectura de la temperatura/
Para solucionar esto pondremos una forma de controlar cada que tiempo se reali"a la llamada, y para ello
usaremos la funcin millis$% la cual de&uel&e el tiempo en milisegundos transcurridos desde que se arranc
la placa #rduino con el programa actual/ 1ste n'mero se desbordar! $&ol&er! a cero%, despuDs de
apro;imadamente 30 das/
Para empe"ar declararemos una &ariable global para guardar cuando se e0ecuto la ultima &e" nuestro
cdigo/
long *ldO,illis @ 0V
=espuDs pondremos el siguiente cdigo en nuestra funcin loop/
&oid loop$%
X
if $ $millis$% < *ldO,illis% S 7000% EE comprobamos que hayan pasado 7 segundos
X
*ldO,illis @ millis$%V EE 2uardamos el tiempo actual/
Lcd/?riteIC$ 6elo0/=ate4ime$%, A0, .A %V
,irar4emperaturas$%V EE,iramos la temperaturas
[
4eclado$%V
[
-0
:on este cdigo haremos que la fecha y hora as como la lectura de la temperatura se realice cada 7
segundo, lo cual es un tiempo sobrado para que se controle todos los par!metros/
1n cambio hemos de0ado fuera la funcin que &igila el teclado ya que esta tiene que detectar el momento
e;acto en que toquemos el teclado/
La inactividad en los men:s
1n un post anterior pusimos el cdigo de la funcin teclado$% la cual nos sacaba un men' el cual se
quedaba a la espera de que seleccionemos una opcin, todo esto tiene un problema grabe y es que mientras
estamos dentro del men' el resto del cdigo de nuestro controlador no se e0ecuta, con lo cual los sensores
no leen y por lo tanto tampoco act'an con nuestro actuadores, como relDs/
4eniendo en cuenta esto no cre!is que sea tan raro que alguien mientras esta dentro de un men' se
entretenga con cualquier cosa o se ol&ide de salir del men'/
Para e&itar esto &amos a crear una funcin que controle la inacti&idad dentro de un men' y pasado de un
tiempo nos saque de esta/
1mpe"aremos creando una &ariable que nos mida la inacti&idad dentro de un men'/
long Gnacti&idad @ 20000V EE4iempo que estamos sin tocar la botonera
Luego crearemos la funcin que la llamaremos 1nGnacti&idad$% a la cual consultaremos para saber si
lle&amos mas de un cierto tiempo sin tocar la botonera del men'/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE P#6# 7#816 7G )*7 *L5G=#,*7 7#LG6 =1 () ,1)(
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
boolean 1nGnacti&idad$%
X
if $ $millis$% < Gnacti&idad% S B0000% EE B0 segundos
return trueV
else
return 8alseV
[
Luego solo tendremos que intercalarlo entre nuestro cdigo, para ello pondremos tanto en el inicio como
en cada pulsacin de los botones el siguiente cdigo
Gnacti&idad @ millis$%V
:on esto pondremos a cero el contador de inacti&idad, de esta forma si nos pasamos mas de los B0
segundos configurados sin tocar ning'n botn, nuestra funcin lo detectara y para que lo detecte la
llamaremos al final del men' de esta forma/
if $ 1nGnacti&idad$% %
X
Pito$B00%V
7alir @ trueV
[
-A
=e esta forma nuestro men' quedara de esta forma
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE 41:L#=* P6G):GP#L C =1 :*)JG2(6#:G*)
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid 4eclado$%
X
int Gnde;V
boolean 7alir @ 8alseV
if $digital6ead$PG)O=OK1CO*K%% EE7i hemos pulsado el botn *K entramos/
X
PrintPant:onfig$%V EE Pintamos la pantalla del men'
Gnde; @ AV
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V EE ,arca de en que posicin del men' estamos
delay$A000%V
Gnacti&idad @ millis$%V
EE# continuacin nos quedamos a la espera de que pulsemos alg'n botn/
Fhile$$Zdigital6ead$PG)O=OK1CO7#LG6%% WW $Z7alir%%
X
if $digital6ead$PG)O=OK1CO=16%% EE )os mo&emos para aba0o
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, -, 3H<$A0]Gnde;%%V
if $Gnde; @@ 3% Gnde; @ AV else 99Gnde;V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
delay$300%V
[
if $digital6ead$PG)O=OK1COG`R%% EE)os mo&emos para arriba/
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, -, 3H<$A0]Gnde;%%V
if $Gnde; @@ A% Gnde; @ 3V else <<Gnde;V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
delay$300%V
[
if $digital6ead$PG)O=OK1CO*K%% EE10ecutamos la opcin del men' seleccionada/
X
Gnacti&idad @ millis$%V
sFitch $Gnde;%
X
case A:
EEPrint:onf6elo0$%V EEJuncin para configurar el relo0
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case 2:
EEPrint:onf4emperatura$%V EEJuncin para configurar las temperaturas
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case B:
EEPrint:onfPH$%V EEJuncin para configurar el PH
-2
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case -:
EEPrint:onfLuces$%V EEJuncin para configurar el horario de las luces
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case 3:
EEPrint#cti&a6eles$%V EE Juncin para acti&ar y desacti&ar relDs
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
[
[
if $ 1nGnacti&idad$% %
X
7alir @ trueV
[
[
PrintPant,ain$%V
[
[
Sensores de temperatura$
8ueno y a continuacin ya que estamos afinando nuestro cdigo, &amos a afinar un poco el cdigo de
nuestros sensores de temperatura, como ya descubri nuestro compaero moiaio y que despuDs de &arias
pruebas tengo que darle la ra"n, la funcin setHigh#larm4emp$% de la librera del sensor no es muy fina
al controlar las &ariaciones de temperatura, por lo cual &amos a pasar de ella y controlarlo directamente/
Para empe"ar definiremos una constante que contenga el margen de &ariacin de temperatura que estemos
dispuestos a soportar/
Tdefine ,#621)O41,P16#4(6# 0/B
=espuDs tendremos que borrar en la funcin Gniciar4emperaturas$% el siguiente cdigo
sensors/setHigh#larm4emp$ #gua4ermo, 2./73 %V
sensors/setLoF#larm4emp$ #gua4ermo, 2./23 %V
sensors/setHigh#larm4emp$ =epo4ermo, 2./73 %V
sensors/setLoF#larm4emp$ =epo4ermo, 2./23 %V
sensors/setHigh#larm4emp$ 4apa4ermo, B0/00 %V
sensors/setLoF#larm4emp$ 4apa4ermo, 2H/30 %V
que adem!s tenia unos &alores fi0os y no tenia los &alores de nuestra configuracin/
Luego en la funcin ,irar4emperaturas$% cambiaremos las comprobacin de temperaturas por este cdigo
if $$sensors/get4emp:$#gua4ermo% U $:J2/4ermo#cuario<,#621)O41,P16#4(6#%% WW
digital6ead$PG)O=O61L1O:#L1)4#=*6%%
7et6ele$ >, PG)O=O61L1O:#L1)4#=*6, HG2H %V
if $$sensors/get4emp:$#gua4ermo% S $:J2/4ermo#cuario9,#621)O41,P16#4(6#%% WW $Z
digital6ead$PG)O=O61L1O:#L1)4#=*6%%%
-B
7et6ele$ >, PG)O=O61L1O:#L1)4#=*6, L*? %V
if $$sensors/get4emp:$=epo4ermo% U $:J2/4ermo=eposito<,#621)O41,P16#4(6#%% WW
digital6ead$PG)O=O61L1O:#L1)4=1P*%%
7et6ele$ 7, PG)O=O61L1O:#L1)4=1P*, HG2H %V
if $$sensors/get4emp:$=epo4ermo% S $:J2/4ermo=eposito9,#621)O41,P16#4(6#%% WW
$Zdigital6ead$PG)O=O61L1O:#L1)4=1P*%%%
7et6ele$ 7, PG)O=O61L1O:#L1)4=1P*, L*? %V
if $$sensors/get4emp:$4apa4ermo% S $:J2/4ermo4apa9,#621)O41,P16#4(6#%% WW
digital6ead$PG)O=O61L1O1I46#4*617%%
7et6ele$ ., PG)O=O61L1O1I46#4*617, HG2H %V
if $$sensors/get4emp:$4apa4ermo% U $:J2/4ermo4apa<,#621)O41,P16#4(6#%% WW $Z
digital6ead$PG)O=O61L1O1I46#4*617%%%
7et6ele$ ., PG)O=O61L1O1I46#4*617, L*? %V
:omo comprobareis estamos comprobando si la temperatura de nuestra configuracin es superior o
inferior al margen definido por nosotros, de esta forma cambiando el margen podemos controlar la
precisin de control de nuestra temperaturas/
1n la pr;ima le meteremos mano a como controlar y dimear nuestras luces/
1l cdigo modificado del controlador lo tenDis aqu/ )uestro:ontrolador00>/"ip
Control y dimeo de luces$
:omo ya &imos en un post anterior las luces de nuestro acuario las podemos controlar con nuestro #rduino
f!cilmente con tan solo un transistor y una resistencia, de una forma muy eficiente y como &eremos a
continuacin lo podemos hacer ya sea nuestra iluminacin leds o fluorescentes/
1n el caso de iluminacin led el sistema es simple:
:omo podemos &er el transistor 4GP esta
montado como si fuera una lla&e con la que
regulamos el flu0o de corriente $imaginaros
que es una tubera por la que corre el agua
y el 4GP es la lla&e con la que regulamos el
flu0o de agua%, la corriente que podemos
regular puede estar entre 7& y 3>& o incluso
mas dependiendo del tipo de transistor, con
lo cual la fuente de alimentacin que
regulemos puede ser de A25, 2-5 o ->5
dependiendo de las caractersticas de
nuestra iluminacin/
1l control es simple, el pin del #rduino nos da de 05 a 35 escalado en 233 &alores $0@05 a 233@35% esta
escala es igual para la salida de nuestro transistor el cual escalara el &olta0e de la fuente de alimentacin de
la misma forma $e0emplo: fuente de 2-5, 0@05 a 233@2-5%/
7i lo que queremos controlar son fluorescentes, tambiDn lo podemos
hacer pero para ello nos hace falta que estDn equipados con
reactancias $balastros% electrnicos regulables, estas reactancias se
regulan aplic!ndoles una seal de 05 a A05 en unas bornas para tal
fin/
Lo que cambia es la fuente de alimentacin que tiene que ser de A05/
--
8ueno empecemos con el cdigo para controlar nuestras luces/
Para controlar las luces debemos controlar dos cosas, el dimeo de las luces con los 4GP y la fuente de
alimentacin con un relD, ya que aunque apaguemos las luces con los 4GP, mientras no desconectemos la
fuente, esta seguir! consumiendo y haciendo traba0ar a los 4GP, tener en cuenta que los 4GP sufrir!n
$calent!ndose% mas contra mas redu"camos la iluminacin, ya que los 4GP tienen que dispar el &olta0e que
recortamos en forma de calor/
1l cdigo lo haremos para controlar la iluminacin en 2 faces o grupos de luces y una tercera para
controlar la lu" de luna/
1mpe"aremos definiendo el tope de dimeo de nuestras luces, en mi caso por e0emplo como me pase
poniendo luces me &ino muy bien para poder reducir la m!;ima iluminacin/
Tdefine =G,1*OL(`A 233
Tdefine =G,1*OL(`2 233
Tdefine =G,1*O)*:H1 233
declarando B &ariables globales que nos dir!n el ni&el de dimeo de nuestros nuestras luces/
int =imeoA, =imeo2, =imeoBV
las iniciaremos a cero en nuestro setup$%
=imeoA @ 0V =imeo2 @ 0V =imeoB @ 0V
:rearemos la funcin que pinte en la pantalla las barras de progresos de iluminacin de nuestras luces/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE PG)4# 1L 2#(21 :*) 1L )G51L =1 G)41)7G=#= #:4(#L =1 L# L(`
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid 2augeIC$ int 5alor, byte Gnde;:ol %
X
int :ol ^_ @ X0, A0H, AA3, A2A[V
int I @ :ol^Gnde;:ol_V
Lcd/6ectangulo$I, A2, I9B, 3A%V
Lcd/8orrar$I9A, A29A, I92, 30%V
Lcd/6ectangulo$I9A, A2, I92, A29$map$5alor, 0, 233, 0, BH%%%V
[
#adiremos la llamada a esta funcin en el pintado de la pantalla principal
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE PG)4# L# P#)4#LL# P6G):GP#L
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid PrintPant,ain$%
X
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
-3
Lcd/Linea$ 0, 3B, A27, 3B, A%V
Lcd/Linea$ H0, A0, H0, 3B, A%V
Lcd/Linea$ 0, A0, A27, A0, A%V
Lcd/?riteIC$Y#:(#6G* :Y, 2, 30%V EE #ncho, #lto, ,odo
Lcd/?riteIC$Y4#P#=16#:Y, 2, -0%V
Lcd/?riteIC$Y=1P*7G4*:Y, 2, B0%V
Lcd/?riteIC$YPH :Y, 2, 20%V
for$G@0V G U >V G99%
X
Lcd/6ectangulo$ H3, 30<$G]3%, A0-, -7<$G]3%%V
[
2augeIC$ =imeoA, A %V
2augeIC$ =imeo2, 2 %V
2augeIC$ =imeoB, B %V
6ePintar6ele$%V
[
C crearemos la funcin de control y de dimeo de nuestras luces
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE :*)46*L =1 L#7 L(:17
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid Luces$%
X
EE L(` )QA EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
if$6elo0/GsLater$ :J2/Lu"AHO*), :J2/Lu"A,O*) % WW 6elo0/GsPre&ious$ :J2/Lu"AHO*JJ,
:J2/Lu"A,O*JJ %%
X
EE #limentar el trasformador de la lu" si no esta encendido
if $digital6ead$PG)O=O61L1OL(:17%% 7et6ele$ 3, PG)O=O61L1OL(:17, HG2H %V
if $ =imeoA U =G,1*OL(`A %
X
=imeoA 9@ 2V
if $=imeoA S =G,1*OL(`A% =imeoA @ =G,1*OL(`AV
EE 7i se a re<iniciado el sistema
if$6elo0/GsLater$ :J2/Lu"AHO*), :J2/Lu"A,O*)9B0 % WW
6elo0/GsPre&ious$ :J2/Lu"AHO*JJ, :J2/Lu"A,O*JJ %% =imeoA @ =G,1*OL(`AV
analog?rite$ PG)OPOL(:17A, =imeoA %V
[
2augeIC$ =imeoA, A %V
[
if$ 6elo0/GsLater$ :J2/Lu"AHO*JJ, :J2/Lu"A,O*JJ % WW $=imeoA S 0% %
X
=imeoA <@ 2V
if $=imeoA U 0% =imeoA @ 0V
EE 7i se a re<iniciado el sistema
if $6elo0/GsLater$ :J2/Lu"AHO*JJ, :J2/Lu"A,O*JJ9B0 %% =imeoA @ 0V
analog?rite$ PG)OPOL(:17A, =imeoA %V
2augeIC$ =imeoA, A %V
[
EE L(` )Q2 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
-.
if$6elo0/GsLater$ :J2/Lu"2HO*), :J2/Lu"2,O*) % WW 6elo0/GsPre&ious$ :J2/Lu"2HO*JJ,
:J2/Lu"2,O*JJ %%
X
EE #limentar el trasformador de la lu" si no esta encendido
if $digital6ead$PG)O=O61L1OL(:17%% 7et6ele$ 3, PG)O=O61L1OL(:17, HG2H %V
if $ =imeo2 U =G,1*OL(`2 %
X
=imeo2 9@ 2V
if $=imeo2 S =G,1*OL(`2% =imeo2 @ =G,1*OL(`2V
EE 7i se a re<iniciado el sistema
if$6elo0/GsLater$ :J2/Lu"2HO*), :J2/Lu"2,O*)9B0 % WW
6elo0/GsPre&ious$ :J2/Lu"2HO*JJ, :J2/Lu"2,O*JJ %% =imeo2 @ =G,1*OL(`2V
analog?rite$ PG)OPOL(:172, =imeo2 %V
[
2augeIC$ =imeo2, 2 %V
[
if$ 6elo0/GsLater$ :J2/Lu"2HO*JJ, :J2/Lu"2,O*JJ % WW $=imeo2 S 0% %
X
=imeo2 <@ 2V
if $=imeo2 U 0% =imeo2 @ 0V
EE 7i se a re<iniciado el sistema
if $6elo0/GsLater$ :J2/Lu"2HO*JJ, :J2/Lu"2,O*JJ9B0 %% =imeo2 @ 0V
analog?rite$ PG)OPOL(:172, =imeo2 %V
2augeIC$ =imeo2, 2 %V
[
EE L(` )QB EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
if$6elo0/GsLater$ :J2/Lu"BHO*), :J2/Lu"B,O*) % WW 6elo0/GsPre&ious$ :J2/Lu"BHO*JJ,
:J2/Lu"B,O*JJ %%
X
EE #limentar el trasformador de la lu" si no esta encendido
if $digital6ead$PG)O=O61L1OL(:17%% 7et6ele$ 3, PG)O=O61L1OL(:17, HG2H %V
if $ =imeoB U =G,1*O)*:H1 %
X
=imeoB 9@ 2V
if $=imeoB S =G,1*O)*:H1% =imeoB @ =G,1*O)*:H1V
EE 7i se a rei<iniciado el sistema
if$6elo0/GsLater$ :J2/Lu"BHO*), :J2/Lu"B,O*)9B0 % WW
6elo0/GsPre&ious$ :J2/Lu"BHO*JJ, :J2/Lu"B,O*JJ %% =imeoB @ =G,1*O)*:H1V
analog?rite$ PG)OPOL(:17B, =imeoB %V
[
2augeIC$ =imeoB, B %V
[
if$ 6elo0/GsLater$ :J2/Lu"BHO*JJ, :J2/Lu"B,O*JJ % WW $=imeoB S 0% %
X
=imeoB <@ 2V
if $=imeoB U 0% =imeoB @ 0V
EE 7i se a rei<iniciado el sistema
if $6elo0/GsLater$ :J2/Lu"BHO*JJ, :J2/Lu"B,O*JJ9B0 %% =imeoB @ 0V
analog?rite$ PG)OPOL(:17B, =imeoB %V
EE #pagamos el transformador de la lu"
if $ =imeoB @@ 0 % 7et6ele$ 3, PG)O=O61L1OL(:17, L*? %V
2augeIC$ =imeoB, B %V
[
[
-7
C ya por ultimo ponemos la llamada a nuestra funcin de dimeo y control de nuestras luces en la funcin
loop$%/
&oid loop$%
X
if $ $millis$% < *ldO,illis% S 7000% EE 7 segundos
X
*ldO,illis @ millis$%V
Lcd/?riteIC$ 6elo0/=ate4ime$%, A0, .A %V
,irar4emperaturas$%V EE,iramos la temperaturas
Luces$%V
[
4eclado$%V
[
1n este punto tenemos que mirar bien como funciona todo esto, por una parte tenemos B &ariables globales
que en las cuales tenemos siempre el ni&el de dimeo de nuestras luces y por otra parte tenemos la funcin
Luces$% que comprueba las horas de configuracin de nuestras luces y dependiendo de esto &a dimeando
nuestras luces cada &e" que la llamamos/
:omo &emos en nuestra funcin loop$% la funcin Luces$% se llama cada 7 segundos, con lo cual llegada la
hora de encender las luces, cada 7 segundos que llamemos a la funcin Luces$% subiremos el dimeo de la
lu" 2 puntos de los 233 posibles, lo cual no da que desde el inicio de dimeo de una lu" hasta su dimeo total
$iluminacin a tope% pasaran apro;imadamente A3 minutos/
1n mi caso que tengo configurada las primera fase 0B:00 y la segunda fase a las 0B:20 me queda una
bonito amanecer de algo mas de media hora, lo mismo pasa la apagar las luces que se &an oscureciendo
gradualmente durante el mismo tiempo y que adem!s cuando empie"a el oscurecimiento de la segunda
fase, tambiDn empie"a el encendido gradual de la lu" de luna/
1spero haberme e;plicado bien, de todas formas lo que no comprend!is, preguntarlo/
)os queda toda&a por &er la programacin de los men's de configuracin de fechas, temperaturas y
horarios de luces/
1l cdigo modificado del controlador lo tenDis aqu/ )uestro:ontrolador00H/"ip
Pitos y alarmas
:omo ya &imos al principio del pos el controlador tiene montado un "umbador de esos pequeos, como
los que traen los ordenadores/
,as informacin
:omo &erDis este tipo de "umbador tiene 2 polos uno negati&o y otro positi&o y
su cone;in con el #rduino es muy simple ponemos el conector negati&o al
negati&o del #rduino y el positi&o a un pin digital del #rduino en este caso lo
pondremos al pin >/
1s tan simple que no creo que haga falta poner ni un esquema ni nada mas, solo el cdigo para mane0arlo/
->
=efinimos el pin donde tenemos conectado el "umbador/
Tdefine PG)O=OPG4* >
C creamos una funcin a la que llamaremos Pito$% y le pasaremos un par!metro que es la duracin del
pitido, cuanto mas largo sea el pitido mas fuerte lo oiremos ya que es un sonido en crescendo/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE 21)16# () PG4G=* =1 #5G7*
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid Pito$ int duracion %
X
tone$ PG)O=OPG4*, 20->, duracion %V
[
Gnternamente usaremos la funcin del #rduino tone$% la cual es una funcin que le tenemos que pasar el pin
donde lo tenemos conectado, la frecuencia a la que queremos que suene y la duracin/
Para que queremos un pito en nuestro controlador, pues os puedo asegurar que sin este, parece tonto el
controlador, porque por mucho que toquemos nunca nos dice nada, por eso le pondremos que genere un
pito largo cuando se reinicie para que nos enteremos que se esta reiniciando, y luego pondremos un pitido
corto cada &e" que le pidamos una orden y la realice, por e0emplo cuando le asignemos una configuracin
y la guarde/
:omo he dicho al principio tambiDn tenemos que
programar las alarmas y la alarma principal que tenemos
que controlar es la de los ni&eles, si no queremos que la
mu0er nos aporree con la fregona/
:omo ya di0imos en un post anterior el sensor de ni&el $la
boya% se comporta como si fuera un pulsador y lo tenemos
que conectar tambiDn como tal, con una resistencia de A0K
a masa y la otra punta al positi&o/
1l post en el que lo comente
Luego en nuestro cdigo ser! f!cil implementarlo como siempre primero definiremos el pin en el que esta
conectado/
Tdefine PG)O=O)G51L= .
C como siempre crearemos una funcin que se encargue de comprobar que el sensor de ni&el no se a
acti&ado, a la cual llamaremos ni&eles$%/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE :*,P6(18# 1L )G51L =1 #2(# =1L =1P*7G4*
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid ,irar)i&eles$%
-H
X
if $$digital6ead$PG)O=O)G51L=% @@ HG2H% WW $Z#larma)i&el%% EE La bolla esta acti&a y cierra
las electro&!l&ulas
X
7et6ele$ B, PG)O=O61L1O*7,*7G7, L*? %V
7et6ele$ 2, PG)O=O61L1OLL(5G#, L*? %V
Log1&ent$ ,72O)G51L, Y#cti&ada la alarma de ni&elY, YY, YY %V
,sgPie$ Y#larma de ni&el Y %V
#larma)i&el @ trueV
#larma$%V
[
[
:omo &erDis esta funcin comprueba nuestro sensor de ni&el y si &e que esta acti&ado desconecta los relDs
de entrada de agua como son los de smosis y de llu&ia, y adem!s saca un mensa0e en el pie de la pantalla
y llama a la funcin #larma para a&isarnos, esta funcin alarma que crearemos a continuacin
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE 21)16# PG4G=*7 =1 #L#6,#
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid #larma$%
X
int nV
for$ n@0V n U B0V n99%
X
Pito$>00%V
delay$A000%V
Pito$-00%V
[
delay$A0000%V
[
La cual utili"ando la funcin Pito$% nos generara un pitido repetiti&o para a&isarnos/
1sto tiene una pega, y es que si estar! constantemente sonando la alarma hasta que no &aciemos el ni&el
del agua que a echo saltar la alarma de ni&el/
Para e&itar esto pondremos una &ariable global que solemos llamar sem!foro, la cual nos de0ara llamar a la
funcin de comprobar ni&el, siempre y cuando no nos haya a&isado anteriormente de una alarma,
miraremos tambiDn que si no esta la alarma acti&a, pongamos esta &ariable a false/
=efinimos la &ariable
boolean #larma)i&el @ 8alseV
y luego de todo esto nuestro loop$% nos quedara as/
&oid loop$%
X
if $ $millis$% < *ldO,illis% S 7000% EE 7 segundos
X
*ldO,illis @ millis$%V
Lcd/?riteIC$ 6elo0/=ate4ime$%, A0, .A %V
if $$#larma)i&el% WW $Zdigital6ead$PG)O=O)G51L=%%% #larma)i&el @ 8alseV
30
,irar)i&eles$%V
,irar4emperaturas$%V EE,iramos la temperaturas
Luces$%V
[
4eclado$%V
[
8ueno ya tan solo nos queda las pantallas de configuracin que espero poder poner maana/
1l cdigo modificado del controlador lo tenDis aqu/ )uestro:ontrolador0A0/"ip
8ueno &amos a poner ahora el resto de las configuraciones, despuDs de mucho mirarlo, no &eo la forma de
e;plicarlo, sobre todo porque casi todo esta ya e;plicado en la funcin que esplique y puse, la funcin
4eclado$%/
Para la configuracin que nos falta pondremos una pantalla para cada tipo de configuracin y iremos
llamando a estas pantallas en la funcin 4eclado$% seg'n seleccionemos cada opcin/
La funcin 4eclado$% con todas las opciones ya programadas nos quedara asn/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE 41:L#=* P6G):GP#L C =1 :*)JG2(6#:G*)
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid 4eclado$%
X
int Gnde;V
boolean 7alir @ 8alseV
if $digital6ead$PG)O=OK1CO*K%%
X
Pito$A00%V
PrintPant:onfig$%V
Gnde; @ AV
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
delay$A000%V
Gnacti&idad @ millis$%V
Fhile$$Zdigital6ead$PG)O=OK1CO7#LG6%% WW $Z7alir%%
X
if $digital6ead$PG)O=OK1CO=16%%
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, -, 3H<$A0]Gnde;%%V
if $Gnde; @@ 3% Gnde; @ AV else 99Gnde;V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
delay$300%V
[
if $digital6ead$PG)O=OK1COG`R%%
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, -, 3H<$A0]Gnde;%%V
if $Gnde; @@ A% Gnde; @ 3V else <<Gnde;V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
delay$300%V
3A
[
if $digital6ead$PG)O=OK1CO*K%%
X
Gnacti&idad @ millis$%V
sFitch $Gnde;%
X
case A:
Pito$A00%V
Print:onf6elo0$%V
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case 2:
Pito$A00%V
Print:onf4emperatura$%V
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case B:
Pito$A00%V
Print:onfPH$%V
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case -:
Pito$A00%V
Print:onfLuces$%V
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
case 3:
Pito$A00%V
Print#cti&a6eles$%V
PrintPant:onfig$%V
Lcd/?riteIC$ YSY, -, 3H<$A0]Gnde;%%V
(rea+V
[
[
if $ 1nGnacti&idad$% %
X
Pito$B00%V
7alir @ trueV
[
[
PrintPant,ain$%V
[
[
32
y la programacin de las pantallas de configuracin/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE :*)JG2(6#:G*) 61L*c
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid Print:onf6elo0$%
X
int Gnde;, Gnde;:olV
int :ol^_ @ X2,3A[V
int month=ay, month, year, hour, minute, secondV
static char tmp^23_V
boolean 7alir @ 8alseV
6elo0/2et=ate4ime$ month=ay, month, year, hour, minute, second %V
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
Lcd/?riteIC$Y61L*cY, -0, .A%V
Lcd/Linea$ 0, 3B, A27, 3B, A %V
Lcd/?riteIC$Y=G#:Y, >, -H%V Lcd/?riteIC$YH*6# :Y, 3>, -H%V
Lcd/?riteIC$Y,17:Y, >, BH%V Lcd/?riteIC$Y,G)(4*7 :Y, 3>, BH%V
Lcd/?riteIC$Y#)*:Y, >, 2H%V Lcd/?riteIC$Y712()=*7:Y, 3>, 2H%V
Lcd/?riteIC$ YSY, 2, -H %V
Gnde; @ AV
Gnde;:ol @ 0V
sprintf$tmp, YL02dY, month=ay%V Lcd/?riteIC$tmp, B-, -H%V
sprintf$tmp, YL02dY, hour%V Lcd/?riteIC$tmp, AA2, -H%V
sprintf$tmp, YL02dY, month%V Lcd/?riteIC$tmp, B-, BH%V
sprintf$tmp, YL02dY, minute%V Lcd/?riteIC$tmp, AA2, BH%V
sprintf$tmp, YL02dY, year%V Lcd/?riteIC$tmp, B-, 2H%V
sprintf$tmp, YL02dY, second%V Lcd/?riteIC$tmp, AA2, 2H%V
Gnacti&idad @ millis$%V
Fhile$$Zdigital6ead$PG)O=OK1CO7#LG6%% WW $Z7alir%%
X
if $digital6ead$PG)O=OK1CO=16%% EE #delante
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, :ol^Gnde;:ol_, 3H<$A0]Gnde;% %V
if $Gnde; @@ B%
X
Gnde; @ AV
if $Gnde;:ol @@ A% Gnde;:ol @ 0V else Gnde;:ol @ AV
[
else 99Gnde;V
Lcd/?riteIC$ YSY, :ol^Gnde;:ol_, 3H<$A0]Gnde;% %V
delay$A000%V
[
if $digital6ead$PG)O=OK1COG`R%% EE #tras
X
Gnacti&idad @ millis$%V
3B
Lcd/?riteIC$ Y Y, :ol^Gnde;:ol_, 3H<$A0]Gnde;% %V
if $Gnde; @@ A%
X
Gnde; @ BV
if $Gnde;:ol @@ A% Gnde;:ol @ 0V else Gnde;:ol @ AV
[
else <<Gnde;V
Lcd/?riteIC$ YSY, :ol^Gnde;:ol_, 3H<$A0]Gnde;% %V
delay$A000%V
[
if $digital6ead$PG)O=OK1CO,#7%%
X
Gnacti&idad @ millis$%V
sFitch $Gnde;9$Gnde;:ol]A0%%
X
case A:
month=ay99 V
if $month=ay S BA% month=ay @ AV
sprintf$tmp, YL02dY, month=ay%V
Lcd/?riteIC$tmp, B-, -H%V
(rea+V
case 2:
month99 V
if $month S A2% month @ AV
sprintf$tmp, YL02dY, month%V
Lcd/?riteIC$tmp, B-, BH%V
(rea+V
case B:
year99 V
Lcd/?riteIC$tmp, B-, 2H%V
sprintf$tmp, YL02dY, year%V
(rea+V
case AA:
hour99 V
if $hour S 2-% hour @ AV
sprintf$tmp, YL02dY, hour%V
Lcd/?riteIC$tmp, AA2, -H%V
(rea+V
case A2:
minute99V
if $minute S 3H% minute @ 0V
sprintf$tmp, YL02dY, minute%V
Lcd/?riteIC$tmp, AA2, BH%V
(rea+V
case AB:
second99V
if $second S 3H% second @ 0V
sprintf$tmp, YL02dY, second%V
Lcd/?riteIC$tmp, AA2, 2H%V
(rea+V
[
[
if $digital6ead$PG)O=OK1CO,1)*7%%
X
3-
Gnacti&idad @ millis$%V
sFitch $Gnde;9$Gnde;:ol]A0%%
X
case A:
month=ay<<V
if $month=ay U A% month=ay @ BAV
sprintf$tmp, YL02dY, month=ay%V
Lcd/?riteIC$tmp, B-, -H%V
(rea+V
case 2:
month<<V
if $month U A% month @ A2V
sprintf$tmp, YL02dY, month%V
Lcd/?riteIC$tmp, B-, BH%V
(rea+V
case B:
year<< V
sprintf$tmp, YL02dY, year%V
Lcd/?riteIC$tmp, B-, 2H%V
(rea+V
case AA:
hour<< V
if $hour U 0% hour @ 2-V
sprintf$tmp, YL02dY, hour%V
Lcd/?riteIC$tmp, AA2, -H%V
(rea+V
case A2:
minute<<V
if $minute U 0% minute @ 3HV
sprintf$tmp, YL02dY, minute%V
Lcd/?riteIC$tmp, AA2, BH%V
(rea+V
case AB:
second<<V
if $second U 0% second @ 3HV
sprintf$tmp, YL02dY, second%V
Lcd/?riteIC$tmp, AA2, 2H%V
(rea+V
[
[
if $digital6ead$PG)O=OK1CO*K%%
X
6elo0/7et=ate4ime$ month=ay, month, year, hour, minute, second %V
Pito$A00%V
7alir @ trueV
[
Lcd/?riteIC$ 6elo0/=ate$%, A0, A0%V
Lcd/?riteIC$ 6elo0/4ime$%, 70, A0%V
if $ 1nGnacti&idad$% %
X
Pito$B00%V
7alir @ trueV
[
[
33
[
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE :*)JG2(6#:G*) 41,P16#4(6#
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid Print:onf4emperatura$%
X
int Gnde;V
float 4empA, 4emp2, 4empBV
boolean 7alir @ 8alseV
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
Lcd/?riteIC$Y41,P16#4(6#Y, 23, .A%V
Lcd/Linea$ 0, 3B, A27, 3B, A %V
Lcd/?riteIC$Y#:(#6G* :Y, >, -H%V
Lcd/?riteIC$Y4#P# :Y, >, BH%V
Lcd/?riteIC$Y=1P*7G4*:Y, >, 2H%V
Lcd/?riteIC$ YSY, 2, -H %V
Gnde; @ AV
4empA @ :J2/4ermo#cuarioV
4emp2 @ :J2/4ermo4apaV
4empB @ :J2/4ermo=epositoV
Lcd/?riteIC$4empA, .3, -H, A%V
Lcd/?riteIC$4emp2, .3, BH, A%V
Lcd/?riteIC$4empB, .3, 2H, A%V
Gnacti&idad @ millis$%V
Fhile$$Zdigital6ead$PG)O=OK1CO7#LG6%% WW $Z7alir%%
X
if $digital6ead$PG)O=OK1CO=16%% EE #delante
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, 2, 3H<$A0]Gnde;% %V
if $Gnde; @@ B%
X
Gnde; @ AV
[
else 99Gnde;V
Lcd/?riteIC$ YSY, 2, 3H<$A0]Gnde;% %V
delay$A000%V
[
if $digital6ead$PG)O=OK1COG`R%% EE #tras
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, 2, 3H<$A0]Gnde;% %V
if $Gnde; @@ A%
X
Gnde; @ BV
[
3.
else <<G nde;V
Lcd/?riteIC$ YSY, 2, 3H<$A0]Gnde;% %V
delay$A000%V
[
if $digital6ead$PG)O=OK1CO,#7%%
X
Gnacti&idad @ millis$%V
sFitch $Gnde;%
X
case A:
4empA 9@ 0/3V
Lcd/?riteIC$4empA, .3, -H, A%V
(rea+V
case 2:
4emp2 9@ 0/3V
Lcd/?riteIC$4emp2, .3, BH, A%V
(rea+V
case B:
4empB 9@ 0/3V
Lcd/?riteIC$4empB, .3, 2H, A%V
(rea+V
[
[
if $digital6ead$PG)O=OK1CO,1)*7%%
X
Gnacti&idad @ millis$%V
sFitch $Gnde;%
X
case A:
4empA <@ 0/3V
Lcd/?riteIC$4empA, .3, -H, A%V
(rea+V
case 2:
4emp2 <@ 0/3V
Lcd/?riteIC$4emp2, .3, BH, A%V
(rea+V
case B:
4empB <@ 0/3V
Lcd/?riteIC$4empB, .3, 2H, A%V
(rea+V
[
[
if $digital6ead$PG)O=OK1CO*K%%
X
sensors/setHigh#larm4emp$ #gua4ermo, 4empA 9 ,#621)O41,P16#4(6# %V
sensors/setLoF#larm4emp$ #gua4ermo, 4empA < ,#621)O41,P16#4(6# %V
sensors/setHigh#larm4emp$ =epo4ermo, 4empB 9 ,#621)O41,P16#4(6# %V
sensors/setLoF#larm4emp$ =epo4ermo, 4empB < ,#621)O41,P16#4(6# %V
sensors/setHigh#larm4emp$ 4apa4ermo, 4emp2 %V
sensors/setLoF#larm4emp$ 4apa4ermo, 4emp2 %V
:J2/4ermo#cuario @ 4empAV
:J2/4ermo4apa @ 4emp2V
:J2/4ermo=eposito @ 4empBV
7et:onfig$%V
37
Pito$A00%V
7alir @ trueV
[
if $ 1nGnacti&idad$% %
X
Pito$B00%V
7alir @ trueV
[
[
[
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE :*)JG2(6#:G*) =1L PH
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid Print:onfPH$%
X
boolean 7alir @ 8alseV
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
Lcd/?riteIC$YPHY, .0, .A%V
Lcd/Linea$ 0, 3B, A27, 3B, A %V
Lcd/?riteIC$YPH :Y, >, BH%V
Lcd/?riteIC$:J2/PH, 33, BH, A%V
Gnacti&idad @ millis$%V
Fhile$$Zdigital6ead$PG)O=OK1CO7#LG6%% WW $Z7alir%%
X
if $digital6ead$PG)O=OK1CO,#7%%
X
Gnacti&idad @ millis$%V
:J2/PH 9@ 0/A V
Lcd/?riteIC$:J2/PH, 33, BH, A%V
[
if $digital6ead$PG)O=OK1CO,1)*7%%
X
Gnacti&idad @ millis$%V
:J2/PH <@ 0/A V
Lcd/?riteIC$:J2/PH, 33, BH, A%V
[
if $digital6ead$PG)O=OK1CO*K%%
X
7et:onfig$%V
Pito$A00%V
7alir @ trueV
[
if $ 1nGnacti&idad$% %
X
Pito$B00%V
7alir @ trueV
[
[
3>
[
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE :*)JG2(6#:G*) =1 L*7 H*6#6G*7 =1 L#7 L(:17
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid Print:onfLuces$%
X
int Gnde;Line, Gnde;:olV
int Line^_ @ XBH,22,3[V
int :ol^_ @ X-2,3H,H0,A07[V
int ,arcaLine^_ @ X-A,2-,7[V
static char tmp^23_V
boolean 7alir @ 8alseV
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
Lcd/?riteIC$YL(:17Y, 30, .A%V
Lcd/Linea$ 0, 3B, A27, 3B, A %V
Lcd/?riteIC$YJ#71A:Y, B, -H%V Lcd/?riteIC$Y:Y, 3B, -H%V Lcd/?riteIC$YaY, 77, -H%V
Lcd/?riteIC$Y:Y, A0A, -H%V
Lcd/?riteIC$YJ#712:Y, B, B2%V Lcd/?riteIC$Y:Y, 3B, B2%V Lcd/?riteIC$YaY, 77, B2%V
Lcd/?riteIC$Y:Y, A0A, B2%V
Lcd/?riteIC$YL()# :Y, B, A3%V Lcd/?riteIC$Y:Y, 3B, A3%V Lcd/?riteIC$YaY, 77, A3%V
Lcd/?riteIC$Y:Y, A0A, A3%V
Gnde;Line @ 0V
Gnde;:ol @ 0V
sprintf$tmp, YL02dY, :J2/Lu"AHO*)%V Lcd/?riteIC$tmp, -2, -H%V sprintf$tmp, YL02dY,
:J2/Lu"A,O*)%V Lcd/?riteIC$tmp, 3H, -H%V
sprintf$tmp, YL02dY, :J2/Lu"2HO*)%V Lcd/?riteIC$tmp, -2, B2%V sprintf$tmp, YL02dY,
:J2/Lu"2,O*)%V Lcd/?riteIC$tmp, 3H, B2%V
sprintf$tmp, YL02dY, :J2/Lu"BHO*)%V Lcd/?riteIC$tmp, -2, A3%V sprintf$tmp, YL02dY,
:J2/Lu"B,O*)%V Lcd/?riteIC$tmp, 3H, A3%V
sprintf$tmp, YL02dY, :J2/Lu"AHO*JJ%V Lcd/?riteIC$tmp, H0, -H%V sprintf$tmp, YL02dY,
:J2/Lu"A,O*JJ%V Lcd/?riteIC$tmp, A07, -H%V
sprintf$tmp, YL02dY, :J2/Lu"2HO*JJ%V Lcd/?riteIC$tmp, H0, B2%V sprintf$tmp, YL02dY,
:J2/Lu"2,O*JJ%V Lcd/?riteIC$tmp, A07, B2%V
sprintf$tmp, YL02dY, :J2/Lu"BHO*JJ%V Lcd/?riteIC$tmp, H0, A3%V sprintf$tmp, YL02dY,
:J2/Lu"B,O*JJ%V Lcd/?riteIC$tmp, A07, A3%V
Lcd/?riteIC$YddY, -2, -A%V
Gnacti&idad @ millis$%V
Fhile$$Zdigital6ead$PG)O=OK1CO7#LG6%% WW $Z7alir%%
X
if $digital6ead$PG)O=OK1CO=16%% EE #delante
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, :ol^Gnde;:ol_, ,arcaLine^Gnde;Line_ %V
if $Gnde;:ol @@ B%
X
Gnde;:ol @ 0V
3H
if $Gnde;Line @@ 2% Gnde;Line @ 0V else Gnde;Line99V
[
else 99Gnde;:olV
Lcd/?riteIC$ YddY, :ol^Gnde;:ol_, ,arcaLine^Gnde;Line_ %V
delay$A00%V
[
if $digital6ead$PG)O=OK1COG`R%% EE #tras
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, :ol^Gnde;:ol_, ,arcaLine^Gnde;Line_ %V
if $Gnde;:ol @@ 0%
X
Gnde;:ol @ BV
if $Gnde;Line @@ 0% Gnde;Line @ 2V else Gnde;Line<<V
[
else <<Gnde;:olV
Lcd/?riteIC$ YddY, :ol^Gnde;:ol_, ,arcaLine^Gnde;Line_ %V
delay$A00%V
[
if $digital6ead$PG)O=OK1CO,#7%%
X
Gnacti&idad @ millis$%V
sFitch $Gnde;Line9$Gnde;:ol]A0%%
X
case 0:
:J2/Lu"AHO*)99 V
if $:J2/Lu"AHO*) S 2-% :J2/Lu"AHO*) @ 0V
sprintf$tmp, YL02dY, :J2/Lu"AHO*)%V
Lcd/?riteIC$tmp, -2, -H%V
(rea+V
case A0:
:J2/Lu"A,O*)99 V
if $:J2/Lu"A,O*) S 3H% :J2/Lu"A,O*) @ 0V
sprintf$tmp, YL02dY, :J2/Lu"A,O*)%V
Lcd/?riteIC$tmp, 3H, -H%V
(rea+V
case 20:
:J2/Lu"AHO*JJ99 V
if $:J2/Lu"AHO*JJ S 2>% :J2/Lu"AHO*JJ @ 0V
sprintf$tmp, YL02dY, :J2/Lu"AHO*JJ%V
Lcd/?riteIC$tmp, H0, -H%V
(rea+V
case B0:
:J2/Lu"A,O*JJ99 V
if $:J2/Lu"A,O*JJ S 3H% :J2/Lu"A,O*JJ @ 0V
sprintf$tmp, YL02dY, :J2/Lu"A,O*JJ%V
Lcd/?riteIC$tmp, A07, -H%V
(rea+V
case A:
:J2/Lu"2HO*)99 V
if $:J2/Lu"2HO*) S 2-% :J2/Lu"2HO*) @ 0V
sprintf$tmp, YL02dY, :J2/Lu"2HO*)%V
Lcd/?riteIC$tmp, -2, B2%V
.0
(rea+V
case AA:
:J2/Lu"2,O*)99 V
if $:J2/Lu"2,O*) S 3H% :J2/Lu"2,O*) @ 0V
sprintf$tmp, YL02dY, :J2/Lu"2,O*)%V
Lcd/?riteIC$tmp, 3H, B2%V
(rea+V
case 2A:
:J2/Lu"2HO*JJ99 V
if $:J2/Lu"2HO*JJ S 2>% :J2/Lu"2HO*JJ @ 0V
sprintf$tmp, YL02dY, :J2/Lu"2HO*JJ%V
Lcd/?riteIC$tmp, H0, B2%V
(rea+V
case BA:
:J2/Lu"2,O*JJ99 V
if $:J2/Lu"2,O*JJ S 3H% :J2/Lu"2,O*JJ @ 0V
sprintf$tmp, YL02dY, :J2/Lu"2,O*JJ%V
Lcd/?riteIC$tmp, A07, B2%V
(rea+V
case 2:
:J2/Lu"BHO*)99 V
if $:J2/Lu"BHO*) S 2-% :J2/Lu"BHO*) @ 0V
sprintf$tmp, YL02dY, :J2/Lu"BHO*)%V
Lcd/?riteIC$tmp, -2, A3%V
(rea+V
case A2:
:J2/Lu"B,O*)99 V
if $:J2/Lu"B,O*) S 3H% :J2/Lu"B,O*) @ 0V
sprintf$tmp, YL02dY, :J2/Lu"B,O*)%V
Lcd/?riteIC$tmp, 3H, A3%V
(rea+V
case 22:
:J2/Lu"BHO*JJ99 V
if $:J2/Lu"BHO*JJ S 2>% :J2/Lu"BHO*JJ @ 0V
sprintf$tmp, YL02dY, :J2/Lu"BHO*JJ%V
Lcd/?riteIC$tmp, H0, A3%V
(rea+V
case B2:
:J2/Lu"B,O*JJ99 V
if $:J2/Lu"B,O*JJ S 3H% :J2/Lu"B,O*JJ @ 0V
sprintf$tmp, YL02dY, :J2/Lu"B,O*JJ%V
Lcd/?riteIC$tmp, A07, A3%V
(rea+V
[
[
if $digital6ead$PG)O=OK1CO,1)*7%%
X
Gnacti&idad @ millis$%V
sFitch $Gnde;Line9$Gnde;:ol]A0%%
X
case 0:
:J2/Lu"AHO*)<< V
if $:J2/Lu"AHO*) U 0% :J2/Lu"AHO*) @ 2-V
sprintf$tmp, YL02dY, :J2/Lu"AHO*)%V
.A
Lcd/?riteIC$tmp, -2, -H%V
(rea+V
case A0:
:J2/Lu"A,O*)<< V
if $:J2/Lu"A,O*) U 0% :J2/Lu"A,O*) @ 3HV
sprintf$tmp, YL02dY, :J2/Lu"A,O*)%V
Lcd/?riteIC$tmp, 3H, -H%V
(rea+V
case 20:
:J2/Lu"AHO*JJ<< V
if $:J2/Lu"AHO*JJ U 0% :J2/Lu"AHO*JJ @ 2>V
sprintf$tmp, YL02dY, :J2/Lu"AHO*JJ%V
Lcd/?riteIC$tmp, H0, -H%V
(rea+V
case B0:
:J2/Lu"A,O*JJ<< V
if $:J2/Lu"A,O*JJ U 0% :J2/Lu"A,O*JJ @ 3HV
sprintf$tmp, YL02dY, :J2/Lu"A,O*JJ%V
Lcd/?riteIC$tmp, A07, -H%V
(rea+V
case A:
:J2/Lu"2HO*)<< V
if $:J2/Lu"2HO*) U 0% :J2/Lu"2HO*) @ 2-V
sprintf$tmp, YL02dY, :J2/Lu"2HO*)%V
Lcd/?riteIC$tmp, -2, B2%V
(rea+V
case AA:
:J2/Lu"2,O*)<< V
if $:J2/Lu"2,O*) U 0% :J2/Lu"2,O*) @ 3HV
sprintf$tmp, YL02dY, :J2/Lu"2,O*)%V
Lcd/?riteIC$tmp, 3H, B2%V
(rea+V
case 2A:
:J2/Lu"2HO*JJ<< V
if $:J2/Lu"2HO*JJ U 0% :J2/Lu"2HO*JJ @ 2>V
sprintf$tmp, YL02dY, :J2/Lu"2HO*JJ%V
Lcd/?riteIC$tmp, H0, B2%V
(rea+V
case BA:
:J2/Lu"2,O*JJ<< V
if $:J2/Lu"2,O*JJ U 0% :J2/Lu"2,O*JJ @ 3HV
sprintf$tmp, YL02dY, :J2/Lu"2,O*JJ%V
Lcd/?riteIC$tmp, A07, B2%V
(rea+V
case 2:
:J2/Lu"BHO*)<< V
if $:J2/Lu"BHO*) U 0% :J2/Lu"BHO*) @ 2-V
sprintf$tmp, YL02dY, :J2/Lu"BHO*)%V
Lcd/?riteIC$tmp, -2, A3%V
(rea+V
case A2:
:J2/Lu"B,O*)<< V
if $:J2/Lu"B,O*) U 0% :J2/Lu"B,O*) @ 3HV
sprintf$tmp, YL02dY, :J2/Lu"B,O*)%V
.2
Lcd/?riteIC$tmp, 3H, A3%V
(rea+V
case 22:
:J2/Lu"BHO*JJ<< V
if $:J2/Lu"BHO*JJ U 0% :J2/Lu"BHO*JJ @ 2>V
sprintf$tmp, YL02dY, :J2/Lu"BHO*JJ%V
Lcd/?riteIC$tmp, H0, A3%V
(rea+V
case B2:
:J2/Lu"B,O*JJ<< V
if $:J2/Lu"B,O*JJ U 0% :J2/Lu"B,O*JJ @ 3HV
sprintf$tmp, YL02dY, :J2/Lu"B,O*JJ%V
Lcd/?riteIC$tmp, A07, A3%V
(rea+V
[
[
if $digital6ead$PG)O=OK1CO*K%%
X
7et:onfig$%V
Pito$A00%V
7alir @ trueV
[
if $ 1nGnacti&idad$% %
X
Pito$B00%V
7alir @ trueV
[
[
[
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE P#)4#LL#7 =1 #:4G5#:G*) =1 61L17
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid Print#cti&a6eles$%
X
int Gnde;, Gnde;:olV
int :ol^_ @ X2,.A[V
static char tmp^23_V
boolean 7alir @ 8alseV
Lcd/:ls$%V
Lcd/6ectangulo$0, 0, A27, .B%V
Lcd/?riteIC$Y61L17Y, 30, .A%V
Lcd/Linea$ 0, 3B, A27, 3B, A %V
Lcd/?riteIC$Y:#LA:Y, >, -H%V Lcd/?riteIC$Y:*2 :Y, .>, -H%V
Lcd/?riteIC$Y:#L2:Y, >, BH%V Lcd/?riteIC$Y*7,*:Y, .>, BH%V
Lcd/?riteIC$Y1I46:Y, >, 2H%V Lcd/?riteIC$YLL(5:Y, .>, 2H%V
Lcd/?riteIC$YL(` :Y, >, AH%V Lcd/?riteIC$YLL1):Y, .>, AH%V
Lcd/?riteIC$YJ#7A:Y, >, H%V Lcd/?riteIC$YJ#72:Y, .>, H%V
Lcd/?riteIC$ YSY, 2, -H %V
Gnde; @ AV
.B
Gnde;:ol @ 0V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O:#L1)4#=*6%%, -2, -H%V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O:#L1)4=1P*%%, -2, BH%V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O1I46#4*617%%, -2, 2H%V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1OL(:17%%, -2, AH%V
Lcd/?riteIC$*JJ*)$ZGsLu"A%, -2, H%V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O:*2%%, A02, -H%V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O*7,*7G7%%, A02, BH%V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1OLL(5G#%%, A02, 2H%V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1OLL1)#=*%%, A02, AH%V
Lcd/?riteIC$*JJ*)$ZGsLu"2%, A02, H%V
Gnacti&idad @ millis$%V
Fhile$$Zdigital6ead$PG)O=OK1CO7#LG6%% WW $Z7alir%%
X
if $digital6ead$PG)O=OK1CO=16%% EE #delante
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, :ol^Gnde;:ol_, 3H<$A0]Gnde;% %V
if $Gnde; @@ 3%
X
Gnde; @ AV
if $Gnde;:ol @@ A% Gnde;:ol @ 0V else Gnde;:ol @ AV
[
else 99Gnde;V
Lcd/?riteIC$ YSY, :ol^Gnde;:ol_, 3H<$A0]Gnde;% %V
delay$A000%V
[
if $digital6ead$PG)O=OK1COG`R%% EE #tras
X
Gnacti&idad @ millis$%V
Lcd/?riteIC$ Y Y, :ol^Gnde;:ol_, 3H<$A0]Gnde;% %V
if $Gnde; @@ A%
X
Gnde; @ 3V
if $Gnde;:ol @@ A% Gnde;:ol @ 0V else Gnde;:ol @ AV
[
else <<Gnde;V
Lcd/?riteIC$ YSY, :ol^Gnde;:ol_, 3H<$A0]Gnde;% %V
delay$A000%V
[
if $digital6ead$PG)O=OK1CO*K%%
X
delay$30%V
sFitch $Gnde;9$Gnde;:ol]A0%%
X
case A:
7et6ele$ >, PG)O=O61L1O:#L1)4#=*6, digital6ead$PG)O=O61L1O:#L1)4#=*6% %V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O:#L1)4#=*6%%, -2, -H%V
(rea+V
case 2:
7et6ele$ 7, PG)O=O61L1O:#L1)4=1P*, digital6ead$PG)O=O61L1O:#L1)4=1P*% %V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O:#L1)4=1P*%%, -2, BH%V
.-
(rea+V
case B:
7et6ele$ ., PG)O=O61L1O1I46#4*617, digital6ead$PG)O=O61L1O1I46#4*617% %V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O1I46#4*617%%, -2, 2H%V
(rea+V
case -:
7et6ele$ 3, PG)O=O61L1OL(:17, digital6ead$PG)O=O61L1OL(:17% %V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1OL(:17%%, -2, AH%V
(rea+V
case 3:
if $GsLu"A%
Xanalog?rite$ PG)OPOL(:17A, 0 %V GsLu"A @ 8alseV[
else
Xanalog?rite$ PG)OPOL(:17A, 233 %V GsLu"A @ trueV[
Lcd/?riteIC$*JJ*)$ZGsLu"A%, -2, H%V
(rea+V
case AA:
7et6ele$ -, PG)O=O61L1O:*2, digital6ead$PG)O=O61L1O:*2% %V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O:*2%%, A02, -H%V
(rea+V
case A2:
7et6ele$ B, PG)O=O61L1O*7,*7G7, digital6ead$PG)O=O61L1O*7,*7G7% %V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1O*7,*7G7%%, A02, BH%V
(rea+V
case AB:
7et6ele$ 2, PG)O=O61L1OLL(5G#, digital6ead$PG)O=O61L1OLL(5G#% %V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1OLL(5G#%%, A02, 2H%V
(rea+V
case A-:
7et6ele$ A, PG)O=O61L1OLL1)#=*, digital6ead$PG)O=O61L1OLL1)#=*% %V
Lcd/?riteIC$*JJ*)$digital6ead$PG)O=O61L1OLL1)#=*%%, A02, AH%V
(rea+V
case A3:
if $GsLu"2%
Xanalog?rite$ PG)OPOL(:172, 0 %V GsLu"2 @ 8alseV[
else
Xanalog?rite$ PG)OPOL(:172, 233 %V GsLu"2 @ trueV[
Lcd/?riteIC$*JJ*)$ZGsLu"2%, A02, H%V
(rea+V
[
[
if $ 1nGnacti&idad$% %
X
Pito$B00%V
7alir @ trueV
[
[
[
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE =15(1L51 *) o *JJ
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
.3
char ] *JJ*)$ int 5alor %
X
if $5alor @@ L*?%
Xreturn Y*) YV[
else
Xreturn Y*JJYV[
[
Hay que tener en cuenta que el horario de las luces, tiene su propio sistema de codificacin, a causa de que
muchos de nosotros tendremos configuradas las luces hasta una hora superior a las 2-:00, por e0emplo
hasta la 0A:00 o mas tarde y esto dara error al comparar si es mas tarde o mas temprano de la hora fi0ada/
las horas de apagado superiores a las 2-:00 las pasaremos sum!ndolas osea
7i es a las 0A:00 pondremos a las 23:00
7i es a las 0A:B0 pondremos a las 23:B0
7i es a las 02:00 pondremos a las 2.:00
y asn el resto de los &alores, pero recordar, solo para configurar el apagado/
Lo que no compredais preguntarlo/
1l cdigo modificado del controlador lo tenDis aqu/ )uestro:ontrolador0AA/"ip
Leer el P
5amos a &er ahora un tema que se me haba ol&idado, nuestro sensor de PH, como ya &imos en el post
TA., podemos utili"ar un pequeo sensor que conect!ndole la sonda PH tendremos el control del PH de
nuestro acuario, hay adem!s de esta sonda otras de distinto tipo, me0ores y peores, seg'n el gusto o la
dificultad de cada uno, yo me decid por la que describo porque en su momento me pareci la mas fiable
y f!cil, pero para el que quiera otras opciones os pongo algunos enlaces/
http:EEFFF/phidgets/comEproducts/phpaproductOid@AAB0
http:EEcode/google/comEpEphduinoE
http:EEFFF/ebay/comEitmE#rduino<pH<///d<EAA0>AB.2332.
http:EEFFF/ebay/comEitmE#rduino<pH<///d<EAA0>AB.2332.
8ueno empecemos, la programacin de nuestro sensor, para ello empe"aremos declarando el margen que
estamos dispuestos que &ariD nuestro PH
Tdefine ,#621)OPH 0/A
Luego definiremos una &ariable global para el PH
float pHV
y luego escribimos una funcin que nos lea el PH, lo pinte en pantalla y controle si hay que acti&ar el :*2
o lo que deseemos seg'n el &alor del PH, en esta estamos controlando el relD de la &!l&ula del :*2/
1ste tipo de sensor se comunica con el #rduino a tra&Ds de un puerto serie, por lo que en la funcin
deberemos tener en cuenta por que puerto serie lo tenemos conectado, adem!s este sensor solo da lo que se
le pide, o lo que es lo mismo para que nos mande el &alor del PH por el puerto serie tenemos primero que
pedrselo con una orden mandada por el mismo puerto serie, en este caso la orden es mandarle el &alor de
la temperatura actual del agua ya que es un &alor que le hace falta para la escala del PH/
1n la funcin el puerto definido para la sonda es el 7erialB/
..
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE J():G*) =1 L1:4(6# =1L PH
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
float LeerPH$&oid%
X
int clOi, iV EE :ontador
float 4emV
char stampOdata^A3_V
char ] strtmp @ Y YV
pH @ 0V
4em @ sensors/get4emp:$#gua4ermo%V EE La temperatura en celcius para el agua
strtmp @ dtostrf$ 4em, -, 2, strtmp %V
7erialB/print$strtmp%V EE Le mando la temperatura
7erialB/print$e;re%V
delay$H00%V
for $int ;V ; U A3V ;99 %
X
stampOdata^0_ @ 0V
[
clOi @ 0V
Fhile$7erialB/a&ailable$%%
X
stampOdata^clOi_ @ 7erialB/read$%V
clOi99V
[
stampOdata^clOi_@e;*eV
if $stampOdata Z@ YY%
X
pH @ atof$ stampOdata %V EE :ombertimos la cadena de te;to a float/
if $$pH S A/0% WW $pH U A0/0%% EE 7i es un float &alido
X
Lcd/?riteIC$ pH, .B, 20, 2 %V
[
else
X
Lcd/?riteIC$ Y,#L Y, .B, 20 %V
[
[
if $$pH U $:J2/PH < ,#621)OPH%% WW $Zdigital6ead$PG)O=O61L1O:*2%%%
X
7et6ele$ -, PG)O=O61L1O:*2, L*? %V
[
if $$pH S $:J2/PH 9 ,#621)OPH%% WW digital6ead$PG)O=O61L1O:*2%%
X
7et6ele$ -, PG)O=O61L1O:*2, HG2H %V
[
.7
return pHV
[
Luego tan solo nos queda incluir la llamada a nuestra funcin en el loop$%
&oid loop$%
X
if $ $millis$% < *ldO,illis% S 7000% EE 7 segundos
X
*ldO,illis @ millis$%V
Lcd/?riteIC$ 6elo0/=ate4ime$%, A0, .A %V
if $$#larma)i&el% WW $Zdigital6ead$PG)O=O)G51L=%%% #larma)i&el @ 8alseV
,irar)i&eles$%V
,irar4emperaturas$%V EE,iramos la temperaturas
LeerPH$%V
Luces$%V
if $ZGniciado%
X
GsLu"A @ $=imeoA S 0%V GsLu"2 @ $=imeo2 S 0%V GsLu"B @ $=imeoB S 0%V Gniciado @ trueV
[
[
4eclado$%V
[
:on esto tendremos nuestro sensor de PH funcionando, pero nos falta una cosa muy importante
M:alibrarloN como todos los sensores de PH, para ello nos hace falta un par de botes de tapn de PH- y
PH7, podemos usar tambiDn uno de PHA0/
1l sistema es simple y f!cil, meteremos la sonda de PH primero en el bote de tapn de PH- teniendo en
cuenta que tiene que estar a 23 grados de temperatura, para lo cual ayuda meter tambiDn en el bote una de
las sondas de temperatura/
=espuDs de esto tan solo tenemos que mandarle la orden de a0uste de PH- por el puerto serie del sensor, la
orden en este caso es MJN, para el PH7 M7N y para el PH M4N/
#l mandarle la orden el sensor se autocalibrara al PH dado, y con esto ya tendremos calibrado y
funcionando nuestro sensor de PH/
Lo malo es que en todo esto falla una cosa, Mcomo mandamos la orden por el puerto del sensorN,
podramos hacer un pequeo cdigo que al pulsar un botn se mandara, pero seria complicado y muy lioso
de configurar, por lo que haremos otra cosa, le daremos capacidad a nuestro #rduino para recibir ordenes
desde nuestro P:, comoa Pues desde el monitor del puerto serie del G=1 del #rduino/
:uando tenemos conectado nuestro #rduino al P: con el cable de (78, abrimos el G=1 y le damos al
icono del monitor, con esto se nos abrir! una &entana como un editor de te;to el la cual nos saldr! todas las
ordenes de salida del #rduino al puerto serie por defecto el 0/
Por e0emplo si ponemos en el cdigo de nuestro #rduino la orden 7erial/println$fHolag%V nos saldr! MHolaN
en la &entana del monitor y si lo que queremos es mandarle algo al #rduino en la parte de arriba hay una
lnea de edicin con un botn que pone mandar, para mandar algo al #rduino tan solo tenemos que
escribirlo en esa lnea y darle al botn/
:laro que para todo esto nuestro #rduino tiene que tener programado un cdigo que reciba estas ordenes y
las entienda, conque &amos a programar el cdigo para ello/
Lo primero que nos hace falta es un cdigo que se encargue de recoger los caracteres recibidos desde el P:
y nos lo de&uel&a sea una orden completa, para ello en &e" de escribir ning'n cdigo, usaremos uno ya
escrito y que esta muy bien reali"ado, el cdigo es cogido del foro en inglDs del #rduino, y cuando lo & me
encant como estaba hecho, por lo que lo utilicD, sin quitar la referencia al autor claro, que aunque no se su
.>
nombre, si esta referenciado el mensa0e de donde se cogi en su cabecera/
La utili"acin de este cdigo es simple, lo declararemos como si fuera una librera en el inicio de nuestro
cdigo y a partir de este momento tendremos disponible, &arias &ariables con los datos de las ordenes
recibidas desde el P:/
c5ar cmd<line < :adena de te;to con todas las palabras del comandos
c5ar cmd<str < Primera palabra de la lnea de comandos
c5ar cmd<parm<str < #rray con el resto de las palabras del comandos
int cmd<n<parms h )umero de par!metros recibidos
c5ar cmd<parm < Hasta seis par!metros, de doce caracteres cada una, separadas por comas o espacios/
7u mane0o es muy simple, tan solo tendremos que llamar a la funcin processOcommandOline$% la cual nos
de&ol&er! A si a recibido alg'n comando y 0 si no a recibido nada, si nos de&uel&e A tendremos las
&ariables antes descritas rellenas con los datos del comando/
# continuacin haremos la funcin nuestra que comprobara si recibimos los comandos que definamos, a la
que llamaremos 2etOcmd$% y que llamaremos desde la funcin loop$% para comprobar si recibimos algo/
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EE
EE :*,#)=*7 61:G8G=*7 =17=1 1L P:
EE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
&oid 2etOcmd$&oid%
X
float fV
int rV
int Gnde;6ele^_ @ X0,2>,B2,B0,B-,B.,B>,-0,-2[V
if $processOcommandOline$% @@ A%
X
EE :,=
if $strcmp$cmdOstr, YcmdY% @@ 0%
X
if $strcmp$cmdOstr, YhelpY% @@ 0%
X
7erial/println$Y:*,#)=*7 =G7P*)G8L17:Y%V
7erial/println$Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@Y%V
7erial/println$Ycmd dimeo ^AE2E4_ X&alor[ EE7e asigna el X&alor[ de dimeo a ^faseAEfase2Elas dos
faces_Y%V
7erial/println$Ycmd setrele Xinde;[ ^onEoff_ EE7e ^acti&aEdesacti&a_ el relD Xinde;[Y%V
7erial/println$Ycmd getrele Xinde;[ EE7e obtiene el estado del relD Xinde;[ retornando ^onEoff_Y%V
7erial/println$Ycmd ph X&alor[ EE7e manda una orden al sensor de PHY%V
7erial/println$Ycmd setph X&alor[ EE7e asigna el X&alor[ al control de PHY%V
7erial/println$Ycmd reset EE 6esetea el #rduinoY%V
7erial/println$YY%V
[
EE #7G2)# 5#L*6 =1 =G,1#=*
if $strcmp$cmdOparm^0_, YdimeoY% @@ 0%
X
if $strcmp$cmdOparm^A_, YAY% @@ 0%
X
r @ $int%atoi$cmdOparm^2_%V
.H
if $$r S@ 0% WW $r U@ 233%%
X
=imeoA @ rV
analog?rite$ PG)OPOL(:17A, =imeoA %V
Pito$-0%V
[
[
if $strcmp$cmdOparm^A_, Y2Y% @@ 0%
X
r @ $int%atoi$cmdOparm^2_%V
if $$r S@ 0% WW $r U@ 233%%
X
=imeo2 @ rV
analog?rite$ PG)OPOL(:172, =imeo2 %V
Pito$-0%V
[
[
if $strcmp$cmdOparm^A_, Y4Y% @@ 0%
X
r @ $int%atoi$cmdOparm^2_%V
if $$r S@ 0% WW $r U@ 233%%
X
=imeoA @ rV =imeo2 @ rV
analog?rite$ PG)OPOL(:17A, =imeoA %V
analog?rite$ PG)OPOL(:172, =imeo2 %V
Pito$-0%V
[
[
[
EE ,#)1c#6 L*7 61L17
if $strcmp$cmdOparm^0_, YsetreleY% @@ 0%
X
r @ $int%atoi$cmdOparm^A_%V
if $$r S@ A% WW $r U@ >%%
X
if $strcmp$cmdOparm^2_, YonY% @@ 0%
X
7et6ele$ H<r, Gnde;6ele^r_, HG2H %V
Pito$-0%V
[
if $strcmp$cmdOparm^2_, YoffY% @@ 0%
X
7et6ele$ H<r, Gnde;6ele^r_, L*? %V
Pito$-0%V
[
[
[
EE L11 174#=* =1 L*7 61L17
if $strcmp$cmdOparm^0_, YgetreleY% @@ 0%
X
r @ $int%atoi$cmdOparm^A_%V
if $$r S@ A% WW $r U@ >%%
X
70
if $digital6ead$Gnde;6ele^r_%%
7erial/print$YonY%V
else
7erial/print$YoffY%V
[
[
EE #signar el PH
if $strcmp$cmdOparm^0_, YsetphY% @@ 0%
X
f @ $float%atof$cmdOparm^A_%V
if $$f S@ 0/0% WW $f U@ A-/0%%
X
:J2/PH @ fV
7et:onfig$%V
Pito$-0%V
[
else
X
7erial/println$Y1rror: pH rango entre 0/0 a A-/0Y%V
[
[
EE :omando al PH
if $strcmp$cmdOparm^0_, YphY% @@ 0%
X
:omandoPH$ cmdOparm^A_ %V
7erial/print$Y,#)=#=* @ Y%V
7erial/println$cmdOparm^A_%V
[
EE 6esetear el #rduino
if $strcmp$cmdOparm^0_, YresetY% @@ 0% resetJunc$%V
[
[
[
1sta funcin reali"ara &arias funciones con los siguientes comandos/
C9=A>D9S DISP9>IBLES?
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
cmd dimeo @.&/&"A BvalorC EE7e asigna el X&alor[ de dimeo a ^faseAEfase2Elas dos faces_
cmd setrele BindexC @on&o88A EE7e ^acti&aEdesacti&a_ el relD Xinde;[
cmd getrele BindexC EE7e obtiene el estado del relD Xinde;[ retornando ^onEoff_
cmd p5 BvalorC EE7e manda una orden al sensor de PH
cmd setp5 BvalorC EE7e asigna el X&alor[ al control de PH
cmd reset EE 6esetea el #rduino
Para que nuestro sistema sepa que lo que recibe es un comando, todos los comandos tendr!n que empe"ar
por la palabra cla&e McmdN/
7i queremos cambiar por e0emplo el dimeo de la primera fase de la lu" y ponerla a un ni&el de 200
mandaremos el comando siguiente
cmd dimeo . /**
7i se lo queremos cambiar a las dos fases a la &e" pondremos
cmd dimeo " /**
7A
o si queremos acti&ar o desacti&ar el relD )QB
cmd setrele 0 on
cmd setrele 0 o88
C si lo que queremos es a0ustar el PH como hemos comentado anteriormente simplemente tendremos la
sonda de PH y temperatura introducidas en el tarro de tapn correspondiente y en el momento preciso
mandaremos la orden pertinente, por e0emplo para el PH- el siguiente comando/
cmd p5 D
con lo cual el sensor se autocalibrara al &alor de PH-/
He escrito un tocho bueno, con que espero haberlo echo de una forma clara, de todas formas lo que no
comprend!is ya sabDis preguntar/
#qu os de0o el cdigo de nuestro controlador modificado/ )uestro:ontrolador0A2/"ip
Hoy os &oy a poner algunas fotos de mi controlador funcionando, son fotos que le hice antes de montarlo
en el mueble del acuario, de el solo cambia con el que tengo actualmente, el sensor de PH, que el que se
&e en la foto es uno reali"ado por mi, que no funcionaba a mi gusto/
5erDis una tiras de interruptores en el panel,
estos interruptores son de seguridad, por si
alguna &e" el #rduino se empea en poner algo
en marcha y a mi no me con&iene, desconec<
tando el interruptor el aparato de0a de funcionar
aunque el #rduino le ordene funcionar/

5ista general del controlador/
=etalle de la placa de #rduino/ 4ira de interruptores/
72
=etalle de los tipA-A para dimear la pantalla de
L1=s/
4engo que desmontarlo para fotografiar un poco mas de detalle, y el sensor de PH, irD poniendo tambiDn
esquemas de las placas que e reali"ado por si las querDis hacer y el cdigo completo de controlador mio/

1l panel esta echo con un programa gratuito, el Jront Panel =esigner/ :on el puedes disear el panel e
imprimirlo en una ho0a #- normal, luego la plastifica en cualquier papelera, ya solo queda pegarla en la
ca0a que &allamos a usar, luego con el panel
pegado y seco, se reali"a los boquetes y
queda bastante bien, yo como lo puse en una
tabla y esta era demasiado gorda para los
componentes, pegue el frontal plastificado, a
una lamina de pl!stico de - mm y luego
agarre esta a la madera/


7B

También podría gustarte