problema con while

ho due parti loop separeti invio comando seriale se sensore alto esegue azione altrimenti attende che il sensore sia libero per eseguire, nela seconda parte del loop invio diverso comando seriale e esegue azione nella stessa modalita.il problema e che se la condizione non si avvera cosa che capita non mi accetta altro comando,come fare mantenedo while:

Grazie in anticipo invio sketch

while_mot__e_seriale_ok.ino (1.44 KB)

Non capisco il senso dello sketch. Ciao Uwe

Di base, fare questa lettura: val = Serial.read (); Senza aver verificato se è disponibile un dato è una cosa errata. Devi usare Serial.available()

if(Serial.available())
{ val = Serial.read ();

A che serve Riavvia(); ??? a far riavviare Arduino ? Perchè ?

La loop() è già un ciclo infinito (un while quindi)

Secondo me devi leggerti e capire qualcosa sulle macchine a stati finiti, ovvero attraverso una variabile di "stato" Arduino deve capire in che "momento" si trova. Un semaforo stradale ad esempio ha 4 stati finiti, di notte lampeggiante, di giorno verde/giallo/rosso secondo una temporizzazione.

http://www.gammon.com.au/forum/?id=12316

Secondo me il concetto del programma é sbaglaito. per primo usi tante costruzioni che frenano il programma ( delay e while) e per secondo un riavvio del programma é un idea assurda per un programma.

Perché pensi di dover resettare Arduino?

Ciao Uwe

scusate non sono stato chiaro il senso dello sketch è: ho un motrore che puo girare a destr o sinistra due sensori uno a sinistra e uno a destra se invio comando seriale per girare a dx si verifiaca lo stato del sensore se è acceso avvia il motore fino a quando il sensore diventa spento,. ma si puo verificare che il sensore sia spento quindi il programma attende che il sensore sia acceso per far partire il motore che poi sispegne di nuovo quando il sensore si spegne. fino qui tutto bene. il problema e che se invio seriale per movimentare motore ad esempio a destra e il sensore destro non si libera condizione che si puo verificare, e poi invio seriale per per movimentare a sinistra il motore non si avvia , credo il problema sia il while che attende che la prima condizione si sia verificata. Scusate e vi ringrazio in anticipo non so se possibile ma si può usire dal while quando si invia nuovo comano seriale Grazie

mi rispondi per favore:

Perché pensi di dover resettare Arduino?

Ciao Uwe

ciao scusami se non ti ho risposto subito,
riavvio perchè altrimenti mi legge solo la prima parte dello sketch, e non mi esegue il secondo comando seriale ,
comunque vorrei capire questo è possibile uscire da ciclo while se non si verifica condizione inserendo nuovo comando seriale,
scusami ancora

Si e no. Da un while puoi uscire, mettendo nel suo test una variabile di controllo oppure dentro al while un if con un break. Ma da quel tuo while non puoi uscirne perchè ha anche dei delay() che bloccano l'esecuzione del micro. E quindi in quel momento non può verificare la seriale. E poi dovresti nel primo while (ma ha anche un secondo while!!!) un controllo se Serial.available() e nel caso uscire con break; if(Serial.available()) break; Questo però esce solo da 1 while. Inoltre è un programma scritto con i piedi (spaghetti code)

E' proprio la logica del programma che hai scritto che non può funzionare. Secondo me devi fare una cosa un pò più "complessa", ovvero avere una variabile di stato ed in base a questa agire. Senza nessun delay(). E' una programmazione non semplice e viene spiegata nel link che ti ho postato in precedenza.

ciao ma non si puo fare che il ciclo while e soddisfatto da una delle due condizione non so come fare pero se

//val = Serial.read (); /7if(val == '2' ) // invio comando while (SensorState2 == 0) o val ==1 // Aspetto sensore alto o comando seriale cambiato cosi esco da while ed eseguo funzione 1 é possibile

Si, puoi anche provare a cambiare così, ma non è detto che funzioni (devi verificare se ci sono altri dati in almeno 2 punti:

if (val == '2' ) // invio comando
  while  (SensorState2 == 0 && val == '2')// Aspetto sensore alto
  {
    SensorState2 = digitalRead(SensorPin2);
    if ( SensorState2 == 1)
    { if(Serial.available() ) val = '0';          // forza uscita da while
      digitalWrite(md, LOW);
      digitalWrite(ms, HIGH);
      delay(200);
      while ( SensorState2 == 1  && val == '2')
      { if(Serial.available() ) val = '0';          // forza uscita da while
        SensorState2 = digitalRead(SensorPin2);
        if ( SensorState2 == 0 )
        {
          digitalWrite(ms, LOW);
          delay(100); // fino qui perfetto
         val = Serial.read ();
         Riavvia();
        }
      }
    }
  }

Nei due while verifichi anche se val è ancora '2' e se Serial.available() forza val a '0' (quindi esce). La stessa cosa dovrai farla per il secondo blocco-comandi ma con '1'. E' comunque un codice poco elegante e che non credo funzionerà in tutti le casistiche.

if(Serial.available() val == '0'; mi dice 'expectet')'before 'val' grazie

gegia: if(Serial.available() val == '0'; mi dice 'expectet')'before 'val' grazie

Manca una tonda e non è un test ma una assegnazione:

if(Serial.available() ) val = '0';

niente da fare va tutto bene se si avvera il while cioe parte con sensore libero o aspetta che si libera il sensore e si avvia motore in un senso ma se una volta avviato comando seriale e il sensore è chiuso e resta cosi, il comando per invertire motore non va non esce dal while Grazie di nuovo non riesco ad uscire da while con comando seriale

Da qualunque ciclo (do, for, o while) si esce con l'istruzione "break" ... quindi, quando vuoi uscire dal while, per una certa condizione, basta che fai :

if (condizione) break;

... non mi sembra molto difficile ... :roll_eyes:

Guglielmo

gegia: niente da fare va tutto bene se si avvera il while cioe parte con sensore libero o aspetta che si libera il sensore e si avvia motore in un senso ma se una volta avviato comando seriale e il sensore è chiuso e resta cosi, il comando per invertire motore non va non esce dal while Grazie di nuovo non riesco ad uscire da while con comando seriale

Ho scritto di fretta e lasciato altri errori,

 while ( SensorState2 == 1  && val == '2')

La & deve essere doppia

grazie se vuoi ti invio sketch il loop à diviso in due parti comando 1 e comando 2 motore destra o a sinistra
invio seriale aspetto che sensore destro sia alto quando la condizione si avvera il motore va a destra fino quando sensore dx low.
stessa cosa per sinitra
invio seriale aspetto che sensore sx sia alto quando la condizione si avvera il motore va a sx fino quando sensore sx low.
fino qui bene ( premetto sono al primo impatto con arduino)
Il problema nasce quando invio comando seriale o per dx o sx se il sensore relativo non si libera il motore non va bene è la condizione che voglio.pero non avverandosi la condizione while non mi accetta comando seriale per avviare in altro senso

Drazie mille per la pazienza

while_mot__e_seriale_ok.ino (1.38 KB)

scusate ancore se insisto come potrete ho uno sketch diviso in due parti quando invio comando 1 si avvia prima parte con ciclo while se si avvera lo sketch si ravvia ciò è perfetto per il mio scopo, idem per il seconda parte dello sketch, il problema e se il while non si avvera mi resta bloccato , l’ideale sarebbe provocare ravvio con comando seriale tipo(ifvalore seriale reset ravvio arduino)
Susate ho provato con break con if comando seriale ma non riesco,
Grazie mille per la pazienza
se avete suggerimenti li attendo con anzia ciao a tutti

while_mot__e_seriale_ok.ino (1.38 KB)