Arduino Forum

International => Italiano => Software => Topic started by: Joninho on Jun 08, 2014, 10:58 pm

Title: aiuto memoria arduino
Post by: Joninho on Jun 08, 2014, 10:58 pm
Code: [Select]


int AR0 = 2; // ampolla reed - finecorsa ad ogni piano
int TE0 = 3; // tasto esterno
int AR1 = 4;
int TE1 = 5;
int AR2 = 6;
int TE2 = 7;
int AR3 = 40;
int TE3 = 41;

int SP0 = 44; // microswitch ad ogni piano, per segnalare l'eventuale apertura della porta della cabina
int SP1 = 45;
int SP2 = 46;
int SP3 = 47;

int LV0 = 22; // led verde
int LR0 = 23; // led rosso
int LV1 = 24;
int LR1 = 25;
int LV2 = 8;
int LR2 = 9;
int LV3 = 42;
int LR3 = 43;

int G = 28; // display 7 segmenti
int F = 29;
int A = 30;
int B = 31;
int DP = 32;
int C = 33;
int D = 34;
int E = 35;

int motorPin1 = 50;
int motorPin2 = 51;
int motorPin3 = 52;
int motorPin4 = 53;
int pinPot = 0;


void setup(){
 
 
 
  pinMode(AR0, INPUT);
  pinMode(TE0, INPUT);
  pinMode(AR1, INPUT);
  pinMode(TE1, INPUT);
  pinMode(AR2, INPUT);
  pinMode(TE2, INPUT);
  pinMode(AR3, INPUT);
  pinMode(TE3, INPUT);
 
  pinMode(SP0, INPUT);
  pinMode(SP1, INPUT);
  pinMode(SP2, INPUT);
  pinMode(SP3, INPUT);

  pinMode(LV0, OUTPUT);
  pinMode(LR0, OUTPUT);
  pinMode(LV1, OUTPUT);
  pinMode(LR1, OUTPUT);
  pinMode(LV2, OUTPUT);
  pinMode(LR2, OUTPUT);
  pinMode(LV3, OUTPUT);
  pinMode(LR3, OUTPUT);
 
  pinMode(G, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(DP, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
 
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
 
}

void zero(){              // display numero zero
  digitalWrite(G, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}

void uno(){              // display numero uno
  digitalWrite(G, LOW);
  digitalWrite(F, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}

void due(){              // display numero due
  digitalWrite(G, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(DP, LOW);
}

void tre(){              // display numero tre
  digitalWrite(G, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}

void motoresu(){                 
digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(5);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(5);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(5);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(5);
}
 
void motoregiu(){             
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay(5);
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delay(5);
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay(5);
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delay(5);
}

void motorefermo(){
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
}

void ledrossi(){                 // cabina in movimento, tutti i led rossi sono accesi
digitalWrite(LV0, LOW);
digitalWrite(LV1, LOW);
digitalWrite(LV2, LOW);
digitalWrite(LV3, LOW);
digitalWrite(LR0, HIGH);
digitalWrite(LR1, HIGH);
digitalWrite(LR2, HIGH);
digitalWrite(LR3, HIGH);
}

void ledpiano0 (){              // led accesi con la cabina al piano 0
digitalWrite(LV0, HIGH);
digitalWrite(LV1, LOW);
digitalWrite(LV2, LOW);
digitalWrite(LV3, LOW);
digitalWrite(LR0, LOW);
digitalWrite(LR1, HIGH);
digitalWrite(LR2, HIGH);
digitalWrite(LR3, HIGH);
}

void ledpiano1 (){              // led accesi con la cabina al piano 1
digitalWrite(LV0, LOW);
digitalWrite(LV1, HIGH);
digitalWrite(LV2, LOW);
digitalWrite(LV3, LOW);
digitalWrite(LR0, HIGH);
digitalWrite(LR1, LOW);
digitalWrite(LR2, HIGH);
digitalWrite(LR3, HIGH);
}

void ledpiano2 (){              // led accesi con la cabina al piano 2
digitalWrite(LV0, LOW);
digitalWrite(LV1, LOW);
digitalWrite(LV2, HIGH);
digitalWrite(LV3, LOW);
digitalWrite(LR0, HIGH);
digitalWrite(LR1, HIGH);
digitalWrite(LR2, LOW);
digitalWrite(LR3, HIGH);
}

void ledpiano3 (){              // led accesi con la cabina al piano 3
digitalWrite(LV0, LOW);
digitalWrite(LV1, LOW);
digitalWrite(LV2, LOW);
digitalWrite(LV3, HIGH);
digitalWrite(LR0, HIGH);
digitalWrite(LR1, HIGH);
digitalWrite(LR2, HIGH);
digitalWrite(LR3, LOW);
}

                                                           // INIZIO DEL PROGRAMMA
void loop(){

 
   AR0 = digitalRead(2);
   TE0 = digitalRead(3);
   AR1 = digitalRead(4);
   TE1 = digitalRead(5);
   AR2 = digitalRead(6);
   TE2 = digitalRead(7);
   AR3 = digitalRead(40);
   TE3 = digitalRead(41);
   
     
//0000000000000000000000000000000000000000000000000000000000000000000

  // azionamento motore
     if (AR0 == HIGH) {      // il piano attuale è lo 0?
       ledpiano0();          // accendi i led del piano zero
       zero();               // segnala il numero zero sul display
       
       if (TE1 == HIGH){              // è stato premuto il tasto del piano 1?
         while (AR1 == LOW){          // entra in un ciclo infinito e ne esce quando AR1 diventa HIGH
           AR1 = digitalRead(4);      // leggi lo stato del finecorsa del piano 1
           ledrossi();               
           motoresu();               
         }
       }
       
       else if (TE2 == HIGH){   
         while (AR2 == LOW){
           AR2 = digitalRead(6);
           ledrossi();
           motoresu();
         }
       }
       
       else if (TE3 == HIGH){
         while (AR3 == LOW){
           AR3 = digitalRead(40);
           ledrossi();
           motoresu();
         }
       }

       else if (AR1 == HIGH){   
         motorefermo();
         uno();
         ledpiano1();
       }
     
       
       else if (AR2 == HIGH){ 
         motorefermo();
         due();
         ledpiano2();
       }
       
       else if (AR3 == HIGH){
         motorefermo();
         tre();
         ledpiano3;
       }
     }      // fine azionamento motore
     
     // controllo destinazione
     
      else if (AR1 == HIGH){       
         motorefermo();
         uno();
         ledpiano1();
       }
       
       else if (AR2 == HIGH){
         motorefermo();
         due();
         ledpiano2();
       }
       
       else if (AR3 == HIGH){
         motorefermo();
         tre();
         ledpiano3;
       }
       
      // fine controllo destinazione



} // fine loop

                                                 // FINE PROGRAMMA


Questo è il mio programma per il comando di un ascensore in miniatura, ho incollato solo il segmento di software che riguarda solo il caso in cui il finecorsa del piano terra è HIGH e vengono premuti rispettivamente i tasti del piano 1 (TE1) del piano 2 (TE2) e del piano 3 (TE3).
Il funzionamento è il seguente: viene effettuato un controllo dei finecorsa ad ogni piano che indicherà la presenza della cabina, successivamente viene effettuato il controllo dei tasti di chiamata che verranno premuti e il motore girerà fino a quando non si attiverà il finecorsa del piano del tasto premuto.
Io però vorrei chiamare più piani contemporaneamente, cioè se la cabina è al piano terra e io premo il tasto del piano 1 e mentre il motore gira premo il tasto del piano 2, vorrei che prima si fermasse al piano 1 per tot secondi, 5 ad esempio, per poi ripartire in direzione del piano 2 e così via se dovessi premere prima il tasto del terzo piano e poi quello del secondo...
Qualche idea? Dovrei immagazzinare lo stato del tasto premuto mentre il motore gira nella memoria di arduino?
Title: Re: aiuto memoria arduino
Post by: leo72 on Jun 08, 2014, 11:01 pm
Ti serve un array in cui memorizzare il pulsante premuto. Il 1° elemento dell'array è il piano successivo che l'ascensore deve raggiungere. Una volta raggiunto, lo elimini dall'array e fai scorrere le altre celle di 1 posto. Una volta svuotato l'array, l'ascensore si ferma all'ultimo piano raggiunto.

PS:
il titolo è fuorviante, non fa capire di cosa si stia parlando nel thread  ;)
Title: Re: aiuto memoria arduino
Post by: uwefed on Jun 09, 2014, 01:32 am
aggiungi anche una variabile che definisce la direzione (salita o discesa ) del ascensore perché questo vada dal piano 2 al 3 e 4 anche se in marcia viene premuto il piano 0.
Ciao Uwe