Problema con millis()

ciao

mooger: Sempre stesso problema.. :( O meglio,non va in timeout,ma non reagisce quando premo lo switch.

E' lo stesso errore di prima: tutte le variabili che usi per sapere se una cosa è stata premuta, mandata come impulso ecc. le devi rimettere "a posto" per poterle riutilizzare. In questo caso: if (pulsantePremuto(PET) == true && giaPremuto == false) non rimetti giaPremuto a false quindi questo if (la seconda volta) non si avvera mai. stessa soluzione: metti giaPremuto = false;prima del while.

ciao pippo72

Ora funziona grazie!!! :) Per il secondo problema,pare sia il cavo difettoso! :) Speriamo!!

Mi fa piacere, però ho risposto di fretta e ho commesso un errore: da un punto di vista di logica del programma le varie variabili (scusa pe il gioco di parole :)) andrebbero azzerare a operazione conclusa cioè quando chiedi di estrarre la carta. Visto che funziona lo stesso puoi non cambiare niente, ma ci tenevo a puntualizzare.

ciao pippo72

pippo72: Mi fa piacere, però ho risposto di fretta e ho commesso un errore: da un punto di vista di logica del programma le varie variabili (scusa pe il gioco di parole :)) andrebbero azzerare a operazione conclusa cioè quando chiedi di estrarre la carta. Visto che funziona lo stesso puoi non cambiare niente, ma ci tenevo a puntualizzare.

ciao pippo72

Cioe',le avrei dovuto azzerare a operazione conclusa? (volevi scrivere "andrebbero azzerate?" Beh al limite lo modifico,visto che devo aggiungere anche altre cose,non vorrei magari portarmi dietro questo "errore" che magari ora da problemi e poi piu in la aggiungendo pezzi,mi creerebbe problemi,facendomi impazzire!Poi anche per imparare!Cosa avrei dovuto fare esattamente?

Per una correttezza logica, quando l'utente estrae la card, vuol dire che l'operazione è conclusa; a quel punto dovresti porre tutte le variabili di appoggio che hai utilizzato ad uno stato pulito, in modo che un secondo utente inserisce la card ed il programma funziona correttamente.

Quindi hai risolto anche il problema 2? Ora funziona?

Ho bene o male capito cosa stai facendo, e se posso permettermi secondo me chiudiportelloPET() sarebbe da inserire prima di attendere che l'utente abbia rimosso la card. Leggendo lo sketch tu conti i pezzi che l'utente inserisce, una volta che scade il timeout, esci da contaPET(), e quindi stampi la dicitura di rimuovere la card, ma lo sportello è ancora aperto. Quindi l'utente può tranquillamente caricare pezzi PET e tu non te ne accorgi. Io la chiusura portello la sposterei prima di questa riga smartcard.PowerOffSC(). Così l'utente ha tutto il tempo di rimuovere la tessera. Poi quando dici che l'operazione è conclusa, se il sensore lo ritiene necessario fai partire il compattatore. Questo controllo penso che sarà da inserire anche in contaPET. ;) Scusa se mi son permesso di andar oltre alle tue domande, ma mi sembrava corretto farti presente una problematica che penso ti fosse sfuggita.

Ciao.

"Dovresti porre tutte le variabili di appoggio che hai utilizzato ad uno stato pulito, in modo che un secondo utente inserisce la card ed il programma funziona correttamente." Cioe' come dovrei fare praticamente?

"Quindi hai risolto anche il problema 2? Ora funziona?" Sembra che sia problema di contatti...Quando li muovo comincia a conteggiare...

"Io la chiusura portello la sposterei prima di questa riga smartcard.PowerOffSC()."

Si grazie mille dei preziosissimi suggerimenti!Anzi mi fa piacere..In realta' ci avevo gia' pensato a questa modifica,ma l'avrei fatta in un secondo momento,comunque grazie.! :)

Praticamente quando l'utente ha tolto la tessera, devi fare in modo di portare le variabili utilizzate, allo stato originale (solo se necessario). Un esempio è la variabile stato, che come hai visto se non la riportavi a 0, il secondo utilizzo ti manda già in timeout. Come ti ha detto Pippo72 anche giaPremuto lo devi riportare a false. Credo che anche impulso_mandato debba essere rimesso a false.

Fai una prova: Inserisci la card e lasci scadere il timeout. Poi estrai la card e riprovi ad inserirla. Controlla se funziona correttamente o se ti blocca all'istante.

La variabile gia_premuto era gia su "false",ma ho aggiunto come tu suggerivi anche impulso_mandato=false; Ho fatto la prova che mi hai suggerito,in effetti fa quello che deve fare:

Inserire la simcard prego........OK

SIMCARD VALIDA

Effettua la scelta del materiale da conferire entro 10 secondi.. BLOCCATO Estrarre la SIMCARD,Grazie...

Dopo che per 10 secondi non si effettua una scelta si blocca (in effetti qui ci andrebbero altre cose,ma per ora ho solo questo messaggio".

Purtroppo,come prevedevo il secondo problema non e' risolto mi spiego: Ho provato con lo sketch che ho usato per la sola funzione che e' questo:

#include 

DistanceGP2Y0A21YK Dist;
int distance;


unsigned long Timer = 0;
const unsigned long Timeout = 10000;  // 10 secondi
boolean premuto = false;
unsigned int Contatore = 0;

void setup() {
  
  
  
//  pinMode (SwitchPin, INPUT_PULLUP);  // pulsate chiude verso massa (per evitare il resistore di pullup si usa quello interno)
  Serial.begin(9600);
  Dist.begin(A0);
}

void loop() {
  
  distance = Dist.getDistanceCentimeter();

  if ((millis() - Timer) > Timeout) {  // raggiunto timeout
    Serial.println("BLOCCATO"); 
  }
  else {
  
    if (distance>=7) { //pulsante non premuto
    
      premuto = false;
                    }
   
        if ((distance<7) && premuto == false) {  // pulsante premuto
      
        if (distance<7) {  // conferma pulsante premuto
      
        Contatore ++;  // incrementa contatore
        Timer = millis();  // timer partito/resettato
        premuto = true;
        Serial.print("Contatore: ");
        Serial.println(Contatore);
      }
    }

  }
}

E funziona benissimo. Invece nello sketch completo,conta solo quando smuovo il collegamento con il pin A0! Ovviamente non e' questione di cavo,perche' nelle stesse condizioni l'altro sketch funziona! :(

mooger: La variabile gia_premuto era gia su "false",ma ho aggiunto come tu suggerivi anche impulso_mandato=false; Ho fatto la prova che mi hai suggerito,in effetti fa quello che deve fare:

Inserire la simcard prego........OK

SIMCARD VALIDA

Effettua la scelta del materiale da conferire entro 10 secondi.. BLOCCATO Estrarre la SIMCARD,Grazie...

Dopo che per 10 secondi non si effettua una scelta si blocca (in effetti qui ci andrebbero altre cose,ma per ora ho solo questo messaggio".

Quello che intendevo io, era fare 3/4/5/6 prove consecutive, senza interrompere. Come se fosse una fila di persone che deve buttare le bottigliette, e non sono capaci, quindi fai scattare i timeout. Il primo va inserisce la tessera e scatta il primo timeout, e leva la tessera. Poi va il secondo, mette la tessera, e seleziona PET, ma non fa nulla. Il terzo fa scattare ancora il primo timeout. Il quarto è il più furbo, mette la tessera, seleziona PET e finalmente butta 4 bottigliette. Poi riprovi con un altro e fai scattare il timeout. Ci riprovi e fai buttare 2/3 bottiglie. Quello dopo si ferma alla selezione PET e non fa niente.

Fatte queste prove, e tutte funzionano al 100%, puoi passare oltre.

Cosa intendi con

mooger: conta solo quando smuovo il collegamento con il pin A0!

?

ciao.
parlando del secondo problema: ma il sensore è collegato sul pin A0 o A1?
nel void setup tu scrivi:

  ///////////////////////////////////////////////////////////////////////
  
    // Pin analogico a cui è collegato il sensore IR,che gestisce la presenza del materiale PET:
       Dist.begin(A0);
  
   // Pin analogico a cui è collegato il sensore IR,il quale misura il riempimento del contenitore PET: 
       Dist.begin(A1);

Credo che così cerchi il sensore su A1 (visto che è l’ultimo che dichiari).

o ci sono più sensori?
In questo caso credo dovresti chiamare in maniera diversa i 2 sensori es:

...
DistanceGP2Y0A21YK Dist;
   int distance;
DistanceGP2Y0A21YK Dist1;
   int distance1;
...
  // Pin analogico a cui è collegato il sensore IR,che gestisce la presenza del materiale PET:
       Dist.begin(A0);
  
   // Pin analogico a cui è collegato il sensore IR,il quale misura il riempimento del contenitore PET: 
       Dist1.begin(A1); 
...

Non so quando usi il sensore collegato al pin A1, ma così non dovresti fare confusione.
ciao
pippo72

Si in realta' ci sono 2 sensori (dovro' tra l'altro aggiungere degl'altri). Per ora sto utilizzando solo quello collegato al pin A0 Quello collegato invece al pin A1 e' solo parzialmente dichiarato,ma non utilizzato (almeno per ora).Basta che quando conteggia,muovo un po il connettore del cavetto che proviene dal sensore,e collegato al pin A0,che funziona..conteggia..e' molto strana sta cosa...

Brado: [ Quello che intendevo io, era fare 3/4/5/6 prove consecutive, senza interrompere. Come se fosse una fila di persone che deve buttare le bottigliette, e non sono capaci, quindi fai scattare i timeout. Il primo va inserisce la tessera e scatta il primo timeout, e leva la tessera. Poi va il secondo, mette la tessera, e seleziona PET, ma non fa nulla. Il terzo fa scattare ancora il primo timeout. Il quarto è il più furbo, mette la tessera, seleziona PET e finalmente butta 4 bottigliette. Poi riprovi con un altro e fai scattare il timeout. Ci riprovi e fai buttare 2/3 bottiglie. Quello dopo si ferma alla selezione PET e non fa niente.

Fatte queste prove, e tutte funzionano al 100%, puoi passare oltre.

Cosa intendi con

mooger: conta solo quando smuovo il collegamento con il pin A0!

?

Si ho fatto varie prove e funziona bene ,(A parte il conteggio),come dicevo nel post sopra,il conteggio funziona se muovo il cavetto proveniente dal sensore ,il quale e' collegato al pin A0.

Guarda che adesso il programma così com'è va a leggere il sensore collegato al pin A1 !! ripeto:

// Pin analogico a cui è collegato il sensore IR,che gestisce la presenza del materiale PET:
       Dist.begin(A0);
  
   // Pin analogico a cui è collegato il sensore IR,il quale misura il riempimento del contenitore PET: 
       Dist.begin(A1);

scritto così il secondo Dist.begin annulla il primo quindi la lettura che fai con il comando Dist.getDistanceCentimeter(); all'interno del void contaPET() vai a leggere il sensore collegato al pin A1. fai questa prova: commenta il secondo Dist.begin

// Pin analogico a cui è collegato il sensore IR,che gestisce la presenza del materiale PET:
       Dist.begin(A0);
  
   // Pin analogico a cui è collegato il sensore IR,il quale misura il riempimento del contenitore PET: 
    //   Dist.begin(A1);    // <====MODIFICA

e vedi se funziona.

Se si rileggiti bene quello che ho scritto nel mio post precedente.

ciao pippo72

Funziona!!!!Quante cose nuove sto imparando!Non credevo che facendo cosi' si annullasse poi la lettura sul pin A0!Buono a sapersi!GRAZIE ANCORA!!!

Pippo72 mi ha rubato le parole dalla tastiera ... :)

Brado: Pippo72 mi ha rubato le parole dalla tastiera ... :)

Grazie a tutti e due! Brado,stavo rileggendo i tuoi suggerimenti,in effeti,forse sarebbe meglio se quando si estrae la card all'improvviso,tutta l'operazione termini,e quindi anche il portello si chiudesse..in questo come potrei fare?

Io metterei dopo questo codice

while (stato <1)
                   {

il controllo di presenza della card.

if (!smartcard.IsCardPresent(1))
     stato=1;

Così facendo esci subito dal while e dovrebbe darti immediatamente operazione conclusa.

Mentre qui farei questa modifica:

void contaPET() 
{
    Timer = millis();  // PARTE IL TIMER
     while((millis() - Timer) < Timeout) {   // Mentre t < timeout 
        distance = Dist.getDistanceCentimeter(); // Acquisisci dati dal sensore
         if (distance>=7) { // Se la distanza e' maggiore di 7,non contare
            premuto = false;
          }
          if ((distance<7) && premuto == false) {  // Se la distanza e'minore di 7 comincia a contare
              Contatore ++;  // incrementa contatore
              Timer = millis();  // timer partito/resettato
              premuto = true;
              Serial.print("Contatore: ");
              Serial.println(Contatore);
          } 
          if (!smartcard.IsCardPresent(1))         // Verifico presenza card     <<< Modifica proposta
              Timer = millis()+millis();           // Faccio scadere il timeout
       }
}

In entrambi i codici ho inserito !smartcard.IsCardPresent(1) , ma immagino che possa funzionare anche con smartcard.IsCardPresent(0) .

Ciao

Perfetto!Funziona,grazie ancora!

Bene ! ;)