Go Down

Topic: realizzazione di un ascensore a 3 piani  (Read 13898 times) previous topic - next topic

Standardoil

allora..
non ti mettero' il codice, non lo faccio più, in particolare nno per gli studenti
ma ti segnalo qualche incongruenza, alcune anche grosse
primo: da marzo (meta') non hai ancora deciso se i pulsanti che hai sono NC o NO?
stai usando i micro di piano come se fossero NC, ma li dichiari input, non input_pullup, sono perplesso
secondo: ma possibile che non riesci (nessuno di voi ci riesce) a formattare decentemente il programma?
Che idea bizzarra è quella di chiudere una graffa di un if e aprire una nuova if sulla stessa riga?
che leggibilità speri di ottenere?
cosa credi che pensi chi legge il tuo programma?
in due mesi e mezzo almeno un passo in questa direzion lo potevi fare
parliamo di passi:
Claudio_FF te lo ha detto all'una e un quarto che avevi sbagliato i tipi dati
e tu otto ore dopo sei ancora qui a giocare coi tipi dati sbagliati?, cosa non ti è chiaro del concetto "Bool NON è Int"?, se non metti a posto gli errori nemmeno quando te li mostrano come credi di poter ottenere qualcosa di funzionante?
ora, se un bool NON è un Int scrivere una bizzarria del genere:
Code: [Select]

bool PULS_0=2;

e tutte le rige sue sorelle
significa assegnare 1 (ovvero true) alle variabili, e non altri valori
che se poi le usi per le pinmode significa che hai fatto molte volte la pinmode del piedino 1, ma MAI le pinmode che ti servono
e unito al fatto che non sai bene se i tuoi tasti sono NC o NO significa che non sai se i pin "vanno" oppure "non vanno", a posto siamo.......
poi, lungi da te l'idea di seguire il consiglio di steve_cr di un paio di settimane fa: fai le cose una per volta, e quando va aggiungi
no, tu devi (tuo post 48) prevedere per i tre pulsanti i casi che siano premuti i piani.....
che sarebbe già lavoro improbo e facile ad errori SE fosse fatto, peccato che NON lo hai fatto
tre piani con tre pulsanti possibili e tre posizioni possibili fanno nove (in cifra: 9 ovvero 3*3) casi da considerare, tu hai scritto 4 if
e gli altri 5 casi?
certo che tra mancate pinmode, pullup forse presenti, tasti che non sono come si crede e casi non previsti l'ascensore fa quello che vuole, mi avrebbe meravigliato il contrario
da ultimo le stranezze minori
perchè non hai seguito i varii (si' varii, con due i, è il plurale di variO, che diventa variI, e se il mio correttore ortografico non è daccordo la cosa non mi interessa)
dicevo: perchè non hai seguito i varii consigli di fermare l'ascensore quando arriva a premere il micro, non contare i passi?  se il motore col tempo perdesse qualche passo tra sei mesi ti trovi la cabina che si ferma a mezzo piano? vabbe' che devi solo passare l'esame, ma un minimo di pensiero ci vuole....
dulcis in fundo il numero dei passi: ma sei sicuro che la distanza tra i piani sia proprio così come indichi?
no, perchè se la distanza tra il piano 0 e il piano 2 è di 8836 passi mi sembra difficile credere che la somma delle distanze 0-1 e 1-2 sia 8270, forse abbiamo già cominciato a fermare l'ascensore in mezzo ai piani, senza nemmeno bisogno di aspettare un guasto hardware, comodo per avere inquilini incaxati alla grande ed esaminatori che sanno cosa pensare dell'esaminando..........
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

Standardoil

Un consiglio te lo posso lasciare
progetti zoppi sono duri da raddrizzare, riparti da capo che fai prima
ma tieni presente i suggerimenti che ti sono stati dati
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

simonsdec

grazie della risposta apprezzo molto
 sicuramente ho capito degli errori enormi che ho fatto forse data la mia nulla esperienza e anche poca informazione
i pulsanti sono sicuramente nc e spingendoli no
I microswitch l'inverso
però li alimento con i 3.3v di Arduino e mi è stato detto che non dovevano essere usate le resistenze di pullup per questo ho pensato se non le uso fisicamente le resistenze non le dovrò dichiarare neanche su Arduino giusto ?sbagliato?
per quanto riguarda il fatto degli altri 5 casi che mi mancano hai ragione, diciamo questa era una bozza di programma un testing e l'ascensore sembrava aver risposto correttamente, faceva molte cose come veniva scritto da programma me ne mancavano delle altre che sicuramente con l'aggiunta dei vari if e di tutte le cose che mi hai consigliato si aggiusteranno.
L'ultimo consiglio che mi hai dato quello di mandare avanti il motore fin quando non sentisse il cambio di stato del microsw l'avevo bocciato perché non sapevo come fare a livello di progetto .... avevo optato per una cosa semplice e basilare come andare a confrontare due variabili con l'if e dirgli in caso fossero vere cosa dovesse fare....

Standardoil

separa il programma in unità funzionali
che poi vuol dire funzioni che fanno una cosa specifica ed entrocontenuta
leggi i pulsanti e definisci il piano prenotato (se c'è pulsante)
leggi i micro e definisci il piano presente (se l'ascensore è fermo)
se prenotato <> presente  in C sarebbe if (prenotato!=presente)
se prenotato > presente motoresale
se prenotato < presente motorescende
motoresale è una fonzione che fa un tot di passi e poi controlla se il micro di presente segna presente uguale a prenotato, se si si ferma, altrimenti ricomincia, suggerimento: guarda la documentazione di while
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

Claudio_FF

#79
Jun 03, 2018, 08:56 am Last Edit: Jun 03, 2018, 06:23 pm by Claudio_FF
Quote from: simonsdec
però li alimento con i 3.3v di Arduino e mi è stato detto che non dovevano essere usate le resistenze di pullup
Per leggere dei contatti isolati le resistenze di pull-up (oppure pull-down), esterne o interne che siano, servono sempre. Non si usano solo se la cosa da leggere genera già da sola i corretti livelli di tensione riconoscibili dall'ingresso.


Quote from: simonsdec
i pulsanti sono sicuramente nc e spingendoli no
Provato elettricamente (con tester, minicircuito con LED, ecc) o dedotto in altro modo?

Lo chiedo perché entrambi questi circuiti danno LOW quando premuto e HIGH quando non premuto, ma solo quello di sinistra (con resistenza di pull-down) ha un pulsante di tipo NC.

I tuoi collegamenti sono quelli di sinistra o di destra?



Comunque l'importanza è relativa, una volta stabilito con sicurezza che pulsante premuto corrisponde a lettura LOW basta scriverlo chiaramente come commento nella sezione dichiarazioni.


Quote from: standardoil
significa assegnare 1 (ovvero true) alle variabili, e non altri valori
Vero, credevo che il tipo boolean fosse solo un alias di byte, invece effettivamente assume solo 0 o 1:
Code: [Select]
bool x = 12;

void setup() {
  Serial.begin(9600);
  delay(1000);
  Serial.println(sizeof(x));
  Serial.println(x);
  Serial.println((byte)x);
}

void loop() {}

In questo caso, nonostante i pinMode errati, "funziona" tutto solo perché i pin sono già ingressi all'accensione, il pin 1 è già un'uscita (ma magari si blocca la seriale), e le uscite probabilmente vengono impostate dalla libreria stepper.
* * * * Una domanda ben posta è già mezza risposta * * * *

simonsdec

il collegamento è il seguente
hanno un positivo comune i 3 pulsanti
successivamente pin e massa perché usando i 3.3v non avevo messo le resistenze
e provando con lo sketch che vi ho postato in precedenza l'unica condizione che aspetta la condizione del programma è quella del microsw HIGH and pulsante LOW
se metto altre condizioni parte da solo ....
quindi presumo che sia normalmente chiuso e successivamente open

Claudio_FF

#81
Jun 03, 2018, 06:21 pm Last Edit: Jun 03, 2018, 06:24 pm by Claudio_FF
Quote from: simonsdec
hanno un positivo comune i 3 pulsanti
successivamente pin e massa perché usando i 3.3v non avevo messo le resistenze
Dopo 80 post io ancora non ho capito (niente).
Quindi non è nessuna delle due alternative che ho disegnato? (le ho disegnate apposta per non rischiare fraintendimenti nel descriverle)
* * * * Una domanda ben posta è già mezza risposta * * * *

simonsdec

positivo switch resistenza massa
dovrebbe corrispondere al tuo esempio di sinistra

simonsdec


allora lo schema dei pulsanti è il seguente
ed avrei un dubbio siccome è nc e successivamente no
con l'input devo mettere pulldown giusto?

Claudio_FF

Non c'è INPUT_PULLDOWN, ma la resistenza è già all'esterno per cui va bene così.

Piuttosto metti anche un condensatore 100nF in parallelo alla resistenza stessa, così ti togli i problemi dei rimbalzi meccanici.
* * * * Una domanda ben posta è già mezza risposta * * * *

simonsdec

ok quindi la parte meccanica risolta
adesso ho problema di codice
allora se voglio indicare ad esempio che in una determinata situazione non devono fare assolutamente niente come faccio ?
Ci sono dei casi , esattamente 3 per il quale l'ascensore si trova al piano 0 prendo ad esempio e viene spinto il piano 0
cosi per piano 1 pulsante 1
piano 2 pulsante 2
e voglio dire che in quel caso non deve fare niente l'ascensore
fin'ora ho scritto così
Code: [Select]

if(digitalRead(MICROSW_0) == HIGH and digitalRead(PULS_0) == LOW){

}

non scrivevo niente all'interno della graffa sperando che stia a significare che in quel caso non deve far niente
ma noto che o fa discesa o fa salita a suo piacimento...... come posso risolvere?

Silente

Considerando tutti i casi possibili NON FINISCI PIÙ!!! Devi trovare una maniera più veloce.
Tale maniera te la do io, visto che dirti "pensaci", dopo mesi che sei su questo problema, non è molto efficace.
Tu devi (come qualcuno, guarda caso, ti ha già detto) usare gli ARRAY!!! In cui mettere i pin di tasti e switch.
Hai, inoltre, due variabili globali, che sono ultimo tasto sentito e ultimo switch sentito.
in loop
{
Ogni volta che senti un tasto o uno switch aggiorni la variabile corrispondente, e la rendi pari al valore di tale tasto/switch.
Se il tasto memorizzato ha valore maggiore dello switch memorizzato
{
sali di UN PASSO
}
se il tasto memorizzato ha valore minore dello switch memorizzato
{
scendi di UN PASSO
}
}
Scrivilo così e vedi CHE funziona.
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

Patrick_M

non scrivevo niente all'interno della graffa sperando che stia a significare che in quel caso non deve far niente
ma noto che o fa discesa o fa salita a suo piacimento...... come posso risolvere?
se in una condizione non devi fare nulla allora non fare nulla, cioè non pensare a quella condizione, ri-cioè non scrivire una riga inutile, se  perche è scritta per non fare nulla è come se non fosse scritta

ascensore a 3 piani

Code: [Select]

if(digitalRead(MICROSW_352) == HIGH and digitalRead(PULS_352) == LOW){

}


non devi controllare il piano 352 perchè non esiste.... è più o meno la stessa cosa
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Silente

Unica cisa da risolvere del mio programmino (la dico perché ci potrebbe essere un problema) é:
Separare l'aggiornamentobdella memoria micro da quellla pulsanti
Eseguire l'aggiornamento della memoria pulsanti solo se i due ricordi sono uguali
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

simonsdec

se in una condizione non devi fare nulla allora non fare nulla, cioè non pensare a quella condizione, ri-cioè non scrivire una riga inutile, se  perche è scritta per non fare nulla è come se non fosse scritta

ascensore a 3 piani

Code: [Select]

if(digitalRead(MICROSW_352) == HIGH and digitalRead(PULS_352) == LOW){

}


non devi controllare il piano 352 perchè non esiste.... è più o meno la stessa cosa
però ho un problema io noto che i step che ho segnato con if else li fa senza problemi
sta al piano 0 deve andare al piano 1 spingo il pulsante ci va
sta al piano 1 spingo il piano 2 va al piano 2
ma ho notato,cosa che non deve assolutamente capitare,che se spingo il piano 0 e si trova al piano 0 mi fa discesa ad esempio ..... devo eliminare questo tipo di problema
come posso evitare ciò? mi sono spiegato ?

Go Up