Go Down

Topic: realizzazione di un ascensore a 3 piani  (Read 1 time) 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

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

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

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

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

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"

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

Go Up