Go Down

Topic: aiuto memoria arduino (Read 666 times) previous topic - next topic

Joninho

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?

leo72

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  ;)

uwefed

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

Go Up