ARDUINO + sensore ultrasuoni+ sensore suono

massibal:
..in realtà ho scritto a Xilav il mio dubbio, proprio dopo aver letto l'articolo :wink:

... se lo hai letto e capito ... non dovresti allora porti il problema :wink:

Guarda come ha usato la millis() ... :grin:

Guglielmo

.. l'ho letto ..sul capito ci sto ancora lavorando !:frowning:

HELP ... disperazione ai massimi livelli . ho provato a fare la prima cosa consigliata da Xilav ...ma purtroppo non funziona bene.. vi spiego il problema... quando passo la mano sotto il sensore Ulrasuoni
nel caso in cui non metto nessun tipo di toggle... funziona perfettamente ( cioè al primo colpo eccita il relè e la lampada di accende !) se invece inserisco il toggle purtroppo quando passo la mano non sempre legge correttamente .. ogni tanto accende e poi spegne subito altre volte devo passare la mano più volte ...insomma come si direbbe dalle mie parti " DA ALLA TESTA !!! " cioè non è stabile---
sarà meglio sostituire l'ultrasuono con un PIR ??

aiuto

grazie
PS
con il MILLS() .. non sono in grado ! l'overflow mi ha battuto 1-0! :confused:

un saluto a tutti
massi

Scusa, ma hai provato solo a cambiare la if() o hai provato ad implementare il mio pezzo di codice con la millis() ?!?

Sembra comunque che la scheda ultrasuoni ti lagga anche del rumore interpretato poi dal codice come successivi on-off, per cui secondo la mia opinione devi filtrare via software i dati ricevuti.

  • o tramite delay (e qui entra in gioco la millis()
  • oppure puoi provare facendo una media d n letture successive (la cosa migliore sarebbe l'utilizzo di un buffer circolare)

Io proverei il delay che è comunque la soluzione più semplice; inoltre non penso che il problema lo risolverai tanto facilmente con un PIR in quanto mi sa proprio che si comporterà ne più nè meno come il sensore ad ultrasuoni....

Ciao!

ciao Xilav,
in realtà non ho ancora provato con il tuo sketch con mills() perchè così come è scritto , temo che dopo 47 giorni ( overflow !! ) ricompaiano i problemi ... secondo te ???

grazie

bye
massi

...secondo me no...

leggi bene
http://www.leonardomiliani.com/2012/come-gestire-loverflow-di-millis/
come ti ha detto gpb01

Se non ti è chiaro guarda anche qui

http://playground.arduino.cc/Code/TimingRollover

Ciao!

si l'ho letto l'altra sera.. ma ho capito ben poco--

il sistema per ovviare l'overflow sarebbe :

void setup() {
    intervallo = millis() + 1000;
}
void loop() {
    if ((long)(millis() - intervallo) >= 0) {
        //codice da eseguire
        intervallo += 1000;
    }
}

ma nel mio caso o meglio nel TUO caso :

unsigned long actTime = 0;

//...snip...
  if ((millis() - actTime) > 2000)

come dovrei correggere per evitare overflow...
..o devo lasciare così com'è ?
grazie
bye

@massibal: ... ti è stato detto in tutte le lingue, ora te lo dico in romanaccio ... visto che nun lo capisci, nun te peroccupa', in quer modo l'overflow nun c'è e nun ce devi pensà !!!

Più chiaro così ? :grin: :smiley: :grin:

Guglielmo

anvedi il romanaccio ... se sei di Roma (capitale) ..consigliami una buona trattoria de Roma!!che vengo giù per Pasqua.: )

grazie allora proseguo.... stasera provo nuovamente .. se anche così mi da problemi ..tolgo il toggle!!:slight_smile:

buona serata e arvedze! :slight_smile:

massibal:
anvedi il romanaccio ... se sei di Roma (capitale) ...

[OFF-TOPIC]
massibal ... nun ce crederai ... so Svizzero e sto in Svizzera ... ;D ;D ;D

Guglielmo

P.S.: ... ma pe' lavoro ho vissuto più de 40 anni a Roma :wink:
[/OFF-TOPIC]

ho concluso adesso lo sketch con il suggerimento mills() è PERFETTAMENTE FUNZIONANTE !!!!!
GRAZIEEEEEEEE a Xilav e Guglielmo....
... prossimo progetto ...
stazione meteo!!!

[OFF-TOPIC]

Guglielmo .... uno svizzero a Roma ... sembra un film!!:slight_smile: :wink:

P.S.: ... grazie ancora per il tuo supporto!!

[/OFF-TOPIC]

buongiorno,
... a volte ritornano...
pensavate che fosse tutto risolto .. ed invece no!
ieri ho deciso di mettere una presa con timer ,per fare in modo che il mio kit fosse accesso soltanto nelle ore notturne... purtroppo mi sono reso conto che da quando ho inserito il timer... la PRIMA ACCENSIONE con il sensore ad ultrasuoni ....non funziona al primo passaggio della mano sotto il sensore, ma devo passare la mano più volte... no capisco perchè .. ogni volta che do tensione ad arduino non dovrebbe resettarsi ?

grazie per il vs. aiuto!

saluti
massib

dimenticavo ecco lo sketch

int rele = 4;
int soundpin = 12;
int triggerPort = 3;
int echoPort = 2;

boolean currentState = HIGH;
boolean lastState = LOW;
boolean releState = HIGH; 
boolean currentStateU = true;
boolean lastStateU = true;
unsigned long actTime = 0;

void setup() {                
   
  pinMode(rele, OUTPUT);
  pinMode(triggerPort, OUTPUT);
  pinMode(echoPort, INPUT);
  pinMode(soundpin, INPUT);
  }
 
void loop() {
   
   //porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );

long durata = pulseIn( echoPort, HIGH );

//if(durata < 700 )
if( (durata >= 0 ) && (durata < 500 ) )
{
 currentStateU = true;}
 else 
 {
 currentStateU = false ;}
  if ((millis() - actTime) > 2000) // se sono passati almeno 2 secondi dall'ultimo rilevamento
  {
   
   if (currentStateU == true && lastStateU == false)
   {  
                 
    if (releState == LOW){
      digitalWrite(rele, HIGH);
      releState = HIGH;
     //currentStateU = true ;
      delay(10);
    } else {
      digitalWrite(rele,LOW);
      releState = LOW;
      //currentStateU = false ;
      delay(20);
      }
      
      actTime = millis();
      }
       lastStateU = currentStateU  ;

currentState = digitalRead(soundpin);
    if (currentState == LOW && lastState == HIGH){
    delay(10);
              //toggle the state of the relè
    if (releState == LOW){
      digitalWrite(rele, HIGH);
      releState = HIGH;
      delay(10);
    } else {
      digitalWrite(rele,LOW);
      releState = LOW;
      delay(10);
      }
  }
 lastState = currentState;

}
}

Il primo consiglio è ... che usi la funzione del IDE Menu Tools -> Auto Format ... che almeno ti mette in codice on una forma "leggibile" :smiley: :smiley: :smiley:

Poi, il comportamento all'accensione è uguale a quello che hai quando premi il pulsante "reset" sulla scheda (... dovrebbe esserlo) ?

Ho idea che al primo avvio ci sono le varie flag iniziali che sono messe in modo tale che comunque non rileva il movimento ... controlla l'assegnazione che hai fatto quando dichiari i boolean e verifica se è congruente con la situazione che vuoi ad inizio programma :wink:

Guglielmo

grazie Guglielmo.... volevo solo capire se poteva essere un problema di software ( ho il weekend per giocherellare un pò) o se era dovuto all'accensione e spegnimento!

un saluto

Ciao,
La prima cosa che vedo è che hai inizializzato a true currentstateU e lasstateU. Per cui certamente alla partenza dovrai entrare, uscire e rientrare nell'area di intercettazione del sensore (la prima volta non te lo trova). Prova ad inizializzato le due variabili entrambe a false e fammi sapere.

Ciao!

ciao xilav, grazie peril tuo aiuto..
ho cambiato come da tuo suggerimento ma non è cambiato nulla...
siccome però ogni volta che tolgo corrente il sensore suono funziona senza problemi mentre il problema
è solo sul sensore ad ultrasuoni... e secondo me il problema è nel comando

if ((millis() - actTime) > 2000) // se sono passati almeno 2 secondi dall'ultimo rilevamento
  {

perchè il ritardo è solo una volta dopo il reset!!
cosa ne dici?

saluti
massi

Ciao,
non penso che sia li il problema, in quanto millis() riparte da zero e actTime è impostato a zero, per cui circa due secondi dopo l'accensione, il sistema è pronto ad intercettare il sensore ad ultrasuoni.

Altra cosa: perchè imposti di default ReleState = High? il relè è attivo quando il pin è LOW?

hai ragione... ma il fatto è che sembra che i 2 secondi vengano "contati" da quando metto la mano sotto il sensore!! :confused:

a senso mi verrebbe da pensare che si debba mettere un comando di reset subito ad inizio loop..

ciao xilav

ho QUASI risolto... ho corretto boolean releState = LOW; e non HIGH !

ora dopo il reset funziona...QUASI alla perfezione ... dico quasi perchè quando passo la mano sotto il sensore ...la lampada si accende ma con una breve "incertezza" iniziale... non capisco a cosa è dovuto!!

ma direi che così è accettabile!

grazie mille come sempre!
buonadomenica