Editando
Cronometro
(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 = == Explicación código == <br> Archivo código: [http://wiki.erikcrane.net/images/2/24/Crono07.ino Cronometro.ino]<br> <br> <b>Bloque 01 - Defines, declaraciones variables</b><br> <br> *Las primeras tres lineas son los includes. Voy a usar la comunicación I2C para conectar el lcd al arduino por lo tanto hago un include de la libreria Wire.h. Tambien hago un include de la libreria para controlar el lcd y por último utilizare la libreria Bounce.h para poder hacer [[Debounce]] en los botones *El siguiente mini-bloque es el encargado de definir los pines que usaré del arduino para los botones *Un define de la "varaible" INTERVAL_MILLIS que usaré más adelante *Otros defines que sirven para "traducir" el numero del estado en palabras mas entendibles *Configuración del parámetro REBOUNCE_TIME para los Debounce *Declaración del objeto lcd con la dirección I2C y las lineas y caracteres que tiene el lcd *Creación de los objetos debounce (uno por cada boton) *Creación de la variable tiempo que es un struct dónde almacenaré el tiempo que he configurado como cuenta atrás *Creación de una variable que almaceno los milisegundos que pasan desde que enciendo el cronómetro <br> <b>Bloque 02 - Setup</b><br> <br> En el setup voy a configurar los pines del arduino e iniciar el objeto lcd: *Lo primero que hago es activar el pin RELE como OUTPUT y ponerlo como LOW porque lo quiero desactivado *Con un bucle configuro los 6 botones como INPUT_PULLUP (este modo es para ahorrarme colocar las pullup en la placa, ya que el arduino ya lleva integrada resistencias pullup en cada entrada/salida digital *Llamo a la función init() del obejto lcd que inicia el LCD <br> <b>Bloque 3 - Loop</b><br> <br> El bloque del Loop consiste en un switch en donde cada case corresponde con un estado y la variable estate almacena en que estado se encuentra el programa.<br> Hay 3 estados: *Estado 0 - Inicial **Es el primer estado cuando encendemos el cronometro **En este estado lo que hacemos es: ***Mostrar el tiempo por pantalla (la función imprimirTiempo() ***Pasar directamente al siguiente estado (state = E_CONFIG_TIME;) *Estado 1 - Configurar tiempo **Lo primero es llamar a la función configTiempo(), que sirve para configurar los minutos y segundos de cuenta atrás **Luego tenemos dos if's ***El primero (ev_reset()) hace que si apretamos el botón reset reiniciamos el cronometro a 0 y volvemos al estado inicial ***El segundo (ev_start()) hace que si apretamos el botón start activamos el relé y vamos al estado cuenta atras (state = E_CUENTA_ATRAS;) *Estado 2 - Cuenta atras **En este estado hay un if que miras si se ha acabado la cuenta atrás o se ha pulsado el boton reset. Si no pasa ningun de estas dos acciones empezamos la cuenta atrás (llamando a la función cuentaAtras();) y la seguimos ejecutando hasta que uno de estos dos eventos ocurran **Si se acaba la cuenta atrás o se aprieta el botón reset lo que haremos es: ***Desactivar relé (desactivarRele();) ***Reiniciar el contador a 0 (resetTiempo();) ***Dirigirnos al estado inicial (state = E_INICIAL;) <br> <b>Bloque 4 - Funciones</b><br> <br> En el bloque 4 nos encontramos todas la funciones que utilizamos durante el loop. Las voy a listar y explicar brevemente: *boolean ev_start() **Utilizando las fórmulas del objeto Bounce miramos si se ha apretado el botón start **Si se ha apretado se devuelve true (ATENCIÓN si el pulsador está en LOW quiere decir que está pulsado. Esto es debido a que la lógica se invierte porque utilizo resistencias pullup en vez de pulldown) **Sino se ha apretado se devuelve false *boolean ev_reset() **Lo mismo que en la función de ev_start pero con el botón reset *void imprimirTiempo() **Función que se encarga de escribir en el LCD el tiempo *void configTiempo() **Configura el tiempo de la cuenta atrás según los botones que apretamos **Si se llega a 59 segundos se pasa a 1 minuto y los segundos pasan a 0 **Si se llega a los 59 minutos se pasa a 1 hora y se pone 0 en minutos **Tengo en cuenta que no se puede bajar de 0 segundos ni de 0 minutos **Cuando acabo de configurar el tiempo llamo a la función imprimirTiempo() para actualizar la pantalla *void resetTiempo() **Coloco a 0 los campos del struct cuenta (horas, minutos, segundos y decimas) *boolean ev_fin_cuenta_atras() **Si los minutos, segundos y decimas llegan a 0 devuelve true *void cuentaAtras() *void activarRele() **Escribe HIGH en el pin RELE *void desactivarRele() **Escribe LOW en el pin RELE <br> == Máquina de estados == <br> [[File: maquina_estados_cronometro.png | 420px]]<br> <br>
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