const int trimmerPin = A0; // Pin del trimmer
const int buttonPin = 2; // Pin del pulsante
const int lightPin = 13; // Pin della luce
const int enablePin = 3; // Pin per abilitare il temporizzatore
unsigned long timerStart = 0; // Tempo di inizio conteggio
unsigned long duration = 0; // Durata del timer
bool lightOn = false; // Stato della luce
bool blinkDone = false; // Flag per il lampeggio
// Funzione per calcolare la durata in base al trimmer (da 1 a 20 minuti)
unsigned long getTimerDuration() {
int trimmerValue = analogRead(trimmerPin);
return map(trimmerValue, 0, 1023, 60000, 1200000); // Da 1 min (60.000 ms) a 20 min (1.200.000 ms)
}
// Funzione per far lampeggiare la luce 'times' volte con un intervallo 'interval' ms
void blinkLight(int times, int interval) {
for (int i = 0; i < times; i++) {
digitalWrite(lightPin, LOW);
delay(interval);
digitalWrite(lightPin, HIGH);
delay(interval);
}
}
void setup() {
pinMode(trimmerPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(lightPin, OUTPUT);
pinMode(enablePin, INPUT_PULLUP); // Abilita il pull-up interno (HIGH di default)
}
void loop() {
// Se il pin 3 non è a massa (LOW), non fare nulla
if (digitalRead(enablePin) == HIGH) {
digitalWrite(lightPin, LOW); // Assicura che la luce resti spenta
lightOn = false;
return;
}
duration = getTimerDuration(); // Aggiorna la durata in base al trimmer
// Controlla la pressione del pulsante per accendere la luce
if (digitalRead(buttonPin) == LOW && !lightOn) {
lightOn = true;
blinkDone = false;
digitalWrite(lightPin, HIGH);
timerStart = millis();
delay(200); // Debounce
}
if (lightOn) {
unsigned long elapsedTime = millis() - timerStart;
// Negli ultimi 10 secondi, la luce lampeggia 3 volte
if (!blinkDone && elapsedTime >= duration - 10000) {
blinkLight(3, 300); // 3 lampeggi con 300ms di intervallo
blinkDone = true;
}
// Spegnimento al termine del tempo impostato
if (elapsedTime >= duration) {
digitalWrite(lightPin, LOW);
lightOn = false;
}
}
}