EJERCICIO 7
Luces del coche fantástico.
Este ejercicio es muy básico y se puede realizar usando delay, pero en él se notará muy claramente el efecto de usar delay y no millis. Si quereis podéis intentar hacerlo usando delay (antes de usar este código) e intentad cambiar la velocidad, veréis como resulta imposible hacerlo y que como mucho conseguiréis cambiar la velocidad cada 8 segundos.
Se trata de hacer que una luz se mueva de izquierda a derecha, y de derecha a izquierda. Para ello realizaremos este montaje:
(ampliad la imagen para verla mejor).
Montaremos 8 leds y le añadiremos dos botones: uno para subir la velocidad del barrido y otro para bajarla.
/*
* EJERCICIO 7.
*
* Luces del coche fantástico.
*
* Vamos a conectar unos leds a los pines del Arduino, no olvidar de poner su resistencia
* limiatadora, y crear las luces del coche fantastico. Añadiremos dos botones: subir y
* bajar, para aumentar/disminuir la velocidad. Usaremos 8 leds.
*
* Cada led irá en un pin del arduino, para no tener que escribir un montón usaremos un
* array "pins" donde se guarda el número de pin. Podremos acceder a cada pin del array
* usando pins[x] (x, es un indice del array).
*
* Usaremos la variable "secuencia" para determinar que led se debe encender en cada
* momento: si secuencia es 0, se enciende el led 0, si 1 el led 1, hasta el 7, que se
* encenderá el led 7.Observamos que en este caso la secuencia coincide con el valor
* del array (el pin) a encender.
*
* Existe otra variable "incremento" que nos servirá para aumentar/disminuir la secuencia.
* Asi si incremento vale uno, secuencia en cada paso irá aumentando en uno: 0, 1, 2, 3, 4,
* 5, 6, 7. Cuando la secuencia llegue a 7 no nos interesa que sigua incrementado sino que
* haga todo los contrario, con lo que hacemos que incremento valga -1. Asi en cada paso
* irá restando: 7, 6, 5, 4, 3, 2, 1, 0. Cuando lleguemos a 0 volvemos a poner la secuencia
* a +1 y la variable se irá incrementando.
*
*/
#include <BotonSimple.h>
const int pins[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
BotonSimple botonSubir(8); // El botón que subirá la velocidad.
BotonSimple botonBajar(9); // El botón que bajará la velocidad.
unsigned long tiempoSecuencia; // La variable de tiempo que nos indica cuando cambiar de secuencia.
unsigned long duracionSecuencia = 100; // La duración de la secuencia.
int secuencia; // Secuencia actual.
int incremento; // Incremento.
int i; // Una variable auxiliar para los bucles.
void setup() {
// Iniciamos las salidas.
for (i=0; i<8; i++) {
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], LOW);
}
// Empezamos la secuencia en 0.
secuencia=0;
// El incremento es 1 (de pin a pin).
incremento = +1;
}
void loop() {
// Leemos los botones.
botonSubir.actualizar();
botonBajar.actualizar();
// Si el tiempo trasncurrido desde que tomamos el valor de tiempoSecuencia es
// mayor que lo que debe durar la secuencia, tenemos que cambiar la secuencia
// y apagar encender los leds correspondientes a la secuencia.
if ( millis()-tiempoSecuencia> duracionSecuencia ) {
for (i=0; i<8; i++) {
if ( secuencia==i ) {
digitalWrite(pins[i], HIGH);
}
else {
digitalWrite(pins[i], LOW);
}
}
secuencia+=incremento; // Pasamos a la siguiente secuencia.
if ( secuencia==0 ) incremento=1; // Cuando la secuencia es cero debemos sumar
if ( secuencia==7 ) incremento=-1; // Cuando la secuencia es siete debemos restar.
tiempoSecuencia = millis(); // Volvemos a guardar el tiempo.
}
// Leemos el boton y aumentamos la velocidad, es decir, disminuimos la
// duracion de la secuencia. Controlamos que no valga menos de 10.
// Si la duración de la secuencia fuera 0, daria la sensación de que todos los
// leds están encendidos.
if ( botonSubir.leer()==APRETANDOLO ) {
if ( duracionSecuencia>10 ) duracionSecuencia-=10;
}
// Leemos el boton y disminuimos la velocidad, es decir, aumentamos la
// duracion de la secuencia, la limitamos a 2 segundos entre leds.
if ( botonBajar.leer()==APRETANDOLO ) {
if ( duracionSecuencia<2000 ) duracionSecuencia+=10;
}
}
Para ver el resultado: VIDEO
PD. Este ha costado mas trabajo explicarlo, espero haberlo logrado.