/* Serve a capire se azionando l'interruttore
(PIN / Ingresso 5) La Lampada si stia accendendo o spegnendo
la lampada (PIN / Uscita 13).
Se la lampada viene accesa l'altoparlante (PIN / Uscita 12)
emetterà "Do, Re, Mi", mentre se viene spenta
non ci sarà alcun suono.
Sketch con funzione millis anziché delay */

// Associazione Pin In/Out
const int Interruttore = 2; // Ingresso Interruttore
const int Lampada = 13; // Uscita Lampada
const int Altoparlante = 12; // Uscita Altoparlante
// Variabile per Interruttore
int val = 0; // Valore Iniziale Interruttore
// Variabili di Tempo / Conteggio
unsigned long previousMillis = 0; // Valore Iniziale Timer
const long interval = 1000; // Intervallo in millisecondi (1 secondo)
int counter = 0; // Timer
void setup() {
  // Settaggio In e Out
  pinMode(Interruttore, INPUT); // Interruttore come Ingresso
  pinMode(Lampada, OUTPUT); // Lampada come Uscita
  pinMode(Altoparlante, OUTPUT); // Altoparlante come uscita
  Serial.begin(9600); // Inizializza Stampante Seriale
  }

void loop() {
  // Associa Interruttore a val
  val = digitalRead(Interruttore);

// Se l'interruttore (val) è HIGH ...
if (val == HIGH) {
  digitalWrite(Lampada, HIGH); // Accendi la Lampada
  counterGo(); // Inizia Conteggio
  } else { // Se l'interruttore (val) è LOW ...
    digitalWrite(Lampada, LOW);
    counter = 0; // Resetta Timer
  }
  
  // Se l'interruttore (val) è HIGH e il Conteggio è inferiore a 6 secondi ...
  if (val = HIGH && counter > 0 && counter < 6) {
  suonaMelodia(); // Avvia Ciclo Melodia
  } else { // Se l'interruttore (val) è  LOW o il Conteggio è superiore a 10 secondi ....
    noTone(Altoparlante); // Non Emettere Suono
  }
  }

// Ciclo Melodia "Do, Re Mi"
void suonaMelodia() {
  if (counter > 0 && counter < 2) { // Se conteggio è a 1 secondo
  tone(Altoparlante, 262); // Emetti Do
  }
  if (counter > 1 && counter < 3) { // Se conteggio è a 2 secondi
  noTone(Altoparlante); // Non Emettere Suono
  }
  if (counter > 2 && counter < 4) { // Se conteggio è a 3 secondi
  tone(Altoparlante, 294); // Emetti Re
  }
  if (counter > 3 && counter < 5) { // Se conteggio è a 4 secondi
  noTone(Altoparlante); // Non Emettere Suono
  }
  if (counter > 4 && counter < 6) { // Se conteggio è a 5 secondi
  tone(Altoparlante, 330); // Emetti Mi
  }
}

// Ciclo contaggio
void counterGo() {
  unsigned long currentMillis = millis(); // Crea Variabile con valore millis
  
  // Se è passato almeno un secondo ...
  if (currentMillis - previousMillis >= interval) {
  previousMillis = currentMillis; // Associa il valore di millis a previousMillis
  counter++; // Inizia Conteggio Timer
  Serial.println(counter); // Stampa il valore del contatore (opzionale)
  }
  }