HC-SR04 dopo un po', di un corretto funzionamento, smette di funzionare.

Salve a tutti,
Il mio scopo è quello di rilevare il passaggio di un corpo all’interno di un cilindro e per questo ho pensato di mettere due sensori SR04 alle estremità del cilindro in modo che questi catturino il millis() al passaggio del primo sensore, poi il millis() al passaggio del secondo e se la differenza è != 0 allora vorrà dire che c’è stato un movimento e solo allora verrà azionato un servo. Questo è il codice che ho fin ora creato:

#include <Servo.h> 
#include <NewPing.h>

Servo myservo;

//HC RS04 Sensore ultrasuoni
int triggerPort = 6;
int echoPort = 7;
int triggerPort2 = 8;
int echoPort2 = 9;
int pos=-1;
int tempo=0;
void setup() {
pinMode(11, OUTPUT);
myservo.attach(12);
pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
pinMode( triggerPort2, OUTPUT );
pinMode( echoPort2, INPUT ); 
//Serial.begin( 9600 ); 
}

void loop() {
delay(30); // Wait 50ms between pings
myservo.write(pos);

int t1 = 0;
 
digitalWrite( triggerPort, LOW );
delayMicroseconds (10); 
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds(10);
digitalWrite( triggerPort, LOW );

long duration = pulseIn( echoPort, HIGH );

long r = 0.034 * duration / 2;
int t;
  if ( (r>=0 && r<150) ) { // ok. l'oggetto è passato dal via
     t = millis();  // Mi segno il tempo di partenza
     while ( (millis() - t ) < 10000 ) // tempo massimo ammesso 10 secondi
       {
         //porta bassa l'uscita del trigger
         digitalWrite( triggerPort2, LOW );
         delayMicroseconds (10); 
         //invia un impulso di 10microsec su trigger
         digitalWrite( triggerPort2, HIGH );
         delayMicroseconds( 10 );
         digitalWrite( triggerPort2, LOW );

         long duration2 = pulseIn( echoPort2, HIGH );

         long r2 = 0.034 * duration2 / 2;
     
           if ( (r2>=0 && r2<150) ) { // Ok e' arrivato al secondo sensore
             t1 = millis(); // segno il tempo di arrivo
             break ; // esco dal while prima che scada
           }
     t1 = 0 ;
   }
   
   if ( !t1  ) {
     //Serial.println("fuori tempo massimo");
      digitalWrite(13, HIGH);
      //----INIZIO FUNZIONE SERVO-----
  
 while(pos!=0){
 for(pos = 1; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees 
 {                                  // in steps of 1 degree 
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(15);                       // waits 15ms for the servo to reach the position 
 } 
 
 delay(3000);
 
 for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees 
 {                                
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(15);                       // waits 15ms for the servo to reach the position 
 } 
 break;
}
   //---- FUNZIONE SERVO-----
   }
 }
 
 tempo = (t1 - t ) ;
//int vel=((3.2*0.01)/(tempo*0.001));
 if (tempo  > 0  ) {
   //Serial.print ("Velocita':  ");
   //Serial.print(vel);
   //Serial.println(" m/sec");
   //----INIZIO FUNZIONE SERVO-----
  
 while(pos!=0){
 for(pos = 1; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees 
 {                                  // in steps of 1 degree 
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(15);                       // waits 15ms for the servo to reach the position 
 } 
 
 delay(3000);
 
 for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees 
 {                                
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(15);                       // waits 15ms for the servo to reach the position 
 } 
 break;
}
   //---- FUNZIONE SERVO-----
// delay(1500); 
 
 }
 
 else digitalWrite(13, LOW);

}

PROBLEMA: Il codice pare funzionare secondo le mie esigenze (a parte i miei sensori del tutto imprecisi, ma per i miei 15 cm da visionare vanno benissimo) se non è che si verifichi un problema, infatti ai primi tre passaggi ai due sensori (attualmente con la mano in fase di prova) va tutto bene, se entrambi i sensori rilevano una distanza<50 (50 messo al momento come prova) si aziona il servo, ma dopo 3 passaggi sui sensori il secondo comincia a dare il segnale “sporco” e quindi entra nell’ if(!t1){Serial.println"Fuori portata"} anche se in realtà non vi è alcun passaggio.

A questo punto, essendo che il sensore2 restituisce sempre un !t1 basta passare anche solo al primo sensore per entrare nell’if(!t1) e quindi azionare il servo, mentre invece il servo deve azionarsi solo se vi è il passaggio su entrambi.

GRAZIE in anticipo per le vostre risposte.

>joe95it: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie,

Guglielmo

Mi accorgo inoltre adesso che ... stai parlando dello stesso argomento di cui si sta già discutendo QUI !

In conformità al REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse) quindi NON si debbono aprire più thread relativi allo stesso argomento/problema.

Continua quindi a porre le tue domande nel thread che avevi già aperto senza aprire più thread e rendere dispersiva la discussione. Grazie.

Guglielmo