Compila, ma non l'ho provato:
// Il led lampeggia se premo il pulsante
// premendo una seconda volta il pulsante si spegne il led
#define LED 13
#define BUTTON 7
int val = 0; // stato attuale del pulsante
int vecchio_val = 0; // stato del pulsante nella lettura precedente
int stato = 0; // 0 = led spento, 1 = led lampeggiante
int ledState = LOW; // stato attuale del led
long previousMillis = 0;
long interval = 1000; // semiperiodo di lampeggio del led
void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop() {
val = digitalRead(BUTTON);
if ((val == HIGH) && (vecchio_val == LOW)) {
// inverto il flag di abilitazione al lampeggio
stato = 1 - stato;
// non appena cambia il flag di abilitazione al lamepggio
// aggiorniamo lo stato del led
if (stato == 0) {
// se il lampeggio è stato disabilitato, spegnamo subito il led
ledState = LOW;
digitalWrite(LED, ledState);
}
else {
// se il lampeggio è stato abilitato, accendiamo subito il led
// e inizializziamo il timer del lampeggio
ledState = HIGH;
digitalWrite(LED, ledState);
previousMillis = millis(); // il led cambierà stato dopo interval ms da ora
}
delay(15);
}
vecchio_val = val;
if (stato == 1) {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(LED, ledState);
}
}
else {
// probabilmente questo ora non serve
digitalWrite(LED, LOW);
}
}
L'idea è che se vuoi reagire immediatamente alla pressione del pulsante, allora devi pilotare il led non appena ha rilevato tale evento.