Seguimi su Youtubue
Iscriviti
Se desideri, puoi effettuare un'iscrizione gratuita al forum per entrare nella nostra community.
Ricerca Avanzata
Pubblicità Google AdSense
Answers
Se necessiti di aiuto, clicca il pulsante "Cerco Aiuto" (disponibile anche per i non iscritti).
Ultimi argomenti
» max7219
Da fulvio Lun Mag 22, 2017 11:21 pm

» orologio con LCD.
Da fulvio Lun Mag 22, 2017 12:51 am

» rilevare/intercettare solo la chiusura di una pagina web
Da Poderak Sab Mag 20, 2017 9:36 pm

» programma arduino
Da luigiaguilar Mer Mag 17, 2017 9:51 am

» Arduino Create
Da Poderak Dom Mag 14, 2017 6:42 pm

» Dove acquistare relè arduino
Da Ilfalco78 Gio Mag 04, 2017 7:43 am

» Comprata Scorpion King Farming Simulator 2017 - Mappa Sosnovka
Da Poderak Lun Mag 01, 2017 7:25 pm

» Live di 1 ora su Farming Simulator 2017
Da Poderak Lun Mag 01, 2017 7:23 pm

» Camion di Aukey su ETS2 - Gameplay
Da Poderak Lun Mag 01, 2017 7:22 pm

I postatori più attivi del mese
Poderak
 
brody09
 
fulvio
 
Ilfalco78
 
luigiaguilar
 

Come interrompere un ciclo “for”

Vedere l'argomento precedente Vedere l'argomento seguente Andare in basso

Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Ven Lug 15, 2016 5:26 pm

Ciao a tutti
premo una volta il pulsante ed inizia un ciclo di 10 lampeggi di un led, finiti i lampeggi  il ciclo si ferma aspettando di nuovo il pulsante e fino a qui tutto bene. Vorrei però interrompere ,mediante il pulsante, il ciclo durante il suo svolgimento ,ma non riesco,penso di sostituire il delay con la funzione millis ma dopo alcuni tentativi non ne sono venuto a capo. È una idea giusta o sono fuori strada ? qualcuno mi può dare una dritta ? vi ringrazio in anticipo.

Guido
Codice:


int led_blu     = 2;
int puls        = 3;
int val         = 0;
int vecchio_val = 0;
int stato       = 0;
void setup() {
 pinMode(led_blu,OUTPUT);
 pinMode(puls,INPUT);
}
void loop() {
  val = digitalRead (puls);
  if ((val==HIGH)&&(vecchio_val==LOW)){
  stato = 1 - stato ;
  delay (30);
  }
  vecchio_val = val ;
  
  if (stato==1){
  for (int i = 0;i < 10 ; i ++){
  digitalWrite (led_blu,HIGH);
  delay (500);
  digitalWrite (led_blu,LOW);
  delay (500);
}
}
  stato = 0;                                       // al termine dei 10 lampeggi resetto la variabile "stato"
}


avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Poderak il Sab Lug 16, 2016 9:34 am

Ciao, invece del for utilizza il while. Utilizzi un contatore che si incrementa ed in caso succede un evento, lo fai uscire dal while. 

Questa è la sintassi:

Codice:
while (condizione) {

}
Guarda questa documentazione.
Ripete il ciclo while finché la condizione è vera. Questo è uno spunto Dato che sei in gamba, anche questa volta voglio metterti alla prova! Se non riesci, ti darò ancora qualche indizio Ciao!
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4182
Crediti Crediti : 11704
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedere il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Sab Lug 16, 2016 2:43 pm

Ciao
grazie per la dritta mi do da fare,poi ti faccio sapere.
Guido
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Dom Lug 17, 2016 9:13 am

Ciao a tutti
il codice esegue un solo ciclo (si accende il led una volta sola) non riesco capire!grazie ancora
Guido

Codice:


int led_blu     = 2;
int puls        = 3;
int val         = 0;
int vecchio_val = 0;
int stato       = 0;
int conta       = 0;
const long interval           = 500;        
unsigned long previousMillis  = 0;          
unsigned long time            = 0;         
 
void setup() {
 pinMode(led_blu,OUTPUT);
 pinMode(puls,INPUT);
  time=millis();                           
}
void loop() {
  time=millis();                            
  
  val = digitalRead (puls);
  if ((val==HIGH)&&(vecchio_val==LOW)){
  stato = 1 - stato ;
  delay (30);
  }
  vecchio_val = val ;
  
  if (stato==1){
    
  while (conta < 10){
  if (time-previousMillis >interval){ 
   previousMillis = time ;
   conta ++;
    
  if (digitalRead (led_blu)== LOW){
      digitalWrite(led_blu,HIGH);
  }
  else {
    digitalWrite(led_blu,LOW);
  }
  }
  } 
  }
  }
  
  
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Poderak il Dom Lug 17, 2016 12:29 pm

Ciao,

Sono riuscito a trovare forse una soluzione. Prova con questo:
Codice:

int led_blu    = 2;
int puls        = 3;
int val        = 0;
int vecchio_val = 0;
int stato      = 0;
int conta      = 0;
void setup() {
 pinMode(led_blu,OUTPUT);
 pinMode(puls,INPUT);
}

void loop() {
  val = digitalRead (puls);
  if ((val==HIGH)&&(vecchio_val==LOW)){
  stato = 1 - stato ;
  delay (30);
  }
  vecchio_val = val ;
 
  if (stato==1){
  while (conta < 10 || stato == 0){ //vedo anche lo stato del pulsante. Se cambia devo uscire dal while
  val = digitalRead (puls);
  if ((val==HIGH)&&(vecchio_val==LOW)){
  stato = 1 - stato ;
  delay (30);
  }
  vecchio_val = val ; 
  digitalWrite (led_blu,HIGH);
  delay (500);
  digitalWrite (led_blu,LOW);
  delay (500);
  conta++; //incrementa di un conta
  }
}
  stato = 0;                                      // al termine dei 10 lampeggi resetto la variabile "stato"
}

In pratica nel ciclo while ho messo un'altra condizione ma con "||" che significa ORA. Quindi nel caso in cui una delle tue condizioni dovesse essere falsa, deve uscire dal while. La seconda condizione che ho messo è lo stato del pulsante. Per lo stato del pulsante ho pensato di rifare la lettura. Spero che funzioni o eventualmente ti sia utile per arrivare ad un'altra soluzione migliore.

A presto Ciao!
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4182
Crediti Crediti : 11704
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedere il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Dom Lug 17, 2016 6:03 pm

Ciao,
esegue solo i 10 lampeggi , purtroppo premendo il pulsante non accade nulla,vedo se riesco a trovare una soluzione. Ti ringrazio ancora per la tua disponibilità.
Guido
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Poderak il Dom Lug 17, 2016 6:29 pm

Va bene! Very Happy Prova a mettere il lampeggio con il millis che forse riesce a fare la lettura Ciao!
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4182
Crediti Crediti : 11704
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedere il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Dom Lug 17, 2016 9:02 pm

Ciao,
ho provato come dici , quando premo il pulsante si accende il led e non fa più niente, premo di nuovo il pulsante e non accade nulla.
Guido

 
Codice:


int led_blu    = 2;
int puls        = 3;
int val        = 0;
int vecchio_val = 0;
int stato      = 0;
int conta      = 0;
const long interval           = 500;        
unsigned long previousMillis  = 0;          
unsigned long time            = 0;         
 
void setup() {
 pinMode(led_blu,OUTPUT);
 pinMode(puls,INPUT);
}

void loop() {
   time=millis(); 
  val = digitalRead (puls);
  if ((val==HIGH)&&(vecchio_val==LOW)){
  stato = 1 - stato ;
  delay (30);
  }
  vecchio_val = val ;
  
  if (stato==1){
  while (conta < 10 || stato == 0){                 //vedo anche lo stato del pulsante. Se cambia devo uscire dal while
  val = digitalRead (puls);
  if ((val==HIGH)&&(vecchio_val==LOW)){
  stato = 1 - stato ;
  delay (30);
  }
  vecchio_val = val ;  
   if (time-previousMillis >interval){ 
   previousMillis = time ;
    
  if (digitalRead (led_blu)== LOW){
      digitalWrite(led_blu,HIGH);
  }
  else {
    digitalWrite(led_blu,LOW);
  }
  conta++;                                        //incrementa di uno conta
  }
}
  stato = 0;                                      // al termine dei 10 lampeggi resetto la variabile "stato"
}
}



avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Poderak il Dom Lug 17, 2016 10:26 pm

Potresti provare ad utilizzare break;

Con questo puoi forzare l'uscita da un ciclo. Questa volta ti consiglio di iniziare nuovamente dal codice principale per vedere se con il break riesci ad uscire dal ciclo quando vuoi Ciao!
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4182
Crediti Crediti : 11704
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedere il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Mar Lug 19, 2016 2:22 pm

Ciao,
non ci capisco più niente,con questo codice quando premo il pulsante fa solo 5 lampeggi e poi non fa più nulla.
Guido

 
Codice:


int led_blu    = 2;
int puls        = 3;
int val        = 0;
int vecchio_val = 0;
int stato      = 0;
int conta      = 0;
const long interval           = 500;        
unsigned long previousMillis  = 0;          
unsigned long time            = 0;         
 
void setup() {
 pinMode(led_blu,OUTPUT);
 pinMode(puls,INPUT);
}

void loop() {
   time=millis(); 
  val = digitalRead (puls);
  if ((val==HIGH)&&(vecchio_val==LOW)){
  stato = 1 - stato ;
  delay (30);
  }
  vecchio_val = val ;
  
  if (stato==1){
  while (conta < 10){               
 if (time - previousMillis > interval)  {
    previousMillis = time;
    conta++;
    
     if (digitalRead (led_blu)== LOW){
      digitalWrite(led_blu,HIGH);
  }
  else {
    digitalWrite(led_blu,LOW);
  }
  }
   break; 
   }
   }
   }
  
                                       

avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Poderak il Mar Lug 19, 2016 2:53 pm

Neanche io lol!

Definiamo meglio l'esercizio: Cosa deve fare? Escludiamo il fatto di voler interrompere il for, forse troviamo un'altra soluzione.
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4182
Crediti Crediti : 11704
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedere il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Mar Lug 19, 2016 3:16 pm

premendo un pulsante vorrei realizzare un ciclo di 10 lampeggi ,poi durante il ciclo dei 10 lampeggi, premendo di nuovo il pulsante vorrei azzerare il ciclo pronto per incominciare di nuovo. Con questo codice mi aspettavo almeno il conteggio ma si accende solamente il led e basta,ho provato anche inserire “break” dopo la seconda graffa in chiusura ma non ottengo niente non riesco a capire. 

Guido
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Poderak il Mar Lug 19, 2016 8:42 pm

Ricapitolando: Come ben sappiamo per uscire abbiamo bisogno di "attivare" la condizione che ci permette di uscire dal for. Un altro ingrediente, è quello di utilizzare il millis perché con il delay blocchiamo l'Arduino.

Navigando in rete ho trovato una soluzione abbastanza interessante. Un utente voleva interrompere un for premendo un pulsante. Per risolvere ha inserito il for in "setup" e nel "loop" ha utilizzato il millis.

Codice:


const int fotoresistenzaPin = A0;
const int redPin = 3;
const int yellowPin = 5;
const int intPin = 2;
int valpuls;
int prevvalpuls;
int npuls;
int pulsTemp=0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis = 0;
unsigned long currentMillis2 = 0;
int ledState = 0;
unsigned long intervall = 2000;
unsigned long interval1 = 2000;
unsigned long interval2 = 250;
unsigned long interval3 = 100;
unsigned long currentMillis ;
int numeroSwitch =0;



void setup(){
Serial.begin(9600);
pinMode(fotoresistenzaPin, INPUT);
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(intPin, INPUT);

for (int i=0; i<3; i++){
digitalWrite(redPin,HIGH);
digitalWrite(yellowPin, HIGH);
delay(100);
digitalWrite(redPin,LOW);
digitalWrite(yellowPin, LOW);
delay(100);
}
}

void loop(){
delay(100);
currentMillis = millis();
valpuls= digitalRead(intPin);
  if ((valpuls == HIGH) && (prevvalpuls == LOW)){
  pulsTemp++;
  previousMillis2 = currentMillis;   
  }
 
  if(pulsTemp!=0){
    if (currentMillis-previousMillis2 > 2000){
      npuls = pulsTemp;
      pulsTemp = 0;
        }
  }
   

 




switch (npuls){
case 0:                    // caso zero
digitalWrite(yellowPin, LOW);
digitalWrite(redPin, LOW);

break;

case 1:
digitalWrite(yellowPin, LOW);

  if(currentMillis - previousMillis > interval1) {
      previousMillis = currentMillis; 

   
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

 
    digitalWrite(redPin, ledState);
  }



break;
case 2: 
digitalWrite(redPin, LOW);
    if(currentMillis - previousMillis > interval2) {
    previousMillis = currentMillis;
    ledState ^= 1;
    digitalWrite(yellowPin, ledState);
    }
break;

case 3:

  if(currentMillis - previousMillis > interval3) {
    previousMillis = currentMillis;
    ledState ^= 1;
    digitalWrite(redPin, ledState);
    digitalWrite(yellowPin, ledState);
    }
break;


}

}

Se ti stai domandando cosa è "ledState ^=1" puoi trovare tutto qui. Vedi se riesci a prendere spunto per la soluzione finale. Per il momento stai facendo un ottimo lavoro! Ciao!
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4182
Crediti Crediti : 11704
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedere il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Mar Lug 19, 2016 9:39 pm

Grazie per l'interessamento ma non pensavo che per un progetto del genere servisse un codice cosi lungo e cosi complesso, comunque un grazie ancora.
Guido
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Poderak il Mer Lug 20, 2016 11:59 am

Ciao Guido, non farti ingannare dalla lunghezza. Quel codice è un progetto vero e proprio quindi è normale ci sia codice che a te non serve. Potresti trovare in questo codice una piccola parte che ti potrebbe aiutare a risolvere il problema Very Happy
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4182
Crediti Crediti : 11704
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedere il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Mer Lug 20, 2016 3:40 pm

Ciao,
quel codice così lungo e complesso mi ha dato lo stimolo per cercare di scrivere un codice più semplice. Prima di postarlo l'ho stressato per bene e non mi ha dato alcun problema  te lo sottopongo al tuo giudizio dimmi pure cosa ne pensi.
Guido.

 
Codice:

/* premo una prima volta il pulsante e conto 5 lampeggi
 * finito i 5 lampeggi ritorno alla posizione iniziale  
 * premendo il pulsante durante i lampeggi resetto tutto e 
 * mi predispongo nella posizione iniziale
 */  
int led_blu     = 2;
int puls        = 3;
int val         = 0;
int vecchio_val = 0;
int stato       = 0;
int conta       = 0;
const long interval           = 500;        
unsigned long previousMillis  = 0;          
unsigned long time            = 0;         
 
void setup() {
 pinMode(led_blu,OUTPUT);
 pinMode(puls,INPUT);
  time=millis();                           
}
void loop() {
  time=millis();                            
  
  val = digitalRead (puls);
  if ((val==HIGH)&&(vecchio_val==LOW)){
  stato = 1 - stato ;
  delay (50);
  }
  vecchio_val = val ;
  
  if (stato==0){
  digitalWrite(led_blu,LOW);
  conta = 0;
  }
  if (stato==1){
 
  if (time-previousMillis >interval){ 
   previousMillis = time ;
   
  if (digitalRead (led_blu)== LOW){
      digitalWrite(led_blu,HIGH);
  }
  else {
    digitalWrite(led_blu,LOW);
    conta++;
  }
  if (conta==5){
  stato = 0;
  conta = 0;
  }
  }
  }
  }
  
  
  
  
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Poderak il Mer Lug 20, 2016 7:42 pm

Ciao Guida, funziona? A me sembra ottimo! Ho da poco scoperto che facendo CTRL + T ti mette in ordine il codice cyclops
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4182
Crediti Crediti : 11704
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedere il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari il Gio Lug 21, 2016 8:49 pm

Ciao,
grazie della dritta.
Guido
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedere il profilo dell'utente

Tornare in alto Andare in basso

Vedere l'argomento precedente Vedere l'argomento seguente Tornare in alto


 
Permessi di questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum