Hola de nuevo. Espero que no hayáis desmontado el circuito
del pulsador usado hasta ahora, porque le vamos a dar una vuelta de tuerca más.
Por si caso el montaje es este:
En el ejemplo de hoy vamos a programar un dimmer que regula
la luminosidad de un led. Para ello vamos a aplicar lo que hemos aprendido
hasta ahora sobre pulsadores y sobre PWM.
El funcionamiento exacto que queremos conseguir del dimmer es el siguiente:
El funcionamiento exacto que queremos conseguir del dimmer es el siguiente:
- Que una pulsación encienda el led.
- Una pulsación prolongada comience a incrementar la luminosidad mientras el pulsador esté pulsado. El incremento se detiene cuando se deja de pulsar.
- Si se alcanza la máxima luminosidad y se continúa pulsando, la luminosidad se reinicia desde cero y continuaría incrementandose, en forma de bucle.
- Una pulsación corta apaga el led.
De acuerdo, pues una vez definido el funcionamiento de
nuestro circuito, vamos a explicar una de las funciones que nos hará falta para
completar el ejercicio.
La función milis ()
Es una función que nos devuelve el tiempo que ha pasado
desde que el sketch en curso ha comenzado. Se ha de usar una variable de tipo
unsigned long para almacenarlo. El contador se resetea aproximadamente después
de 50 días.
Para la aplicación que diseñaremos deberemos medir el tiempo que ha pasado entre dos pulsaciones.
Es decir, no nos interesa el acumulado desde el principio sino el tiempo pasado
entre dos intervalos, en concreto, queremos medir lo que dura la pulsación.
Un ejemplo de aplicación:
duracion = millis() –
ultimavez; // Tiempo que ha pasado desde la última vez que se leyó
El algoritmo del programa sería:
- Esperar una pulsación ,
- Cuando recibimos esa pulsación medir el tiempo que permanece pulsado,
- si es menor a 500 ms invertir la salida,
- si es mayor y el LED estaba en ON incrementar su luminosidad
- Repetir indefinidamente,
Fácil, ¿no? El programa sería casi un "copy-paste" de lo visto hasta ahora, con la inclusión de la función milis() para medir los intervalos.
Mi propuesta para resolver este ejercicio, es la siguiente:
// Ejemplo 1.7: Dimmer con un pulsador // El LED se activa con una pulsación corta // y se apaga con otra pulsación corta // Si permanece pulsado se incrementa el brillo const int LED = 9; // pin para el LED const int PULSADOR = 2; // pin para el pulsador
int valor = 0; // variable para almacenar el pulsador int old_valor = 0; // estado anterior del pulsador boolean estado = false; // FLASE = LED apagado TRUE = LED encendido int brillo = 128; // Variable para el brillo. Inicial a media carga unsigned long inicio_pulso = 0; // medirá la duracion de la pulsación
void setup() { pinMode(LED, OUTPUT); // LED es una salida pinMode(PULSADOR, INPUT); // y PULSADOR es una salida } void loop() {
valor = digitalRead(PULSADOR); // Leemos el estado del pulsador if ((valor == HIGH) && (old_valor == LOW)) // si hay una pulsación { estado = !estado; // cambiamos el estado del LED, // ante cualquier pulsacion apagamos si estaba encendido o al reves inicio_pulso = millis(); //esta funcion cuenta el tiempo pasado // desde que se inició el sketch. Nos servirá para medir //la duración de la pulsación delay(10);// Este delay evita los rebotes del pulsador. }
// Comprobemos ahora si el interruptor sigue pulsado if ((valor == HIGH) && (old_valor == HIGH)) { // Y ahora la condicion que esté pulsado más de 500 ms if (estado == 1 && (millis() - inicio_pulso) > 500) { brillo++; // esta función es equivalente a brillo=brillo + 1; delay(10); // "entretenemos" al Arduino para que el brillo // no se incremente demasiado rapido if (brillo > 255) // 255 es el maximo de la salida PWM { brillo = 0; // y si la superamos lo reseteamos a 0 } } } old_valor = valor; // machacamos el valor anterior con el nuevo if (estado == true) {// Si estado TRUE, encendemos el LED analogWrite(LED, brillo); // Enciende el LED } else { analogWrite(LED, 0); // Apaga el LED } }
El programa lo podéis descargar desde aquí.
La particularidas de este sketch respecto al ejercicio con PWM, radica en la parte que mide la longitud de la pulsación. Es esta:
if ((valor == HIGH) && (old_valor == HIGH)) {
En esta línea le decimos que evalue si estamos todavía pulsando el pulsador, es decir si el valor anterior y el actual sique siendo 1, estamos todavía pulsando.
La particularidas de este sketch respecto al ejercicio con PWM, radica en la parte que mide la longitud de la pulsación. Es esta:
if ((valor == HIGH) && (old_valor == HIGH)) {
En esta línea le decimos que evalue si estamos todavía pulsando el pulsador, es decir si el valor anterior y el actual sique siendo 1, estamos todavía pulsando.
if (estado == 1 && (millis() - inicio_pulso) > 500)
Aquí medimos la duración de la pulsación. Si es superior a medio segundo (500ms), comenzamos a subir la luminosidad incrementando la variable que usamos para la señal PWM, Es esta línea,brillo++; // esta función es equivalente a brillo=brillo + 1;
Después de esto, simplemente machacamos el valor anterior del pulsador, escribimos la salida, y comenzamos de nuevo el bucle.Un par de apuntes más sobre el funcionamiento:
- En condiciones iniciales, la primera vez que se enciende el LED lo hará a mitad de brillo. (brillo 128). Si queremos variar este valor recordad que como máximo puede ser de 255.
- Mientras no se desconecte el Arduino de la tensión, recordará el último valor que tenía antes de apagar el LED la próxima vez que lo encienda.
- Si os fijáis en los últimos segundos del video, incluso con el retraso para evitar rebotes, el Arduino recibe una falsa señal y cambia sus estado. En aplicaciones críticas es muy recomendable colocar un condensador en la resistencia de pull-down, tal y como vimos en su día. Podéis repasarlo aquí.
Os dejo el enlace con una muestra del funcionamiento. Nos vemos.
No hay comentarios:
Publicar un comentario