venerdì 3 giugno 2022

Uso di millis() - esempio 1

Il breve sketch seguente è una semplice applicazione della funzione millis(), la quale viene usata per temporizzare lo stato del pin 13, a cui volendo potremmo collegare un led o un relay

Descrizione

All'avvio il pin 13 è in HIGH. Resta HIGH per 1 minuti. Trascorso 1 minuti pin 13 passa allo stato opposto LOW e permane per 5 minuti, trascorsi i quali il tutto si ripete.

Considerazioni

Lo sketch è "NoN Bloccante" e quindi può essere integrato in applicazioni che richiedono reattività, ad esempio per intercettare un evento come la pressione di un pulsante ecc.  Ho impiegato 4 variabili globali, come al solito il prefisso è g_nomevariabile. Per comodità ho usato la macro MIN_TO_MILLIS(m) che effettua l'operazione m x 60000 nel momento della compilazione. Il valore della variabile g_interval viene modificato in funzione dello stato della variabile g_relayState .



#define PIN_RELAY 13

#define MIN_TO_MILLIS(m) (m * 60000UL)

bool g_relayState = HIGH;
bool g_relayOldState = LOW;

uint32_t g_saveMillis;
uint32_t g_interval;

void setup()
{
Serial.begin(115200);
pinMode(PIN_RELAY, OUTPUT);
g_saveMillis = millis();
g_interval = MIN_TO_MILLIS(1);
Serial.println(MIN_TO_MILLIS(1));
Serial.println(MIN_TO_MILLIS(2));
} // end void setup()


void loop() {

if ( millis() - g_saveMillis > g_interval ) {
g_relayState = !g_relayState;
g_saveMillis = millis();
}

if (g_relayState != g_relayOldState) {
digitalWrite(PIN_RELAY, g_relayState);
g_relayOldState = g_relayState;
if (g_relayState) {
g_interval = MIN_TO_MILLIS(1);
} else {
g_interval = MIN_TO_MILLIS(5);

}
}
} // end void loop()

Licenza Creative Commons
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.

Nessun commento:

Posta un commento