Wiki Info
Vuoi reagire a questo messaggio? Crea un account in pochi click o accedi per continuare.
Ricerca Avanzata
Answers
Se necessiti di aiuto, clicca il pulsante "Cerco Aiuto" (disponibile anche per i non iscritti).
Ultimi argomenti attivi
» Comunicazione termine servizio Arduino BT Control
Da Admin Mar Mag 10, 2022 12:55 pm

» Robot aspirapolvere per Alexa: Dreame D9
Da Admin Mar Feb 09, 2021 9:42 am

» Come costruire un robot smart con Arduino
Da Admin Mar Nov 17, 2020 12:15 pm

» TOPPS Trading Cards Match Attax Champsion League/Europa League 2020/21
Da Admin Mar Nov 10, 2020 3:21 pm

» Guida per utilizzare Arduino BT Control v1.2
Da Admin Gio Lug 09, 2020 12:01 pm

» Recensione Umidigi A3 Pro - Smartphone sotto i 100€
Da Admin Gio Apr 04, 2019 12:22 pm

» [Arduino] aiuto programma
Da Glak Mar Mar 12, 2019 9:30 am

» ERRORE NELLA COMPILAZIONE NEXTION
Da papat Mar Feb 26, 2019 7:11 am

» Comandare la Smart TV con Alexa senza broadlink (gratis)
Da Admin Mar Feb 19, 2019 4:31 pm

I postatori più attivi del mese
Nessun utente


Come interrompere un ciclo “for”

2 partecipanti

Andare in basso

Come interrompere un ciclo “for” Empty Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari 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"
}


Guido Laferrari
Guido Laferrari
Livello due
Livello due

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Admin 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!
Admin
Admin
♔ Amministratore

Messaggi Messaggi : 4370
Crediti Crediti : 12173
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 26

https://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

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

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

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari 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);
  }
  }
  } 
  }
  }
  
  
Guido Laferrari
Guido Laferrari
Livello due
Livello due

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Admin 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!
Admin
Admin
♔ Amministratore

Messaggi Messaggi : 4370
Crediti Crediti : 12173
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 26

https://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari 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
Guido Laferrari
Guido Laferrari
Livello due
Livello due

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Admin 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!
Admin
Admin
♔ Amministratore

Messaggi Messaggi : 4370
Crediti Crediti : 12173
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 26

https://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari 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"
}
}



Guido Laferrari
Guido Laferrari
Livello due
Livello due

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Admin 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!
Admin
Admin
♔ Amministratore

Messaggi Messaggi : 4370
Crediti Crediti : 12173
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 26

https://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari 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; 
   }
   }
   }
  
                                       

Guido Laferrari
Guido Laferrari
Livello due
Livello due

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Admin 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.
Admin
Admin
♔ Amministratore

Messaggi Messaggi : 4370
Crediti Crediti : 12173
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 26

https://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari 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
Guido Laferrari
Guido Laferrari
Livello due
Livello due

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Admin 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!
Admin
Admin
♔ Amministratore

Messaggi Messaggi : 4370
Crediti Crediti : 12173
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 26

https://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari 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
Guido Laferrari
Guido Laferrari
Livello due
Livello due

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Admin 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
Admin
Admin
♔ Amministratore

Messaggi Messaggi : 4370
Crediti Crediti : 12173
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 26

https://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Guido Laferrari 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;
  }
  }
  }
  }
  
  
  
  
Guido Laferrari
Guido Laferrari
Livello due
Livello due

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Admin 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
Admin
Admin
♔ Amministratore

Messaggi Messaggi : 4370
Crediti Crediti : 12173
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 26

https://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

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

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

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

Torna in alto Andare in basso

Come interrompere un ciclo “for” Empty Re: Come interrompere un ciclo “for”

Messaggio Da Contenuto sponsorizzato


Contenuto sponsorizzato


Torna in alto Andare in basso

Torna in alto


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