Software per comparare Distanza con SRF05

Ciao a tutti ! vi spiego il mio problema:

Ho un servo motore, un sensore ultrasuoni (SRF05) e due led; In pratica il sensore è posizionato su un servo motore, il mio programma deve comparare la distanza che rileva a destra e quella che rileva a sinistra e a secondo di quale sia maggiore o minore accendere uno dei due led, il mio progetto è quello di un robot, quindi dopo sostituirò il programma per accendere il led con quello per far avviare le ruote.

il problema è che lampeggia solo un led in continuazione

questo è il codice:

#include <Servo.h> //libreria servo motore
Servo servo; //crea l’oggetto di tipo Servo,servo sarà l’oggetto su cui opero;
int durata;           //durata dell'impulso 
int distanza;        // distanza oggetto
int pin_segnale = 8; // pin sensore collegato ad arduino
int leftDistance, rightDistance;
int led1 = 13;
int led2 = 12;

void setup()

{

  Serial.begin(9600);
  servo.attach(2); //piedino di comando del servo collegato al piedino 2 di arduino
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  
}

void loop()
{


    servo.write(0); 
    delay(500);
    rightDistance = Srf(); 
    delay(500);
    servo.write(180);
    delay(700);
    leftDistance = Srf(); 
    delay(500);
    servo.write(90); 
    delay(100);
  
  if (leftDistance>rightDistance) 
  {
    sinistra();
    
  }
 
   else 
  {
    destra(); //turn 180 degrees
  }
}

long Srf()

{
  
  pinMode(pin_segnale, OUTPUT);
  digitalWrite(pin_segnale, LOW);      // viene posto a LOW pin, per 2 microsecondi
                                       // prima di inviare un breve impulso di trigger
  delayMicroseconds(2);  
  digitalWrite(pin_segnale, HIGH);     // invia un impulso di trigger 
  delayMicroseconds(10);               // di 10 microsecondi
  digitalWrite(pin_segnale, LOW);      // pone il pin al LOW in attesa che l'impulso torni indietro
  pinMode(pin_segnale, INPUT);
  durata = pulseIn(pin_segnale, HIGH); // legge l'eco dell'impulso emesso in microsecondi
  distanza = durata/130;                // divide la durata per 58 per ottenere la distanza in cm
  Serial.println(distanza);            // stampa sul Serial Monitor il valore della distanza
  
  
}

void sinistra()

{
 digitalWrite(led1, HIGH);
 delay(1000);
 digitalWrite(led1, LOW);
}



void destra() 
{
 
 digitalWrite(led2, HIGH);
 delay(1000);
 digitalWrite(led2, LOW);
  
}

..Allego anche il file .ino

e un video di quello che succede... - YouTube

Attendo risposte grazie

nnmn.ino (1.83 KB)

Usa i tag CODE, pulsante # nell'editor, per includere il codice. punto 7 --> http://arduino.cc/forum/index.php/topic,149082.0.html

manca --> return distanza; :grin:

#include <Servo.h> //libreria servo motore

// int durata;           //durata dell'impulso 
// int distanza;        // distanza oggetto
const byte pin_segnale = 8; // pin sensore collegato ad arduino
const byte led1 = 13;
const byte led2 = 12;

unsigned long leftDistance, rightDistance;
Servo servo; //crea l’oggetto di tipo Servo,servo sarà l’oggetto su cui opero;

void setup() {
  delay(1000);
  Serial.begin(9600);
  servo.attach(2); //piedino di comando del servo collegato al piedino 2 di arduino
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop()
{
  servo.write(0); 
  delay(500);
  rightDistance = Srf(pin_segnale); 
  delay(500);
  servo.write(180);
  delay(700);
  leftDistance = Srf(pin_segnale); 
  delay(500);
  servo.write(90); 
  delay(100);

  if (leftDistance>rightDistance) 
  {
    sinistra();
  }
  else 
  {
    destra(); //turn 180 degrees
  }
}

unsigned long Srf(byte pin) {
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);      // viene posto a LOW pin, per 2 microsecondi prima di inviare un breve impulso di trigger
  delayMicroseconds(2);  
  digitalWrite(pin, HIGH);     // invia un impulso di trigger 
  delayMicroseconds(10);               // di 10 microsecondi
  digitalWrite(pin, LOW);      // pone il pin al LOW in attesa che l'impulso torni indietro
  pinMode(pin, INPUT);
  unsigned long durata = pulseIn(pin, HIGH); // legge l'eco dell'impulso emesso in microsecondi
  unsigned long distanza = durata/130;                // divide la durata per 58 per ottenere la distanza in cm
  Serial.println(distanza);            // stampa sul Serial Monitor il valore della distanza
  return distanza;
}

void sinistra() {
  digitalWrite(led1, HIGH);
  delay(1000);
  digitalWrite(led1, LOW);
}

void destra() {
  digitalWrite(led2, HIGH);
  delay(1000);
  digitalWrite(led2, LOW);
}

Ok grazie, provo subito ...ho provveduto a modificare il post..grazie per il suggerimento

Grazie PaoloP !! Funziona !! Perfetto

Mi potresti spiegare dov'è ho sbagliato oltre a return ??

E ti sembra poco? :grin:
Senza il comando return la funzione non restituisce nessun valore quindi l'IF era a senso unico.

Le altre modifiche riguardano l'allocazione di variabili e il passaggio di variabili alle funzioni per rendere il codice più flessibile.