come "uscire" da una void una variabile??

Scusate la mia ignoranza ma risolvo un problema e incappo in un altro, cioè sono riuscito a creare una void dove legge tramite ultrasuoni la distanza ma quando eseguo una if per il controllo se minore di 1400 non so il perchè ma non funziona... vi allego il listato per intero...

#include <Servo.h>
Servo Testa;
Servo servopin;
Servo servopin2;

long durata;
//------------------
int centerPos = 90;
int frontRightUp = 72;
int frontLeftUp = 108;
int backRightForward = 75;
int backLeftForward = 105;

void movesinistra() 
{
servopin.write(frontRightUp);
servopin2.write(backLeftForward);
delay(125);
servopin.write(centerPos);
servopin2.write(centerPos);
delay(65);
servopin.write(frontRightUp);
servopin2.write(backLeftForward);
delay(125);
servopin.write(centerPos);
servopin2.write(centerPos);
delay(65);
}
//------------------

int angle2;
int triggerPort = 7; //uscita segnale trigger
int echoPort = 8;//ingresso echo
int angle;
int pulsewidth;
int conta = 0;

void servopulse(int servopin,int angle){
        pulsewidth=(angle*11)+500;
     digitalWrite (servopin,HIGH);
     delayMicroseconds (pulsewidth);
     digitalWrite (servopin,LOW);
     delay (15);
     }
   
void servopulse2(int servopin2,int angle){
        pulsewidth=(angle*11)+500;
     digitalWrite (servopin2,HIGH);
     delayMicroseconds (pulsewidth);
     digitalWrite (servopin2,LOW);
     delay (15);
     }
  void ultrasonico() 
{   
       
digitalWrite( triggerPort, LOW );  //setta al livello logico 0 la porta trigger
 
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );//setta al livello logico 1 (5V) la porta trigger
delayMicroseconds( 10 ); //ritardo di 10 microsecondi
digitalWrite( triggerPort, LOW ); //setta al livello logico 0 la porta trigger
 
long duration = pulseIn( echoPort, HIGH ); //long variabili a 32bit, duration nome della variabile
     // mette dentro duration il tempo che trascorre prima che echoPort diventa allo stato logico1
long r = 0.034 * duration / 2; //long variabili a 32bit, r nome della variabile
                               //mette dentro r 
Serial.print( "durata: " );  //scrive sul monitor la scritta tra ""
Serial.print( duration ); //scrive sul monitor la la variabile tra()
Serial.print( " , " ); //scrive sul monitor la scritta tra ""
Serial.print( "distanza: " ); //scrive sul monitor la scritta tra ""
 
//dopo 38ms è fuori dalla portata del sensore, adesso fino a 50ms
if( duration > 50000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}
delay( 10 );
durata==duration;
 }    
     
void setup()
{
  Testa.attach(4);
  servopin.attach(2);
  servopin2.attach(3);
   
pinMode( triggerPort, OUTPUT );// triggerPort è una porta in uscita
pinMode( echoPort, INPUT );    // echoPort è una porta in ingresso
Serial.begin( 9600 );    //imposta la porta seriale del monitor a 9600
Serial.println( "Sensore ultrasuoni: ");  //scrive sul monitor la scritta tra ""
  }
  void loop()
  {
inizio:
     conta=5;
cammina:    
ultrasonico();

if (durata < 1400) {movesinistra();}
        
 conta--;
    
servopin.write(72);
delay(300);
servopin2.write(105);
delay(300);

servopin.write(90);
delay(300);
servopin2.write(90);
delay(300);

servopin.write(108);
delay(300);
servopin2.write(75);
delay(300);

servopin.write(90);
delay(300);
servopin2.write(90);
delay(300);
    
    if (conta==0) {goto testaa;}
      else {goto cammina;}
     
testaa:   
      //-----------------------------------qui sotto gira la testa------------------------------
        
    for (angle2=90; angle2>=0; angle2--){ //ciclo for che sposta l'angolo del servo
   
   Testa.write(angle2);
   delay(30);}
   
   delay(2000);
      
     for (angle2=0; angle2<=45; angle2++){ //ciclo for che sposta l'angolo del servo
      
   Testa.write(angle2);
   delay(30);}
      
   delay(2000);
     
   //-----------------------------
   
   for (angle2=45; angle2<=90; angle2++){ //ciclo for che sposta l'angolo del servo
      
   Testa.write(angle2);
   delay(30);}
   
   delay(2000);
   //-----------------------------
   for (angle2=90; angle2<=135; angle2++){ //ciclo for che sposta l'angolo del servo
      
   Testa.write(angle2);
   delay(30);}
   
   delay(2000);
   //-----------------------------
   for (angle2=135; angle2<=178; angle2++){ //ciclo for che sposta l'angolo del servo
      
   Testa.write(angle2);
   delay(30);}
   
   delay(2000);
   //-----------------------------
         
   for (angle2=178; angle2>=90; angle2--){ //ciclo for che sposta l'angolo del servo
      
   Testa.write(angle2);
   delay(30);}
   
   delay(2000);
   //------------------------------
        
   }

in pratica questo specie d'insetto cammina, appena trova un ostacolo sotto i 30cm circa deve girare a sinistra. Controllo dal monitor seriale che mi indica la distanza giusta, e capisco che non dovrebbe girare, invece gira sempre come se la variabile fosse sempre minore.

durata==duration;

è errato, per memorizzare il valore si scrive

durata=duration;
come hai scritto tu la variabile durata non cambia mai,
comunque sarebbe stato meglio definire la variabile "duration " globale e utilizzare quest'ultima nell'if.

if (duration < 1400) {movesinistra();}

lo fai dichiarando la funzione non void ma int o altro

int misura distanza()
{ ... 
return(distanza);
}

Ciao Uwe

Non è possibile.
O una funzione è void e quindi non restituisce alcun parametro oppure è dichiarata in base al parametro che restituisce: int, byte, long, tipi custom, ecc.

A dire il vero, un modo anche con void ci sarebbe ma devi passare una parametro con puntatore.

Oppure la rendi pubblica.

maaaaa...il titolo come "uscire" da una void una variabile? equivale a "escimi la bambina che la gioco"? :smiley: :smiley: :smiley:

Come ti ha detto Uwe, invece che dichiarare la funzione di tipo void, la dichiari del tipo di dato che vuoi restituire.
Poi usi "return" per uscire.

Oppure usi una variabile globale: puoi modificarla in qualunque funzione del tuo programma ed il suo valore lo puoi leggere da qualunque funzione.

PS:
devi prendere l'abitudine di indentare per bene il codice, perché così non è molto leggibile... :sweat_smile:
fai un piacere a te stesso, perché lo mantieni meglio, ma anche agli altri che lo devono leggere per aiutarti :wink:

Grazie per i consigli, e scusate se non mi esprimo in modo corretto. Il mio problema di fondo è che provengo dall'assembler, li con 30 istruzioni penavi ma riuscivo a fare molte cose, chiamavo con call una routine e con return ritornavo nel main del programma avendo modificato una variabile o altro. Adesso mi trovo immerso nel codice C e non riesco a capire le sintassi da applicare per risolvere il mio "problema". Quello che mi serviva adesso era capire come costruire una void o routine (esempio questo dell'ultrasuoni) da chiamare durante l'esecuzione del void loop, e memorizzare dentro una variabile (long) il valore da poter interrogare con if nel void loop.
Grazie.

Nella sezione Megatopic c'è un Topic con "LINK UTILI".
Li dentro, oltre a collegamenti per l'elettronica di base, trovi anche collegamenti relativi a guide al linguaggio C.
Se hai già basi di programmazione in Assembler non dovresti avere molte difficoltà ad imparare un nuovo linguaggio. :grin:

Una veloce lettura sul linguaggio C la trovi qui --> C (linguaggio): tutorial per imparare programmare | Guida HTML.it

Grazie per i consigli! Sono riuscito a risolvere i problemi per ottenere il calcolo delle variabili, adesso mi è sorto u altro problema, Come devo comparare 5 varibili? cioè ho 5 variabili con all'interno 5 valori e devo sapere dove si trova il valore maggiore. Ho pensato di annidare più if e else ma mi confondo come fare, inizio così:

if (media1>media2) {if (media1>media3){if (media1>media4) {if (media1>media5);}}}
      else {if(media2>media3){if (media>media4) ;}

i valori sono contenuti dentro le variabili media1-5

Puoi usare gli operatori && (and) e II (or).

Esempio

if (media1>media2 && media1>media3 && media1>media4 && media1>media5)
  { 
   .....
  }
  else
   {
    if (media2>media3 && media>media4)
      {
        ....
     }
   }

Però mi sa che tu vuoi fare qualcos'altro...

Io in pratica leggo 5 distanze e poi devo far girare questo robot nella direzione più lontana, quindi devo capire di queste 5 variabili quella più grande! sapendo quella più grande essempio se è la prima gli faccio fare 2 cicli di rotazione, così il robot si gira a destra di circa 90 gradi se è la seconda variabile 1 ciclo di rotazione così ruota a destra di 45 gradi, se è la terza cammina dritto se è la quarta gira di 45 gradi a sinistra se è la quinta gira a sinistra di 90 gradi. =( =( =(

Penso che se scrivo quello che mi hai detto forse ci riesco... ora provo... Grazie!

Posso scrivere questo? Cioè controllare ogni variabile se è maggiore dell'altra senza else?

 if (media1>=media2 && media1>=media3 && media1>=media4 && media1>=media5)
  { movedestrastra();movedestrastra();}//90gradi dx
 if (media2>=media3 && media2>=media4 && media2>=media5 && media2>=media1)
  { movedestrastra();}//45 gradi dx
 if (media3>=media4 && media3>=media5 && media3>=media1 && media3>=media2)
  { moveavanti();}//dritto
 if (media4>=media5 && media4>=media1 && media4>=media2 && media4>=media3)
  { movesinistra();} //45 gradi sx
 if (media5>=media1 && media5>=media2 && media5>=media3 && media5>=media4)
  { movesinistra();movesinistra();}//90gradi sx

così esegue tutte le if e si dovrebbe girare solo dove trova la variabile "media" più grande! O no?

Potresti anche affrontare la cosa in altro modo forse meno intuitivo.
I 5 dati li metti in un array, scrivi una funzione che esegue la ricerca del valore maggiore che una volta trovato ritorna il valore dell'indice. L'indice lo usa in un costrutto switch (index) case 1: ecc

La ricerca del valore maggiore in un array sarebbe più rapida se i dati fossero messi in ordine, se non
lo sono (perché magari cambiano molto spesso come in questo caso) la ricerca è sì più lenta ma con solo 5 valori non dovrebbe creare problemi al robot.

In effetti di robotica non ci capisco nulla magari c'è già una soluzione collaudata, ma non lo conosco.

Ciao.

FUNZIONA!!!!! :grin: :grin: Grazie mille Paolo e tutti del forum!!

Eseguendo le if in sequenza si gira in maniera corretta!! Favoloso!! si può allegare un video??

Non ho mai provato ad allegare video.
Forse se lo pubblichi su Youtube e metti il link...