Paso 7: Secuencias más
Tenemos una secuencia que comienza en el pin 3 y enciende cada LED a través del pin 10, luego vuelve en el pin 3. ¿Supongo que querías los LEDs encienden en secuencia y devolver la dirección opuesta? Podemos añadir este efecto ping-pong añadiendo otro bucle después del primer bucle y hacer este uno conteo abajo.
para (i = 7; i > = 0; i--) {}
digitalWrite (posPins [i], HIGH);
delay_(t_delay);
digitalWrite (posPins [i], LOW);
Delay(t_delay);
}
Ahora tenemos dos secuencias, así nuestra segunda secuencia ping-pongs contando y contando hacia abajo. Cómo seleccionamos cada uno cuando se pulsa el botón, debe seleccionar de una lista de secuencias utilizando la sentencia "switch".
La sentencia Switch utiliza una variable, que compara el valor de esa variable a un conjunto de valores, como múltiples sentencias de condición, si se cumple la condición ejecuta las instrucciones que están dentro del alcance de la sentencia case. Adopta la forma siguiente:
{Switch(variable)}
caso 1:
instrucciones de código
rotura;
caso 2:
instrucciones de código
rotura;
por defecto:
instrucciones de código
rotura;
}
La sentencia Switch se pasa una variable, entonces el valor de esa variable se comprueba con los valores para cada instrucción case, que ejecutará entonces las declaraciones de código dentro del ámbito de esa evaluación de su caso y su rotura de cierre;.
Una vez que tenemos una manera de ejecutar secuencias diferentes, necesitamos alguna manera de recibir entradas del usuario para cambiar los Estados; Esto es donde entra el botón.
Hemos conectado un botón al pin 11. El botón está en un estado normalmente abierto, y pin 11 se ata a la tierra a través de un resistor limitador actual de 10K ohmios. Cuando se pulsa el botón, lazos pin 11 a V ++ que es el + 5 v proporcionada por el regulador de potencia de la Mini. La ruta será de V ++ al pin 11 y no a través de la resistencia a tierra cuando se pulsa el botón porque el camino entre + 5V y tierra será el camino de menor resistencia.
Una vez que se pulsa el botón y leemos que hay un alto en el pin 11, añadimos uno a la variable de secuencia. Después de que incrementa la variable de la secuencia, comprobamos para asegurarse de que su valor no es mayor que el número de secuencias (caso Estados) que tenemos. Si es mayor, nos restablecerla para hacer referencia a la primera declaración de caso, a partir de las secuencias de todo.
Nota: no estoy usando la sentencia case default por lo que existen enunciados dentro de su ámbito, por lo que no hace nada pero el final con una instrucción break.
Ahora para poner todo junto, el siguiente código tiene dos secuencias, la primera es la secuencia lineal con que empezamos y la segunda es la secuencia de ping-pong.
/ * Flor LED
* Escrito por Mark S. Drummond, (gravedad Boy) 2009
* Eres libre de utilizar, distribuir, modificar, este código.
* Cualquier crédito se agradecería
*
int num = 255;
int temp = 0;
int numbin [8];
maxLED int = 8;
int maxSequence = 6;
int seqButton = 11;
secuencia de int = 1;
int buttonVal = bajo;
int negPin = 2;
int posPins [] = {3,4,5,6,7,8,9,10};
int i, t;
int t_delay = 100;
int p_offset = 0;
int n_offset = 0;
tSTEP int = 50;
/ * setup() función de inicialización, la palabra "vacía" antes del nombre de la función significa que la función no devuelve un valor. */
void setup() {}
Serial.Begin(9600);
pinMode (negPin, salida);
digitalWrite (negPin, bajo);
para (i = 0; i < maxLED; i ++) {}
pinMode (posPins [i], salida);
digitalWrite (posPins [i], LOW);
}
}
/ * Este es el bucle principal después de todas las variables se declaran y setup() se ejecuta, esta función se bucle una y otra vez. */
void loop() {}
buttonVal = digitalRead(seqButton);
if(buttonVal == High) {/ / leer el valor de pin y verifica si alta
secuencia ++; valor de secuencia de la incremento
Delay(t_delay * 10); Deje el botón de grabación
Prensas múltiples
Si (secuencia > maxSequence) {secuencia = 1;}
}
interruptor (secuencia) {}
caso 1: secuencia de //straight
para (i = 0; i < maxLED; i ++) {}
digitalWrite (posPins [i], HIGH);
Delay(t_delay);
digitalWrite (posPins [i], LOW);
Delay(t_delay);
}
rotura;
caso 2: pong //Ping
Dirección de avance
para (i = 0; i < maxLED; i ++) {}
digitalWrite (posPins [i], HIGH);
Delay(t_delay);
digitalWrite (posPins [i], LOW);
Delay(t_delay);
}
invertir dirección
para (i = (maxLED - 1); i > = 0; i--) {/ / nos estamos haciendo la cuenta regresiva a cero, total - 1
digitalWrite (posPins [i], HIGH);
Delay(t_delay);
digitalWrite (posPins [i], LOW);
Delay(t_delay);
}
rotura;
caso 3: / / todos los demás cambiar
t_delay = 60;
para (i = 0; i < = maxLED; i ++) {}
digitalWrite (posPins [i], t);
Delay(t_delay);
digitalWrite (posPins [i], LOW);
Delay(t_delay);
t de la palanca
Si (t == 0) {}
t = 1;
}
Else {}
t = 0;
}
}
t_delay = 30;
rotura;
caso 4: / / esta secuencia se encenderá el LED del centro hacia fuera
p_offset = 4;
n_offset = 3;
para (i = 0; i < maxLED/2; i ++) {//start en el centro y cuenta a extremos
digitalWrite (posPins [p_offset], HIGH);
digitalWrite (posPins [n_offset], HIGH);
Delay(t_delay);
digitalWrite (posPins [p_offset], LOW);
digitalWrite (posPins [n_offset], LOW);
Delay(t_delay);
++ p_offset; luz en una dirección
--n_offset; mientras que la iluminación en la otra dirección
}
rotura;
caso 5: / / al azar intermitente LED
para (i = 0; i < maxLED; i ++) {}
srand(Rand()); Ajuste de la semilla usando la función rand
randomNumber int = (rand()%maxLED); número aleatorio entre 0 y maxLEDs
digitalWrite (posPins [randomNumber], HIGH);
Delay(t_delay/4); acelerar el retraso que brilla
digitalWrite (posPins [randomNumber], LOW);
Delay(t_delay/4);
}
rotura;
caso 6: / / Inicio rápido y lento final, puede usar esto con diversos patrones.
para (i = 0; i < maxLED; i ++) {}
digitalWrite (posPins [i], HIGH);
Delay((t_delay/2) + (i * tSTEP));
digitalWrite (posPins [i], LOW);
Delay(t_delay);
}
rotura;
caso 7: //Binary contador, cuenta en binario de 8 LED ' s
Utilice esto cuando tenga la resistencia adecuada para cada LED
para (i = 0; i < 255; i ++) {}
int contador = 0;
int index = maxLED - 1;
Num = i;
Temp = num;
mientras (num > 0) {}
++ contador;
Si (num % 2 == 0) {numbin [índice] = 0;}
Else {numbin [índice] = 1;}
Num = num / 2;
--Índice;
} / / después mientras que el lazo se rompe, el resto de numbin [] está lleno de 0s (MSB -> LSB)
/ * Perdonar el formato en línea para los para los bucles, una vez que los conoces, son una fácil lectura * /
para (t = 0; t < (maxLED - contador); t ++) {numbin [t] = 0;}
para (t = 0; t < maxLED -1; t ++) {digitalWrite (posPins [t], binNum[t]);}
Delay(t_delay/2);
para (t = 0; t < maxLED - 1; t ++) {digitalWrite (posPins [t], LOW);}
}
Delay(t_delay * 10);
rotura;
por defecto:
rotura;
} / / fin de instrucción switch
} / / fin función loop() principal
Copia el código y una vez que el programa comienza a funcionar, pulse el botón para cambiar la secuencia lineal de la secuencia de ping-pong. Podemos seguir añadiendo nuevas secuencias mediante la adición de más declaraciones caso antes de la sentencia caso por defecto. La sentencia switch puede usarse para probar cualquier valor de un int, char o Boolean. Incluso puede anidar la sentencia switch si quería añadir algunas variaciones de velocidad a una secuencia.
Hay otro bloque añadido de código al principio de la función loop() principal y antes de la sentencia Switch; se utiliza para leer el valor del botón e incrementar nuestra variable de la secuencia, también comprueba la variable para asegurar que esté dentro de gama antes de entrar en la sentencia Switch; Si variable es mayor que el número de caso declaraciones, restablecer a 1, que es la primera instrucción case.
buttonVal = digitalRead(seqButton); leer estado de botón
if(buttonVal == High) {/ / leer el valor de pin y verifica si alta
secuencia ++; valor de secuencia de la incremento
Delay(t_delay * 10); Deje el botón de grabación
Prensas múltiples
Si (secuencia > maxSequence || secuencia < 0) {secuencia = 1;}
}
El retraso fue creado para empujar el tiempo ms 1000 o 1 segundo para tomar en cuenta el! velocidad del humano pulsando el botón. Tenga en cuenta que he añadido la segunda prueba condicional de secuencia < 0 en el ejemplo anterior y no en el código. Las dos barras || es un valor booleano o, por lo que cualquier declaración es verdadera cumplan la condición y establecer secuencia = 1. Si la primera secuencia > 2 es verdadero, entonces secuencia < 0 no incluso se evaluará.
Un truco para agregar más secuencias es secuencia derecha después el botón al principio de la principal loop(), establezca el valor de secuencia en el caso están trabajando en hacer referencia. Si está trabajando en una nueva secuencia para el caso 3: y desea ejecutar la prueba, pero no quiero presionar cada vez para ver la secuencia que está trabajando en, luego usa fuerza bruta como se muestra a continuación.
buttonVal = digitalRead(seqButton);
if(buttonVal == High) {}
secuencia ++;
Delay(t_delay * 10);
Si (secuencia > maxSequence) {secuencia = 1;}
}
secuencia = 3; Reemplace el código anterior y la secuencia que estamos trabajando en la fuerza
Esto establece explícitamente el valor de la secuencia a 3 después de que el botón Lee. Voy a incluir secuencias adicionales diseñadas para la flor en el archivo PDF al final de este Instructable. Estaba fastidiando con los valores analógicos de los pines analógicos que algunos de los LEDs están vinculados, con la difusión y un lento fundido dentro y fuera, fue un lindo efecto. Rampa hacia arriba y hacia abajo se puede lograr con una para lazo y aumentar y disminuir valores entre + 0V y + 5V.