Go Down

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

simonsdec

ho provato a riscrivere il codice pensando che il problema fosse il confronto dei 2 switch e micros quando invece dovevo confrontarne 3 alla volta.
Adesso noto che l'ascensore non fa niente
esegue solo senza nessuna pressione del pulsante dal micros1(piano1) va al piano 2 e poi si mette con i due Led accesi in attesa non facendo niente per nessun pulsante
dove può stare il problema ?

Code: [Select]

#include <Stepper.h>
//---------------------------------------------------COLLEGAMENTI-----------------------------------------------//
int pulsante0pin=1;
int pulsante1pin=2;
int pulsante2pin=3;
int microswitch0=4;
int microswitch1=5;
int microswitch2=6;
//--------------------------------------------------- VARIABILI LED----------------------------------------------//
int LED_PT_R=14;
int LED_PT_V=15;
int LED_P1_R=16;
int LED_P1_V=17;
int LED_P2_R=18;
int LED_P2_V=19;


//--------------------------------------------------VARIABILI E PASSI DEL MOTORE---------------------------------//
int Steps2Take;
int Steps3Take;
int Steps4Take;
#define StepsPerMotorRevolution 32
#define StepsdaZeroaDue 94*94
#define StepsdaZeroaUno 68*68
#define StepsdaUnoaDue  64*64
Stepper small_stepper(StepsPerMotorRevolution,8,10,9,11);
//=================================================================================================================
void setup() {

pinMode(pulsante0pin,INPUT);
pinMode(pulsante1pin,INPUT);
pinMode(pulsante2pin,INPUT);
pinMode(microswitch0,INPUT);
pinMode(microswitch1,INPUT);
pinMode(microswitch2,INPUT);
pinMode(LED_PT_R,OUTPUT);
pinMode(LED_PT_V,OUTPUT);
pinMode(LED_P1_R,OUTPUT);
pinMode(LED_P1_V,OUTPUT);
pinMode(LED_P2_R,OUTPUT);
pinMode(LED_P2_V,OUTPUT);
Serial.begin(9600);

//==================================================PT===============================================================
}
void loop () {
  if (digitalRead(4) == HIGH && digitalRead(5) == LOW && digitalRead(6) == LOW) //STATO SWITCH PIANO 0
  {
  digitalWrite(LED_PT_R,LOW); digitalWrite(LED_PT_V,HIGH);//PT LED VERDE ACCESO LED ROSSO SPENTO
  digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
  digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO
 
   //===============================================================================================================

 if(digitalRead(1) == HIGH && digitalRead(2) == LOW && digitalRead(3) == LOW) //CHIAMATA PT
 {
  digitalWrite(LED_PT_R,LOW); digitalWrite(LED_PT_V,HIGH);//PT LED VERDE ACCESO LED ROSSO SPENTO
  digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
  digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO
  delay (1000); // NON FARE NIENTE E ATTENDI IL PASSO SUCCESSIVO
 }
 
 }
//=================================================================================================================
else if (digitalRead(1) == LOW && digitalRead(2) == HIGH && digitalRead(3) == LOW)//CHIAMATA P1
{
  digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
  digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
  digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO
 
Steps2Take = StepsdaZeroaUno; // FAI 68*68 PASSI ORARIO
small_stepper.setSpeed(700);   
small_stepper.step(Steps2Take);
digitalWrite(LED_P1_R,LOW);digitalWrite(LED_P1_R,HIGH);//ARRIVATO AL PIANO 1 V ON R OFF

 }
 else if (digitalRead(1) == LOW && digitalRead(2) ==LOW && digitalRead(3) == HIGH)//CHIAMATA P2
 {
  digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
  digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
  digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO

Steps3Take = StepsdaZeroaDue; // FAI 94*94 PASSI ORARIO
small_stepper.setSpeed(700);   
small_stepper.step(Steps3Take);

digitalWrite(LED_P2_R,LOW);digitalWrite(LED_P2_V,HIGH);
 }
 //===================================PIANO1=======================================================================
 else if (digitalRead(4) == LOW && digitalRead(5) == HIGH && digitalRead (6) == LOW)
 {
 digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P1_R,LOW);digitalWrite(LED_P1_R,HIGH);//P1 LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO
//=================================================================================================================
if (digitalRead(1) == HIGH && digitalRead(2) == LOW && digitalRead (3) == LOW)
{
 digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO

Steps2Take = -StepsdaZeroaUno; // FAI 68*68 ANTIORARIO
small_stepper.setSpeed(700);   
small_stepper.step(Steps2Take);

digitalWrite(LED_PT_R,LOW); digitalWrite(LED_PT_V,HIGH);//PT LED VERDE SPENTO LED ROSSO ACCESO
}
else if (digitalRead(1) == LOW && digitalRead(2) == HIGH && digitalRead(3) == LOW ) //CHIAMATA P1
{
digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
digitalWrite(LED_P1_R,LOW);digitalWrite(LED_P1_R,HIGH);//P1 LED VERDE SPENTO LED ROSSO ACCESO
digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO
delay (1000);
}
//=================================================================================================================
else if (digitalRead(1) == LOW && digitalRead(2) == LOW && digitalRead(3) == HIGH ) // CHIAMATA P2
{
 digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO

Steps4Take = StepsdaUnoaDue; //FAI 64*64 PASSI ORARIO
small_stepper.setSpeed(700);   
small_stepper.step(Steps4Take);
 
digitalWrite(LED_P2_R,LOW);digitalWrite(LED_P2_V,HIGH);
}
//===================================PIANO2=======================================================================
else if(digitalRead(4) == LOW && digitalRead(5) == LOW && digitalRead(6) == HIGH )
{
 digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P2_R,LOW);digitalWrite(LED_P2_V,HIGH);//P2 LED VERDE SPENTO LED ROSSO ACCESO
//=================================================================================================================
if (digitalRead(1) == HIGH && digitalRead(2) == LOW && digitalRead(3) == LOW )//CHIAMATA PT
{
 digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
 digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO

Steps3Take = -StepsdaZeroaDue; // FAI 94*94 PASSI AO
small_stepper.setSpeed(700);   
small_stepper.step(Steps3Take);

 digitalWrite(LED_PT_R,LOW); digitalWrite(LED_PT_V,HIGH);
}
//=================================================================================================================
else if (digitalRead(1) == LOW && digitalRead(2) == HIGH && digitalRead(3) == LOW)//CHIAMATA P1
{
digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO
digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO

Steps4Take = -StepsdaUnoaDue; //FAI 64*64 PASSI AO
small_stepper.setSpeed(700);   
small_stepper.step(Steps4Take);

digitalWrite(LED_P1_R,LOW);digitalWrite(LED_P1_R,HIGH);
}
//==================================================================================================================
else if ( digitalRead (1) == LOW && digitalRead(2) == LOW && digitalRead(3) == HIGH)//CHIAMATA P2
{
 digitalWrite(LED_PT_R,HIGH); digitalWrite(LED_PT_V,LOW);//PT LED VERDE SPENTO LED ROSSO ACCESO
digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO  LED ROSSO ACCESO
digitalWrite(LED_P2_R,LOW);digitalWrite(LED_P2_V,HIGH);//P2 LED VERDE ACCESO  LED ROSSO SPENTO

 delay (1000);
}
}
}
}

Patrick_M

#31
Apr 20, 2018, 04:46 pm Last Edit: Apr 20, 2018, 04:48 pm by Patrick_M
non mi metto a controllarlo tutto ma solo 2 considerazioni

allora il primo if considera il caso in cui le condizioni sono 4 High 5 e 6  low
poi ti manca l'if 5 high 4 e 6 low
e                   if 6 high 4 e 5 low

I nomi delle variabili servono a capire cosa fai e devono essere non troppo lunghe altrimenti ti ci perdi
vedi ad esempio
LED_P1_R
LED_P1_V
microswitch1

non è più comprensibile ad esempio

P1Rosso
P1Verde

o al limite ledP1Rosso ledP1Verde
e micro1

comunque a prescindere da come li definisci
se hai definito questi

Code: [Select]

int microswitch0=4;
int microswitch1=5;
int microswitch2=6;

perchè poi usi questa

Code: [Select]

 if (digitalRead(4) == HIGH && digitalRead(5) == LOW && digitalRead(6) == LOW)

// al posto di questo?

 if (digitalRead(microswitch0) == HIGH && digitalRead(microswitch1) == LOW && digitalRead(microswitch2) == LOW)

quindi se microswitch0 è alto
deve fare tutto questo
Code: [Select]

//                   rosso                    verde
  digitalWrite(LED_PT_R,LOW); digitalWrite(LED_PT_V,HIGH);//PT LED VERDE ACCESO LED ROSSO SPENTO

//                   rosso                    rosso
  digitalWrite(LED_P1_R,HIGH);digitalWrite(LED_P1_R,LOW);//P1 LED VERDE SPENTO LED ROSSO ACCESO

//                   rosso                     verde
  digitalWrite(LED_P2_R,HIGH);digitalWrite(LED_P2_V,LOW);//P2 LED VERDE SPENTO LED ROSSO ACCESO

  delay (1000); // NON FARE NIENTE E ATTENDI IL PASSO SUCCESSIVO

quindi al piano 1 il led verde non esiste

e questa linea non attende il passo successivo, SI FERMA TUTTO per un secondo
Code: [Select]

 delay (1000); // NON FARE NIENTE E ATTENDI IL PASSO SUCCESSIVO
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

Io quando ho un problema simile in un codice ho imparato a fare una cosa:
spengo il computer, stacco Arduino, esco a fare un giro (a me piace camminare, si possono usare altri mezzi) e intanto ripenso da capo il progetto chiarendo bene cosa deve fare e come, e facendo in modo di non dare nulla per sottinteso.
Una volta fatto questo (che può durare ore come giorni, ovviamente intervallato da gite in cucine e bagni e letti) riaccendo il computer, apro un secondo file NUOVO e comincio a tradurre quello che ho pensato in arduinese.
Faccio questo perché un programma con troppa storia è come un vestito con troppi rammendi, non si sa più cosa fosse il vestito e cosa il buco, ma si sa che ti sta stretto e che hai speso una fortuna in stoffe.
Chiarisci bene, quindi, a te stesso come a noi, cosa deve fare l'ascensore in ogni dettaglio, e POI prova a scriverlo in C
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

simonsdec

allora il funzionamento è il seguente:
l'ascensore ha 3 piani
è composto da un microswitch per piano micros0 micros1 micros2 con corrispondente pulsante0 ''1 ''2 e un motore passo passo.
ho costruito il codice in base a dove si trovasse l'ascensore esempio:
si trova al piano 0? quindi se il micros0 =ALTO and(&&) gli altri due micros1-2 si trovano LOW quindi confermato che l'ascensore si trovi al piano 0 nel caso in cui venga spinto uno dei 3 pulsante tradotto con ELSE IF
pulsante 1(faccio un esempio ) HIGH l'ascensore dovrà salire di tot passi (contati piano per piano grazie al funzionamento del motore passo passo) e si fermetà una volta conclusa la sua corsa
detto ciò si troverà successivamente al piano 1 nel caso sia stato spinto il puls2 e avrà delle nuove condizioni per poi ripetere il procedimento per ogni piano
 PROBLEMA
la cabina è troppo pesante quindi ho dovuto ricorrere a un metodo diverso per spingere il motore passo passo oltre alla sua velocità classica che si può trovare con i classici esempi di Arduino,che mi è stato gentilmente linkato da un componente del forum che corrisponde a questo qui
https://arduino-info.wikispaces.com/SmallSteppers
quindi io non dichiaro una velocità costante nel void setup ma vado a dichiarare ogni volta la velocità del mio motore nel void loop con le varie condizioni come è ben visibile nel codice
ed oltre ad esso avendo dei passi diversi per ogni piano vado a dichiare le 3 variabili intstep2-3-4take
per dichiare successivamente quanti passi deve fare.
Adesso io non so se quello che voglio realizzare è possibile farlo nel metodo usato, spero solo di essere stato chiaro con ciò che voglio realizzare e che qualcuno con più esperienza di me mi possa delucidare qualche idea!
grazie mille a chi riesce ad aiutarmi
la situazione di adesso è la seguente
l'ascensore sente solo quando si trova al piano 1 e va automaticamente al piano 2 senza la spinta di alcun pulsante.....

Silente

Cominciamo con il dire una cosa:
Il programma si può semplificare e rendere scalabile usando array e funzioni. Sai di cosa sto parlando?
Se si allora trasforma tutte le variabili indicanti cose uguali in un unico array che ne contenga i valori (array per tutti i sensori, array per tutti i pulsanti, array per tutti i passi...) e poi vediano come continuare.
Vantaggi:
1) con array il tutto é facilmente scalabile
2) tratti tutti gli elementindi un array allo stesso modo per definizione (usando cicli for) e quindi se il problema é di codice non va nessun pezzo dell'array, altrimenti il probkema é chiaramente hardware
3) con le funzioni usi lo stesso identico modo per fare le stesse cose in parti diverse del programma, accorciando lo stesso e riducendo gli errori di scrittura possibili
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

simonsdec

non ho mai usato nulla del genere....

Silente

Ok.
Hai un manuale/libro di C? Cerca cosa é e come si crea e usa un array. É facile e molto utile
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

simonsdec

sto provando a seguire da questo sito:
http://www.alberti-porro.gov.it/wordpress/wp-content/uploads/2014/01/ProgrammareArduino.pdf
ho trovato la parte degli array,ho capito come dichiarare i vari sensori-pulsanti-led
ma una volta che li dichiaro come faccio a descrivere tutto quello che facevo con il mio codice?
il fatto che deve andare di tot passi in senso O e AO solo se determinate variabili corrispondono?

testato

nel tuo listato ci sono dei goto, finche' non spariscono e' inutile ragionarci su  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

simonsdec

leggi l'ultimo codice.... quello iniziale della prima pagina l'avevo preso come esempio e l'ho modificato nel tempo
mai usati goto

Silente

Come fai a rifare quello che facevi nell'altro programma? Semplice, esattamente non puoi. Ti ho consigliato gli array perché così, esempio, la funzione di riconoscimento del piano diventa
Code: [Select]

byte RiconosciPiano()
{
for (byte i=0;i<num_piani;i++)
{
if (digitalRead (sensore_piani[i]))
{
return (i+1);
}
}
return (0);
}

Più facile, più scalabile, ed elimini i problemi di codice, perché, se il problema é di codice, vedi che nessuno funziona, mentre se vedi che alcuni vanno e altri no il problema é hardware.
Ripensa a quello che fai nel tuo programma con i vari numeri separati, e riscrivilo che lo faccia per i vari numeri in un array.
Ricprda che l'array comincia dal punto zero (che di norma significa falso, per questo ho messo return (i+1))
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

gpb01

#41
Apr 22, 2018, 07:51 pm Last Edit: Apr 22, 2018, 07:52 pm by gpb01
Ricprda che l'array comincia dal punto zero (che di norma significa falso ...
Cosa diavolo c'entra il fatto che l'indice di un array parta da 0 con il fatto che una lo zero è associato al valore logico "false" ? ? ? :o :o :o

Per favore, cerchiamo di NON confondere le idee agli utenti mischiando argomenti che nulla hanno a che vedere l'uno con l'altro.

Guglielmo
Search is Your friend ... or I am Your enemy !

Silente

Lo avevo messo per spiegare il (i+1), con il quale distinguo ""l'ascensore é al piano terra" con "non so dove sia l'ascensore"
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

simonsdec

Scusami ma non ho capito che hai fatto potresti spiegarmelo cortesemente con dei commenti ? Scusa e grazie

steve-cr

nel tuo listato ci sono dei goto, finche' non spariscono e' inutile ragionarci su  :)

Daii, non essere così estremista, per uno come me che è partito dal basic Apple, i goto erano la soluzione di tutto!!! :D
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Go Up