problema programmazione ascensore intelligente con arduino

Salve a tutti, sono un nuovo iscritto e mi sono presentato nella sezione presentazione. Frequento l’ultimo anno di tecnico industriale e per progetto d’esame di maturità ho deciso di realizzare un ascensore a quattro piani intelligente con arduino con le seguenti caratteristiche:
ad ogni piano sono presenti quattro pulsanti di chiamata cabina.
sempre ad ogni piano ma internamente, sono presenti quattro pulsanti/finecorsa con lo scopo di far fermare la cabina al piano desiderato.
i pulsanti interni alla cabina li comando tramite app con smartphone realizzata con mit, ancora in fase di sviluppo.
Bene ora vi presento il mio problema. Come motore utilizzo un motore passo-passo bipolare collegato ad ponte ad H “uln298” dato che il funzionamento è a 12 volt. Fin qua tutto bene, ho testato il motore con un esempio nelle librerie di arduino e il funzionamento è ottimo. Il mio problema è che sono bloccato con il programma in quanto non riesco a far partire il motore utilizzando i pulsanti. Quello che il programma deve fare è far partire la cabina dal piano terra quando viene premuto un pulsante ad ogni piano. Non deve accettare ulteriori chiamate quando la cabina è in movimento. Ho realizzato anche un diagramma degli stati che poi ho riportato nel programma.
Vi posto il mio programma, se per favore qualcuno riesce a darmi un dritta :confused: :confused:

utilizzo i seguenti ingressi: 2-3-4-5-6-7-8-9-10-11-12-13
in cui 2-3-4-5 sono gli ingressi dei pulsati p0-p1-p2-p3, 6-7-12-13 sono ingressi dei finecorsa s0-s1-s2-s3, 8-9-10-11 sono riservati al motore.

#include <Stepper.h>
char c=' ';
int s0=6;
int s1=7;
int s2=12;
int s3=13;
int p0=2;
int p1=3;
int p2=4;
int p3=5;
Stepper myStepper(48,8,9,10,11);
int stato=1,staton;


void P0 (){
if(stato==1) staton = 7;
if(stato==2) staton = 7;
if(stato==3) staton = 7;
stato=staton;
}
void P1 (){
if(stato==0) staton = 4;
if(stato==3) staton = 8;
if(stato==2) staton = 8;
stato=staton;
}
void P2 (){
if(stato==3) staton = 9;
if(stato==4) staton = 2;
if(stato==1) staton = 5;
stato=staton;
}
void P3 (){
if(stato==1) staton = 6;
if(stato==0) staton = 6;
if(stato==2) staton = 6;
stato=staton;
}
void S0(){
if(stato==7) staton = 0;
stato=staton;
}
void S1(){
if(stato==4) staton = 1;
if(stato==8) staton = 1;
stato=staton;
}
void S2(){
if(stato==4) staton = 4;
if(stato==9) staton = 2;
stato=staton;
}
void S3(){
if(stato==4) staton = 3;
if(stato==5) staton = 4;
if(stato==6) staton = 3;
stato=staton;
}
int in[]={6,7,12,13,2,3,4,5};
void setup (){
for(int i=0;i<8;i++)
  pinMode(in[i],INPUT);
Serial.begin(9600);

myStepper.setSpeed(300);
}

void loop (){
//  if(Serial.available()>0){
//   char c=Serial.read();
//   Serial.print(c);
if(digitalRead(p0)) c='A';else c=' ';
if(digitalRead(p1)) c='B';else c=' ';
if(digitalRead(p2)) c='C';else c=' ';
if(digitalRead(p3)) c='D';else c=' ';
if(digitalRead(s0)) c='E';else c=' ';
if(digitalRead(s1)) c='F';else c=' ';
if(digitalRead(s2)) c='G';else c=' ';
if(digitalRead(s3)) c='H';else c=' ';
Serial.println(c);
switch(c){
  case 'A' : P0(); break;
  case 'B' : P1(); break;
  case 'C' : P2(); break;
  case 'D' : P3(); break;
  case 'E' : S0(); break;
  case 'F' : S1(); break;
  case 'G' : S2(); break;
  case 'H' : S3(); break;
}
c=' ';

if((stato<4)&&(stato>=0)){
  
}
if((stato>3)&&(stato<7)){
  myStepper.step(1);
}
if((stato>6)&&(stato<10)){
  myStepper.step(-1);
}
Serial.println(stato);
delay(1000);
}

Ale996:
Salve a tutti, sono un nuovo iscritto e mi sono presentato nella sezione presentazione.

… ti sei presentato, ma evidentemente NON hai letto il REGOLAMENTO !

In conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

scusi la mia ingenuità, potrebbe spiegarmi meglio? Ho cliccato su edit in basso a destra ma si blocca la pagina ricaricandomi sempre la stessa..

In basso a destra c’è la voce "More, ci vai sopra e selezioni “Modify” …
… ti riapre in edit il tuo post, selezioni tutto il codice ed usi il primo bottone tutto a sinistra fatto così </>. Il codice viene messo in un apposito sfondo, con un suo font.

Salvi e tutto è a posto …

Guglielmo

ok perfetto grazie mille, era un problema del pc. Risolto, grazie mille

Ciao, ti consiglio di gestire il loop con una macchina a sati (due nel tuo caso), il primo è lo stato di "attesa", in questo stato leggi i pulsanti , se sono stati premuti allora fai partire la tua funzione che imposta le tue variabili e con un'altra poni lo stato in "movimento", in questo stato non fai leggere più i pulsanti ma ti occupi solo di muovere il motore, arrivato al piano rimetti lo stato in "attesa". Per far si che il tutto funzioni correttamente ti consiglio anche di eliminare il delay e se proprio ti si rendesse necessario attendere imposta il tutto con l'uso della funzione millis(). Ultima cosa, fai una lettura diretta dei pulsamti con la digitalRead, se hai previsto il debounce hardware tutto ok, altrimenti devi implementarlo via software per evitare il problema della lettura di rimbalzi che ogni pulsante fisico porta con se. Visto che ci sei pulisci anche il codice, lo switch con la variabile settata poco sopra serve a poco, fai le operazioni direttamente dentro gli if visto che non ne esiste più di uno che setta il medesimo valore

Non deve accettare ulteriori chiamate quando la cabina è in movimento.

Oh bella questa... e come mai? Se deve essere "intelligente", deve gestire la lista delle prenotazioni delle chiamate ai piani. Per quale motivo uno dovrebbe aspettare che si fermi prima di prenotare la chiamata, se è intelligente? Premi e ti mette in lista di attesa, mettendo l'azione "fermati al piano X" in coda dopo le altre azioni già programmate tramite i pulsanti dei piani ed i pulsanti in cabina. Se poi vogliamo farla ancora più bella, mettiamo una rielaborazione della coda in modo da ottimizzare la sequenza. Insomma se hai 1 - 4 - 2 e sei al primo piano, magari rielabori in 1 - 2 - 4 per evitare di fare sali e scendi.

Ti suggerisco per i pulsanti di usare una sola porta analogica e collegare tutti e quattro i pulsanti, se vuoi collegare dei LED per ogni piano che magari lampeggiano se sei prenotato, oppure puoi mettere altri sensori e farlo ad 8 piani ovviamente mettendo otto pulsanti. La stessa cosa potresti fare con i fine corsa, usando una sola porta analogica per tutti.

... inoltre, per ovvi motivi di sicurezza, non e' possibile impostare un controller per ascensore in modo che NON legga alcun pulsante durante il movimento ... specie quelli di emergenza ;)

guardate io sto seguendo un progetto da un libro per questo utilizzato queste caratteristiche. Per il fatto della chiamata dei pulsanti interni, devo svilupparli con uno smartphone in quanto mi è stato chiesto di farlo con esso. Comunque, potete un pò aiutarmi scrivendomi dove devo cambiare il programma? Io sono nel pallone e non riesco più ad andare avanti :confused:

Hai trovato il progetto in un libro. Bene. Ma nulla toglie che tu possa metterci qualcosa di tuo, anzi credo che sarebbe molto gradito dai tuoi professori.

Mi sfugge la logica del tuo programma.

Per esempio, consideriamo il blocco:

if(digitalRead(p0)) c='A';else c=' ';
if(digitalRead(p1)) c='B';else c=' ';
if(digitalRead(p2)) c='C';else c=' ';
if(digitalRead(p3)) c='D';else c=' ';
if(digitalRead(s0)) c='E';else c=' ';
if(digitalRead(s1)) c='F';else c=' ';
if(digitalRead(s2)) c='G';else c=' ';
if(digitalRead(s3)) c='H';else c=' ';

cosa dovrebbe fare, secondo te?

Legge in sequenza p0, p1, ... , s3 se nessuno è true, allora avrai c=' ' immagina ora che p3 sia true, cosa succede?