problema sketch: loop con due azioni diverse

salve a tutti, mi sono appena iscritto e colgo l'occasione per salutare tutti i membri del forum. Vengo al sodo, ho un problema con lo sviluppo di uno sketch, è molto semplice ma non riesco a lo stesso a cavarci le gambe. Dunque per dirla breve ho bisogno che lo sketch faccia questo: Un "ping" rileva la distanza da un oggetto posto davanti, se la distanza è inferiore a 10 cm, viene azionato un servomotore che compie 180°. [u]FIN QUI TUTTO OK.[/u] Il problema viene ora, perchè il prossimo oggetto messo davanti al PING dovrà riazionare il servo che però dovrà fare 120° gradi e non più 180° come la prima volta. Fatto questo secondo movimento, lo sketch dovrà ripartire dall'inizio. In pratica andata 180° ritorno 120°, solo però quando il ping rileva l'oggetto (quindi non posso scrivere un "normale" loop..). Quali comandi posso usare per risolvere il quesito? Ci sto pensando da giorni, ho provato anche a mettere un counter che dia valore 1 al ciclo dei 180° e 2 al ciclo dei 130 e dargli la condizione che al counter 2 vada al ciclo 2 ma niente da fare.... ho provato con etichette, 2 loop..... nulla non ci tolgo le gambe.... aspetto i vostri consiglie e grazie in anticipo! Francesco

metti il codice!!

ciao, questo è il codice fino a dove sono arrivato

#include <Servo.h> 
#include <LiquidCrystal.h>
LiquidCrystal lcd(31, 30, 34, 35, 36, 37);

 
Servo myservo;
 int grado = 0; //grado iniziale dell'albero s
int minGrad = 0;
int maxGrad = 180;
int pinServo = 3;
 int pos = 0;
 
 void setup()
 {
   myservo.attach(3); 
   pinMode (9,INPUT);
  pinMode (8,OUTPUT);
  Serial.begin(9600);
 }
 
 void loop()
 {
   digitalWrite (8,LOW);
  delayMicroseconds (1);
  digitalWrite (8,HIGH);
  delayMicroseconds (1);
  digitalWrite (8,LOW);
  long ping= pulseIn (9,HIGH);
  long distanza = ping/58.0;
  
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("Rilevamento");
lcd.setCursor(1, 1);
  lcd.print("distanza");
lcd.setCursor(14, 1);
  lcd.print("cm");
  lcd.setCursor(11, 1);
  lcd.print(distanza);
delay(50);


if (distanza<15)
  {
lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("azione 180°");
 delay(2000);
 for(pos = 0; pos < 180; pos += 3) 
   {
     myservo.write(pos);
     delay(15);
     }
     delay(2000);
   for(pos = 180; pos>=3; pos-=3)
   {
     myservo.write(pos);
     delay(15);
}}}

cecco77: ... il prossimo oggetto messo davanti al PING dovrà riazionare il servo che però dovrà fare 120° gradi e non più 180° come la prima volta. Fatto questo secondo movimento, lo sketch dovrà ripartire dall'inizio. In pratica andata 180° ritorno 120°...

Hai un servo che gira all infinito oppure ci sono problemi. se giri 180 a destra e poi 120 ritorno e poi di nuovo 180 arrivi velocemente al finecorsa.

Il Tuo codice gira il Servo di 180 gradi e poi di altri 180 indietro. Ciao Uwe

esatto, qui il servo gira 180 avanti e 180 indietro e torna diciamo all'inizio. la prossima volta vorrei che facesse 120° andata e 120° al ritorno. E via di nuovo prima andata e ritorno 180 dopo andata e ritorno 120. Scusami mi sono spiegato male prima

dentro il blocco dell’if distanza metti qualcosa del genere:

ovviamente all’inizio del programma inizializzi la variabile posfinale=120

if (distanza<15)
{
  lcd.clear();
  lcd.setCursor(1, 0);
  if (posfinale==180)
   {posfinale = 120;
    lcd.print("azione 120°");}
  else
   {posfinale=180;
    lcd.print("azione 180°");}
  
 delay(2000);
 for(pos = 0; pos < posfinale; pos += 3) 
   {
     myservo.write(pos);
     delay(15);
     }
     delay(2000);
   for(pos = posfinale; pos>=3; pos-=3)
   {
     myservo.write(pos);
     delay(15);
   }
}

cambia il titolo della discussione con qualcosa che rifletta il tuo problema per favore.

paulus1969: dentro il blocco dell'if distanza metti qualcosa del genere:

ovviamente all'inizio del programma inizializzi la variabile posfinale=120

GRAZIE PAULUS!! Mi hai risolto il problema! :) Grazie a tutti alla prossima!

[quote author=Federico Vanzati link=topic=190574.msg1409018#msg1409018 date=1380392942] cambia il titolo della discussione con qualcosa che rifletta il tuo problema per favore. [/quote]

fatto, scusami ;)

cecco77: salve a tutti, ....... ..... nulla non ci tolgo le gambe.... aspetto i vostri consiglie e grazie in anticipo! Francesco

mah.... qualche variabile che porti da zero a uno insieme al primo movimento e per il secondo movimento controlli la variabile se è a uno fai il secondo movimento e porti la variabile a zero