0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #105 on: May 01, 2012, 02:27:58 pm » |
ho sbattuto la testa su un problema che all'inizio avrei scommesso di risolvere in 5 minuti, invece non ne esco  continuo a pensare che sia banale, se e' cosi', sono rincoglionito  if (millis() > reset_timer + 9000) { reset_timer=millis(); } else if(millis()>reset_timer+6000) { fare_c(); } else if(millis()>reset_timer+3000) { fare_b(); } else { fare_a(); } Questo bellissimo codice, nato grazie agli interventi di su questo post, cosa fa ? - Mi esegue "fare_a" in continuazione, a massima velocita', per 3 secondi. - Poi passa ad eseguire in continuazione "fare_b" per altri 3 secondi, ecc ecc A me servirebbe modificarlo affinche': - Esegue "fare_a" una sola volta - Resta 3 secondi a far altro (non bloccato con delay) - Esegue "fare_b" una sola volta - resta 3 secondi, ecc ecc Illuminatemi 
|
|
|
|
|
Logged
|
|
|
|
|
Malo ( VI )
Offline
Sr. Member
Karma: 0
Posts: 371
|
 |
« Reply #106 on: May 01, 2012, 02:35:04 pm » |
Illuminatemi Nel mio Test_Link ( vedi in firma ) ho creato una base tempi e dei temporizzatori che non saranno orologi atomici ma fanno benissimo il lavoro Timer che attiveranno dei Flags per eseguire quanto voluto Chiaramente io mi rifaccio al mondo dei PLC perche' e' da li che vengo
|
|
|
|
« Last Edit: May 01, 2012, 02:42:30 pm by brunol949 »
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 83
Posts: 8239
:(){:|:&};:
|
 |
« Reply #107 on: May 01, 2012, 03:02:31 pm » |
ti servono 2 booleane e un if per il timer un boleano indica se fare A (ad esempio se è a 0) o se fare B (se a 1) eseguire a o b cambia il flag in automatico da 0 a 1 e da 1 a 0. (notare che se hai più cose da fare puoi usare un byte o un intero) il secondo flag indica se bisogna eseguire qualcosa: se a 0 no, se a 1 sì. una volta lanciato A o B si cambiain automatico a 0 if(millis()>reset_timer+3000){ fareQualcosa = true } if (fareQualcosa){ fareQualcosa=false; if (isA){ isA = 0; faiA(); }else{ isA=1; faiB(); } }
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #108 on: May 01, 2012, 04:55:16 pm » |
1: grazie 2: sono contento non era una cosa da 5 minuti, almeno per me, quindi non sono rincoglionito  3: non ho capito come fare x lesto: tu fai l'esempio con 2 temporizzazioni, a me ne servono 5  ho cercato anche in giro, sembra una cosa che non si usa spesso, forse esistono altri metodi ? io "semplicemente" voglio fare alcune cose a rotazione, sempre le stesse, c'e' forse una libreria ? Ho visto la Metro, ma non fa cose a rotazione, ma le fa separate una dall'altra, come un multitask per capirci Anche se onestamente preferirei fare questa cosa senza librerie, in modo da capirla meglio
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16489
Don't know what I do
|
 |
« Reply #109 on: May 01, 2012, 05:06:40 pm » |
Cerco di spiegartelo. Ti serve un flag per ogni azione perché se l'azione da compiere è molto veloce, rischi (come hai visto anche tu), di rieseguirla più volte, finché il controllo fra il tempo attuale ed il tempo impostato per l'azione sono uguali Detto questo, potresti forse anche affrontare il discorso in un altro modo. Usi la seconds() che ho fatto giorni fa e poi pianifichi gli intervalli. mettiamo così: unsigned long pianificazioni[5]; byte intervallo[5]={3, 4, 6, 8 ,9};
setup: for (byte i=0; i<5; i++) { pianificazioni[i]=seconds()+intervallo[i]; }
loop: unsigned long secondi=seconds(); for (byte i=0; i<5; i++) { if (secondi>pianificazioni[i]) { eseguiAzione(i); pianificazioni[i]=seconds()+intervallo[i]; } } ....
void eseguiAzione(byte i) { switch (i) { .... } In questo modo, una volta eseguita l'azione, non la riesegue un'altra volta nello stesso secondo perché l'intervallo viene subito spostato in avanti. Prova, non so, l'ho scritto mentre sono in fase quasi REM...
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #110 on: May 01, 2012, 05:57:28 pm » |
thanks, domani ti fo sapere domani, vado a ninna. notte 
|
|
|
|
|
Logged
|
|
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #112 on: May 02, 2012, 11:38:46 am » |
grazie paolo, questa non la conoscevo, ma mi sembra che tutte, la Metro, questa TimeAction, la tecnica del Blik Without Delay, vanno nella direzione del multitasking. Cioe' servono per fare X cose ogn'una per conto suo. Ho forse capito male ? Anche con questa io vedo negli esempi, che lui fa lampeggiare un led ogni secondo e contemporaneamente scrivere su seriae ogni 50ms. Mentre a me serve una cosa che sembrava piu' banale, cioe' fare una sequenza fissa di 5 cose. Se la prima non e' fatta, la seconda non deve essere fatta. Non e' un multitask quello che chiedo. Paradossalmente e' piu' difficile fare una sequenza che un multithread  Quello che dico io e' fattibile immediatamente con delay fai A Delay Fai B Delay, ecc ecc come vedi fai B verra' fatta solo dopo Fai A, e tra il Fai A ed il Fai B posso mettere il tempo che voglio. Questo giochetto trasformato con il millis non mi riesce. (ancora non ho lavorato sui consigli di leo-lesto)
|
|
|
|
« Last Edit: May 02, 2012, 11:45:31 am by Testato »
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #113 on: May 02, 2012, 11:46:06 am » |
Leo, se ti ricordi la mia idea chiamata improriamente Delay2, servirebbe a questo. Vuoi mettere la comodita' di poter scrivere fai A Delay2 Fai B Delay2 ecc ecc senza dover dichiarare variabili, azzerarle, ecc ecc Si puo' creare una libreria del genere ? che usi Millis di arduino ? io dico che avrebbe risonanza mondiale. in tutti i libri si citerebbe il delay e immediatamente il tuo (e mio per le royalties  ) delay2
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16489
Don't know what I do
|
 |
« Reply #114 on: May 02, 2012, 11:58:50 am » |
Leo, se ti ricordi la mia idea chiamata improriamente Delay2, servirebbe a questo. Vuoi mettere la comodita' di poter scrivere fai A Delay2 Fai B Delay2 ecc ecc senza dover dichiarare variabili, azzerarle, ecc ecc Si puo' creare una libreria del genere ? che usi Millis di arduino ? io dico che avrebbe risonanza mondiale. in tutti i libri si citerebbe il delay e immediatamente il tuo (e mio per le royalties  ) delay2 Sì, però mi devi spiegare per bene cosa intendi fare. Non capisco la differenza rispetto ad un loop: faiA(); delay(xxx); faiB(); delay(xxx); endloop
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3029
|
 |
« Reply #115 on: May 02, 2012, 11:58:58 am » |
senza dover dichiarare variabili, azzerarle, ecc ecc Senza variabili aggiunteve per gestire una logica tipo semaforo l'unica ipotesi che mi viene in mente è quella più banale. loop(){ funzioneA(); delay(1000); funzioneB(); delay(1000); funzioneC(); delay(1000); ...... } Inserendo variabili booleane e una struttura a stati finiti puoi attivare o meno le funzioni in sequenza. Ma se non vuoi inserire variabili, contatori o altro la vedo difficile.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #116 on: May 02, 2012, 02:42:44 pm » |
Sì, però mi devi spiegare per bene cosa intendi fare. Non capisco la differenza rispetto ad un loop: faiA(); delay(xxx); faiB(); delay(xxx); endloop
Mi spiego meglio, anche perche' qui stiamo parlando della libreria piu' importante di arduino  Definiamo bene il nome, chiamiamola millisTL() (millisTestatoLeo) la millisTL deve avere: 1) le funzionalita' tipiche di delay () per quanto riguarda IMMEDIATEZZA D'USO e SEQUENZIALITA' 2) le funzionalita' di millis() per quanto riguarda il non blocco del loop Funzioni simil delay(): .faiB() deve essere eseguito solo DOPO faiA(), .faiA() viene eseguito una sola volta, anche faiB una sola volta, fino a faiN() .l'unico comando da inserire tra faiA() e faiB() e' solo millisTL(xxx) senza variabili o altro, tutto deve essere nascosto nella libreria. Funzioni simil millis(): .il non blocco del loop, quindi tutto il resto del codice va avanti tranquillamente
|
|
|
|
« Last Edit: May 02, 2012, 02:52:02 pm by Testato »
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #117 on: May 02, 2012, 02:52:22 pm » |
Esempi ? - ho un acquario, ho fatto giorno notte, ma mi sono accorto che durante il delay non posso fare altro .risposta, usa millisTL() invece di delay() e lascia tutto il resto come e' - ho fatto u semaforo, ma mi sono accorto che durante l'attesa dei cambi colore non posso fare altro .risposta usa milliTL, ecc ecc - ho fatto un robot, deve andare avanti per tot secondi, a destra per tot secopndi, ecc, mi sono accorto che durante l'attesa non posso fare altro .risposta, usa millisTL ecc ecc - ho fatto un termometro, mi visualizza su lcd ogni 10 secondi la temp, ma mi sono accorto che non posso fare altro nell'attesa .risposta usa millisTL, ecc ecc potrei continuare all'infinito  tutti gli sketch del pianeta terra verrebbero modificati per sostituire tutti i delay con millisTL, perche' on avrebbe controindicazioni
|
|
|
|
« Last Edit: May 02, 2012, 02:54:23 pm by Testato »
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16489
Don't know what I do
|
 |
« Reply #118 on: May 02, 2012, 03:01:19 pm » |
Ma è una schedulazione, ci sono abbozzi di multitasking perché non puoi sapere quanto una certa azione possa durare e se si accavalla con un'altra.
Ad esempio, tu scheduli faiA ogni 10s e faiB ogni 4s. Ma faiB dura 2s.... faiB viene eseguita dopo 4s e finisce a 6s. Dopo 4s dovrebbe essere rieseguita. Ma a 10s devi eseguire anche faiA. Come fai?
|
|
|
|
|
Logged
|
|
|
|
|
|
|
|