millis()....maledetto millis()

la parte di shifttare i bit non mi è chiara dalla base.

l'intenzione è quella di mettere i Pin in un unico byte...le famose paline...poi di richiamarle ciclicamente avanti o indietro in sequenza oppure bloccarle....non mi è chiaro proprio il concetto.

vabbe lascio perdere al momemento perche mi sono accorto di avere ancora grossi problemi,prima di utilizzare i Bit

ora sono arenato qui: se la scrivo così funziona come dovrebbe,ovviamente con tutti i problemi del delay

//Invento FUNZIONE 
unsigned long tempoBob;
unsigned long velocita1=50;



void COMANDAdirezione()
{ 
 if(direzioneAtt==1)
   {
    
    for(int i=0;i<4;i++)
       {
         digitalWrite(bob[i],HIGH);
         delay(velocita1);
         digitalWrite(bob[i],LOW);
        }
   }    
}

ma se provo a sostituire il delay con millis() ad esempio in questo caso,ma anche in altri 1000 tentativi diversi

//Invento FUNZIONE 
unsigned long tempoBob;
unsigned long velocita1=50;



void COMANDAdirezione()
{ 
 if(direzioneAtt==1)
   {
    
    for(int i=0;i<4;i++)
       {
        if(millis()-tempoBob>=velocita1)
          {
           digitalWrite(bob[i],HIGH);
           tempoBob=millis();
          }
        if(millis()-tempoBob>=velocita1)
          {
           digitalWrite(bob[i],LOW);
          }
       }
   }    
}

compila regolarmente,ma non funziona >:( >:( >:( >:( >:(

in qualunque caso se non ci aggiungo almeno un delay in mezzo...non funziona

... ovvio che non ti funzioni come vorresti ...

Il delay rallenta il ciclo dei for, facendogli "aspettare" il tempo stabilito dal delay prima di ogni incremento for ...

MA, il millis scritto cosi, NON fa aspettare nulla, quindi NON rallenta il ciclo for, che dura 4 cicli loop, in pratica qualche manciata di microsecondi ... devi usare il millis per "controllare" lo scorrere del tempo, e "condizionare" (con degli opportuni if) il ciclo for all'esecuzione solo a tempi trascorsi (oppure sostituirlo con un banale incremento negli if, dato che fai solo 4 step e quindi mi sembra un po sprecato) ...

Altro problema: non inizializza tempoBob, quindi chi ti dice cosa c'è scritto li dentro?

:fearful: :-X :roll_eyes:

giusto torno a lavorarci sù

Il problema è quel for la dentro con cui si applica ancora la logica sequenziale bloccante. Quel for deve sparire, c'è già il loop principale che cicla. Urge un esempio.

if(direzioneAtt == 1  &&  millis() - tempoBob >= velocita1)
{
    tempoBob += velocita1;
    digitalWrite(bob[iBob], LOW);     // spegne bobina attuale
    iBob = (iBob + 1) % 4;            // iBob cicla da 0 a 3
    digitalWrite(bob[iBob], HIGH);    // accende successiva
}

Naturalmente ci sono delle questioni di contorno da risolvere, come il valore della variabile tempoBob nel momento in cui direzioneAtt diventa 1.

ok allora anche il FOR lo metto assieme al DELAY ed al WHILE... in un sacchetto nel pattume. :smiling_imp:

cosi sembra funzionare anche se devo mettere a posto alkune cose.......solo una domanda ho notato su tinkercad che i led successivi a quello impostato come primo led,sono meno luminosi sembra che abbiano meno potenza????

Doc hai ragione in parte

solo che penso che per imparare bisogna cercare un obbiettivo lontano,che magari non si raggiungerà mai,ma che si cerca di raggiungere si andrà sempre piu lontano di chi ha obbiettivi facili e vicini.

La questione dei bit prima o poi mi ci dedico…da piccolo ero ero affascinato dal sistema binario,dorei fare un po di refresc :cold_sweat:

lo so che anche se ti faccio arrabbiare tenti di autarmi :kissing:

Rimaneggiare il programma… no è lo stesso motore passo passo precedente,solo che sto provando a scriverlo in maniera quantomeno decente e non da primitivo.
anzi appena riesco con questo riscrivo anche il semaforo…non vorrei mai che il VECCHIETTO venga schiacciato per un bug.

Vabbe il FOR lo tengo in un cassetto senza buttarlo,ma solo perche 6 te. :kissing:

Ed appena riesco con la partenza 1,la 2 provo a farla coi bit ed il for.

UMMMM :confused: :confused: :angry: :angry:

più difficcile del previsto farlo andare nel senso opposto oppure farlo bloccare.......ma prima o poi ci arrivo. :roll_eyes: ::) :neutral_face:

La logica è già stata detta (schema a stati del post #82).

Ci sono cinque diverse situazioni da gestire.

Le ripropongo in un modo diverso:

|500x255

Cinque diverse situazioni si possono gestire con una variabile chiamata 'stato':

if(stato == 0)
{
    ...
}
else if(stato == 1)
{
    ...
}
else if(stato == 2)
{
    ...
}
else if(stato == 3)
{
    ...
}
else if(stato == 4)
{
    ...
}

Si può anche scrivere uno switch del tutto equivalente:

switch(stato)
{
    case 0:
        ...
        break;

    case 1:
        ...
        break;

    case 2:
        ...
        break;

    case 3:
        ...
        break;

    case 4:
        ...
}

Cosa dobbiamo fare nello stato zero (attesa prima pressione)?

Solo verificare se è vera la condizione blu (che significa pulsante appena premuto), quindi ci salviamo il tempo attuale in 't' e cambiamo stato (NOTA ad ogni ciclo viene eseguito solo lo stato in quel momento attivo, quindi il nuovo stato viene eseguito al ciclo successivo di programma):

case 0:
    if(premuto) { t = millis();  stato = 1; }
    break;

E così via per tutti gli altri stati, sono una, massimo due, righe per stato.

Le condizioni da verificare sono scritte in blu.

Le operazioni da eseguire in caso positivo sono quelle in rosso.

Lo stato successivo a cui passare è la freccia in nero.

Se nessuna condizione è vera non si esegue nessuna operazione e si resta nello stato attuale.

... ottimo esempio pratico di ... "macchina a stati finiti" !

Guglielmo

la logica del pulsante l'avevo capita il problema è farlo ciclare nel senso opposto e farlo bloccare.

per ora sto studiando gli array

ora dovrei capire gli array ed avrei un mucchio da imparare .....che dite è maglio che apro un nuovo post sugli array??? visto che la mia ignoranza per ora non riguarda il millis.

Puso: ora dovrei capire gli array ed avrei un mucchio da imparare .....che dite è maglio che apro un nuovo post sugli array??? visto che la mia ignoranza per ora non riguarda il millis.

Se hai una domanda specifica, SI, ma prima ... ti prendi un bel libro di 'C' e STUDI ... dato che gli array sono ben spiegati su qualsiasi buon testo di programmazione.

Guglielmo

Non in un buon libro, ma qualcosa ho studiato e sinceramente non è ci abbia capito molto. Ho capito molto di più e fatto progressi con piccoli esempi e tanta pratica (non sò se avete notato i miglioramenti da quando ho cominciato circa 3 mesi fà).

Dicevo solo che siccome ho grosse lacune sugli array,mi sembra corretto aprire un nuovo post anche per gli altri utenti che magari si trovano di fronte agli stessi problemi.

Anche perchè mi sembra improbabile che un qualsiasi utente che ha problemi con gli array,venga a cercare di capire in un post dal titolo millis()...ect ect.

Puso: Dicevo solo che siccome ho grosse lacune sugli array,mi sembra corretto aprire un nuovo post anche per gli altri utenti che magari si trovano di fronte agli stessi problemi.

Ok, esponi allora i tuoi dubbi in un thread nuovo, ma ripeto ... ... questa NON è un scuola dove si insegna il 'C', questo è il forum di Arduino.cc dove si fornisce aiuto agli utenti su problematiche che coinvolgono direttamente i collegamenti e la programmazione di Arduino.

Per i concetti di base del 'C', o si studia o ci si iscrive a corsi di programmazione ... noi qui ti aiutiamo a risolvere [u]specifici problemi[/u], quindi, come detto, apri un nuovo thread e chiedi sullo [u]specifico problema[/u] che hai.

Guglielmo

..e comunque, per restare in argomento:

:D 8) :smiling_imp:

@docdoc....MI-TI-CO!

:D :D :D :D