Salve a tutti, avrei un problema abbastanza importante. Sto sviluppando un progetto e ho collegato ad arduino diversi sensori.
Se un sensore assume un certo valore "X" allora deve eseguire delle funzioni (sono funzioni molto semplici come accendere un led).
Il problema è che mentre esegue quelle funzioni per quel sensore deve poter leggere contemporaneamente anche i valori degli altri sensori ed eventualmente eseguire delle funzioni se assumono appunto quel famoso valore "X"
Con la funzione delay non è possibile fare questo perchè "congela" arduino per quel laso di tempo.
Ho sentito parlare anche della funzione millis() ma, da quanto ho capito, dopo circa 50 giorni che arduino rimane acceso, si resetta il timer interno di arduino.
sono disperato e non so come posso fare
potete aiutarmi?
Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione ...
... poi, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiQUI (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 il su citato REGOLAMENTO ... Grazie.
Guglielmo
P.S.: Il tuo post è stato spostato nell'opportuna sezione del forum "Italiano"
... studiati come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... perché non hai capito come usarla e che l'overflow lo puoi ignorare.
ok grazie mille per la spiegazione e per avermi fornito i link..... ma non ho capito molto bene come funziona la funzione millis()
qualcuno potrebbe spiegarmelo?
millis() ti ritorna i millisecondi trascorsi dall'accensione dell'arduino; più precisamente ti ritorna i millisecondi nel range di una unsigned long (32 bit) quindi da 0 a 4.294.967.295 dopodiché, essendo una unsigned (senza segno...cioè senza valori negativi) si azzera e ricomincia da capo (overflow).
Il valore massimo di 4.294.967.295 (millisecondi) corrispondono a circa 49 giorni consecutivi.
millis() lo puoi usare in una if per verificare se un tot di tempo è trascorso:
if (millis() - tempo_precedente > intervallo) {
//fai qualche cosa
tempo_precedente = millis();
}
in pratica confronti il tempo attuale (millis()) sottraendo un tempo x che avevi salvato precedentemente (tempo_precedente) per verificare se da tale tempo x è trascorso il valore della variabile "intervallo".
Ricordati che devi ragionare in millisecondi (1000 = 1 secondo)...che "tempo_precedente" dev'essere anch'essa una unsigned long; intervallo la puoi dichiarare a seconda del suo valore, meglio se unsigned long anche questa.
Il pezzo di codice che ti ho postato è la "soluzione 2" proposta per la gestione dell'overflow di millis() presente in uno dei link che ti ha suggerito Guglielmo.
Dovresti usare una variabile per ogni tempo diverso, ed una serie di if che controllino ognuno una specifica variabile ...
Se ad esempio hai due diversi tempi, ti serviranno due diverse variabili in cui mettere i valori di millis al momento di leggerla, ed ovviamente ogni if poi dovra' controllare la propria variabile, per decidere se quello specifico tempo e' passato o no ...
>Hicut1938: emmm ... ti prego di considerare che, purtroppo, qui NON funziona così ...
... qui nessuno scrive software per conto terzi , ma si danno le indicazioni per fare quello che si desidera e si segnalano gli errori affinché ,chi scrive, riesca, piano piano, studiando, a capire ed a scrivere da solo il software.
Ora, hai avuto tutti i link, hai avuto indicazioni ed esempi, ed infine ti sono stati segnalati gli errori che stai commettendo ...
... metti tutto assieme e, con calma, riscrivi il tuo codice tenendo conto di quanto sopra e poi, se non funziona, pubblicalo di nuovo ed avrai, come hai avuto, altre indicazioni, ma NON ti aspettare che qualcuno ti dia il codice bello e fatto.
... ah .. passare da un programma con un infinità di delay() come il tuo ad un programma strutturato con millis(), NON è cosa banale che fai in un mezzo pomeriggio, ma richiede studio, comprensione del meccanismo di controlo del tempo, analisi e ridisegno della struttura del programma dato che non hai più delle semplici pause, ma un ciclo che gira in continuazione, senza mai fermarsi, ed in cui tu, ad intervalli che misuri, decidi di fare alcune cose.
Io le consiglierei, mi scusi sebtorno indietro, di dichiarare 3 variabili unsigned Long: Tempo=millis()
Attesa=tempo di attesa tra due letture
Ed una serie di aspetta pari a uno ogni sensore. Puoi usare per contatore ad esempio unaif tempo-aspetta>attesa...
Aspetta=tempo. Per il problema delloverflow puoi dire che se aspetta>tempo aspetta=tempo;
Forse perche' hai messo gli if di controllo "all'interno" degli if con cui setti i currentmilllis ? ...
Rifletti un'attimo su come funziona un "if" ... se la condizione e' vera, esegue tutto quello che contiene ... altrimenti, "tutto" quello che contiene NON viene eseguito ... quindi messe cosi, quelle if non verranno mai eseguite, s el'if principale non viene eseguito, OPPURE non saranno mai vere, perche' l'if principale subito prima setta currentmillis uguale a millis ... (questo indifferentemente dal fatto che usi la stessa variabile in cicli diversi, quello e' un'altro errore, prima c'e' da eliminare questo)
Poi mi sembra che manchi qualche parentesi in quegli if ... (umTerr1>=580 && umTerr1<720) dovrebbe invese essere scritto ((umTerr1>=580) && (umTerr1<720)) ... meglio che ogni confronto abbia la propria parentesi ...
Inoltre, ma questo semmai lo possiamo vedere dopo, sarebbe meglio che usassi una variabile come flag per lo stato della pompa, cosi puoi condizionare l'esecuzione dei vari if alle sole condizioni in cui servono realmente ... ad esempio, se umidita' minore di tot E maggiore di tot E ANCHE se la pompa e' spenta ... oppure controllare se il tempo e' trascorso SOLO SE la pompa e' accesa ... ma prima risolvi gli altri problemi
Tu al verificarsi di una data condizione non è che fai una azione di una certa durata
Tu fai una sequenza di azioni, ognuna con la propria durata
E per una condizione differente un'altra sequenza
Occorre chiarire se una nuova condizione ferma o no la sequenza gia attiva
E se si riportando o no le uscite in uno stato conosciuto prima di cominciare la nuova sequenza
Credo che la risposta sia si in entrambi i casi
Poi, da una occhiata veloce al tuo codice mi pare di capire che imposti degli intervalli di temperatura
È giusto oppure no che le sequenze impostate siano eseguite sia nel caso di temperatura bassa che è salita che nel caso di temperatura alta che è scesa?
docsavage:
...
Tu fai una sequenza di azioni, ognuna con la propria durata
...
... intendi anche tu perche' manca qualsiasi tipo di flag di controllo ? ... della serie "qualcosa per non continuare a ripetere la stessa azione se gia la sto facendo" ? ...
Ragazzi grazie mille per tutte le informazioni che mi avete fornito.... finalmente sono riuscito a sistemare il tutto sostituendo tutti i delay con la funzione millis()