Editando
Insoladora
(sección)
Ir a la navegación
Ir a la búsqueda
Advertencia:
no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si
inicias sesión
o
creas una cuenta
, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Comprobación antispam. ¡
No
rellenes esto!
== Código == <br> Archivo código: [http://wiki.erikcrane.net/images/c/cd/Insoladora.ino Insoladora.ino]<br> <br> === Bloque 01 - Defines === *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 <br> === Bloque 02 - Declaracion objetos === *Declaro los objetos botones con el sistema debounce *Declaro el obejto lcd con la dirección i2c, las lineas que tiene y las filas <br> === Bloque 03 - Declaracion variables === *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 <br> === Bloque 04 - Setup === *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 <br> === Bloque 05 - Loop === 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.<br> *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 <br> === Bloque 06 - Funciones === *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 *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 <br> *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 <br> *funciones menu **Las explico en la sección [[Insoladora#Menu|Menu]] porque utilizaré gráficos para que sea más entendible <br> *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 <i>segundosTotales</i>) **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 <i>posMenu*16</i> ***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, <i>segundosTotales</i> *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 <i>segundosTotales</i> 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 <i>posMenu</i>. <br> === Bloque 07 - Funciones eventos === *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
Resumen:
Ten en cuenta que todas las contribuciones a Proyectos se consideran publicadas bajo la Creative Commons Atribución-CompartirIgual (véase
Proyectos:Derechos de autor
para más información). Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre.
¡No uses textos con copyright sin permiso!
Cancelar
Ayuda de edición
(se abre en una ventana nueva)
Menú de navegación
Herramientas personales
No has accedido
Discusión
Contribuciones
Crear una cuenta
Acceder
Espacios de nombres
Página
Discusión
español
Vistas
Leer
Editar
Ver historial
Más
Buscar
Navegación
Página principal
Cambios recientes
Página aleatoria
Ayuda sobre MediaWiki
Páginas especiales
Herramientas
Lo que enlaza aquí
Cambios relacionados
Información de la página