Diferencia entre revisiones de «Insoladora»
| (No se muestran 13 ediciones intermedias del mismo usuario) | |||
| Línea 42: | Línea 42: | ||
[[File:Ins_Montaje01.png|450px]]<br> | [[File:Ins_Montaje01.png|450px]]<br> | ||
<br> | <br> | ||
== Reactancias == | == Reactancias == | ||
| Línea 167: | Línea 160: | ||
| http | | http | ||
|} | |} | ||
== Archivos == | |||
{| class="wikitable" | |||
!Fichero !!Descripción | |||
|- align="center" | |||
| [[File: PlantillaAgujerosBase.PDF]] | |||
| Indica donde van los agujeros para collar las piezas que sujetan el vidrio, las reactancias, los casquillos y la pcb | |||
|- align="center" | |||
| [[File:]] | |||
| "" | |||
|} | |||
<br> | |||
= Electrónica = | = Electrónica = | ||
| Línea 355: | Línea 359: | ||
== Archivos == | == Archivos == | ||
* | *[[File: Insoladora Gerber.zip]] | ||
* | *[[File: Insoladora SVG.rar]] | ||
== Galería PCB == | == Galería PCB == | ||
Galería de fotos de las diferentes etapas de la producción del PCB<br> | Galería de fotos de las diferentes etapas de la producción del PCB<br> | ||
| Línea 490: | Línea 495: | ||
== Menu == | == Menu == | ||
<br> | <br> | ||
<b>imprimirMenu(char* menu[])</b> | |||
*Distingo con un <i>if</i> si la posición del menú es la 0, es decir el cursor está en la primera posición del menú, o si está en las demás posiciones | |||
*Si la posición del menú es 0: | |||
**En la primera fila imprimo el cursor y luego el nombre del primer ítem | |||
**En la segunda fila imprimo el siguiente ítem, que es la posición + 1 | |||
*Si la posición del menú es cualquiera menos 0: | |||
**En la primera fila imprimo el ítem de la posición - 1 | |||
**En la segunda fila imprimo el ítem de la posición | |||
<br> | |||
Explicación gráfica:<br> | Explicación gráfica:<br> | ||
<br> | <br> | ||
[[File: Ins_ImprimirMenu.png]]<br> | [[File: Ins_ImprimirMenu.png | 300px]]<br> | ||
<br> | <br> | ||
El porqué en cualquier posición del menú que no sea la 0 imprimo en la primera fila la posición -1 y en la segunda fila la posición es porque una vez que se ha desplazado una posición a partir de la 0 el cursor siempre estará en la segunda fila. El menú irá avanzando, es decir el ítem que había en la segunda fila pasará a la primera y aparecerá un nuevo ítem en el segunda fila, y el nuevo ítem siempre estará en la segunda fila.<br> | El porqué en cualquier posición del menú que no sea la 0 imprimo en la primera fila la posición -1 y en la segunda fila la posición es porque una vez que se ha desplazado una posición a partir de la 0 el cursor siempre estará en la segunda fila. El menú irá avanzando, es decir el ítem que había en la segunda fila pasará a la primera y aparecerá un nuevo ítem en el segunda fila, y el nuevo ítem siempre estará en la segunda fila.<br> | ||
| Línea 507: | Línea 512: | ||
Explicación gráfica:<br> | Explicación gráfica:<br> | ||
<br> | <br> | ||
[[File: | [[File: Ins_ImprimirMenu_Desp.png | 300px]]<br> | ||
<br> | <br> | ||
desplazarMenu(int numMenu) | <b>desplazarMenu(int numMenu)</b> | ||
interactuarMenu() | <b>interactuarMenu()</b> | ||
<br> | |||
Esta función consta de un <i>switch</i> con tantos <i>case</i> como ítems tiene el menú. Como tengo sólo 3 ítems en el menú se ponen 3 <i>case</i>.<br> | |||
Con el valor de la variable <i>PosMenu</i> iremos a la función de ese submenú.<br> | |||
<br> | |||
limpiaMenu() | <b>limpiaMenu()</b> | ||
<br> | |||
En esta función simplemente se pone a 0 la variable <i>posMenu</i> (que nos indica en que posición del menú estamos).<br> | |||
<br> | <br> | ||
=Mejoras= | =Mejoras= | ||
*Conectore LCD en la otra cara y a 90º | *Conectore LCD en la otra cara y a 90º | ||
*Conector PCB a 90º | *Conector PCB a 90º | ||
*Botones en placa separada para que esten lo mas cerca posible de la tapa, lo de usar botones de plastico no es buena solucion | *Botones en placa separada para que esten lo mas cerca posible de la tapa, lo de usar botones de plastico no es buena solucion | ||
<br> | |||
= Enlaces = | = Enlaces = | ||
Revisión actual - 21:31 19 ene 2016
Propósito
[editar]He querido constrir mi propia insoladora UV para la creación de placas PCB electrónicas.
He diseñado un circuito que controlado con un arduino pro mini y con un lcd de 16x2, un joestick y dos botones me permiten controlar el tiempo de insolado. El circuito está preparado para una insoladora de doble cara, aunque yo de momento solo he construido una insoladora de una sola cara.
El programa contiene un pequeño menú con tres memorias para guardar tres tiempos diferentes y luego poder volver a cargarlos y una opción para activar las dos caras, solo la inferior o solo la superior.
He querido hacer un modelo que todo sea atornillable por si se tiene que desmontar por algún motivo y las piezas que utilizo para colocar los componentes (como los casquillos, las reactancias, etc) son impresas.
Teoria sobre la luz UV
[editar]
Imagen que muestra el espectro visible por el ojo humano:

Como vemos en la imagen las ondas que van desde los 750nm a los 400 nm es la luz que nuestros ojos ven.
La Luz actínica está comprendida entre los 480nm a los 400nm. Está dentro del espectro visible y los azules/vielotas forman parte de esta luz.
La Luz ultravioleta es la que está comprendida entre los 400nm y los 100nm. Dentro de la luz UV encontramos tres subdivisiones:
- UV-A (400nm-315 nm): Es la menos destructiva de las tres.
- UV-B (315nm-280 nm): Es biológicamente destructiva y la exposición directa puede causar daños y quemaduras en la piel.
- UV-C (280nm-100 nm): Es absorvida por la atmosfera terrestre. Es la utilizada para la esterilización médica, del agua o del agua de los acuarios.
Para este proyecto necesitaremos de la Luz Ultravioleta tipo A. Cuando busquemos un tubo fluorescente no solo nos tenemos que fijar en la potnecia que nos da, sino en la potencia de luz Ultravioleta tivo A que tiene. Por ejemplo, en el tupo que yo he escogido (por tamaño y potnecia) tiene 11W de luz, de los cuales 2W son de UV-A. Los 11W no seran de luz UVA, solo una parte. Esto es lógico porque cuando encendemos el tubo vemos luz (violeta), esto por lo que he explicado antes es porque forma parte del rango 750nm-400nm, la ultravioleta no la podemos ver. Esto es algo a tener en cuenta a la hor ade escoger le tubo, porque lógicamente no es lo mismo un tuvo de 11W con 2W de UV-A que uno de 11W con 1W de UV-A.
Hardware
[editar]Fluorescentes y casquillos
[editar]| Fluorescente | Casquillos | Soporte Casquillos |
|---|---|---|
| Tubo para reprografia con 2W de UV-A. 11W de potneci aen total | Casquillo para tubo G5 | Soporte para collar el casquillo a la base y darle altura al tubo. Se colocan dos insertos de M3, uno para collar el soporte al casquillo y el otro para collar el soporte a la base |
| Actinic BL TL 11W/10 | Soporte Casquillo |
Montaje
[editar]Detalle del montaje de los Sujeta Casquillos, los Casquillos y los Fluorescentes:
![]()
Reactancias
[editar]| Reactancias | Soporte Reactancias |
|---|---|
| [[File:]] | |
| texto | Soporte para collar las reactancias a la base. Las reactancias se colocan de dos en dos y se necesitan dos soportes por cada par de reactancias. En la parte superior del soporte van dos insertos de M3 para collar las reactancias y en la parte inferior del soporte va un inserto para collarlo a la base |
| http | Soporte Reactancia |
Montaje
[editar]Detalle del montaje de los Sujeta Reactancias y las Reactancias:
![]()
Soportes Vidrio, vidrio y vidrio de ajuste
[editar]| Soporte Vidrio Parte A | Soporte Vidrio Parte B | Vidrio | Vidrio Ajuste | Pinzas |
|---|---|---|---|---|
| Soporte para el vidrio. Consta de dos partes. La parte A es donde se apoya el vidrio y está sujeta a la base. Se usan dos insertos, uno para collar la parte A a la base y la otra donde se collará la parte B | Esta pieza sirve para sujetar el vidrio a la parte A. Con un tornillo M3 que pasa por la parte B se enrosca con la parte A y queda el vidrio sujeto. | Vidrio que se usa como base donde apoyar el fotolito y el PCB. Dimensiones: 251mmx195mm | Vidrio para apretar el fotolito a la PCB. Se crea un "sandwich" entre el vidrio inferior, el fotolito, el pcb y el vidrio superior | Pinzas para juntar los dos vidrios |
| Soporte Vidrio Parte A | Soporte Vidrio Parte B |
Montaje
[editar]Detalle del montaje de los Sujeta Casquillos, los Casquillos y los Fluorescentes:
Soportes PCB
[editar]| Soporte para PCB |
|---|
| Soporte para collar El PCB Base a la base. Se necesitan 2 soportes. En la parte superior del soporte van dos insertos de M3 para collar el PCB y en la parte inferior del soporte van dos insertos para collar el soporte a la base |
| Soporte PCB |
Montaje
[editar]PCB LCD, embellecedores, botones y espaciadores
[editar]| Embellecedor LCD | Embellecedor Joestick | Embellecedor Botón | Botón Joestick | Botón | Espaciador LCD | Espaciador PCB LCD | Espaciador PCB a LCD |
|---|---|---|---|---|---|---|---|
| [[File:]] | [[File:]] | [[File:]] | [[File:]] | [[File:]] | [[File:]] | [[File:]] | [[File:]] |
| Se usa para tapar los desperfectos en el corte para el LCD de la tapa. | Se usa para tapar los desperfectos en el corte para el Joestick de la tapa. | Se usa para tapar los desperfectos en el corte para el Botón de la tapa. | El Joestick está a unos 10mm por debajo de la tapa, para poder accionarlo he creado un "alargador". | El Botón está a unos 10mm por debajo de la tapa, para poder accionarlo he creado un "alargador" | Espaciadores entre la tapa y el LCD. | Espaciadores entre la tapa y el PCB. | Espaciadores entre el PCB y el LCD. |
| Embellecedor LCD | Embellecedor Joestick | Embellecedor Botón | Botón Joestick | Botón | Espaciador LCD a Tapa | Espaciador PCB LCD a Tapa | http |
Montaje
[editar]Detalle del montaje del PCB LCD y espaciadores (Vista superior tapa):
![]()
Detalle del montaje de los Embellecedores y los Botones (Vista inferior tapa):
Demás acabados caja
[editar]| Enchufe | Cierres | Bloqueador tapa | Maneta |
|---|---|---|---|
| File | File | File | |
| Conjunto de enchufe, interruptor y fusible. | Cierres tipo maletín. | Bloqueador de la apertura de la tapa. | Maneta para facilitar el transporte. |
| http | http | http | http |
Archivos
[editar]| Fichero | Descripción |
|---|---|
| Archivo:PlantillaAgujerosBase.PDF | Indica donde van los agujeros para collar las piezas que sujetan el vidrio, las reactancias, los casquillos y la pcb |
| [[File:]] | "" |
Electrónica
[editar]Lista de componentes (BOM)
[editar]
| Componente | Características | Encapsulado | Unidades |
|---|---|---|---|
| Regleta | 2 posiciones | PTH | 3 |
| Transformador 220V:9V | 230Vac:9Vac - 2,8VA | PTH | 1 |
| Fusible rearmable | 1206L035/16YR | SMD 1206 | 1 |
| Puente de diodos | RMB4S-E3/45 | TO-269AA | 1 |
| Condensador electrolítico | 470uF 16V | SMD 8x10.2 | 1 |
| Condensador electrolítico | 100uF 16V | SMD 6.3x5.8 | 1 |
| Condensadores de 100nF | 100nF 50V | SMD 1206 | 2 |
| Regulador de tensión de 9V a 5V | MC7805BD2T | DPAK 3 | 1 |
| Diodo de protección | S2G-E3/5BT | DO214AA | 3 |
| Rele | Relé Finder 40.52. | PTH | 2 |
| Resistencia | 240 | SMD 1206 | 2 |
| Resistencia | 100k | SMD 1206 | 2 |
| Transistor NPN | FMMTA42TA | SOT23 | 2 |
| Conector | PTH | 2 | |
| Arduino Pro Mini | Arduino Pro Mini | PTH | 1 |
| Componente | Caracterísitcas | Encapsulado | Unidades |
|---|---|---|---|
| Blue LCD Module HD44780 | 1602A v2.0 | PTH | 1 |
| PCF8574 | PTH | 1 | |
| Push button | KAN0610 | PTH | 2 |
| Joestick | SKQUCAA010 | PTH | 1 |
| LED | 5mm Rojo | PTH | 1 |
| Resistencia | 220 | PTH | 1 |
| Conector | PTH | 2 |
Análisis de los bloques
[editar]Bloque 1 - Alimentación
[editar]Transformador
Primero hay que saber el consumo total del circuito para poder elegir el transformador que necesitaremos:
| Arduino Pro Mini | |
| Leds | 20mA |
| Reles | 260mA |
| LCD | |
| Total |
Condensadores
En la sección Uso práctico del Filtro de la entrada Fuente de Alimentación comento la regla práctica de 1000uF por cada amperio de corriente en la salida.
En este caso tendré unos 400mA como máximo a la salida, por lo tanto escogeré un condensador de 470uF (que es el valor anterior a 1000uF).
También colocaré los condensadores que comenta el usuario Fogonazo en el forosdeelectronica.com con los valores de C2 - 100nF y C3 - 100nF.
Los demás componentes solo hay que buscar que aguanten los máximos de corriente, voltaje y potencia. En la sección Fuente Alimentación esta explicado como elegir cada componente para configurar una fuente lineal a tus necesidades.
Bloque 2 - Arduino
[editar]Como placa Arduino he escogido la Arduino Pro Mini de Sparkfun. En esta placa se usa el Atmega328 que se debe programar via FTDI, por lo cual he necesitado un programador externo. He usado este, USB 2.0 TO RS232 UART TTL Serial CP2102, que utiliza el integrado CP2102 para convertir la señal de USB a TTL.
Dejo un par de enlaces con los diferentes Arduinos y sus características:
Bloque 4 - Reles y transistor
[editar]
Cada relé necesitará 130mA para activar bobina. Utilizando la teoria del apartado Circuito Relé calcularé la resistencia de base del transistor. No utilizaré un led para saber si está encendido el relé como en el apartado Circuito Relé.
. Es el valor que nos indica en el datasheet del relé como corriente necesaria para activar la bobina
Pero es una buena práctica multiplicar la corriente por 5 para asegurarnos que el transistor se saturará aunque la cambie. Por lo tanto:
Yo he acabado poninedo una
Bloque 5 - LCD y botones
[editar]El LCD me sirve para poder interactuar con el sistema. Me muestra el menu y el contador. Utilizo un lcd de 16x2 que es bastante sencillo pero no necesito nada mas complejo. Para conectarlo con el Arduino Pro Mini utilizo el inegrado 8574 que me permite conectar el lcd al arduino por i2c en vez de usar 7 de sus puertos.
Los botones que he puesto son 3, uno tipo joestick para moverme por el menu, configurar el tiempo, etc y otros dos que son el de empezar la cuenta atrás y el de cancelar. El de cancelar sirve tanto para salir del menu como para cancelar la cuenta atrás o borrar el tiempo introducido en el contador.
Esquemáticos
[editar]
-
PCB Base
-
PCB LCD
Archivos
[editar]Galería PCB
[editar]Galería de fotos de las diferentes etapas de la producción del PCB
Programación
[editar]Esquema menú y comportamiento lógico del menú
[editar]Funcionamiento sistema:
- En modo reposo
- Imprimir contador
- Se entra directamente en el modo configurar el tiempo
- Con las felcas de UP/DOWN y LEFT/RIGHT podremos movernos por el contador y modificar el valor
- Con el botón Start empieza la cuenta atras
- Con el botón Cancel se cancela la cuenta atras, si se ha iniciado, y se coloca el contador a 0
- En modo menu
- Se utilizan las flechas UP/DOWN para desplazarse por el menu
- Se utiliza el boton ENTER para acceder a los submenus/opciones
- Menu guardar tiempo en memoria
- Se muestran tres memorias para guardar el tiempo
- Se selecciona la memoria donde se quiere guardar y el tiempo que hay en el contador se guarda en la memoria
- Menu cargar tiempo de memoria
- Se muestran las tres memorias
- Se selecciona la memoria que se desea y el tiempo se carga en el contador
- Menu Doble Cara
- Se muestran las opciones de insolado
- Se selecciona el modo deseado y se guarda en memoria
Código
[editar]
Archivo código: Insoladora.ino
Bloque 01 - Defines
[editar]- Utilizo el define para dar un nombre más intuitivo a los pines de los botones, joystick y reles (Seccion Definicion pin arduino)
- Lo mismo para los estados del menu (Sección Definicion estados)
- El define INTERVAL_MILLIS y REBOUNCE_TIME son parametros de la libreria Bounce
Bloque 02 - Declaracion objetos
[editar]- Declaro los objetos botones con el sistema debounce
- Declaro el obejto lcd con la dirección i2c, las lineas que tiene y las filas
Bloque 03 - Declaracion variables
[editar]- Declaración variable state donde almaceno en que estado estoy. Inicializo en el estado inicial, E_INICIAL
- Declaración de un struct para almacenar el tiempo e inicializado a 0
- Variable posicionCursor que almacenara donde esta el cursor para cambiar los digitos de los minutos y segundos. Inicializo a 9 que es dond estan las unidades de segundo
- Variable milisegundos que almacena los milisegundos transcurridos cuando el cronometro está en marcha
- Declaración de las variables para almacenar los textos de los diferentes menus
- Variable posMenu para guardar el menu que tenemos seleccionado
- Declaración de la variable reles que almacenará que cara de la insoladora queremos encender
Bloque 04 - Setup
[editar]- Configuro los pines RELE1 y RELE2 como output y los inicializo en low
- Configuro los pines de los botones como input activando los pull-up internos del arduino pro mini. Hay que tener en cuenta que la lógica sera negativa. Cuando se apriete un boton la señal de entrada será LOW y en modo reposo será HIGH
Bloque 05 - Loop
[editar]El bloque del Loop consiste en un switch en donde cada case corresponde con un estado y la variable state almacena en que estado se encuentra el programa.
- Estado 0 - Inicial
- Estado 1 - Configurar Tiempo
- Estado 2 - Cuenta atras
- Estado 3 - Menu
- Estado 4 - Menu Guardar
- Estado 5 - Guardar en memoria
- Estado 6 - Menu Cargar
- Estado 7 - Cargar de memoria
- Estado 8 - Menu Doble Cara
- Estado 9 - Guardar Doble Cara
- Estado 10 - Acción cancelar dentro del menu
Bloque 06 - Funciones
[editar]- imprimirTiempo()
- Muestra el tiempo por pantalla
- Si solo hay unidades de segundos o minutos inserta un 0, sino escribe directamente lo que hay en el struct cuenta
- limpiaLCD()
- Función que uso para limpiar el lcd al pasar del modo temporizador al modo menu
- Tambien quita el cursor
- configuraTiempo()
- Esta función es la encargada de modificar el tiempo cuando utilizamos los botones UP/DOWN y /LEFT/RIGHT
- Consta de 4 ifs que son los encargados de controlar que boton se ha pulsado
- El comportamiento lógico se divide en dos bloques
- 2 ifs que controlan LEFT/RIGHT, que son los que desplazan el cursor entre los segundos y minutos
- Se tiene en cuenta que la posicion del cursor solo pueda "navegar" por los segundos
- Las posiciones son de la casilla 9 (unidades de segundo) a la casila 5 (decenas de minutos). Se saltan los ":" que hay entre segundos y minutos
- 2 ifs que controlan UP/DOWN, que son los que aumentan el numero de segundos y minutos
- Se controla que los minutos ni los segundos pasen de 59
- Se utilizan ifs para saber si estamos en unidades o decenas y en segundos o minutos (es decir se utilizan para saber donde esta el cursor). Dependiendo de donde esta el cursor de aumenta el numero de minutos o segundos de unidad en unidad o de 10 en 10
- Al acabar de modificar el tiempo se llama a la funcion imprimirTiempo() para actualizar el valor por pantalla
- 2 ifs que controlan LEFT/RIGHT, que son los que desplazan el cursor entre los segundos y minutos
- resetTiempo()
- Encargada de poner el tiempo a 0
- Tambien pone el cursor en la posicion inicial, que es la de unidades de segundo
- cuentaAtras()
- Encargada de hacer la cuenta atras cuando se presiona el boton start
- Utiliza la funcion millis() de arduino como "reloj" y compara el valor del temporizador que hemos puesto con el valor de millis()
- Actualiza el valor del contador en cada cambio de decimas
- activaReles()
- Activa los reles que encienden la cara superior, inferior o ambas a la vez.
- Utiliza la funcion EEPROM.gets() para leer de memoria que cara ha de encenderse
- Mediante un switch enciende un rele u otro
- desactivaReles()
- Desactiva los dos reles sin importar cual estaba activo
- funciones menu
- Las explico en la sección Menu porque utilizaré gráficos para que sea más entendible
- guardaMemoria()
- Se ocupa de guardar el tiempo que introducimos en la Memoria 1, o la Memoria 2 o la Memoria 3
- Lo primero que hace es convertir los segundos y minutos que son un struct a un int (es la variable que creamos segundosTotales)
- Mediante la funcion EEPROM.put() guardamos en la memoria el valor del tiempo
- El primer argumento de la función es la posicion de la memoria eeprom donde se guardará el dato. Vemos que este primer argumento es posMenu*16
- Las tres memorias (Memoria 1, Memoria 2 y Memoria 3) se guardan consecutivamente por eso utilizamos el valor de la variable posMenu (el cual nos indica en que Memoria queremos guardar el dato) y lo multiplicamos por el tamaño que ocupa la variable segundosTotales. Sabiendo que es un int ocupa 16bits
- El segundo argumento es la variable a guardar, segundosTotales
- cargaMemoria()
- Funciona igual que guardaMemoria() pero haciendo el trabajo inverso
- Leemos de la eeprom con la funcion EEPROM.get()
- El primer argumento es la memoria que queremos cargar (Memoria 1, 2 o 3)
- El segundo argumento es es una variable que creo para guardar esa informacion leida de la eeprom
- Luego divido los segundosTotales en segundos y minutos y lo almaceno en el struct cuenta
- caraGuardar()
- Guardamos la opción escogida en la memoria eeprom con la funcion EEPROM.put()
- Como hemos dicho antes la información guardada esta consecutivamente, por lo tanto teniendo en cuenta que hay tres Memorias del tiempo (Memoria 1, 2 y 3) y que cada Memoria es un int de 16 bits (2 bytes), en la casilla que tenemos que guardar la opción escogida sera 3*16 (o 3*2*8)
- El segundo parametro de la función es la opción que hemos escogido (Inferior, Doble Cara o Superior). Esta información la tiene la variable posMenu.
- Guardamos la opción escogida en la memoria eeprom con la funcion EEPROM.put()
Bloque 07 - Funciones eventos
[editar]- funciones de los eventos de todos los botones (Start, Cancel, Enter, Up, Down, Left y Right)
- Controlan mediante las funciones del objeto Bounce si se ha presionado un boton o no
- la funcion boton.update() devuelve TRUE si se ha cambiado el estado del boton
- si se ha cambiado el estado miramos si es LOW (se ha activado el boton) y entonces devolvemos TRUE
- sino se ha cambiado el estado del boton o no es LOW se devuelve FALSE
- sino utilizamos la funcion boton.update() lo que obtendriamos es que si apretamos un boton (por ejemplo UP), solo con una presion las unidades no pararian de subir. Al utilizar esta funcion nos obliga a que cada vez que queramos subir una unidad tenemos que hacer una presion al boton UP
- ev_fin_cuenta_atras()
- Controla que si la variable cuenta llega a 0 devuelve TRUE y significaria que se ha acabado la cuenta atras
Menu
[editar]
imprimirMenu(char* menu[])
- Distingo con un if si la posición del menú es la 0, es decir el cursor está en la primera posición del menú, o si está en las demás posiciones
- Si la posición del menú es 0:
- En la primera fila imprimo el cursor y luego el nombre del primer ítem
- En la segunda fila imprimo el siguiente ítem, que es la posición + 1
- Si la posición del menú es cualquiera menos 0:
- En la primera fila imprimo el ítem de la posición - 1
- En la segunda fila imprimo el ítem de la posición
Explicación gráfica:
![]()
El porqué en cualquier posición del menú que no sea la 0 imprimo en la primera fila la posición -1 y en la segunda fila la posición es porque una vez que se ha desplazado una posición a partir de la 0 el cursor siempre estará en la segunda fila. El menú irá avanzando, es decir el ítem que había en la segunda fila pasará a la primera y aparecerá un nuevo ítem en el segunda fila, y el nuevo ítem siempre estará en la segunda fila.
Explicación gráfica:
![]()
desplazarMenu(int numMenu)
interactuarMenu()
Esta función consta de un switch con tantos case como ítems tiene el menú. Como tengo sólo 3 ítems en el menú se ponen 3 case.
Con el valor de la variable PosMenu iremos a la función de ese submenú.
limpiaMenu()
En esta función simplemente se pone a 0 la variable posMenu (que nos indica en que posición del menú estamos).
Mejoras
[editar]- Conectore LCD en la otra cara y a 90º
- Conector PCB a 90º
- Botones en placa separada para que esten lo mas cerca posible de la tapa, lo de usar botones de plastico no es buena solucion
Enlaces
[editar]http://i.stack.imgur.com/oOtkU.png
http://arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf
http://aquaflash.blogspot.com.es/2009/04/34-luz-ultravioleta-tratamiento.html