Comme indiqué dans les réponses tu peux réécrire en supprimant les délais et en réécrivant le code sous forme d'automate.
Mais ça risque d'être compliqué et (très) fastidieux.
Je te propose une méthode qui implique le minimum de modifications sur le programme.
Il s'agit de tester les boutons pendant les delay(). Pour cela on remplace le delay() par une fonction qui fait effectue un delay tout en testant le bouton. Si le bouton est enfoncé on effectue un long jump qui retourne au début de la loop().
#include <setjmp.h>
#define t 30
#define t1 20
#define t2 100
#define t3 50
int j;
int k;
int i;
int bouton = 1;
int etat;
int effet;
// fonction pour remplacer delay()
#define delay(d) _delay(d)
jmp_buf jBuffer;
void _delay(unsigned long d)
{
for (unsigned long start = millis(); millis() - start < d;)
{
if (digitalRead(bouton) == LOW)
longjmp(jBuffer, 1); // retourne en début de loop
}
}
void setup() {
// set up pins 2 to 13 as outputs
for (int i = 2; i <= 13; i++) {
pinMode(i, OUTPUT);
}
pinMode(bouton, INPUT_PULLUP);
effet = 1;
}
void effect1()
{
for (int i = 2; i < 13; i = i + 2) {
digitalWrite(i, HIGH);
delay(40);
}
for (int i = 13; i > 2; i = i - 2) {
digitalWrite(i, HIGH);
delay(40);
}
for (int i = 2; i < 13; i = i + 2) {
digitalWrite(i, LOW);
delay(40);
}
for (int i = 13; i > 2; i = i - 2) {
digitalWrite(i, LOW);
delay(40);
}
}
void effect2()
{
for (int i = 2; i < 14; i++) {
digitalWrite(i, HIGH);
delay(20);
digitalWrite(i, LOW);
delay(20);
}
}
void effect3()
{
for (int i = 2; i < 14; i++) {
digitalWrite(i, HIGH);
delay(20);
digitalWrite(i, LOW);
delay(20);
}
for (int i = 13; i > 1; i--) {
digitalWrite(i, HIGH);
delay(20);
digitalWrite(i, LOW);
delay(20);
}
}
void effect4()
{
j = 8;
for (int i = 7; i > 1; i--) {
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
delay(50);
digitalWrite(i, LOW);
digitalWrite(j, LOW);
delay(50);
j = j + 1;
}
}
void effect5()
{
j = 8;
for (int i = 7; i > 1; i--) {
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
delay(50);
j = j + 1;
}
j = 13;
for (int i = 2; i < 8; i++) {
digitalWrite(i, LOW);
digitalWrite(j, LOW);
delay(50);
j = j - 1;
}
}
void effect6()
{
for (int k = 1; k < 5; k++) {
j = 3;
for (int i = 2; i < 14; i += 2) {
digitalWrite(i, HIGH);
digitalWrite(j, LOW);
j = j + 2;
}
delay(100);
j = 3;
for (int i = 2; i < 14; i += 2) {
digitalWrite(i, LOW);
digitalWrite(j, HIGH);
j = j + 2;
}
delay(100);
}
for (int i = 2; i < 14; i++) {
digitalWrite(i, LOW);
}
delay(300);
for (int i = 2; i < 14; i++) {
digitalWrite(i, HIGH);
}
delay(300);
for (int i = 2; i < 14; i++) {
digitalWrite(i, LOW);
}
delay(300);
for (int i = 2; i < 14; i++) {
digitalWrite(i, HIGH);
}
delay(300);
for (int i = 2; i < 14; i++) {
digitalWrite(i, LOW);
}
delay(300);
for (int i = 2; i < 14; i++) {
digitalWrite(i, HIGH);
}
delay(300);
for (int i = 2; i < 14; i++) {
digitalWrite(i, LOW);
}
delay(300);
}
void effect7()
{
if (k < 2)
{
j = 13;
for (int i = 2; i < 13; i = i + 2) {
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
delay(70);
digitalWrite(i, LOW);
digitalWrite(j, LOW);
j = j - 2;
}
}
else {}
j = 5;
for (int i = 10; i > 1; i = i - 2) {
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
delay(70);
digitalWrite(i, LOW);
digitalWrite(j, LOW);
j = j + 2;
}
j = 11;
for (int i = 4; i < 13; i = i + 2) {
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
delay(70);
digitalWrite(i, LOW);
digitalWrite(j, LOW);
j = j - 2;
}
k = 5;
}
void effect8()
{
j = 13;
k = 2;
for (int i = 2; i < 14; i++) {
while (k < j + 1) {
digitalWrite(k, HIGH);
delay(50);
if (k != j) {
digitalWrite(k, LOW);
}
else {}
k = k + 1;
}
digitalWrite(j, HIGH);
delay(50);
j = j - 1;
k = 2;
}
for (int i = 2; i < 14; i++) {
digitalWrite(i, LOW);
delay(50);
}
//pareil dans l'autre sens
j = 2;
k = 13;
for (int i = 2; i < 14; i++) {
while (k > j - 1) {
digitalWrite(k, HIGH);
delay(50);
digitalWrite(k, LOW);
k = k - 1;
}
digitalWrite(j, HIGH);
delay(50);
j = j + 1;
k = 13;
}
for (int i = 13; i > 1; i--) {
digitalWrite(i, LOW);
delay(50);
}
}
void effect9() {
for (int i = 2; i < 14; i++) {
digitalWrite(i, HIGH);
}
delay(500);
}
void loop()
{
int val = setjmp(jBuffer); // on revient ici en cas d'appui
etat = digitalRead(bouton);
if (etat == LOW) {
effet++;
for (unsigned long start = millis(); millis() - start < 20; ); // anti rebond ne pas utiliser delay
while (digitalRead(bouton) == LOW); // attente relachement
}
if (effet == 1) {
effect1();
}
else if (effet == 2) {
effect2();
}
else if (effet == 3) {
effect3();
}
else if (effet == 4) {
effect4();
}
else if (effet == 5) {
effect5();
}
else if (effet == 6) {
effect6();
}
else if (effet == 7) {
effect7();
}
else if (effet == 8) {
effect8();
}
else if (effet == 9) {
effect9();
}
else {
effet = 0;
}
}