Probema funzione millis

Dovrei realizzare un codice in grado di comandare l'accensione di un LED. Il LED si accende quando viene premuto un pulsante e si spegne quando il pulsante viene rilasciato o sono passati 5 secondi dalla pressione del tasto. In pratica dovrei leggere il tempo passato con la funzione millis in tempo reale. se il tempo supera i 5 secondi il LED si spegne.
Grazie per l'aiuto, buona giornata.

Buongiorno e benvenuto, :slight_smile:

essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO … Grazie. :slight_smile:

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto.

Vorrei presentarmi ma appena schiaccio il link mi rimanda alla sezione del regolamento e non mi permette di scrivere messaggi. Come posso fare ?

... mi sembra strano, ho controllato il link, quello segnato come IN QUESTO THREAD ti porta al posto giusto dove devi schiacciare il bottone Screenshot 2021-06-17 at 10.40.34 e inserire la tua presentazione come hanno fatto tutti gli altri.

Guglielmo

A ok pensavo dovessi scrivere un nuovo argomento invece devo "rispondere" al messaggio. Grazie

Per me non molto chiaro. "Tasto rilasciato" cosa intendi ?
Il tasto le devi tenere premuto x far partire il conteggio ?

In pratica si tratta di un sensore che deve rilevare la presenza di un bicchiere non un pulsante. Quando si toglie il bicchiere e il sensore non ne rileva più la presenza l'erogazione si deve fermare. Ma se il bicchiere rimane lì l'erogazione si deve fermare dopo un tempo determinato.

Il programma serve per gestire un distributore d'acqua che ha come ingresso un sensore e come uscita l'elettrovalvola.

Hai uno sketch di partenza su cui cominciare a ragionare?

Questa è la descrizione generica in italiano. Basta trasformarla in qualcosa di più formale, che sia poi a sua volta traducibile direttamente in istruzioni. Un modo generale che permette di risolvere qualsiasi automazione/controllo/sequenza è quello di pensare il programma sotto forma di tante frasi: se la situazione è questa e accade quest'altro allora faccio questo (magari rappresentandolo con un diagramma). Il caso specifico è un problema a tre fasi/stati/situazioni (attesa, conteggio, attesa dopo conteggio). Millis fornisce semplicemente "l'ora di sistema" in millisecondi dall'accensione. Quindi basta salvarsi in una variabile il valore letto nel momento DA CUI si vuole iniziare la misura, e calcolare il tempo trascorso come differenza tra l'ora attuale e il valore precedentemente salvato.

Sensore...pulsante...fotocellula....radar...

Tutti ingressi digitali per quel che riguarda arduino

Tantovale cominciare con pulsante e led

Comunque la tua descrizione del funzionamento è abbastanza corretta ma incompleta

Serve pensare ai casi anomali, anzi, è assolutamente necessario
Sono i casi anomali che fanno i danni

Questo è il link del progetto su tinkercad. Ovviamente manca la parte relativa all'erogazione.
Il LED giallo indica che si è superato il numero massimo di utilizzi.

Quindi adesso provo a salvare l'orario in cui avviene il "fronte di salita" del sensore (schiaccio il pulsante o attivo il sensore) e alvo in una variabile la differenza fra il tempo reale e il tempo 0 ad ogni ciclo. Se la differenza supera il tempo massimo si spegne l'erogazione. Adesso provo, grazie per l'aiuto.

In effetti si, l'unico caso anomalo che mi è venuto in mente è la fine dell'ora di sistema ma penso ce ne siano altri.

Poca fantasia, vedo

Banalmente il bicchiere è posato male e fa falso contatto
Quindi i 5 secondi ripartono ad ogni oscillazione del bicchiere stesso

In pochi cicli hai allagato la stanza

E questo solo pensando a errati usi
Figuriamoci per atti malevoli...

Giusto non ci avevo pensato, magari potrei mettere 2 sensori per risolvere il problema per le oscillazioni.

Quando il bicchiere viene posato, attendi 2 secondi di rilevamento continuo. Se (e ogni volta che) viene sollevato, leggi nuovamente millis e attendi che la differenza tra millis e il valore letto raggiunga 2000.
Poi inizia l'erogazione. Se la differenza tra millis e il valore letto raggiunge 7000, ferma l'erogazione. Fermala immediatamente se il bicchiere viene tolto prima.
Se il bicchiere viene tolto e rimesso, riparte con i 2 secondi di attesa.
Per rilevare un bicchiere già pieno, puoi solo leggerne il peso con un sensore sotto al piano di appoggio. Se non riesce a rilevare il bicchiere vuoto, dovrà iniziare anche se il peso letto è zero.
Se il peso supera quello del bicchiere pieno, l'erogazione si interrompe e attende un nuovo ciclo.
Se il peso diminuisce o si annulla durante l'erogazione, si interrompe e attende che il peso torni maggiore di zero per continuare. Se rimane zero per 10secondi, attende un nuovo ciclo.

Non penso di inserire anche quella funzionalità anche perché poi il costo del progetto salirebbe ancora. Già adesso ci aggiriamo attorno ai 50 euro. Non vorrei aggiungere altre spese. Grazie per l'idea comunque