Go Down

Topic: Spiegazioni per millis() (Read 3221 times) previous topic - next topic

kemosabesay

Sep 15, 2018, 11:36 pm Last Edit: Sep 17, 2018, 01:03 pm by gpb01
--- Questo thread è stato creato separandolo dal PRECEDENTE in cui l'OP si è cancellato. - gpb01

buona sera a tutti, sto leggendo con molto interesse tutti i vari post su questo argomento, perchè son in corso d'opera con un progettino.

Ho letto tutti i vari articoli di Leo ecc, ma resta il fatto che a quanto pare non mi è di facile comprensione la partenza del millis, e la struttura dell'if per il conteggio.

So che per voi è storia antica, ma è da poco che ho cominciato con Arduino e vorrei approfondire.
Grazie per l'interesse e il tempo dedicatomi...

Patrick_M

#1
Sep 16, 2018, 12:00 am Last Edit: Sep 16, 2018, 12:03 am by Patrick_M
la storia dei millis è come un orologio e un foglio di carta
se devi fare qualche cosa (tipo spegnere l'arrosto) tra 2 ore che fai?
ti segni sul pezzo di carta che ore sono adesso
e cominci a leggere il giornale
poi ogni tanto controlli se la differenza tra l'ora attuale e l'ora che ti sei scritto è uguale o maggiore di 2 ore
se non è vero non fai nulla e continui a leggere ancora una pagina di giornale
se è vero (sono passate le 2 ore), spegni l'arrosto :)
Code: [Select]

oraInizioControllo = millis()

void loop() {
  if ((millis() - oraInizioControllo) >= 2Ore) {
     spegniArrosto
  }
  else {
     LeggiGiornale
  }
}





per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

kemosabesay

ok, solo che sto vedendo che per esempio tu il tempo corrente e il tempo da confrontare li metti tra parentesi, in altri sketch no.
per esempio alla fine dell'if alcuni aggiornano il tempo corrente con il tempo di partenza, altri no

alcuni resettano il tempo memorizzato con il tempo da far passare.

Vorrei capire questi modi di interpretare l' if e i vari confronti e aggiornamenti per poter gestire le pause o i tempi di conteggio tra una operazione e l'altra

grazie

gpb01

#3
Sep 16, 2018, 03:46 am Last Edit: Sep 16, 2018, 03:47 am by gpb01
ok, solo che sto vedendo che per esempio tu il tempo corrente e il tempo da confrontare li metti tra parentesi, in altri sketch no.
Però questo NON ha nulla a che vedere con millis(), questa è una domanda di BASE sulla sintassi del 'C' e, se ci pensi un'attimo, e ricordi le precedenze degli operatori in 'C', ti dovrebbe risultare chiaro che quelle parentesi servono SOLO per aumentare la leggibilità e NON hanno alcun effetto sul codice.

per esempio alla fine dell'if alcuni aggiornano il tempo corrente con il tempo di partenza, altri no
... ragionaci e capirai che dipende da quello che vuoi fare ... se è una cosa che fai "una tantum" non ti serve aggiornare nulla, ma se è una cosa che devi fare con una determinata "periodicità", ovviamnete devi aggiornare per poter calcolare quando è il prossimo momento in cui fare la cosa :)

alcuni resettano il tempo memorizzato con il tempo da far passare.
... non mi è chiaro, cosa intendi ?  Parli dell'aggiornamento del "oraInizioControllo" (per usare lo stesso nome di variabile usato da Patrick) ?

Se SI, allora li ci sono due strade ...
... se a te interessa avere un "intervallo di ripetizione" esattamente costante, incrementi la variabile del tempo esatto, se invece vuoi fare una cosa dopo X tempo dal aver terminato di farla (quindi tenendo in conto del tempo che occorre a fare la cosa) allora gli assegni il valore corrente di millis() per conteggiare da quel momento in poi.

Spero sia tutto chiaro ... comunque la cosa migliore per capire e prendere proprio l'esempio di Patrick e ragionarci sopra con calma ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Claudio_FF

#4
Sep 16, 2018, 12:08 pm Last Edit: Sep 16, 2018, 12:15 pm by Claudio_FF
Quote from: Patrick_M
se è vero (sono passate le 2 ore), spegni l'arrosto :)
Mi sa che questo esempio te lo rubo :)



Per il resto mi sembra che la maggior parte dei problemi non riguardino tanto millis ma come strutturare il codice per:

  • Fare qualcosa dopo un certo tempo (si carica la variabile tempo una volta all'inizio e si controlla quando è trascorso il tempo voluto).
  • Fare diverse cose in sequenza con tempi diversi (si parte come prima, ma alla fine di ogni "cosa" si ricarica la variabile tempo con il tempo attuale avanzando di fase per occuparsi della nuova "cosa").
  • Fare diverse cose indipendenti con tempi diversi (ogni "cosa" deve avere una sua variabile tempo personale).
  • Fare qualcosa ad intervalli precisi (la variabile tempo va incrementata esattamente del valore dell'intervallo voluto).
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

Patrick_M

per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

kemosabesay

Siete tutti molto gentili, ma vi sfrutto ancora un po.
Ho visto anche gli esempi che ha fatto Claudio_FF  che sfruttando la logica del" ogni conteggio non influenza il programma..",
quindi vorrei capire come affrontare il problema del far fare due o piu cose contemporaneamente al programma...

grazie

Patrick_M

fai lo stesso ragionamento di prima ma con 2 arrosti dove 1 cuoce in 2 ore e l'altro in 3 (sempre con il solito orologio e pezzo di carta) ;)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

fabpolli

Sfruttando l'ottimo esempio dell'arrosto e del giornale :) immagina che ad un certo punto della giornata metti l'arrosto in forno e ti segni l'ora in cui l'hai messo in un foglio (Chiamiamolo Foglio1) sapendo che deve cuocere per due ore, a questo punto ti siedi a leggere il giornale e ogni tanto controlli che ore sono e fai la differenza con l'ora del Folgio1 se sono passate due ore sforni altrimenti ti rimetti a leggere il giornale.
Leggendo il giornale (e l'arrosto è sempre in forno da un po' di tempo quanto non è importante) ti accorgi che vuoi cuocere anche una torna nel microonde ( :o  vabbé) allora vai e metti la torta nel microonde e ti segni su un altro foglio (che chiameremo Foglio2) l'ora in cui l'hai messa e ti rimetti a leggere il giornale.
Ogni tanto smetterai di leggere il giornale e controllerai se tra l'ora attuale e della del Foglio1 è trascorso il tempo necessario, se si sforni l'arrosto, altrimenti non fai nulla. Subito dopo aver controllato il Foglio1 controlli anche la differenza tra l'ra attuale e l'ora del Foglio2 per sapere se devi sformare la torta dal microonde, se si la sforni, altrimenti non fai nulla. In entrambe i casi dopo aver deciso se sfornare o no l'arrosto e se sfornare o no la torta poi ti rimetti a leggere.
Quindi Folgio1 e Foglio2 non sono altroché due variabili con due nomi differenti che verranno controllate da due if indipendenti

Mi sono sovrapposto con Patrick_M ma ho scritto troppo per non pubblicare :)

gpb01

quindi vorrei capire come affrontare il problema del far fare due o piu cose contemporaneamente al programma...
... "contemporaneamente" è una parolona e ... NON lo farai mai, hai una sola MCU con un solo "core" e quindi una sola cosa per volta. ;)

Quello che fai è fare le cose in modo da non fermare mai il programma e fare un po' di una cosa ed un po' di un altra, scegliendo le opportune tempistiche, come ti ho già detto nel terzo punto del mio post #19 e come claudio_ff ti ha ribadito nel post #20.

Guglielmo
Search is Your friend ... or I am Your enemy !

kemosabesay

ok , adesso mi metto un po all'opera e faro' impazzire il mio Nano........
Posso continuare a rompervi..... man mano che proseguo?   


Grazie ancora

fabpolli

Posso continuare a rompervi..... man mano che proseguo?  
Il forum è qui per quello  ;) quando ti incagli posti il codice che hai prodotto e cosa non va e gli aiuti (di solito) arrivano

Patrick_M

ora la culinaria è di moda :D e allora ci adattiamo ;)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

kemosabesay

allora, dopo aver scoperto che ho bruciato un Nano.... >:(  >:(  >:( ,
vi propongo questo primo pezzettino, so già che non funziona, e non vorrei la soluzione da voi ma spiegazioni sugli errori in modo da poter capire e poter correggere

Code: [Select]

 // *** PIN COLLEGATI
 
  const int frecce=11;
  const int Inclinometro=12;    //inclinometro

 // *** VARIABILI DI STATO

int Stato_Incl=0;       
  int Sirena= A0;               //sirena

// *** VARIABILI DI TEMPO
unsigned long tempo_mem=0;
unsigned long spegnimento=0;
unsigned long accensione=0;
const long T_Accendi = 5000;
const long T_Spegni = 3000;

void setup() {
pinMode (frecce, OUTPUT);
 pinMode (Inclinometro,INPUT);
         Serial.begin(9600);
}

void loop() {
  Stato_Incl=digitalRead(Inclinometro);
 
  while (Stato_Incl==1);
{
    Serial.print(Stato_Incl);
 
        blinkveloce();
}

}
void  blinkveloce()
{
 
    static byte situazione = 0;
   
    tempo_mem = millis();
  if (situazione == 0  &&  tempo_mem - accensione >= 200)
  {
    digitalWrite(frecce, HIGH);
       spegnimento = millis();
    situazione = 1;
  }
  else if(situazione == 1  &&  tempo_mem - spegnimento >= 400)
  {
    digitalWrite(frecce, LOW);
        accensione = millis();
    situazione = 0;
  }
}

Patrick_M

#14
Sep 17, 2018, 11:45 pm Last Edit: Sep 17, 2018, 11:47 pm by Patrick_M
Quote
allora, dopo aver scoperto che ho bruciato un Nano.... >:(  >:(  >:( ,
cos'è un arrosto piccolo piccolo? :D

passiamo al programma
Code: [Select]

 while (Stato_Incl == 1);  // <--- questo ";" è di troppo
  {
    Serial.print(Stato_Incl);

    blinkveloce();
  }


qui dici:
 fino a che Stato_Incl è = 1 fai
...
...
quindi non esce dal ciclo while sino a che Stato_incl non cambia
e dentro a questo while chi fa cambiare Stato_Incl?

dentro blinkveloce la variabile tempo_mem puoi eliminarla così:
Code: [Select]

void  blinkveloce(){
  static byte situazione = 0;
  if (situazione == 0  &&  ((millis() - accensione) >= 200))  {
    digitalWrite(frecce, HIGH);
    spegnimento = millis();
    situazione = 1;
  }
  else if (situazione == 1  &&  ((millis() - spegnimento) >= 400))  {
    digitalWrite(frecce, LOW);
    accensione = millis();
    situazione = 0;
  }
}

a me piacciono le parentesi :)

per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Go Up