Go Down

Topic: ciclo for (Read 1 time) previous topic - next topic

sasa216

Jul 05, 2013, 01:25 pm Last Edit: Jul 19, 2013, 10:25 pm by sasa216 Reason: 1
Salve a tutti,
mi scuso in anticipo se la mia domanda sarà per voi banale però sono "nuovo" del mondo di arduino e sono settimane ormai che sto perdendo la testa per un ciclo for che non funziona. Vi allego qui sotto il codice in questione e spero che qualcuno possa aiutarmi.
Grazie mille

Code: [Select]
void loop() {
 setPump(1,20000);
 delay(1000);
 tempotot= temporcl+tempoa+temposl+temposc;
}
// funzione di comando del circuito idraulico


void setPump  ( int nomeSostanza, int tempo){  // elimino i tempi e li riduco a uno solo tanto poi li chiamo nel loop


switch ( nomeSostanza ){
 
 case 1:
 tempoa=tempo;
 ev=evu;
 break;
 
 case 2:
 tempoa=tempo;
 ev=evd;
 break;
 
 case 3:
 tempoa=tempo;
 ev=evt;
 break;
}

for (csec=0; csec<tempotot; csec++)                    //int temporcl=9500;
                                                                              //int temposl=2500;
                                                                              //int temposc=7000;
{

if(csec==0 ){

analogWrite(ev, HIGH); //apro elettrovalvola 1 che è normalmente chiusa
analogWrite(pwma,255);        //aziono la pompa di riempimento in direzione oraria
       analogWrite(dira,LOW);

}
if (csec==temporcl ) {

analogWrite(dira,HIGH); //aziono la pompa di riempimento in direzione antioraria
analogWrite(evp, HIGH);        //chiudo elettrovalvola pompa che è normalmente aperta

}

if (csec==temporcl+temposl){ // azionamento

analogWrite(pwma,0); //fermo pompa di riempimento
analogWrite(ev, LOW); //chiudo elettrovalvola 1 che è normalmente chiusa
}
if (csec=temporcl+tempoa+temposl) {

   analogWrite(evp, LOW); //apro elettrovalvola pompa che è normalmente aperta
   analogWrite(pwmb,255);
   analogWrite(dirb,HIGH); //aziono pompa di svuotamento per tempo di svuot camera
}

delay(1000);

}

}


edit by mod: per favore includere il codice usando gli appositi tag

gpb01

1. racchiudi il tutto tra gli appositi tag "code" e "/code" (il bottone con il simbolo #) così è molto più leggibile e ... non si inc...za il moderatore ;)

2. riporta il programma COMPLETO (inclusa la dichiarazione delle variabili e quant'altro)

Guglielmo

Search is Your friend ... or I am Your enemy !

nid69ita

Come detto da @Guglielmo, serve tutto il codice.

questa riga, la prima volta che parte il programma, se non c'e' qualcosa prima o nella setup(), non ha senso.
tempotot è uguale a zero alla partenza? se si il test è clicla finchè csec<0   e csec parte da 0
for (csec=0; csec<tempotot; csec++)

Questo intendi che non funziona il for? Sarebbe meglio specificare bene il problema.

Inoltre una cosa utile è fare il debug da soli, per imparare. Devi aggiungere all'inizio della setup():
Code: [Select]

 delay(1000);
 Serial.begin(9600);


Nel codice puoi stampare sul monitor seriale dell'IDE dei valori per capire cosa succede, ad esempio:
Code: [Select]

...
Serial.print("tempotot= "); Serial.println(tempotot);
for (csec=0; csec<tempotot; csec++)  
{  


P.S. altra regola dei forum, non si mette il titolo in maiuscolo, equivale a urlare.
my name is IGOR, not AIGOR

cyberhs

Credo che tu abbia commesso un errore: il pin ev ed il pin dira dovrebbero essere uscite digitali, mentre tu le hai considerate uscite analogiche PWM.

Code: [Select]

digitalWrite(ev, HIGH); //apro elettrovalvola 1 che è normalmente chiusa
analogWrite(pwma, 255);        //aziono la pompa di riempimento in direzione oraria
digitalWrite(dira, LOW);

sasa216

Grazie a tutti delle dritte...erano tutti errori che fortunatamente ho corretto grazie alle vostre risposte. Il problema principale in realtà era però che nel MOTORSHIELD che usavo il pin8 conteneva un BREAK e io ci avevo collegato una delle elettrovalvole.

sasa216

#5
Jul 19, 2013, 10:28 pm Last Edit: Jul 21, 2013, 02:01 pm by sasa216 Reason: 1
Vi chiedo ancora un consiglio, secondo voi se io in ingresso della funzione inserisco tempi così lunghi come 7200 sec può andare in overload o dovrebbe funzionare ugualmente?
Vi allego il codice completo:

code
Code: [Select]

#include <OneWire.h>
OneWire ds(2);


//dichiarazione delle variabili
int evp=5;      //significa che evp è connessa al pin numero 5
int evu=6;
int evd=7;
int evt=8;
int ev=0;

int pwma=11; //potenza pompa di sinistra
int pwmb=3;   // potenza pompa di destra

int csec= 0;
int temporcl=110;
int temposl=10;
int temposc=110;
int tempoa=0;
int tempotot=0;


int dira=13;  //direzione pompa di sinistra
int dirb=12;  // direzione pompa di destra

int peltier=10;  //peltier
int direzione=9;



// funzione che modifica i registri del microcontrollore per i timer
void setPwmFrequency (int pin, int divisor)
{
 byte mode;
 if(pin==5||pin ==6||pin==9 || pin ==10)
 {
   switch (divisor)
   {
     case 1:
     mode=0x01;
     break;
     case 8:
     mode=0x02;
     break;
     case 64:
     mode=0x03;
     break;
     case 256:
     mode=0x04;
     break;
     case 1024:
     mode=0x05;
     break;
     default:
     return;
   }
   if (pin == 5 || pin ==6)
   {
     TCCR0B= TCCR0B & 0b1111100000 | mode;
   }
   else
   {
     TCCR1B= TCCR1B & 0b1111100000 | mode;
   }
 }
else if (pin == 3 || pin ==11)
{
   switch (divisor)
   {
     case 1:
     mode=0x01;
     break;
     case 8:
     mode=0x02;
     break;
     case 64:
     mode=0x03;
     break;
     case 256:
     mode=0x04;
     break;
     case 1024:
     mode=0x05;
     break;
     default:
     return;
   }
   TCCR2B= TCCR2B & 0b1111100000 | mode;
   }
}




void setup () {
 Serial.begin(9600);
 pinMode(pwma, OUTPUT);        // imposta questo pin come pin di uscita
 pinMode(pwmb, OUTPUT);
 pinMode(dira, OUTPUT);
 pinMode(dirb, OUTPUT);
 pinMode(peltier, OUTPUT);
 pinMode(direzione, OUTPUT);
 pinMode(evu, OUTPUT);
 pinMode(evd, OUTPUT);
 pinMode(evt, OUTPUT);
 pinMode(evp, OUTPUT);
 digitalWrite(evp, LOW);      //Scrive un valore HIGH o LOW su un pin impostato come digitale
 digitalWrite(evu, LOW);
 digitalWrite(evd, LOW);
 digitalWrite(evt, LOW);
 digitalWrite(dira,LOW);
 digitalWrite(dirb,LOW);
 
 setPwmFrequency(pwma,8);
 setPwmFrequency(pwmb,8);
 setPwmFrequency(10,8);
 delay(3000);
 
}

void loop() {
 

for(int ora=0; ora <18; ora++){
 
   if (ora<12){
       setPump(1,7200,20,24);
       delay(2000);
       
   }    
 
   if (ora>11&&ora<14){
       setPump(2,43200,20,24);
       delay(2000);
       
            }
           
            else if (ora>13){
         setPump(3,43200,20,24);
       delay(2000);
         
       }
     
  } //chiudo for
 
}  //chiudo loop


// funzione di comando del circuito idraulico


void setPump  ( int nomeSostanza, int tempo, int tmin, int tmax){  



switch ( nomeSostanza ){
 
 case 1:
 tempoa=tempo;
 ev=evu;
 break;
 
 case 2:
 tempoa=tempo;
 ev=evd;
 break;
 
 case 3:
 tempoa=tempo;
 ev=evt;
 break;
}

tempotot=temporcl+temposl+tempoa+temposc;

for (csec=0; csec<tempotot; csec++)                    //int temporcl=9500;
                                                                              //int temposl=2500;
                                                                              //int temposc=7000;
{

 
if(csec==0 ){

digitalWrite(ev, HIGH); //apro elettrovalvola 1 che è normalmente chiusa
analogWrite(pwma,255);        //aziono la pompa di riempimento in direzione oraria
       digitalWrite(dira,LOW);
       analogWrite(pwmb,0);

}
if (csec==temporcl ) {

digitalWrite(dira,HIGH); //aziono la pompa di riempimento in direzione antioraria
digitalWrite(evp, HIGH);        //chiudo elettrovalvola pompa che è normalmente aperta

}

if (csec==temporcl+temposl){ // azionamento

analogWrite(pwma,0); //fermo pompa di riempimento
digitalWrite(ev, LOW); //chiudo elettrovalvola 1 che è normalmente chiusa
        digitalWrite(evp, LOW); //apro elettrovalvola pompa che è normalmente aperta
}
if (csec==temporcl+tempoa+temposl) {

 
   analogWrite(pwmb,255);
   digitalWrite(dirb,HIGH); //aziono pompa di svuotamento per tempo di svuot camera
}

delay(1000);

}


}

/code

sasa216

ps scusate per le maiuscole nel Subject!

cyberhs

Guarda che Leo, il nostro moderatore, ti ha già ripreso perché non avevi inserito il codice con l'apposito TAG.

Se ti prende ti spella!

sasa216

Scusatemi...mi direste come si fa? Non ho ben capito cosa significhi!

gpb01


Scusatemi...mi direste come si fa? Non ho ben capito cosa significhi!


Editi il tuo messaggio e metti tutto il codice racchiuso tra i tag "code" e "/code" che automaticamente ti inserisce il bottone # che hai sopra, tra i vari bottoncini ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita

http://forum.arduino.cc/index.php?topic=149082.0

regolamento, sezione 7, è spiegato con immagini.
my name is IGOR, not AIGOR

sasa216

Spero di aver sistemato tutto.
Il consiglio che vi chiedevo riguardava i cicli for nel loop!
I numeri all'interno della funzione (7200, 43200, 43200) dovrebbero essere le ore in secondi in cui la mia funzione dovrebbe matenere un certo stato.
solo che i cicli for in cui inserisco il 7200 va mentre gli altri 2 non vanno...sono troppi secondi? Avete una soluzione? GRAZIE

Brunello

hai dichiarato i valori come INT , ma INT accetta solo valori da -32768 a 32767.

usa almeno un UNSIGNED INT

uwefed

Il ciclo for usa una variabile di tipo int ( non so se unsigned int o int) percui non puoi fare cicli maggiori di ca 65 o 32 mila.
http://forum.arduino.cc/index.php/topic,60056.0.html
Ciao Uwe

sasa216

Grazie a tutti, non me ne ero accorto. RISOLTO!

Go Up