Mi código:
#define MAX 10
const int LED1 = 2;
const int LED2 = 8;
const int LED3 = 4;
const int LED4 = 5;
int val;
int array[MAX];
int counter = 0;
int i;
int old_b = 0;
int error;
void setup() {
Serial.begin(9600);
pinMode(A5, INPUT_PULLUP);
}
int readButtons(int pin) {
int b,c;
c=analogRead(pin);
Serial.print("analogRead = ");
Serial.println(c);
delay(100);
if (c>1015) b = 0;
else if (c>70 && c<76) b = 1;
else if (c<128 && c>122) b = 2;
else if (c>169 && c<175) b = 3;
else if (c>209 && c<217) b = 4;
else if (c>247 && c<256) b = 5;
else if (c>280 && c<291) b = 6;
else b = 0;
if (b == old_b) {
return 0;
old_b = b;
} else {
return b;
stari_b = b;
}
}
void loop() {
while ((val = readButtons(5)) != 5) {
if (val == 1) {
array[counter] = 1;
counter++;
Serial.print("In ");
Serial.print(counter);
Serial.print(" saving ");
Serial.println("1");
delay(500);
} else if (val == 2) {
array[counter] = 2;
counter++;
Serial.print("In ");
Serial.print(counter);
Serial.print(" saving ");
Serial.println("2");
delay(500);
} else if (val == 3) {
array[counter] = 3;
counter++;
Serial.print("In ");
Serial.print(counter);
Serial.print(" saving ");
Serial.println("3");
delay(500);
} else if (val == 4) {
array[counter] = 4;
counter++;
Serial.print("In ");
Serial.print(counter);
Serial.print(" saving ");
Serial.println("4");
delay(500);
}
if (counter == MAX) {
counter = 0;
}
}
for (i = 0; i < MAX; i++) {
if (array[i] == 1) {
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
delay(1000);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
delay(1000);
Serial.print("Executing ");
Serial.print(i);
Serial.print(" ");
Serial.println(array[i]);
delay(500);
}
if (array[i] == 2) {
digitalWrite(LED1, HIGH);
digitalWrite (LED2, HIGH);
delay(1000);
digitalWrite(LED1, LOW);
digitalWrite(LED2,LOW);
delay(1000);
Serial.print("Executing ");
Serial.print(i);
Serial.print(" ");
Serial.println(array[i]);
delay(500);
}
if (array[i] == 3) {
digitalWrite(LED2, HIGH);
digitalWrite(LED4, HIGH);
delay(1000);
digitalWrite(LED2, LOW);
digitalWrite(LED4, LOW);
delay(1000);
Serial.print("Executing ");
Serial.print(i);
Serial.print(" ");
Serial.println(array[i]);
delay(500);
}
if (array[i] == 4) {
digitalWrite(LED1, HIGH);
digitalWrite(LED3, HIGH);
delay(1000);
digitalWrite(LED1, LOW);
digitalWrite(LED3, LOW);
Serial.print("Executing ");
Serial.print(i);
Serial.print(" ");
Serial.println(array[i]);
delay(500);
}
}
}
Así que tengo botones conectados como este , excepto que yo los tengo 5. Cuando uno de los primeros cuatro es presionado el sketch almacena 1,2,3 o 4 para denotar que botones fueron presionados y lo almacena en un array de enteros. Cuando el quinto (el botón "GO") es presionado el bucle while termina y comienza el bucle for que de acuerdo a los botones presionados parpadea los LEDs. Quiero hacer que mientras el Arduino parpadea los LEDs, es decir, mientras se ejecuta el bucle for, si en algún momento se pulsa el quinto botón "GO" debe dejar de parpadear los LEDs y comenzar el programa desde el principio ( void loop { ... } ) es decir, esperar de nuevo a las pulsaciones de los cuatro primeros botones.
Me las arreglé para hacer esto:
#define MAX 50
const int LED1 = 2;
const int LED2 = 3;
const int LED3 = 4;
const int LED4 = 5;
int array[MAX];
int old_b = 0;
int val;
int counter = 0;
int i;
int temp;
int L1;
int L2;
void setup () {
pinMode (A5, INPUT_PULLUP);
Serial.begin(9600);
}
int readButtons (int pin) {
int b, c;
c = analogRead(pin);
Serial.print("analogRead = ");
Serial.println(c);
delay(100);
if (c > 1015) b = 0;
else if (c > 70 && c < 76) b = 1;
else if (c > 122 && c < 128) b = 2;
else if (c > 169 && c < 175) b = 3;
else if (c > 209 && c < 217) b = 4;
else if (c > 247 && c < 256) b = 5;
else if (c > 280 && c < 291) b = 6;
else b = 0;
if (b == old_b) {
return 0;
old_b = b;
} else {
return b;
old_b = b;
}
}
void loop () {
while ((val = readButtons(5)) != 5) {
if ((val == 1) || (val == 2) || (val == 3) || (val == 4)) {
array[counter] = val;
Serial.print("In ");
Serial.print(counter);
Serial.print(" saving ");
Serial.println(val);
delay(200);
counter++;
if (counter == MAX) {
counter = 0;
}
}
}
temp = counter;
counter = 0;
for (i = 0; i < temp; i++) {
if (array[i] % 2 == 0) {
L1 = 2;
L2 = array[i] / 3 + 3;
} else {
L2 = 5;
L1 = array[i] % 3 + 3;
}
if (readButtons(5) != 5) {
digitalWrite (L1, HIGH);
if (readButtons(5) != 5) {
digitalWrite (L2, HIGH);
delay(1000);
digitalWrite (L1, LOW);
digitalWrite (L2, LOW);
if (readButtons(5) == 5) {
i = temp;
}
} else {
digitalWrite (L1, LOW);
i = temp;
}
}
}
}
Así que todavía tengo una función que detecta si un botón fue presionado. Antes de eso, he determinado en qué rango están los valores de cierto botón. En el while () {...}
mientras el 5º botón no está pulsado, Arduino está "buscando" si alguno de los cuatro primeros botones fue pulsado. Si lo fue lo almacena en un array y si no sigue "buscando". Cuando el 5º botón es presionado, frenamos y almacenamos el último lugar conocido en el array en el que se almacenó el valor y ponemos el contador de lugares a cero para que al comenzar de nuevo, Arduino almacene los valores en el primer lugar del array. Luego en base a lo almacenado determino que pin/LED se encenderá. Si en cualquier momento durante el parpadeo de los LEDs se vuelve a pulsar el quinto botón, Arduino detiene el parpadeo y vuelve a esperar las pulsaciones de los cuatro primeros botones. Así es como se supone que funciona en teoría. En la práctica todavía no consigo que deje de parpadear cada vez que se vuelve a pulsar el 5º botón. Tengo que pulsarlo varias veces, a veces dos o incluso más. No creo que usar interrupciones ayude, ya que no sé cómo podría usarlas en mi problema.