aiuto con mio progetto

giorno a tutti ho realizzato un progetto una macinino che rileva l ostacolo e lo evita ma ho un problema con il programma perché il sensore mi rileva sempre 0 o ogni tanto qualche valore strano e così facendo mi va in stallo la macchinina potreste dirmi quali sono gli errori e come risolverli?
grazie in anticipo

posto sotto il programma a causa delle dimensioni

#include <Servo.h>

// creazione degli oggetti servo
Servo MotoreSinistro;
Servo MotoreDestro;

const int periodoStampaSuSeriale = 250;       // stampa sulla Serial Monitor ogni 1/4 di secondo
unsigned long ritardoSuSeriale = 0;

const int periodoLoop = 20;          // un periodo di 20 ms = una frequenza di 50Hz
unsigned long ritardoLoop = 0;

// specifica i pin di trig e echo usati per il sensore ad ultrasuoni
const int TrigPin = 8;
const int EchoPin = 9;

int distanza;               // distanza rilevata dal sensore
int durata;                 // durata dell'eco rilevata dal sensore ad ultrasuoni
int minimaDistanza = 10;    // distanza di soglia a cui il robot deve cambiare direzione
unsigned long tempoRotazioneSx = 1100;  // 1,1 secondi (circa) per effettuare una rotazione di 90°
                                       // variare questo valore in funzione nel caso la rotazione non sia perfettamente di 90°

// definizione degli stati
#define VAI_AVANTI  0
#define GIRA_SX     1

int stato = VAI_AVANTI;   // 0 = vai avanti (DEFAULT), 1 = gira a sinistra

void setup()
{
 Serial.begin(9600);     // configurazione dei pin Arduino a cui colleghiamo il sensore
 pinMode(TrigPin, OUTPUT);
 pinMode(EchoPin, INPUT);

 MotoreSinistro.attach(11);
 MotoreDestro.attach(10);
}


void loop()
{
   printOutput(); // stampa un messaggio di debug sulla Serial Monitor
   
   if(millis() - ritardoLoop >= periodoLoop)
   {
       letturaSensoreUltrasuoni(); // legge e memorizza la distanza misurata
       
       azioneRobot();
       
       ritardoLoop = millis();
   }
}

void azioneRobot()
{
 if(stato == VAI_AVANTI) // non viene rilevato nessun ostacolo
 {
   if(distanza > minimaDistanza || distanza < 0) 
   // non è presente nessun ostacolo di fronte al sensore
   // nota: la distanza rileata può assumere valori negativi se non è presente nessun ostacolo di fronte 
   {  MotoreDestro.write(180);
     MotoreSinistro.write(180);
     // vai avanti
    
     
   }
   else // se ci sono oggetti di fronte gira a sinistra
   {
     stato = GIRA_SX;
   }
 }
 else if(stato == GIRA_SX) // viene rilavato un ostacolo, il robot gira a sinistra
 {
   unsigned long tempoRotazioneSx = 1100;         // ci voglion circa 1,1 secondi per ruotare di 90°
   unsigned long tempoInizioRotazione = millis(); // memorizziamo l'istante in cui incomincia la rotazione
   
   while((millis()-tempoInizioRotazione) < tempoRotazioneSx) // il robot ruota a sinistra fino a quando non sono passati 1,1 secondi
   {
     // gira a sinistra
   
     MotoreSinistro.write(180);
     MotoreDestro.write(0);
     
   }
   stato = VAI_AVANTI;
 }
}

void letturaSensoreUltrasuoni()
{
   digitalWrite(TrigPin, HIGH);
   delayMicroseconds(10);                  // mantiene alto il trigger per almeno 10us 
   digitalWrite(TrigPin, LOW);
   
   durata = pulseIn(EchoPin, HIGH);
   distanza = (durata/2)/29;
}


void printOutput()
{
   if((millis() - ritardoSuSeriale) > periodoStampaSuSeriale)
   {
       Serial.print("distanza: ");
       Serial.print(distanza);
       Serial.print("cm: ");
       Serial.println();
       
       ritardoSuSeriale = millis();
   }
}

E' scritto troppo piccolo ?
PER FAVORE LEGGERE PRIMA DI SCRIVERE

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

all ora ripresento la domanda ho un arduino uno e il mio progetto consiste nel e programmare arduino in modo che la macchinina si muovi liberamente e nel momento in cui rileva(sensore ultrasuoni HC-SR04) l ostacolo lo evita
il materiale che ho usato sono il sensore HC-SR04
2 servomotori MG946R
arduino uno e 2 pile da 9 volt

il problema e che quando carico il programma e guardo il seria monitor mi rileva sempre distanza 0cm o dopo un po di tempo qualche valore strano senza la presenza di niente di vicino
potreste cortesemente dirmi se ci sono problemi nel programma e come risolverli?
grazie in anticipo

macchinina.ino (3.14 KB)

prova a dichiarare unsigned long la variabile durata.

ho provato ma niente

Io scriverei cosi:

#include <Servo.h>

#define _DEBUG_

Servo MotoreSinistro;
Servo MotoreDestro;

const int PERIODO_LOOP = 20;
const int TRIG_PIN = 8;
const int ECHO_PIN = 9;

unsigned long cadenza;
unsigned long distanza;               // distanza rilevata dal sensore
unsigned long durata;                 // durata dell'eco rilevata dal sensore ad ultrasuoni
unsigned long minimaDistanza = 10;    // distanza di soglia a cui il robot deve cambiare direzione
unsigned long tempoRotazioneSx = 1100;  // 1,1 secondi (circa) per effettuare una rotazione di 90°
                                       // variare questo valore in funzione nel caso la rotazione non sia perfettamente di 90°


void letturaSensoreUltrasuoni()
{
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10); 
    digitalWrite(TRIG_PIN, LOW);
   
    durata = pulseIn(ECHO_PIN, HIGH);
    distanza = durata / 58;
    
    #ifdef _DEBUG_
        Serial.print("raw ultrasuoni:");
        Serial.println(durata);
        Serial.print("distanza:");
        Serial.println(distanza);
    #endif
}

void robotAvanti()
{
    MotoreDestro.write(180);
    MotoreSinistro.write(180);
    #ifdef _DEBUG_
       Serial.println("robotAvanti()");
    #endif
}

void robotSX()
{
    MotoreSinistro.write(180);
    MotoreDestro.write(0);
    
    #ifdef _DEBUG_
       Serial.println("robotSX()");
    #endif
    
    unsigned long inizioRotazione = millis();
    while( (millis() - inizioRotazione) < tempoRotazioneSx );
    
    robotAvanti();
} 

void azioneRobot()
{
    if( distanza < minimaDistanza ) 
    {
        #ifdef _DEBUG_
           Serial.println("Collision()");
        #endif
        robotSX();
    }
}

void setup()
{
    pinMode(TRIG_PIN, OUTPUT);
    pinMode(ECHO_PIN, INPUT);
    MotoreSinistro.attach(11);
    MotoreDestro.attach(10);
    robotAvanti();
    cadenza = millis();
    
    #ifdef _DEBUG_
        Serial.begin(9600);
    #endif
    
}


void loop()
{
   if( (millis() - cadenza) >= PERIODO_LOOP)
   {
       letturaSensoreUltrasuoni(); // legge e memorizza la distanza misurata
       azioneRobot();
       cadenza = millis();
   }
}

Ora attaccherei alla usb e proverei.
In caso non fa quello che vuoi te posta il log di quello che ricevi sulla seriale.
In caso tu voglia usarlo staccato dalla usb elimina questa riga:

#define _DEBUG_

compila ed invia.