Creare parte di programma che funzioni indipendentemente dal "void loop"

Salve a tutti, è la prima volta che scrivo su questo forum, ho un paio di progettini che vorrei realizzare con ARDUINO, ma sto avendo alcuni problemi a scrivere il programma.
Mi spiego meglio, in pratica ho la necessità di far funzionare un modulo relè in maniera del tutto indipendente dal "void loop", nel senso che se si dovesse verificare una certa condizione il relè deve accendersi ad intervalli di un secondo, questo sono riuscito a farlo in parte, perché nel loop ho un'altra funzione che al premere di un pulsante mi da dei risultati a schermo (ovviamente ci sono dei delay per tenere i risultati a schermo per qualche secondo) e i relè entrano in conflitto con i delay, perché rimangono accesi anche nel tempo che la scritta rimane sul display. Spero di essermi spiegato bene. Quindi vorrei che le cose siano indipendenti l'una dall'altra, è possibile? Utilizzo Arduino Uno.
Grazie!

Si che si può, ma le funzioni vanno riscritte in modo da non essere sequenze monolitiche di istruzioni.

Piuttosto devono essere richiamate tutte molto rapidamente (decine o centinaia di volte al secondo così si ha l'impressione che vengano eseguite tutte in parallelo) e ciascuna deve fare qualcosa (rapidamente) solo se si verifica una certa condizione.

Per coordinare il tutto si mantiene lo stato della situazione in apposite variabili da controllare (ed eventualmente modificare) ad ogni ciclo.

A questo punto, nel caso in cui serva, rimane solo da agganciarsi al "tempo reale", si può fare in vari modi... frequenza letta dall'esterno, funzioni millis o micros che leggono un contatore interno a 32 bit, un piccolo delay nel loop principale per rallentarlo ad un "rate" desiderato e contarne i cicli.

Ci sono due soluzioni:

  • La funzione millis() di Arduino suggerita da Claudio
  • L'interrupt del timer

La più semplice e meno incasinata, almeno per me, è la seconda.

In pratica, se ho capito ben, tu vuoi "accendere" il relay solo se "condizione x" è vera ogni "y" secondi. Questo è fattibile molto facilmente con il timer, dato che genera degli interrupt che sono totalmente indipendenti dalla funzione loop (infatti quando avviene l'isr la funzione che si sta eseguendo si interrompe per poi ricontinuare), quindi con la soluzione 2 hai risolto tutti i tuoi problemi in modo facile.
Per il controllo della condizione, usa una variabile bool e impostala nel loop. Poi dall'ISR, se è vera vedi quanti tick del timer sono passati (ad esempio se la frequenza del timer è di 50Hz, ogni 50 tick devi accendere/spegnere il relay) e fai ciò che devi fare

Grazie mille ad entrambi per le soluzioni, mi studio un pò le due soluzioni e vedo se risolvo, anche perché non mi serve solo per i relè, ma anche per altre funzioni!

0xIOSTREAM:
Ci sono due soluzioni:

  • La funzione millis() di Arduino suggerita da Claudio
  • L'interrupt del timer

La più semplice e meno incasinata, almeno per me, è la seconda.

La meno incasinata e per tempi decisamente piú lunghi é la prima soluzione.
Ciao Uwe

Ho un'altra domanda, si possono utilizzare funzioni (sempre indipendenti dal loop) che utilizzano come condizione l'orario del modulo rtc?

Magari, se spieghi esattamente cosa vuoi fare ... possiamo suggertiti una soluzione. Così la tue domande sono poco chiare ed è difficile darti una risposta.

Guglielmo

Devo attivare/disattivare un modulo relè a intervalli orari precisi, attraverso un modulo RTC(DS3231), perché gli intervalli devono riferirsi ad un orario reale! Grazie

La lettura dell'RTC porta via meno di un millisecondo.
Chi sia a leggerlo, nel senso di quale funzione, è indifferente.

pastilio:
Devo attivare/disattivare un modulo relè a intervalli orari precisi, attraverso un modulo RTC(DS3231), perché gli intervalli devono riferirsi ad un orario reale! Grazie

Ma deve fare solo quello o quello e altro nello stesso tempo ??