Temporizzazione con libreria personalizzata

L'esempio che segue mostra come il codice visto nella sezione precedente si semplifica se le funzioni vengono inserite in una libreria che viene richiamata.

Codice che utlizza la libreria:

#define LED_BUILTIN 13

#include "myTimer.h"

// ledState contiene lo stato del led
int ledState; 

void setup() {
  // inizializza il piedino del LED come output
  pinMode(LED_BUILTIN, OUTPUT);
  // comincio con il led acceso (attenzione al valore di ledState)
  ledState = HIGH;
  // in questo caso la riga di codice digitalWrite(ledPin, ledState) è
  // equivalente a scrivere digitalWrite(ledPin, HIGH)
  digitalWrite(LED_BUILTIN, ledState);
  // inizializzo la temporizzazione a 1000 millisecondi
  timerInit(1000);
}

void loop() {
  // controlla se è il momento di far lampeggiare il LED; 
  // ovvero, se la somma tra l'ultima volta che hai lampeggiato 
  // il LED e il periodo di lampeggio è minore dell'istante corrente
  if ( timerIsEOT() ) {
    if (ledState == LOW){
      ledState = HIGH;            
    }
    else{
      ledState = LOW; 
    }
    // a seconda del valore di ledState il led viene spento o acceso
    digitalWrite(LED_BUILTIN, ledState);  
    // una volta aggiornato lo stato del led è necessario
    // far ripartire il conteggio
    timerReset();     
  }
}    

Codice contenuto nel file myTimer.h. Per poter compilare correttamente il codice è necessario che la libreria myTimer.h. sia nella stessa directory del file .ino che si sta compilando.

#ifndef __MYTIMER_H__
#define __MYTIMER_H__

    static unsigned long previousMillis;  
    static unsigned long interval;
    // la seguente funzione fa partire la temporizzazione con
    // il valore dato in ingresso in millisecondi
    inline void timerInit(unsigned long milliseconds){
      interval = milliseconds;
      previousMillis = millis();
    }
    // la seguente funzione fa ripartire la temporizzazione
    // e non prevede alcun dato in ingresso
    inline void timerReset(void){
      previousMillis = millis();
    }
    // la seguente funzione controlla se il tempo trascorso
    // è superiore all'intervallo (in questo caso si è raggiunta
    // la fine del conteggio EOT=end of time).
    // Se il tempo è trascorso viene restituto 1, altrimenti 0.
    // Non è previsto alcun valore in ingresso
    inline int timerIsEOT(void){
      if (millis()>=previousMillis+interval) return 1;
      else return 0;
    }

#endif
Ultime modifiche: domenica, 11 dicembre 2022, 15:20