// Link to Origianl sketch: https://wokwi.com/projects/421315105315990529


void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(4, INPUT_PULLUP);


  // Eseguo il seguente blocco di codice per 10s prima di fare altro
  Serial.print(millis());
  Serial.println(" - Attendo 10 secondi");
  uint32_t timeout = millis();
  while (millis() - timeout <= 10000) {

    // Eseguo il seguente blocco di codice una volta ogni 500ms (blink di un led)
    static uint32_t blinkTime = millis();
    if (millis() - blinkTime >= 500) {
      blinkTime = millis();
      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    }
  }

  Serial.print(millis());
  Serial.println(" - Tempo di attesa trascorso");
  digitalWrite(LED_BUILTIN, LOW);
}

// calcAndPrintTcm Calcola e stampa il tempo di ciclo medio
// tcm è espresso in millesimi di secondo.
// moltiplicare tcm x 1000 per ottenere il tempo in microsecondi
// Decommentare (1) e (2) per stampare il valore  di loopCounter
// oppure calcolarlo manualmente così: lc = 1000 / tcm.
void calcAndPrintTcm() {
    static uint32_t loopCounter;
    static uint32_t oneSec = millis();
    loopCounter++;
    if (millis() - oneSec >= 1000) {
        oneSec = millis();
        float tcm = 1000.0/loopCounter;
        Serial.print("Tempo di ciclo medio: ");
        Serial.print(tcm, 5);
        Serial.println(" ms");
        //Serial.print("loopCounter: ");  // (1)
        //Serial.println(loopCounter);    // (2)

        loopCounter = 0;
    }
}


void loop() {
  
  static uint32_t pressTime = millis();
  static bool toggleLed = false;
  calcAndPrintTcm(); // chiama la funzione calcAndPrintTcm() 

  // Gestione del pulsante: la variabile toggleLed in AND con digitalRead() 
  // fa in modo che questo blocco di codice viene eseguito una volta soltanto 
  // quando il pulsante viene premuto fino a quando non saranno passati 5s
  if (!toggleLed && digitalRead(4) == LOW) {
    toggleLed = true;
    pressTime = millis();
    Serial.print(pressTime);
    Serial.println(" - Pulsante premuto");
  }

  // Eseguo il seguente blocco di codice 5 secondi dopo aver premuto il pulsante
  if (toggleLed && millis() - pressTime >= 5000) {
    toggleLed = false;
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    Serial.print(millis());
    Serial.println(" - Uscita LED invertita");
    // per simulare del codice che impegna in modo esclusivo la 
    // cpu per 500 millesimi di secondo.
    // Togli il commento e osserva tcm che aumenta del doppio.
    // delay(500);  //(3) mezzo secondo di impiego esclusivo della CPU
  }
  
}

uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
led1:A
led1:C