Pages: [1]   Go Down
Author Topic: ciclo for  (Read 701 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: July 19, 2013, 03:25:17 pm by sasa216 » Logged

Switzerland
Online Online
Faraday Member
**
Karma: 82
Posts: 4215
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Guglielmo

Logged

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

ivrea (to)
Online Online
Faraday Member
**
Karma: 57
Posts: 3527
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
 delay(1000);
  Serial.begin(9600);

Nel codice puoi stampare sul monitor seriale dell'IDE dei valori per capire cosa succede, ad esempio:
Code:
...
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.
Logged

my name is IGOR, not AIGOR

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 932
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
digitalWrite(ev, HIGH); //apro elettrovalvola 1 che è normalmente chiusa
analogWrite(pwma, 255);        //aziono la pompa di riempimento in direzione oraria
digitalWrite(dira, LOW);
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
« Last Edit: July 21, 2013, 07:01:14 am by sasa216 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ps scusate per le maiuscole nel Subject!
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 932
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Switzerland
Online Online
Faraday Member
**
Karma: 82
Posts: 4215
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guglielmo
Logged

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

ivrea (to)
Online Online
Faraday Member
**
Karma: 57
Posts: 3527
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

regolamento, sezione 7, è spiegato con immagini.
Logged

my name is IGOR, not AIGOR

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 37
Posts: 1479
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

usa almeno un UNSIGNED INT
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: