realizzazione di un ascensore a 3 piani

Non ho ben chiaro però come strutturare tutto ciò anche la composizione del flowchart mi risulta complicata,non riesco a focalizzare ciò che mi serve realizzare.

Intanto devi capire a cosa serve un diagramma di flusso e cosa rappresenta. Un diagramma di flusso idealmente serve a descrivere in forma grafica un problema in tutte le sue sfaccettature, con particolare enfasi sul metodo di risoluzione dello stesso. La programmazione, qualunque linguaggio tu stia usando, è il metodo pratico per realizzare ciò che è stato pianificato nel diagramma di flusso. Allora, devi partire dal presupposto che ad ogni """struttura""" del linguaggio C (if-else, switch-case, do-while,while, for) si può far corrispondere un blocco grafico del diagramma di flusso. Quindi una volta che definisci il tuo diagramma di flusso, non devi far altro che pensare a tradurre ciascun blocco nelle sue equivalenti istruzioni di codice. L'importante è focalizzare il concetto della corrispondenza (quasi) univoca fra il programma e la sua rappresentazione grafica.

Come posso sviluppare un codice di questo genere? Mi puoi aiutare a farmi uno schema mentale o una bozza per capire da dove cominciare ? Ho una grande confusione su come si possa realizzare un codice di questo tipo. Conosco discretamente le funzioni if else....for..... ma ho difficoltà nel metterle in pratica a e nel capire come e quando vanno sfruttate....

Descrizione veloce dei blocchi grafici che compongono un diagramma di flusso ed esempio di come descrivere un problema: https://it.wikiversity.org/wiki/Diagrammi_di_Flusso_(superiori) Per quanto riguarda la codifica in istruzioni dei blocchi grafici di un diagramma di flusso, questi due documenti, che puoi scaricare al seguente indirizzo: http://staff.polito.it/claudio.fornaro/CorsoC, sono particolarmente utili da leggere: Strutture di selezione e Strutture iterative

Nei documenti succitati vedi per esempio come si rappresenta un'istruzione if-else in forma grafica.

Prova a studiare quelle guide e vedi se riesci autonomamente a trovare un punto di partenza, poi se hai dubbi proviamo a chiarirli. Come ti ho detto in precedenza devi definire per filo e per segno il funzionamento dell'automazione, il codice è l'ultima cosa a cui devi pensare. Io per ora ti ho indicato due metodi per descrivere il problema e la sua soluzione: 1- Elencare in modo scritto la sequenza delle operazioni da effettuare 2- Disegnare un diagramma di flusso che rappresenta la sequenza delle operazioni da effettuare

Scegli uno dei due metodi e poi pensa a come trasformarlo in codice. Probabilmente, siccome sei alle prime armi, ti conviene fare un diagramma di flusso perché ti aiuta meglio a capire il flusso di esecuzione del programma.

ho letto tutti i vostri messaggi e sto provando a scrivere qualcosa mo ho grandi dubbi porgo un esempio 3 tasti 0-1-2 premo il tasto 1, rileva la posizione attuale del ascensore(chi svolge quest'azione)?? sali o scendi a seconda della posizione nell'istante prima della pressione del tasto memorizzata del ascensore attiva il led di prenotazione e una volta arrivato al piano apri porta e accendi il led verde che indica che l'ascensore sta al piano e spengi quello rosso riesco ad esprimere tutto quello che ho detto secondo un codice? come riesco a rilevare la posizione del'ascensore ?

come riesco a rilevare la posizione del'ascensore ?

Collegando fisicamente un sensore di fine corsa ( pulsante a levetta, ottico, magnetico, etc etc )

Ad esempio, collegandone solo uno quando è al piano zero, dovresti tutte le volte che accendi Arduino ( o che viene resettato) far girare il motore in discesa , fino a che non scatta il sensore. Cosi sai che sei al piano zero e poi durante il normale lavoro hai comunque delle variabili che ti dicono a che piano si trova

Oppure ne metti uno per piano, cosi' sai subito dove si trova. E all'accensione controlli se uno dei sensori è premuto, e se non lo è nessuno, muovi il motore fino a che non scatta uno di essi

si penso di metterne uno per ogni piano
quindi pensavo di progettarlo così
ho 3 finecorsa, se il finecorsa 1 è spinto (high) ho rilevato la posizione del ascensore invece nel caso in cui non è spinto nessuno switch facciamo caso che l’ascensore non stia a nessun piano in base al pulsante spinto
0-1-2 sali o scendi dalla sua posizione attuale
quindi riassumendo
riesco a comandare ciò che sto dicendo con la funzioni if else?
ed in più gli progetto insieme il comportamento del led bicolore giusto?

simonsdec: si penso di metterne uno per ogni piano quindi pensavo di progettarlo così ho 3 finecorsa, se il finecorsa 1 è spinto (high) ho rilevato la posizione del ascensore invece nel caso in cui non è spinto nessuno switch facciamo caso che l'ascensore non stia a nessun piano in base al pulsante spinto 0-1-2 sali o scendi dalla sua posizione attuale quindi riassumendo riesco a comandare ciò che sto dicendo con la funzioni if else? ed in più gli progetto insieme il comportamento del led bicolore giusto?

Ma almeno li hai letti i miei messaggi con annesse spiegazioni? Sicuramente la maggior parte delle istruzioni consisteranno in istruzioni di selezione (if-else), ma questo non significa che qualche istruzione di ripetizione (while, for) non potrà rivelarsi necessaria. Comunque te lo dico chiaramente, finché TU DA SOLO non ti fai uno schema di come devi realizzare il progetto, farai molta fatica ad ottenere risultati. Come minimo fai un diagramma di flusso e postalo nella discussione, sennò è inutile stare a discutere sul nulla.

simonsdec: riesco a comandare ciò che sto dicendo con la funzioni if else?

Quello che si fa normalmente è questo:

  • Si leggono gli ingressi (applicando un opportuno anti rimbalzo hard/soft se sono ingressi sporchi come i contatti meccanici).
  • In base alla situazione attuale (stato) e ai valori letti, si decide quali operazioni svolgere (compreso il comando delle uscite e l' eventuale aggiornamento della situazione attuale).
  • La situazione attuale (stato) si mantiene in apposite variabili usate per quello scopo (che vanno all'inizio impostate in modo da permettere una partenza regolare all'accensione o ad un reset).

Detto questo sono da decidere:

  • In quali situazioni (e sotto situazioni) si può trovare il sistema.
  • A quali eventi deve reagire in ogni situazione.
  • Quali operazioni deve compiere ad ogni reazione.

Tutto questo si fa con if/else e variabili usate opportunamente (come indicatori di stato, contatori ecc)

Il funzionamento/avanzamento del sistema è formato dalla continua rapida ripetizione di tutti i punti detti.

Se oltre a questo c'è anche da tenere conto del trascorrere del tempo (o si devono realizzare temporizzazioni), in ordine di precisione crescente si possono usare:

  • Piccoli delay nel loop principale per rallentarlo ad una frequenza nota (in modo da poterne contare "i passaggi".
  • La funzione millis per leggere il contatore di millisecondi interno.
  • Un modulo orologio RTC esterno.

ho fatto un flowchart tramite un'applicazione di windows ma non riesco a girarvelo provo a riassumervelo qui:

LOW PulsantPiano0 HIGH ATTENDI Rileva la posizione del ascensore piano0 piano1 piano2 end sali di tot passi sali di tot passix2 end end

quello che voglio che il mio sistema faccia è nel caso si spinga il pulspiano0 deve rilevare subito la posizione del ascensore,in base ai 3 finecorsa una volta rilevata grazie ai passi del motore passo passo che comanderò con la funzione stepper.h gli dirò di andare al piano0 sempre dallo stato memorizzato prima della spinta del pulsante . Quindi poi per progettare dovrò capire bene quanti giri del mio motore servano per far arrivare al piano l'ascensore è buona come idea??? in più penso di aggiungere i 2 led bicolori

dovrò capire bene quanti giri del mio motore servano per far arrivare al piano l'ascensore è buona come idea???

A parte il fatto che non serve uno Stepper, ma basta un semplice motore DC possibilmente con riduttore......

Che te ne importa di sapere quanti step deve fare........ hai dei sensori di finecorsa per ogni piano, quindi fai avanzare il motore fino a che non scatta il finecorsa

con il motore dc non riesco a capire come farlo avanzare.... mi sembrava più semplice l'utilizzo dello stepper mettendo tutti i casi possibili che mi dava il finecorsa e i pulsanti pensi che mi complico la vita?

ragazzi mi serve il vostro aiuto avrei un paio di problemi con lo stepper 1) come imposto la massima velocità del motore passo passo? ho provato vari setting dagli esempi ma sembra abbastanza lento... consigli? 2) come gli dico di fermarsi ? Ogni volta mi tocca staccare il cavo usb sennò

Se non alleghi lo sketch la vedo dura risponderti

/*
 * MotorKnob
 *
 * A stepper motor follows the turns of a potentiometer
 * (or other sensor) on analog input 0.
 *
 * http://www.arduino.cc/en/Reference/Stepper
 * This example code is in the public domain.
 */

#include 

// change this to the number of steps on your motor
#define STEPS 100

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);

// the previous reading from the analog input
int previous = 0;

void setup() {
  // set the speed of the motor to 30 RPMs
  stepper.setSpeed(30); //questo valore solitamente lo metto a 100 
}

void loop() {
  // get the sensor value
  int val = analogRead(0);

  // move a number of steps equal to the change in the
  // sensor reading
  stepper.step(val - previous);

  // remember the previous value of the sensor
  previous = val;
}

Ma che motore hai ?

ho uno step motor da 5v fa circa 35 giri al minuto e ho visto un video su youtube che lo fa girare al max e penso vada minimo al doppio del mio altra cosa un led dei 4 sul driver non si accende nonostante sia collegato.... speriamo non si sia fulminata una delle 4 bobine

Ah, ho capito quale stepper hai.....

qui trovi tutto quello che c'è da sapere , anche il fatto che hai definito male i pin https://arduino-info.wikispaces.com/SmallSteppers

grazie mille risolto il problema va alla grande!

ragazzi ho provato a fare uno sketch ma non mi sente il motore
secondo voi per quale motivo?
questo è il codice

#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 PER PULSANTI--------------------------------------//
int val0=0;
int val1=0;
int val2=0;
//--------------------------------------------------VARIABILI E PASSI DEL MOTORE---------------------------------//
int Steps2Take;
#define StepsPerMotorRevolution 32
#define StepsdaZeroaDue 94*94
#define StepsdaZeroaUno 68*68
#define StepsdaUnoaDue  64*64
Stepper small_stepper(StepsPerMotorRevolution,8,9,10,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);
StepMotor.setSpeed(10);
//=================================================================================================================
}
/*costruzione dei blocchi if else in modo tale che l'ascensore arrivi nel piano desiderato*/
void loop () {
val0 = digitalRead(pulsante0pin); // caso in cui l'ascensore si trova al piano 1 e deve andare al piano 0
if ((val0 == HIGH) && (microswitch1 == HIGH)) { // se il pulsante piano0 è spinto ed è spinto anche il microswitch piano 1 l'ascensore dovrà scendere di tot passi
  Steps2Take = -StepsdaUnoaDue; //ascensore scendi di 64x64 passi 
  small_stepper.setSpeed(700);//alla velocità di 700 
}
else if ((val0 == LOW) && (microswitch1 == HIGH)) {
  small_stepper.setSpeed(0);
  delay(5000);
}
if ((val0 == HIGH) && (microswitch2 == HIGH)) {
   Steps2Take =  -StepsdaZeroaDue;
   small_stepper.setSpeed(700);
}
else if ((val0 == LOW) && (microswitch2 == HIGH)) {
  small_stepper.setSpeed(0);
  delay(5000);
}
if ((val0 == HIGH) && (microswitch0 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val0 == LOW) && (microswitch0 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
val1 = digitalRead(pulsante1pin);
if ((val1 == HIGH) && (microswitch0 == HIGH)) {
  Steps2Take = StepsdaZeroaUno; //salita 0-1 
  small_stepper.setSpeed(700);
}
else if ((val1 == LOW) && (microswitch0 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val1 == HIGH) && (microswitch2 == HIGH)) {
  Steps2Take = -StepsdaUnoaDue; //scendi da 2 a 1 
  small_stepper.setSpeed(700);
}
else if  ((val1 == LOW) && (microswitch2 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val1 == HIGH) && (microswitch1 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
else if ((val1 == HIGH) && (microswitch1 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
val2 = digitalRead(pulsante2pin);
if ((val2 == HIGH) && (microswitch0 == HIGH)) {
  Steps2Take = StepsdaZeroaDue; //salire da 0 a 2  
  small_stepper.setSpeed(700);  
}
else if ((val2 == LOW) && (microswitch0 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val2 == HIGH) && (microswitch1 == HIGH)) {
   Steps2Take = StepsdaUnoaDue; //sali dal piano 1 al piano 2 
   small_stepper.setSpeed(700);
}
else if ((val2 == LOW) && (microswitch1 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val2 == HIGH) && (microswitch2 == HIGH)) {
delay(10000);
  small_stepper.setSpeed(0);
}
if ((val2 == LOW) && (microswitch2 == HIGH)) {
delay(10000);
  small_stepper.setSpeed(0);
}

perchè vedo solo

small_stepper.setSpeed(700);

dopo manca il codice per muovere lo stepper, ad esempio

small_stepper.step(Steps2Take);

si avevo notato prima di leggere il tuo messaggio che mancava il corrispettivo pezzo del codice, aggiungendolo a tutte le mie condizioni noto che stranamente il motore non accenna ad accendersi mentre con altri pezzi di codice ad esempio quello che mi hai postato tu giorni fa va tranquillamente....il che mi fa pensare che non senta per niente ne pulsante ne microswitch e così facendo non accende il motore....possibile? Anche se il cablaggio l'ho ricontrollato più volte ma niente

cominciamo dall'inizio

if ((val0 == HIGH) && (microswitch1 == HIGH)) {

Questo, come tutti gli altri devono diventare

if ((val0 == HIGH) && ( digitalRead (microswitch1) == HIGH)) {