progetto ascensore

buona sera a tutti, ho un problema con un progetto che sto facendo per scuola.
Si tratta di un piccolo ascensore a 3 piani, ha 3 pulsanti esterni per chiamare l’ascensore al piano e internamente 3 fine corsa meccanici che vengono premuti appena l’ascensore ci passa davanti.
Internamente non ha pulsanti per salire/scendere solo esterni.
ho buttato giu un programmino che secondo me è il miglior modo per farlo però non funziona e non capisco dove sbaglio.
Chiedo qui quindi se qualcuno può darmi una mano.
Grazie

int pulsante1 = 4;
int pulsante2 = 2;
int pulsante3 = 3;
int fineC1 = 6;
int fineC2 = 7;
int fineC3 = 5;
int outA = 8; // scende
int outB = 10; // sale
int posizione;
int valP;
int valFineC;

void setup() {
  Serial.begin(9600);
  pinMode(pulsante1, INPUT);
  pinMode(pulsante2, INPUT);
  pinMode(pulsante3, INPUT);
  pinMode(fineC1, INPUT);
  pinMode(fineC2, INPUT);
  pinMode(fineC3, INPUT);
  pinMode(outA, OUTPUT);
  pinMode(outB, OUTPUT);
  do
  {
     valFineC = digitalRead(fineC1);
     digitalWrite(outA,HIGH);
   }  while(valFineC == 0);
   digitalWrite(outA,LOW);
   digitalWrite(outB,LOW);
   valFineC = 1;
   posizione = 1;
}

void loop() {

   if(digitalRead(pulsante1) == 0)
   {
     switch(posizione)
     {
       case 2 :
        do
        {
          valFineC = digitalRead(fineC1);
          digitalWrite(outA,HIGH);
        }  while(valFineC == 0);
        digitalWrite(outA,LOW);
        digitalWrite(outB,LOW);
        valFineC = 1;
        posizione = 1;
        break;

        case 3 :
         do
         {
           valFineC = digitalRead(fineC1);
           digitalWrite(outA,HIGH);
         }  while(valFineC == 0);
        digitalWrite(outA,LOW);
        digitalWrite(outB,LOW);
        valFineC = 1;
        posizione = 1;
        break;

        default :
        break;
     }
   }

   if(digitalRead(pulsante2) == 0)
   {
     switch(posizione)
     {
       case 1 :
        do
        {
          valFineC = digitalRead(fineC2);
          digitalWrite(outB,HIGH);
        }  while(valFineC == 0);
        digitalWrite(outA,LOW);
        digitalWrite(outB,LOW);
        valFineC = 1;
        posizione = 2;
        break;

        case 3 :
         do
         {
           valFineC = digitalRead(fineC2);
           digitalWrite(outA,HIGH);
         }  while(valFineC == 0);
        digitalWrite(outA,LOW);
        digitalWrite(outB,LOW);
        valFineC = 1;
        posizione = 2;
        break;

        default :
        break;
     }
   }

   if(digitalRead(pulsante3) == 0)
   {
     switch(posizione)
     {
       case 1 :
        do
        {
          valFineC = digitalRead(fineC3);
          digitalWrite(outB,HIGH);
        }  while(valFineC == 0);
        digitalWrite(outA,LOW);
        digitalWrite(outB,LOW);
        valFineC = 1;
        posizione = 3;
        break;

        case 2 :
         do
         {
           valFineC = digitalRead(fineC2);
           digitalWrite(outB,HIGH);
         }  while(valFineC == 0);
        digitalWrite(outA,LOW);
        digitalWrite(outB,LOW);
        valFineC = 1;
        posizione = 3;
        break;

        default :
        break;
     }
   }

}

Ciao, a me non sembra affatto il modo migliore di implementare un ascensore e neanche di organizzare il codice :)

Ti dovresti creare una variabile piano "il piano prenotato", e una variabile posizione "la posizione effettiva dell'ascensore"

Ti dovresti creare una funzione per muovere l'ascensore che riceve come parametro il piano

Nella funzione fai un confronto if() se piano maggiore di posizione sali, else if se piano minore di posizione scendi fino al sensore.

Ovviamente nella funzione avrai una variabile sensore che modificherai a secondo del piano

if(piano==1) sensore=sensore1; else if(piano==2) sensore=sensore2

digitalRead(sensore);

se fai una ricerca per ascensore qui nel forum trovi diversi progetti già sviluppati e sviscerati :D

p.s. per la ricerca usa la lente in alto a destra

Patrick_M, non gli ho consigliato di vedere progetti di ascensore nonostante sia un progetto che salta sempre fuori come tesina :) Perché penso che a volte la ruota bisogna reinventarla, nel senso che a fare copia e incolla non esiste nessun merito, e a mio avviso neanche soddisfazione :)

torn24: Patrick_M, non gli ho consigliato di vedere progetti di ascensore nonostante sia un progetto che salta sempre fuori come tesina :) Perché penso che a volte la ruota bisogna reinventarla, nel senso che a fare copia e incolla non esiste nessun merito, e a mio avviso neanche soddisfazione :)

sicuramente hai ragione :D ma avere uno spunto da osservare tanto per farsi un'idea mi pare propedeutico... poi se si è solamente maniaci del copia/taglia/incolla allora non c'è verso ;)

boh, io l’ascensore ai tempi me lo ero fatto “truccando”, infatti non avevo un vero motore, e nemmeno dei fine-corsa

ma io credo che ascensore sia un oggetto che “chiama”, “chiama molto forte” le matrici
una bella matrice (in inglese array) di piani,
a livello di consiglio, solo per fare una cosa “muy muy macho”, molto differente dagli altri millemila ascensori che ci sono a scuola quest’anno:
una struttura (e non ditemi che è difficile, ci sono esempi anche di pochi giorni fa)
in pseudocodice “molto italiano e poco C”
uan struttura di
Pin pulsnate chiamata, ingresso
Pin finecorsa presente, ingresso
Pin led di ascensore presente, uscita
Pin led di piano prenotato, ingresso


questa struttura messa in matrice [numeropiani]
due pin di “motore sale” e “motore scende”
si scandisce la matrice per leggere i pulsanti di chiamata
si accende il led di prenotato
while (piano presente <> piano prenotato)
se pianopresente maggiore minore piano prenotato motoresalescende
si spegne il led di prenotato
si accende il led di presente

e si fa un lavoro che dimostra la conoscenza di C almeno a livello struct typedef e array
che fa certo buona impressione
NON ditemi che è difficile,
in teoria chi fa gli “ascensoridiscuola” dovrebbe averlo studiato, il linguaggio

Grazie a tutti ho risolto facendo come mi ha consigliato @torn24.

in teoria chi fa gli "ascensoridiscuola" dovrebbe averlo studiato, il linguaggio

Ma quelli che li portano come tesina poi non mostrano il codice, anche perché chi li esamina spesso sanno poco o spesso niente di programmazione, quindi non è che rimarrebbero positivamente impressionati ;)

Bisogna considerare gli esaminatori alla stregua di bambini e cercarli di impressionare, a questo punto meglio qualche effetto speciale, che mostrargli un codice che poi considerano scarabocchi :)

torn24: Ma quelli che li portano come tesina poi non mostrano il codice, anche perché chi li esamina spesso sanno poco o spesso niente di programmazione, quindi non è che rimarrebbero positivamente impressionati ;)

Non la vedo così. Se uno porta una tesina, primo, deve saperla poi descrivere ossia cosa fa e come lo fa, e perché è stato scelto quel progetto. Ma, secondo, sarà comunque inerente le materie che ha studiato, quindi a meno che lui non stia facendo scuola di modellismo, una tesina su un ascensore controllato da Arduino ha come argomento principale (direi quasi unico, a parte i problemi costruttivi) proprio la logica implementata nella MCU.

E poi, diciamolo, portare un progetto fatto col copia/incolla senza poter spiegare come funziona mette a rischio l'esame...

A mio avviso implementare un ascensore comporta una conoscenza di programmazione, ma poi volendolo spiegare il funzionamento non è che mi verrebbe da dire molto. Anche volendo spiegare il codice non è che mi verrebbe da dire molto, non credo che si debba spiegare il linguaggio C. :)

" Alla pressione del pulsante di un piano, viene inviato alla funzione movimento il numero del piano.

Se il numero del piano è maggiore della posizione sale fino ad arrivare al sensore corrispondente, in caso il piano fosse minore della posizione scende fino al sensore corrispondente.

Per fare ciò uso un ciclo do whlile() che continua fino a quando il sensore corrispondente al piano non è attivo"

Se l'ascensore ha le porte automatiche la spiegazione si allunga di qualche riga, ma veramente non saprei cosa dire, ma forse sono io che non sono di certo eloquente :) :)