Pages: 1 ... 6 7 [8] 9   Go Down
Author Topic: If-Switch-Array-Millis-For  (Read 4161 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho sbattuto la testa su un problema che all'inizio avrei scommesso di risolvere in 5 minuti, invece non ne esco  smiley-roll-sweat
continuo a pensare che sia banale, se e' cosi', sono rincoglionito  smiley


Code:
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  smiley
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Illuminatemi  smiley
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

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
if(millis()>reset_timer+3000){
 fareQualcosa = true
}
if (fareQualcosa){
   fareQualcosa=false;
   if (isA){
      isA = 0;
      faiA();
   }else{
      isA=1;
      faiB();
   }
}
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

1: grazie
2: sono contento non era una cosa da 5 minuti, almeno per me, quindi non sono rincoglionito  smiley
3: non ho capito come fare

x lesto: tu fai l'esempio con 2 temporizzazioni, a me ne servono 5  smiley-roll-sweat

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

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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ì:
Code:
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 Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

thanks,
domani ti fo sapere domani, vado a ninna.
notte  smiley
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6579
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perché non provi con la libreria "TimedAction" --> http://arduino.cc/playground/Code/TimedAction
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

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

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley) delay2
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley) 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, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6579
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Code:
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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

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

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

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

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


0
Online Online
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

in oltre esiste già una libreria che fa esattamente questo: timerAlarm!

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1217881285
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 ... 6 7 [8] 9   Go Up
Jump to: