Veamos otro ejemplo con el uso de PWM.
El enunciado del ejemplo sería programar un bucle que
encienda un led de manera progresiva hasta su máxima luminosidad y lo apague de
la misma manera. Pretendemos simular algo parecido al comportamiento de un led
en standby de un portátil.
Para ello, utilizaremos el bucle for que ya vimos en pasadas
entradas y la función analogWrite().
Usaremos el mismo montaje de la entrada anterior.
El algoritmo del programa
sería algo como esto:
- Inicializar entradas y salidas.
- Hacer un bucle ascendente de 0 a 255 (valor máximo y mínimo) que incremente la salida analógica.
- Hacer un bucle descendente que de 255 a 0 que vaya apagando el led.
- Repetir indefinidamente...
//Ejemplo 1_5. Encendido y apagado progresivo de un led // Modificaremos su luminosidad actuando sobre el ciclo de carga // de la seña de salida const int LED = 9; // Pin conectado al LED int i = 0; // Variable que usaremos para el bucle for void setup() { pinMode(LED, OUTPUT); // Configuramos el pin como salida } void loop() { for (i = 0; i < 255; i++) // bucle de 0 a 254 (fade in).Vamos // incrementando el ciclo de trabajo { //de 0 a 255 analogWrite(LED, i); // esta línea configura el brillo del LED delay(10); // Colocamos una espera de 10ms para poder apreciar // el efecto. De otro modo sería tan inmediato que //no lo veríamos }//fin del primer for. for (i = 255; i > 0; i--) { // bucle de 255 a 1 (fade out) analogWrite(LED, i); // esta línea configura el brillo del LED delay(10); // Espera de 10ms } }
Lo podéis encontrar para descargarlo aquí:
Cómo sería el algoritmo en esta ocasión:
Seguidamente ponemos una condición con un IF, (ya lo trabajamos aquí), para detectar un flanco positivo en la entrada, (vamos una pulsación):
Y pasamos a copiar el código anterior. Tan solo debemos recordar salir del bucle volviendo a apagar el LED en espera de otra pulsación.
El sketch para descarga lo puedes encontrar aquí.
Este montaje tiene muchas posibilidades. Podríamos intentar por que tras la pulsación repita el ciclo n número de veces y se apague.
Otra aún más interesante, que una pulsación comience el ciclo y otra lo apague (con un solo pulsador). Os dejo con el vídeo del funcionamiento de los dos ejemplos, y en la próxima entrada la solución a estas dos propuestas. Nos vemos.
El código es bastante sencillo, así que vamos a añadir un
mínimo de complejidad. Vamos a modificar el ejemplo para que sea la activación
de un pulsador la que inicie el ciclo.
Cómo sería el algoritmo en esta ocasión:
- Inicializar entradas y salidas.
- Leer el estado del pulsador e iniciar el ciclo si se pone a “1”, (se pulsa)
- Hacer un bucle ascendente de 0 a 255 (valor máximo y mínimo) que incremente la salida analógica.
- Hacer un bucle descendente que de 255 a 0 que vaya apagando el led.
- Repetir indefinidamente…
Ok, sencillo ¿no? Solo hemos añadido una línea en el algoritmo, y ¿en el sketch? Dad le una
vuelta antes de seguir leyendo…
…Una vuelta más…
… ¿Ya? Bien pues aquí mi propuesta:
//Ejemplo 1_5b. Encendido y apagado progresivo de un led // modificando su luminosidad actuando sobre el ciclo de carga // de la seña de salida. El ciclo lo inicia una pulsación const int LED = 9; // Pin conectado al LED const int pulsador = 2 ; //Pin conectado al pulsador int i = 0; // Variable que usaremos para el bucle for void setup() { pinMode(LED, OUTPUT); // Configuramos el pin como salida pinMode(pulsador, INPUT); //Configuramos el pin como entrada } void loop() { digitalWrite (LED, LOW); //Fijamos la condición inicial del LED if ( digitalRead(pulsador) == HIGH ) { for (i = 0; i < 256; i++) // bucle de 0 a 255 (fade in).Vamos // incrementando el ciclo de trabajo { //de 0 a 255 analogWrite(LED, i); // esta línea configura el brillo del LED delay(10); // Colocamos una espera de 10ms para poder apreciar // el efecto. De otro modo sería tan inmediato que //no lo veríamos }//fin del primer for. for (i = 255; i > 0; i--) { // bucle de 255 a 1 (fade out) analogWrite(LED, i); // esta línea configura el brillo del LED delay(10); // Espera de 10ms } // fin del segundo for }//Fin condición de la pulsación digitalWrite (LED, LOW); //Apagamos el LED en espera de otro pulso }
¿En qué varía el código? Bien de entrada fijamos que cuando
se ejecuta el bucle, el LED esté apagado en espera de recibir una pulsación.
digitalWrite (LED, LOW);
Seguidamente ponemos una condición con un IF, (ya lo trabajamos aquí), para detectar un flanco positivo en la entrada, (vamos una pulsación):
if ( digitalRead (pulsador == HIGH ))
Y pasamos a copiar el código anterior. Tan solo debemos recordar salir del bucle volviendo a apagar el LED en espera de otra pulsación.
digitalWrite (LED, LOW);
Este montaje tiene muchas posibilidades. Podríamos intentar por que tras la pulsación repita el ciclo n número de veces y se apague.
Otra aún más interesante, que una pulsación comience el ciclo y otra lo apague (con un solo pulsador). Os dejo con el vídeo del funcionamiento de los dos ejemplos, y en la próxima entrada la solución a estas dos propuestas. Nos vemos.
No hay comentarios:
Publicar un comentario