Problema Sensore Ultrasuoni (hc-sr04)

Salve ragazzi, è arrivata l'ora che monti il progetto di maturità, per chi non sa di che si tratta può vederlo nel mio profilo!

Allora, ho un problema, forse ho la testa a mille cose ma non riesco ad arrivare ad una soluzione, sto costruendo un semaforo di un incrocio e fin qua ci siamo, tutto apposto , ma voglio stampare nell'lcd la distanza delle macchine in avvicinamento..

Adesso scrivendo il codice , non riesco ad avere una acquisizione dal sensore continua, ma solo quando il semaforo finisce il loop, e il programma torna su mi acquisisce la distanza..
La mia domanda è:

Come posso acquisire la distanza CONTINUAMENTE durante l'esecuzione del loop?

 #define led1 9
  #define led2 2
  #define led3 3
  //Secondo Semaforo
  #define leda 4
  #define ledb 5
  #define ledc 6
  
  #include <Wire.h> // Includo le librerie Wire e TWI2
   #include <LiquidTWI2.h>
    LiquidTWI2 lcd(0); //Iniziallizzo la connessione I2C all'indirizzo di default "o"
      const int triggerPort = 7;
        const int echoPort = 8;
          
    void setup()
    {
      Serial.begin(9600);
       Serial.print( "Sensore Ultrasuoni: ");
   pinMode(triggerPort,OUTPUT);
    pinMode(echoPort,INPUT);
     pinMode(led1,OUTPUT);
       pinMode(led2,OUTPUT);
        pinMode(led3,OUTPUT);
         pinMode(leda,OUTPUT);
          pinMode(ledb,OUTPUT);
           pinMode(ledc,OUTPUT); 
    lcd.setMCPType(LTI_TYPE_MCP23017); //Imposto il tipo di integrato (MICROCHIP)
     lcd.begin(16, 2);
      lcd.print("Semaforo");
        lcd.setCursor(0, 1);
          delay(2000);
            lcd.print("Intelligente");
              delay(2000);
                lcd.setCursor(13,1);
                  lcd.print("1.0");
                   delay(2000); 
                    lcd.clear();
                      lcd.setCursor(0,0);
                        lcd.print("Creato da:");
                          delay(2000);
                            lcd.setCursor(4,1);
                              lcd.print("Luca Costa");
                                delay(4000);
                                  lcd.clear();
                                    lcd.setCursor(0,0);
                                      lcd.print("Visita:Platone");
                                        delay(2000);
                                         lcd.setCursor(1,1);
                                          lcd.print("Ngineering.it");
                                           delay(4000);
                                            lcd.clear();
                                              delay(100);
                                              }

void loop() {
  digitalWrite( triggerPort, LOW );
//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;
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 )  Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}

digitalWrite(led3,HIGH); 
digitalWrite(led2,LOW);
digitalWrite(led1,LOW); 

digitalWrite(ledc,LOW); 
digitalWrite(ledb,LOW); 
digitalWrite(leda,HIGH); 
delay(5000);

digitalWrite(led2,HIGH); 
delay(1000);

digitalWrite(led3,LOW); 
digitalWrite(led2,LOW); 
digitalWrite(led1,HIGH); 
digitalWrite(ledc,HIGH); 
digitalWrite(ledb,LOW); 
digitalWrite(leda,LOW); 

delay(10000);

digitalWrite(ledb,HIGH); 
delay(1000);

}

P.S Comunicazione seriale solo per testare, poi configuro il diplay

Grazie anticipatamente per l'aiuto :slight_smile:

Il problema è che stai usando la funzione delay che blocca tutto il sistema.

Al suo posto devi usare la funzione millis oppure usare un timer sotto interrupt che alla scadenza del conteggio faccia partire la funzione che esegue la misura ed aggiorna il display e/o il serial monitor.

Utilizzando la funzione Millis risolvo il problema?
Mi interessa il timer , potresti dirmi di più?

Con millis risolvi il problema, mentre l'uso dei timer di Arduino è più elegante, ma richiede una certa conoscenza.

La prima soluzione è più indicata per i neofiti, anche per imparare l'uso di questa comoda funzione.

Ti ringrazio sei sempre tu che mi rispondi :slight_smile: