ciclo for

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

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

  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 :wink:

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

Guglielmo

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():

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

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

...
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.

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.

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

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.

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

#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

ps scusate per le maiuscole nel Subject!

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!

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

sasa216:
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 :wink:

Guglielmo

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

regolamento, sezione 7, è spiegato con immagini.

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

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

usa almeno un UNSIGNED INT

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

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