Temporizzazione Azioni

Buongiorno,
ho la necessità di temporizzare delle azioni, faccio un esempio ch credo semplice, ma che non son riuscito ad implementare nonostante abbia cercato sian in forum che in rete.
(ho appena iniziato a cimentarmi con arduino!)

ho fatto il seguente Sketch:

#include <Servo.h>
Servo myservo;

void setup ()
{
  myservo.attach(9);
  myservo.write (0);
  Serial.begin(9600);
  #define intervallo 6000  // intervallo di tempo in millisecondi
  #define azione 1000      // tempo dell'azione in millisecondi
}

void loop()
{
  long unsigned int time = millis();
    if(time< intervallo){
     myservo.write (0);
    } 
    else{
    myservo.write (180);
   }  
}

questo mi permette di mandare a 0° il mio servo per il tempo da me deciso, appena superato quel periodo va a 180° e fin quì tutto va bene, ma ora?
Se io volessi farlo ritornare a 0° dopo un certo lasso di tempo, cosa dovrei fare?
Ho creato la variabile “azione” ( #define azione 1000 // tempo dell’azione in millisecondi) con questo intento, ma non son stato capace di utilizzarla.

Spero possiate aiutarmi.

Grazie tante,
Marco

Non si mettono i commenti in una riga dove c’è una #define, li puoi mettere o prima o dopo quella riga.
Oppure potresti usare una comune costante:

const int azione = 1000; //commento

Grazie per la dritta leo72, mi sapresti consigliare una strada per risolvere il mio “problema”?
Vorrei far fare al mio servo una serie di comandi temporizzati:

- vai in posizione 0
- dopo 6000ms vai in posizione 180
- restaci per 1000ms
- torna in posizione 0
- dopo altri Xms vai in posizione 45
- Infine torna in O

Ogni azione è un controllo che devi fare. Registri il valore di millis e poi inizi un ciclo che esegue i controlli a catena. Una volta terminato, se vuoi, lo ripeti.

Se vuoi fare una cosa semplice, inizia intanto ad usare delay. Delay non è il male :sweat_smile:, si può usare se non serve fare altro. Puoi fare

- vai in posizione 0
- delay 6000
- vai in posizione 180
- delay 1000
- torna in posizione 0
- delay xxxx
- vai in posizione 45
- Infine torna in O

Con millis diventa un pochino più complicato ma non impossibile.

Infati, a me interessava con millis, visto che mi sarebbe piaciuto fare anche qualcosa di più complesso, che delay non mi permette.

Ad esempio...è possibile fare una sorta di programmatore giornaliero? Qualcosa del tipo:

dalle 8:00 alle 8:30 esegui questa azione poi non fare nulla e dalle 16:00 alle 17:00 esegui quest'altra azione

Sarei molto interessato a capire come si fa una cosa simile.

Non con millis, cioè non con millis così com'è. Intanto sarebbe bene che tu imparassi ad usare i timestamp. Un timestamp è un valore che riporta il numero di secondi trascorsi da una data epoca. In questo modo diventa facilissimo fare azioni del tipo dalle xx:yy alle jj:kk compi questa azione anche se gli orari di inizio e fine appartengono a due giorni differenti (questo è un caso che nei controlli basati sulle ore:minuti crea un po' di problemi quando il termine dell'azione è ad un orario inferiore a quello di inizio, perché appartenente al giorno successivo).

Un timestamp fissa invece un dato istante e da lì si misurano i secondi trascorsi. Quindi un'azione non inizia a ore:minuti ma a xxxxxxxx secondi dall'epoca fissata. Inoltre un timestamp basato sui secondi non soffre dei problemi che si hanno nell'uso di millis: se non si fanno i giusti confronti, si può incorrere nel problema dell'overflow di questo contatore, che si verifica dopo 49,7 giorni.

Se vuoi un piccolo aiuto, ho scritto tempo fa una lib che si chiama secTimer che crea un semplice contasecondi dal'avvio di Arduino, oppure a libreria swRTC che crea un RTC software (non preciso come un RTC hardware) sull'Arduino che ha anche la possibilità di gestire i timestamp.

Grazie mille!!! Il tuo aiuto è stato preziosissimo. Certo che sono interessato alle librerie, dove le trovo? Come funzionano?

Grazie ancora!

Marco121: Grazie mille!!! Il tuo aiuto è stato preziosissimo. Certo che sono interessato alle librerie, dove le trovo? Come funzionano?

Grazie ancora!

Pensavo lo avessi visto :sweat_smile: ma nella mia firma c'è il link al mio sito dove sono ospitate. Ogni libreria ha una pagina di presentazione (in ita/ing) nonché un readme (in ing) che spiega l'uso e le funzioni.