RULETA LUMINOSA CON PULSADOR DE PARE

OBJETIVOS:

Función millis frente a delay.
Números aleatorios.

 

MATERIAL:

5 leds.
5 R de 330 Ω.
1 pulsador.
1 R de 10 KΩ.
1 timbre ó piezoelectrico de 5 V.

 

 

OPCION UTILIZANDO DELAY OPCION SIN UTILIZAR DELAY

/* Ruleta con delay, y
* con pulsador para pararla
*/

// Intervalo de conmutación (milisegundos)
int intervalo = 100;
//Primer Pin para conectar los led
int i=2;
int pulsador=12;

void setup() {
//Configuro pines del 2 al 6 como salidas
for (int i=2; i<7; i++) pinMode (i,OUTPUT);
//Configuro pin 12 como entrada
pinMode (pulsador,INPUT);
}

void loop() {
digitalWrite(i,HIGH);
if (digitalRead (pulsador)==LOW){
delay (intervalo);
digitalWrite(i+1,HIGH);
digitalWrite(i,LOW);
i++;
//Para que i varié solo de 2 a 6
if(i>=7) i=2;
}
}

/* Ruleta sin utilizar delay
* con pulsador para pararla
*/
// Almacena la última vez que la ruleta paro
long millisPrevio = 0;
// Intervalo conmutación (milisegundos)
int intervalo = 100;
//Primer Pin para conectar los led
int i=2;
int pulsador=12;

void setup() {
//Configuro pines del 2 al 6 como salidas
for (int i=2; i<7; i++) pinMode (i,OUTPUT);
//Configuro pin 12 como entrada
pinMode (pulsador,INPUT);
}

void loop() {
if (digitalRead (pulsador)==LOW){
digitalWrite(i,HIGH);
if (millis() - millisPrevio > intervalo) {
millisPrevio = millis();
digitalWrite(i+1,HIGH);
digitalWrite(i,LOW);
i++;
if(i>=7) i=2;
}
}
}

fotoRuleta EsquemaRuleta

 

Mas difícil todavía, en estas opciones el intervalo de tiempo entre leds es aleatorio, cambia cada vez que paramos la ruleta al tocar el pulsador. Al implementar un pito que suene cada 3 segundos en la rutina sin utilizar delay funciona perfectamente, sin embargo si usamos delay, dependera del valor del intervalo, y como en este caso es aleatorio, no funcionara.

OPCION UTILIZANDO DELAY OPCION SIN UTILIZAR DELAY

/* Ruleta con delay, y
* con pulsador para pararla
*/

// Intervalo de conmutación inicial (milisegundos)
long intervalo = 100;
//Primer Pin para conectar los led
int i=2;
int pulsador=12;
int pito=13;

void setup() {
//Configuro consola
Serial.begin(9600);
//Configuro pines del 2 al 6 como salidas
for (int i=2; i<7; i++) pinMode (i,OUTPUT);
//Configuro pin 12 como entrada
pinMode (pulsador,INPUT);
//Configuro pin 13 como salida
pinMode (pito,OUTPUT);
//inicializa randon
randomSeed(millis());
}

void loop() {
digitalWrite(i,HIGH);
if (digitalRead (pulsador)==LOW){
delay (intervalo);
digitalWrite(i+1,HIGH);
digitalWrite(i,LOW);
i++;
//Para que i varié solo de 2 a 6
if(i>=7) i=2;
}
//intervalo aleatorio entre 10 y 200
else intervalo=random(10,200);
//Serial.println (intervalo); //Consume muchos recursos
// Evidentemente aquí fallara pues delay condiciona
if (millis()%3000==0)digitalWrite(pito,HIGH);
else digitalWrite(pito,LOW);
}

/* Ruleta sin utilizar delay
* con pulsador para pararla
*/

// Almacena la última vez que la ruleta fue modificada
long millisPrevio = 0;
// Intervalo conmutación inicial(milisegundos)
int intervalo = 100;
//Primer Pin para conectar los led
int i=2;
int pulsador=12;
int pito=13;

void setup() {
//Configuro consola
Serial.begin(9600);
//Configuro pines del 2 al 6 como salidas
for (int i=2; i<7; i++) pinMode (i,OUTPUT);
//Configuro pin 12 como entrada
pinMode (pulsador,INPUT);
//Configuro pin 13 como salida
pinMode (pito,OUTPUT);
//inicializa randon
randomSeed(millis());
}

void loop() {
if (digitalRead (pulsador)==LOW){
digitalWrite(i,HIGH);
if (millis() - millisPrevio > intervalo) {
millisPrevio = millis();
digitalWrite(i+1,HIGH);
digitalWrite(i,LOW);
i++;
if(i>=7) i=2;
}
}
//intervalo aleatorio entre 10 y 200
else intervalo=random(10,200);
//Cada 3 segundos pita, con delay no funcionaria
if (millis()%3000==0)digitalWrite(pito,HIGH);
else digitalWrite(13,LOW);
// Serial.println (millis());//consume muchos recursos
}

fotoConPito EsquemaRuletaPito