temporizzazione istruzioni con sensori ottici

Buongiorno a tutti, grazie in anticipo a tutti coloro che mi daranno una mano. Da poco ho iniziato a prendere confidenza con il codice di arduino. Devo realizzare uno sketch che faccia il seguente lavoro: leggere lo stato di un sensore ottico (alto o basso), e su questo nessun problema, normalmente il pin del sensore è basso. Quando diventa alto, ho bisogno che arduino capisca PER QUANTI SECONDI tale pin permane nello stato alto. Se è alto per meno (o uguale) a 5 secondi, allora fai girare un motore.... se invece rimane alto per più di 5 secondi, blocca il motore. Come implemento questo codice? Il mio problema è proprio il discorso di far contare quanti secondi il sensore rimane alto. Grazie ancora

Ciao, per raggiungere il tuo scopo devi utilizzare la funzione millis() che ti restituisce il tempo trascorso dall'accensione, quando lo stato logico va alto memorizzi in una variabile unsigned long il valore di millis, e per semplicità setti una flag che ti indica che il sensore ha cambiato stato.
Se tale flag è settato allora confronti l'attuale valore di millis() con la variabile memorizzata all'inizio se il tempo è inferiore a 5 secondi fai quello che devi, se li supera allora fai altro (fermi il motore nel tuo caso).
Quando il sensore torna a stato basso cosa devi fare? Supponendo che hai già previso e gestito la cosa dovrai ricordarti di azzerare la variabile flag in modo che quando il sensore restituirà nuovamente il valore logico alto inizierà di nuovo la gestione indicata in precedenza.
Per capire come funziona e come applicare la funzione millis(), guarda prima QUI, poi QUI ed infine leggere anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Ti ringrazio tantissimo per la risposta tempestiva. Se basso, fai girare un motore tranquillamente... quando il sensore diventa basso, ha trovato il vuoto... quindi deve rallentare il motore... se il vuoto, cioè se lo stato basso permane per meno di 5 secondi, allora il motore deve continuare a girare tranquillamente... se invece il sensore rimane alto per più di 5 secondi, deve fermarsi e invertire il senso di marcia (tornare indietro). Potresti gentilmente accennarmi il codice che implementi quanto hai spiegato? Almeno la parte del conteggio dei 5 secondi... scusami, sono alle prime armi

Scusa ho sbagliato a scrivere.
Se alto, fai girare un motore tranquillamente... quando il sensore diventa basso, ha trovato il vuoto... quindi deve rallentare il motore... se il vuoto, cioè se lo stato basso permane per meno di 5 secondi per poi tornare alto, allora il motore deve continuare a girare tranquillamente... se invece il sensore rimane basso per più di 5 secondi, deve fermarsi e invertire il senso di marcia (tornare indietro).

Ok non è che cambia molto, teoricamente la sequenza standard dovrebbe essere:
Si accende l'impianto e con lui arduino, il sensore è alto -> motore acceso
Il sensore va basso -> Setto il flag, memorizzo millis() e rallento il motore
Il flag è attivo? No tutto ok, si allora sono passati 5 secondi? Si fermo e torno indietro, no procedo con motore lento
Il sensore torna alto -> resetto il flag e reimposto piena velocità

OK grazie mille per la cortesia. Potresti gentilmente spiegarmi cosa intenti per "settare un flag"? Inoltre, puoi scrivere questa parte di codice? questa del flag e della temporizzazione con millis(). Te ne sarei molto grato, sei comunque gentile

Per settare un flag intendo che, ad esempio, ti crea una variabile booleana con un nome a scelta , sempre come esempio la potresti chiamare statusChanged, e quando il sensore va a low

statusChanged = true;
initMillis = millis()

A questo punto la parte di codice seguente farà una cosa del tipo:

if(statusChanged){
  if(millis() - initMillis  > 5000){
  }
  ...
}

Per la parte di codice mi spiace ma no, qui funziona che chi ha la necessità scrive il codice e se incontra problemi lo posta e chiede qui e gli utenti aiutano... e poi servirebbe troppo tempo e mai si adeguerebbe a tutte le esigenze del progetto

>nino_algozino: a chiarimento di questa frase di "fabpolli" ...

fabpolli:
Per la parte di codice mi spiace ma no, qui funziona che chi ha la necessità scrive il codice e se incontra problemi lo posta e chiede qui e gli utenti aiutano ........

... ti prego poi di considerare che, purtroppo, qui NON funziona così. Qui nessuno scrive software per conto terzi o realizza schemi su ordinazione, ma si aiuta chi viene qui a correggere/ottimizzare il software che lui scrive o gli schemi che lui realizza :slight_smile:

Se non hai mai sviluppato su Arduino, o hai sviluppato molto poco, puoi cominciare con studiare QUESTO proseguire con QUESTO e/o acquistare qualche buon libro (es. QUESTO) ... dopo di che puoi cominciare a scrivere il tuo programma, metterlo qui (... mi raccomando, sempre racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra) e chiedere aiuto sui punti che non ti funzionano o che non capisci.

Grazie.

Guglielmo

Infatti non ho chiesto a nessuno di scrivere al posto mio un programma, chiedevo solo un esempio tipo quello che ha postato fabpolli, cui ringrazio tanto, niente di più. Ovvio che lo sketch lo deo compilare io... Scusate se ho interpretato male il regolamento in qualche modo. Grazie comunque per i preziosi suggerimenti e per le direttive!! ci provo, se ho problemi, posto il mio codice e mi date dei consigli... grazie ancora!!

Ottimo,
intanto ti suggerisco qualche altro link per imparare ad usare bene la funzione millis() che ti ha suggerito "fabpolli" ... leggi attentamente prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti aiuteranno. :wink:

Guglielmo