rover autocostruito problema ciclo infinito

Ciao ragazzi sono nuovo del forum.
Ho realizzato un rover con 2 motori 12v, 4 ruote motrici con trazione a carrarmato, una videocamera wifi e due sensori antiurto , tutto controllato da arduino mega in cui è installato un webserver che mi consente di controllare il robot con smartphone da qualsiasi parte del mondo.
I due sensori antiurto ne rallentano la velocità fino a fermarsi prima di sbattere.
Tutto ok a parte che quando do il comando "avanti", il robot continua la sua corsa finche non trova un ostacolo, a nulla serve dare il comando di stop.
Probabilmente while blocca arduino mega in un ciclo infinito che termina solo quando i e j diventano 0.
Se tolgo la parte di codice inerente ai sensori tutto funziona regolarmente, però non mi va di limitare il mio progetto..
Per favore aiutatemi

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 1, 9 }; 
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
EthernetServer server(80); 

String readString;
int temp=0;
int statofari;
int dist;
int dist2;
int durata;
int durata2; 
int triggerPort = 34; 
int echoPort = 35;
int triggerPort2 = 7; 
int echoPort2 = 8;
int distance1;
int duration2;
int distance2;
int duration1;
int ostacolo;
int i;int j;

void setup(){
 Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(22,OUTPUT); //MOTORE 1 AVANTI
pinMode(23,OUTPUT); //MOTORE 1 INDIETRO
pinMode(24,OUTPUT); //MOTORE 2 AVANTI
pinMode(25,OUTPUT); //MOTORE 2 INDIETRO
pinMode(44,OUTPUT); //MOTORE 1 PWM
pinMode(45,OUTPUT); //MOTORE 3 PWM
pinMode(34,OUTPUT); //TRIG1
pinMode(7,OUTPUT); //TRIG2
pinMode(35,INPUT); //ECHO1
pinMode(8,INPUT); //ECHO2

pinMode(30,OUTPUT); // FARI
pinMode(31,OUTPUT); // FARI

 // SENSORE TEMPERATURA A9
 // SENSORE LUMINOSITA' A10
i=0;j=0;
}
 
void loop(){
 
 ostacolo=false;
 
 //TEMPERATURA
 int val=analogRead(A0);
 temp = (5.0 * val * 100.0)/1024.0; 
 
 //LUCE
 int luce=analogRead(A1);
 
EthernetClient client = server.available();
if (client) {
 boolean currentLineIsBlank = true;
 while (client.connected()) {
 
 
 if (client.available()) {
 char c = client.read();
 readString.concat(c); 
 
 if (c == '\n' && currentLineIsBlank) {
 
 if(readString.indexOf("Avanti") > 0) { 
 i=140; 
 analogWrite(23,i);
 analogWrite(25,i);
 analogWrite(44,254);
 digitalWrite(22,LOW);
 digitalWrite(24,LOW);
 analogWrite(45,254);
 
 
 while(i>0){
  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;
 
  if (r > 100 || r == 0){ //lo zero è dovuto a possibili errori di recezione del segnale
  
 i=140; 
 analogWrite(23,i);
 analogWrite(25,i);
 analogWrite(44,254);
 digitalWrite(22,LOW);
 digitalWrite(24,LOW);
 analogWrite(45,254);
  }
  else if (r < 100 && r > 60) 
  {
    
  i=140;
 analogWrite(23,i);
 analogWrite(25,i);
 analogWrite(44,127);
 digitalWrite(22,LOW);
 digitalWrite(24,LOW);
 analogWrite(45,127);
  }
  else if (r < 60 && r > 10) 
  { 
    
  i=140;
 analogWrite(23,i);
 analogWrite(25,i);
 analogWrite(44,80);
 digitalWrite(22,LOW);
 digitalWrite(24,LOW);
 analogWrite(45,80);
  }
  else if( r < 10 && r!=0)  //lo zero è dovuto a possibili errori di recezione del segnale
  {
 digitalWrite(22,LOW);
 digitalWrite(23,LOW);
 digitalWrite(24,LOW);
 digitalWrite(25,LOW);
 digitalWrite(44,LOW);
 digitalWrite(45,LOW);
 
 i=0;}
 }
 
 }

  
 if(readString.indexOf("Indietro") > 0) {
 j=140;
 analogWrite(22,j);
 analogWrite(24,j);
 analogWrite(44,254);
 digitalWrite(23,LOW);
 digitalWrite(25,LOW);
 analogWrite(45,254);
 
 
 while(j>0){ 
  digitalWrite( triggerPort2, LOW );
  //invia un impulso di 10microsec su trigger
  digitalWrite( triggerPort2, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( triggerPort2, LOW );
  long duration = pulseIn( echoPort2, HIGH );
  long r = 0.034 * duration / 2;
 
  if (r > 10 || r == 0){ //lo zero è dovuto a possibili errori di recezione del segnale
  
 j=140; 
 analogWrite(23,LOW);
 analogWrite(25,LOW);
 analogWrite(44,254);
 digitalWrite(22,j);
 digitalWrite(24,j);
 analogWrite(45,254);
  }
 
  else if( r < 10 && r!=0)  //lo zero è dovuto a possibili errori di recezione del segnale
  {
 digitalWrite(22,LOW);
 digitalWrite(23,LOW);
 digitalWrite(24,LOW);
 digitalWrite(25,LOW);
 digitalWrite(44,LOW);
 digitalWrite(45,LOW);
  
 j=0;}}
 }
 
 if(readString.indexOf("Destra") > 0) { 
 analogWrite(23,130);
 analogWrite(24,130);
 analogWrite(44,254);
 digitalWrite(22,LOW);
 digitalWrite(25,LOW);
 analogWrite(45,254);
 delay(200);
 digitalWrite(22,LOW);
 digitalWrite(23,LOW);
 digitalWrite(24,LOW);
 digitalWrite(25,LOW);
 digitalWrite(44,LOW);
 digitalWrite(45,LOW);
 }
 
 if(readString.indexOf("Sinistra") > 0) { 
 analogWrite(22,130);
 analogWrite(25,130);
 analogWrite(45,254);
 digitalWrite(23,LOW);
 digitalWrite(24,LOW);
 analogWrite(44,254);
 delay(200);
 digitalWrite(22,LOW);
 digitalWrite(23,LOW);
 digitalWrite(24,LOW);
 digitalWrite(25,LOW);
 digitalWrite(44,LOW);
 digitalWrite(45,LOW);
 }
 
 if(readString.indexOf("Stop") > 0) { 
 digitalWrite(22,LOW);
 digitalWrite(23,LOW);
 digitalWrite(24,LOW);
 digitalWrite(25,LOW);
 digitalWrite(44,LOW);
 digitalWrite(45,LOW);
 i=0;  j=0;
 }
 if(readString.indexOf("Fari1") > 0) { 
 digitalWrite(30,HIGH);
 digitalWrite(31,HIGH);
 statofari=true;
 }
 if(readString.indexOf("Fari0") > 0) { 
 digitalWrite(30,LOW);
 digitalWrite(31,LOW);
 statofari=false;
 }
 
 //HTML

Prima di tutto essendo il tuo primo post, nel rispetto del regolamento, ti chiedo di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Grazie,

Guglielmo

Scusa non ho mai scritto in un forum.
La mia intenzione era quella.
Scusa ancora

Mi pare la logica è completamente errata. Hai un codice quasi sequenziale.
Il programma in loop() deve essere pensato come una Macchina a Stati Finiti.
Inizia a leggerti questo tutorial: www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/

La "variazione" dello stato della macchina deve arrivare da web oppure dai sensori, dando precedenza ai sensori.

stefanorover:
Scusa non ho mai scritto in un forum.
La mia intenzione era quella.
Scusa ancora

Nessun problema, però ... fallo quello che ti ho chiesto :smiley:

Guglielmo

In C puoi creare delle funzioni che raggruppano comandi sempre uguali.
Esempio, mi pare hai molte volte questo:

 digitalWrite(22,LOW);
 digitalWrite(23,LOW);
 digitalWrite(24,LOW);
 digitalWrite(25,LOW);
 digitalWrite(44,LOW);
 digitalWrite(45,LOW);

che credo sia lo stop dei motori ?
Allora crea in cima una funzione StopMotori()

void StopMotori()
{ digitalWrite(22,LOW);
  digitalWrite(23,LOW);
  digitalWrite(24,LOW);
  digitalWrite(25,LOW);
  digitalWrite(44,LOW);
  digitalWrite(45,LOW);
}

Nel programma loop() ogni posto in cui hai quel gruppo lo sostituisci con la chiama StopMotori()

scusate ma perché il codice completo non ci sta?
supera i 9000 caratteri, quindi cosa si fa?
con il codice completo è più facile intuire una soluzione e un quadro della situazione

Se non ci stà lo alleghi come file, usi pulsante "Attachments and other options"

Ribadisco, la logica del tuo programma non può andare bene per un qualcosa che deve avere uno stato iniziale e poi cambiare stato a seconda dei comandi.
Ogni delay() o ciclo while che metti blocca il programma che non può processare altri comandi.

Grazie Igor!
Ho risolto al primo tentativo , grazie al tuo consiglio.
Era una questione di priorità.
Prima i sensori poi tutto il resto.
Mi sono fissato su while senza pensare ad altro.
grazie ancora....