Hola. Buenos días.
Duda programación. Retener estado de pulsador hasta que llegue su instrucción.
Ejemplo:
Si en un programa de 500 líneas con Deleys, bucles,…, en la línea 200 hay una instrucción de que ejecute algo (ejemplo: encender/apagar 5 veces un Led) cuando el usuario pulsa un pulsador, ¿cómo se soluciona el hecho de que la pulsación del usuario es momentánea? (es decir, no tiene por qué producirse cuando el programa está ejecutando la línea 200). ¿Cómo se consigue retener el hecho de que se haya pulsado hasta que el programa llegue a la línea 200? ¿Es posible?
Muchas gracias.
El número de líneas es totalmente irrelevante.
Evita el uso de delays y en su lugar usa millis.
Los bucles hay que evitar que no sean muy largos ni que bloqueen el programa durante segundos.
Con esas dos simples reglas no tendras problemas con los botones. Ten en cuenta que el loop bien programado puede llegar a ejecutarse cientos de veces por segundo.
En el foro tenemos tutoriales para la programación de botones y el uso de millis.
Se guarda su estado en una variable y luego se la utiliza cuando sea necesario.
Victorjam: uso delays para mostrar cada pocos segundos datos por el monitor. Entiendo que antes o después se va a producir la situación no deseada de (pulsar/despulsar) el pulsador cuando se esté ejecutando otra parte del código y por tanto que no se entere Arduino de que se ha pulsado.
MaximoEsfuerzo: La duda es que si pulso y dejo de pulsar mientras el código está ejecutando (por ejemplo las líneas de la 300 a la 450), antes de que llegue a la línea:
Estado pulsador = digitalRead(pulsador)
Ya he dejado de apretar al pulsador y por tanto “Estado pulsador” no se entera de que se pulsó.
¿Cómo evito en la programación SECUENCIAL esto? ¿concurrente/eventos? ¿alguna forma de implementarlo en Arduino?
Mucha gracias.
Un código sin delays se ejecutaría en cuestión de milisegundos, difícilmente se escape una pulsación.
Te dejo una simulación para que se vea más claro.
Inicia con el LED de la placa encendido.
Ejecuta un lazo while() en el que espera 1 segundo usando delay(), apaga el LED de la placa y muestra cuantas veces se ejecutó el lazo.
Luego hace lo mismo pero sin usar delay().
Aclaro que la única cosa que hace hasta que pasa el tiempo es incrementar una variable, pero igual fíjate la diferencia en el número de ejecuciones del lazo.
Busca el tema de interrupciones para cuando cambie el estado de una entrada digital.
Te recomiendo utilizar CHANGE (se dispara la interrupción cuando cambia el estado anterior, es decir si se pulsa o se suelta el botón, se dispara la interrupción)
Técnicamente lo que hace el procesador (Arduino) es que monitoriza una entrada digital y cuando cambia de estado llama a un void que tu defines.
dentro de esa subrutina que defines hay restricciones como no puedes ejecutar código muy largo pero si puedes perfectamente cambiar el estado de una variable bool.
Defines una variable tipo volátil:
volatile byte estado_pulsador= LOW;
Creas un void para la interrupción:
void cambioEstadoBoton() {
estado_pulsador= digitalRead(pinquesea);
}
Y en tu "setup":
attachInterrupt(digitalPinToInterrupt(pinquesea), estado_pulsador, CHANGE);
Ya con eso en tu "loop" has de preguntar por la variable estado_pulsador y nada más.
Lee detenidamente el link que he pegado porque no todos los pines son usables para interrupciones.
Saludos.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.