porblema for e while

Ciao a tutti. Ho un problema con il mio sketch. Ora mi spiego: ad un certo punto del mio programma viene richiamato un ciclo esterno (void ciclo()) nel quale è presente un for, il problema è che questo non funziona, ovvero non mi restituisce tutti i valori ma solamente l'ultimo valore, ovvero quello massimo assumibile da x. Ecco lo sketch cosi si capisce

#define pulsante 14
int stato = 0;
void setup() {                
  Serial.begin(9600);
  pinMode(pulsante,INPUT);  
}
void loop() {
  stato=digitalRead(pulsante);
  if (stato == HIGH){
    Serial.println ("attivo");
    ciclo();
  }
}
void ciclo(){
  int x;
  x=0;
  for(x;x<10;x++);
  {
    Serial.println(x);
  } 
}

il problema è nel ; messo dopo il for. Interrompe il comando e separa il for dal blocco successivo.
Sappi che l'inizializzazione della variabile indice la puoi mettere anche interna.

#define pulsante 14
int stato = 0;

void setup() {
  Serial.begin(9600);
  pinMode(pulsante, INPUT);
}

void loop() {
  stato = digitalRead(pulsante);
  if (stato == HIGH) {
    Serial.println ("attivo");
    ciclo();
  }
}

void ciclo() {
  for (int x = 0; x < 10; x++) {
    Serial.println(x);
  }
}

Quando usi i blocchi { } non servono i ; tranne nel do { } while(); ma è un caso particolare.

:astonished: :astonished: grazie mille! mi era proprio sfuggito!!

ora ho un altro problema: praticamente ho 2 finecorsa, e la lama che si muove su una guida, e io deve far fare delle passate alla lama, cioè farla andare avanti e indietro un numero prefissato di volte. Ho provato sia con while che con for, non ottenendo nessun risultato. Posto i codici confidando in un aiuto =( =(
ciclo while

while (x == valore);
  {
    if(statosx == HIGH && statodx == LOW){
      Serial.println("destra");
      digitalWrite (destra,HIGH);
      digitalWrite (sinistra,HIGH);
      float tempo = conv1*altezza;
      float  dist = count*conv;
      digitalWrite (su,LOW);
      digitalWrite (giu,HIGH);
      delay(tempo);
      digitalWrite(su,HIGH);
      delay(200);
      digitalWrite (destra,LOW);
      digitalWrite (sinistra,HIGH);
      x++;

    }
    if (statodx == HIGH && statosx == LOW){
      Serial.println("sinistra");
      digitalWrite (destra,HIGH);
      digitalWrite (sinistra,HIGH);
      float tempo = conv1*altezza;
      float  dist = count*conv;
      digitalWrite (su,LOW);
      digitalWrite (giu,HIGH);
      delay(tempo);
      digitalWrite(su,HIGH);
      delay(200);
      digitalWrite (destra,LOW);
      digitalWrite (sinistra,HIGH);
      x++;
    } 
    Serial.println (x);

  }

ciclo for

for (x=0; x <= valore; x++);
  {
    if(statosx == HIGH && statodx == LOW){
      Serial.println("destra");
      digitalWrite (destra,HIGH);
      digitalWrite (sinistra,HIGH);
      float tempo = conv1*altezza;
      float  dist = count*conv;
      digitalWrite (su,LOW);
      digitalWrite (giu,HIGH);
      delay(tempo);
      digitalWrite(su,HIGH);
      delay(200);
      digitalWrite (destra,LOW);
      digitalWrite (sinistra,HIGH);
      

    }
    if (statodx == HIGH && statosx == LOW){
      Serial.println("sinistra");
      digitalWrite (destra,HIGH);
      digitalWrite (sinistra,HIGH);
      float tempo = conv1*altezza;
      float  dist = count*conv;
      digitalWrite (su,LOW);
      digitalWrite (giu,HIGH);
      delay(tempo);
      digitalWrite(su,HIGH);
      delay(200);
      digitalWrite (destra,LOW);
      digitalWrite (sinistra,HIGH);
      
    }

grazie in anticipo :slight_smile:

Nel secondo esempio manca una parentesi } e hai messo in entrambi il ; dopo il for o il while.
NON CI VUOLE!!! :sweat_smile:

Le operazioni, visto che sono invarianti, falle una sola volta prima del ciclo.

Per il while devi mette < di, non ==.

si scusa, ho preso lo sketch vecchio che non avevo modificato. Comunque anche se tolgo il punto e virgola non funziona. Ma concettualmente è giusto come ho formulato il programma? grazie

Non sono ancora riuscito ad uscirne. Qualcuno ha qualche esempio di un progetto simile oppure qualche idea per migliorare il mio? Grazie :slight_smile:

ok. Sono riuscito a risolvere il problema delle passate. Ora però ce n'è un altro :~. Praticamente una volta che il macchinario finisce le passate si sposta e ricomincia dopo un misura prefissata, cosa che dovrebbe essere semplice, con un ciclo for o while, ma il problema è che il contatore, invece che contare uno spostamento, fare le passate, e rispostarsi, è come se contasse tutte le passate di fila e non faccia la lavorazione.
questo è il pezzo di sketch in questione

while (i <= npassate)
  {
    Serial.println ("passate:");
    Serial.print(i);
    lavorazioni();
    i++;
  }
}

ora non dovrebbe eseguire il ciclo "lavorazioni()" fino a quando i è uguale a npassate?

grazie

Ciao
domanda stupida: ma il contatore i lo azzeri prima del while?

ciao
pippo72

si si. A inizio sketch ho messo var i = 0. Comunque il contatore funziona, da seriale lo vedo. solamente che invece di fare i volte il ciclo lavorazioni aumenta solamente il contatore

ntoniudra:

while (i <= npassate)

{
   Serial.println ("passate:");
   Serial.print(i);
   lavorazioni();
   i++;
 }
}



ora non dovrebbe eseguire il ciclo "lavorazioni()" fino a quando i è uguale a npassate?

Solo se i è minore di npassate quando inizia il ciclo. Se i è già maggiore, non entra nel while.
Dove hai azzerato i ? Secondo me nel posto errato.

Per il debug è meglio se inverti print e println:

    Serial.print ("passate:");
    Serial.println(i);

Metti questo anche prima del while così verifichi prima del while cosa succede:

    Serial.print ("prima del while:");
    Serial.println(i);

P.S. se non posti TUTTO il codice è difficile trovare un errore nel codice. Magari l'errore non stà nel pezzo di codice che tu posti.

ok. è un' pò lungo ma lo posto tutto!

#include <LCD.h>
#include <LiquidCrystal.h>
#include <buttons.h>
#include <MENWIZ.h>
#include <EEPROM.h>

#define UP_BOTTON_PIN       26 //definizione pin
#define DOWN_BOTTON_PIN     28
#define LEFT_BOTTON_PIN     30
#define RIGHT_BOTTON_PIN    32
#define CONFIRM_BOTTON_PIN  34
#define ESCAPE_BOTTON_PIN   36
#define led1 53
#define led2 51
#define led3 49
#define led4 47
#define sensdx 14
#define senssx 15
#define conv 180
#define conv1 1
#define su A8
#define giu A9
#define destra A10
#define sinistra A11
#define avanti A12
#define indietro A13
#define rele7 A14
#define rele8 A15
menwiz tree;

LiquidCrystal lcd(12, 11, 6, 5, 4, 3); //creato oggetto lcd
boolean attiva = true;
boolean attiva1= true;
int statodx;
int statosx;
int x = 0;
int i = 0;
int w = 0;
int altezza = 80;
int larghezza = 300;
int npassate = 5;
int ppassate = 5;
int count = 0;
int senstras;
float tempo = conv * altezza;
float  dist = conv1 * count;
float numpas = altezza / ppassate;
int valore = 0;
boolean led=true;
void setup(){
  pinMode(destra, OUTPUT);   
  pinMode(sinistra, OUTPUT);  
  pinMode(su, OUTPUT);  
  pinMode(giu, OUTPUT);  
  pinMode(avanti, OUTPUT);  
  pinMode(indietro, OUTPUT);  
  pinMode(rele7, OUTPUT);  
  pinMode(rele8, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(senssx, INPUT);
  pinMode(sensdx, INPUT);

  digitalWrite (destra,HIGH);
  digitalWrite (sinistra,HIGH);
  digitalWrite (su,HIGH);
  digitalWrite (giu,HIGH);
  digitalWrite (avanti,HIGH);
  digitalWrite (indietro,HIGH);
  digitalWrite(led1,LOW);
  digitalWrite(led2,LOW);
  digitalWrite(led3,LOW);
  digitalWrite(led4,LOW);


  attachInterrupt(0,proximity,RISING);
  _menu *r,*s1,*s2;

  Serial.begin(9600);    
  tree.begin(&lcd,16,2); //declare lcd object and screen size to menwiz lib

  r=tree.addMenu(MW_ROOT,NULL,F(" TERZAGO  GLS37"));
  s1=tree.addMenu(MW_VAR,r, F("LARGHEZZA"));
  s1->addVar(MW_AUTO_INT,&larghezza,0,1000,5 );
  s1=tree.addMenu(MW_VAR,r, F("ALTEZZA"));
  s1->addVar(MW_AUTO_INT,&altezza,0,400,5 );  
  s1=tree.addMenu(MW_VAR,r, F("NUMERO PASSATE"));
  s1->addVar(MW_AUTO_INT,&npassate,0,1000,1 );
  s1=tree.addMenu(MW_VAR,r, F("PROF. PASSATA"));
  s1->addVar(MW_AUTO_INT,&ppassate,0,400,1 );
  s1=tree.addMenu(MW_VAR,r, F("CONTROLLO DATI")); 
  s1->addVar(MW_ACTION,controllo);
  s1->setBehaviour(MW_ACTION_CONFIRM,false);
  s1=tree.addMenu(MW_VAR,r, F("INIZIO CICLO")); 
  s1->addVar(MW_ACTION,ciclo);
  s1->setBehaviour(MW_ACTION_CONFIRM,true);
  tree.navButtons(UP_BOTTON_PIN,DOWN_BOTTON_PIN,LEFT_BOTTON_PIN,RIGHT_BOTTON_PIN,ESCAPE_BOTTON_PIN,CONFIRM_BOTTON_PIN);
  tree.addSplash("TERZAGO GLS37",5000);

}

void loop(){
  tree.draw(); 
  if (senstras==HIGH)
  {
    count++;
    senstras=LOW;
  }

  if(led == true){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW );
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    delay(500);
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH );
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    delay(500);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW );
    digitalWrite(led3, HIGH);
    digitalWrite(led4, LOW);
    delay(500);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW );
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);
    delay(500);
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW );
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    delay(500);
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH );
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    delay(500);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW );
    digitalWrite(led3, HIGH);
    digitalWrite(led4, LOW);
    delay(500);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW );
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);
    delay(500);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW );
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    delay(500);
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    delay(500);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW );
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    led =false;
  }


}
void controllo(){
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH );
  digitalWrite(led3, LOW);
  digitalWrite(led4, HIGH);
  lcd.clear();
  lcd.print("LARGHEZZA:");
  lcd.setCursor(0,1);
  lcd.print(larghezza);
  lcd.print("mm");
  delay(3000);
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW );
  digitalWrite(led3, HIGH);
  digitalWrite(led4, LOW);
  lcd.clear();
  lcd.print("ALTEZZA:");
  lcd.setCursor(0,1);
  lcd.print(altezza);
  lcd.print("mm");
  delay(3000);
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH );
  digitalWrite(led3, LOW);
  digitalWrite(led4, HIGH);
  lcd.clear();
  lcd.print("N PASSATE:");
  lcd.setCursor(0,1);
  lcd.print(npassate);
  delay(3000);
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW );
  digitalWrite(led3, HIGH);
  digitalWrite(led4, LOW);
  lcd.clear();
  lcd.print("PROF PASSATA:");
  lcd.setCursor(0,1);
  lcd.print(ppassate);
  lcd.print("mm");
  delay(3000);

}

void proximity()
{
  senstras=HIGH;
}

void ciclo() {
  lcd.clear();
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH );
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  while (i <= npassate)
  {
    Serial.println ("passate:");
    Serial.print(i);
    lavorazioni();
    i++;
  }
}
void lavorazioni(){
  valore = floor(numpas);
  while (x <= valore)
  { 
    movimento();
    Serial.print("valore x:");
    Serial.print(x);
  } 
  digitalWrite(destra,HIGH);
  digitalWrite(sinistra,HIGH);
  delay(200);
  while (w <= 15){
    Serial.print("w:");
    Serial.print(w);
    traslazione();  
  } 
}
void movimento(){
  statodx = digitalRead(sensdx);
  statosx = digitalRead(senssx);
  if(statosx == HIGH && attiva == true){
    attiva = false;
    attiva1 = true;
    Serial.println("destra");
    vaidestra() ; 
    x++; 
  }
  if (statodx == HIGH && attiva1 == true){
    attiva1 = false;
    attiva = true;
    Serial.println("sinistra");
    vaisinistra();
    x++;
  }
}
void vaidestra(){
  Serial.print("lavorazione a destra");
  digitalWrite (destra,HIGH);
  digitalWrite (sinistra,HIGH);
  float passata = conv * ppassate;
  float tempo = conv1*altezza;
  float  dist = count*conv;
  digitalWrite (su,LOW);
  digitalWrite (giu,HIGH);
  delay(passata);
  digitalWrite(su,HIGH);
  delay(200);
  digitalWrite (destra,LOW);
  digitalWrite (sinistra,HIGH);
}
void vaisinistra(){
  Serial.print ("lavorazione a sinistra");
  float passata = conv * ppassate;
  digitalWrite (destra,HIGH);
  digitalWrite (sinistra,HIGH);
  float tempo = conv1*altezza;
  float  dist = count*conv;
  digitalWrite (su,LOW);
  digitalWrite (giu,HIGH);
  delay(passata);
  digitalWrite(su,HIGH);
  delay(200);
  digitalWrite (destra,LOW);
  digitalWrite (sinistra,HIGH);

}

void traslazione(){
  Serial.println("traslazione");
  digitalWrite(avanti,LOW);
  digitalWrite(indietro,HIGH);
  w++;
}

l' ho azzerato all' inizio

ciao
Nid69ita ha visto giusto (e anch'io) :slight_smile:
Hai settato "i" come variabile globale (credo si dica così), devi azzerarlo subito prima del while altrimenti funziona solo la prima volta che chiami il void ciclo().

void ciclo() {
  lcd.clear();
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH );
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  i=0    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  while (i <= npassate)
  {
    Serial.println ("passate:");
    Serial.print(i);
    lavorazioni();
    i++;
  }

( .... anche se non ho capito quando lo chiami questo void ciclo() :fearful: :fearful:).

ciao
pippo72

E mi ripeto, se fai debug, secondo me questo modo di stampare i dati è quanto meno confusionario:

Serial.print("w:");
Serial.print(w);

Avendo poi altre Serial.print() tutto si stampa appiccicato.
Due possibilità:
1- la seconda la metti come println (mettilo anche su stessa riga, il C non si offende)

Serial.print("w:"); Serial.println(w);

2-prima di ogni testo aggiungi uno o più spazi:
Serial.print(" w:"); Serial.print(w);

Perfetto! si si il Debug l'ho già corretto come hai detto! Ora provo, grazie mille :smiley: :grin: :smiley:

nid69ita:

ntoniudra:

while (i <= npassate)

{
   Serial.println ("passate:");
   Serial.print(i);
   lavorazioni();
   i++;
 }
}



ora non dovrebbe eseguire il ciclo "lavorazioni()" fino a quando i è uguale a npassate?

Solo se i è minore di npassate quando inizia il ciclo. Se i è già maggiore, non entra nel while.
Dove hai azzerato i ? Secondo me nel posto errato.

Per il debug è meglio se inverti print e println:

    Serial.print ("passate:");

Serial.println(i);



Metti questo anche prima del while così verifichi prima del while cosa succede:


Serial.print ("prima del while:");
   Serial.println(i);




P.S. se non posti TUTTO il codice è difficile trovare un errore nel codice. Magari l'errore non stà nel pezzo di codice che tu posti.

Non devo azzerrare i, ma x e w, ma comunque il concetto è quello, ci hai azzeccato!! Il ciclo lo richiamo dal menu, utilizzando la libreria MENWIZ

    1. datemi i vostri indirizzi che vi spedisco una cassa di birra $) $)

ciao.
Credo che hai risposto a me (pippo72) quotando un post di nid69ita. :stuck_out_tongue:
Comunque stai attento a quello che scrivi...

...che vi spedisco una cassa di birra...

... perchè purtroppo per te non sono astemio :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

ciao
pippo72

pippo72:
ciao.
Credo che hai risposto a me (pippo72) quotando un post di nid69ita. :stuck_out_tongue:
Comunque stai attento a quello che scrivi...

...che vi spedisco una cassa di birra...

... perchè purtroppo per te non sono astemio :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

ciao
pippo72

Ha ha :slight_smile: :slight_smile: :slight_smile: