Hashtag più usati
1 | #include |
2 | #drone |
3 | #dlcitalia |
4 | #ets2 |
5 | #eurotrucksimulator2 |
6 | #arduino |
7 | #xiaomi |
8 | #aukey |
9 | #farmingsimulator |
Ultimi argomenti attivi
» Comunicazione termine servizio Arduino BT ControlDa 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
Pagina 1 di 1
Come interrompere un ciclo “for”
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
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- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
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:
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
Questa è la sintassi:
- Codice:
while (condizione) {
}
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
Re: Come interrompere un ciclo “for”
Ciao
grazie per la dritta mi do da fare,poi ti faccio sapere.
Guido
grazie per la dritta mi do da fare,poi ti faccio sapere.
Guido
Guido Laferrari- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
Ciao a tutti
il codice esegue un solo ciclo (si accende il led una volta sola) non riesco capire!grazie ancora
Guido
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- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
Ciao,
Sono riuscito a trovare forse una soluzione. Prova con questo:
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
A presto
Re: Come interrompere un ciclo “for”
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
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- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
Va bene! Prova a mettere il lampeggio con il millis che forse riesce a fare la lettura
Re: Come interrompere un ciclo “for”
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
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- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
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
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
Re: Come interrompere un ciclo “for”
Ciao,
non ci capisco più niente,con questo codice quando premo il pulsante fa solo 5 lampeggi e poi non fa più nulla.
Guido
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- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
Neanche io
Definiamo meglio l'esercizio: Cosa deve fare? Escludiamo il fatto di voler interrompere il for, forse troviamo un'altra soluzione.
Definiamo meglio l'esercizio: Cosa deve fare? Escludiamo il fatto di voler interrompere il for, forse troviamo un'altra soluzione.
Re: Come interrompere un ciclo “for”
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
Guido Laferrari- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
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.
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!
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!
Re: Come interrompere un ciclo “for”
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
Guido Laferrari- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
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
Re: Come interrompere un ciclo “for”
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.
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- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Re: Come interrompere un ciclo “for”
Ciao Guida, funziona? A me sembra ottimo! Ho da poco scoperto che facendo CTRL + T ti mette in ordine il codice
Re: Come interrompere un ciclo “for”
Ciao,
grazie della dritta.
Guido
grazie della dritta.
Guido
Guido Laferrari- Livello due
- Messaggi : 34
Crediti : 54
Reputazione : 2
Data d'iscrizione : 30.04.16
Pagina 1 di 1
Permessi in questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum.