Go Down

Topic: Porta scorrevole (Read 1 time) previous topic - next topic

docdoc

#30
Jun 26, 2018, 01:27 pm Last Edit: Jun 26, 2018, 01:29 pm by docdoc
ti dico che a me in realta serve proprio che poi si spenga anche se il pulsante e' chiuso, ho capito bene?
Non so, dipende tu da cosa vuoi che faccia.. ;) Allora, ok, tu premi il pulsante e lo tieni premuto quindi dopo 2 secondi il LED si accende e dopo altri 3 si spegne, anche mantenendo premuto il pulsante. E questo quindi ti va bene.

Però sei proprio sicuro sicuro che faccia così come dici? Non è che magari si accende per 3 secondi, poi si spegne e si riaccende ancora?... E se poi io alzo il dito dal pulsante e lo premo nuovamente, cosa fa quello sketch? E cosa invece dovrebbe fare nel tuo progetto?

Ma tu questi sketch li provi realmente o ti basi solo sulla lettura del codice?

Io sono convinto che "se faccio, imparo", quindi se non l'hai ancora fatto, ora realizza un circuitino di prova con solo un LED (ricorda la resistenza da 220 ohm) e pulsante (ricorda la resistenza di pull-down), e provalo.

Se proprio non vuoi/puoi realizzare un circuito "fisico", fatti un account su TikerCad Circuits e creati un circuito dove testare gli sketch con un Arduino virtuale (questo ha il vantaggio anche di poter fare un debug più comodo in quanto puoi mettere breakpoint, eseguire passo-passo, ed esaminare il contenuto delle variabili!). Unica accortezza, in quel simulatore per qualche strana ragione la millis() non dà i millisecondi ma centesimi quindi quando simuli devi far attenzione a considerare per 1 secondo il valore 100 e non 1000.


Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gtanix

Si io testo sempre su circuito reale il funzionamento dei miei programmi, e ti rispondo subito che la cabina deve essere rilevata per 2 secondi prima di far aprire le porte ,una volta rilevata , deve aprire le porte e stop, nel momento in cui le porte hanno fatto il loro processo solo se la cabina se ne va e poi ritorna dovranno riaprirsi le porte , quindi penso che il codice vada bene per ora c'e solo da sostituire il led con il motore, cosa che non so ancora fare e tener conto che di porte ce ne sono 4 quindi sicuramente cambia qualcosa, anzi piu di qualcosa, mi sapresti dare una mano?

gtanix

Raga questo dovrebbe essere il codice finale ma non ho ancora modo di provarlo qualcuno mi sa dire se e' giusto? Ricapitolo cosa dovrebbe fare, nel momento in cui i sensori captano la cabina, aspetta 2 secondi e poi fai muovere la porta avanti e indietro una sola volta, anche se il sensore continua a captare deve fare una sola volta questa azione finche la cabina non si sposta e magari ritorna al suo posto, ci sono quattro porte, che dite il codice va bene?
Code: [Select]
#define LED 13                // LED collegato al pin digitale 13 
#define BUTTONUNO A0
#define BUTTONDUE A2
#define BUTTONTRE A3// pin di input dove è collegato il pulsante 
#define BUTTONQUA A1
#define TEMPO 2000
int  val0 = 0;
int  val1 = 0;
int  val2 = 0;
int  val3 = 0;// si userà val per conservare lo stato del pin di input

long tempoPremuto = -1; // Indica tasto non ancora premuto



void setup() {
  pinMode (0, OUTPUT);
  pinMode (1, OUTPUT);
  pinMode (2, OUTPUT);
  pinMode(LED, OUTPUT);       // imposta il pin digitale come output
  pinMode(BUTTONUNO, INPUT);
  pinMode(BUTTONDUE, INPUT);
  pinMode(BUTTONTRE, INPUT);
  pinMode(BUTTONQUA, INPUT);// imposta il pin digitale come input
}



void loop ()
{
   if ( digitalRead(BUTTONUNO) == LOW ) {
    if ( tempoPremuto == -1 ) // quindi solo la prima volta!
      tempoPremuto = millis();
  } else {
    // tasto rilasciato, resetto
    tempoPremuto = -1;
  }
    if ( digitalRead(BUTTONDUE) == LOW ) {
    if ( tempoPremuto == -1 ) // quindi solo la prima volta!
      tempoPremuto = millis();
  } else {
    // tasto rilasciato, resetto
    tempoPremuto = -1;
  }
    if ( digitalRead(BUTTONTRE) == LOW ) {
    if ( tempoPremuto == -1 ) // quindi solo la prima volta!
      tempoPremuto = millis();
  } else {
    // tasto rilasciato, resetto
    tempoPremuto = -1;
  }
    if ( digitalRead(BUTTONQUA) == LOW ) {
    if ( tempoPremuto == -1 ) // quindi solo la prima volta!
      tempoPremuto = millis();
  } else {
    // tasto rilasciato, resetto
    tempoPremuto = -1;
  }

  if ( tempoPremuto > -1 && millis() - tempoPremuto > TEMPO)
  {
    // Almeno 2 secondi, accendo il led
    digitalWrite(LED, HIGH);
    gira_porta();
    delay (3000); //rimane acceso per 3 secondi dopo di che si spegne
    digitalWrite(LED, LOW);
  }
}






void gira_porta()
{
  digitalWrite (0, HIGH);
  digitalWrite (1, LOW);
  digitalWrite (2, 30);
  delay (900);
  digitalWrite (1, HIGH);
  digitalWrite (0, LOW);
  digitalWrite (2, 100);
  delay (900);
  digitalWrite (0, LOW);
  digitalWrite (1, LOW);
  digitalWrite (2, 100);
  delay(3000);
}

docdoc

Raga questo dovrebbe essere il codice finale ma non ho ancora modo di provarlo qualcuno mi sa dire se e' giusto?
Ehm, scusa, ma per testare qualcosa o ti fai tu il circuito e lo provi "dal vivo", oppure se non vuoi/puoi realizzarlo fisicamente te l'ho già consigliato, lo simuli con TinkerCad Circuits (ma ricorda che lì millis() riporta i tempi in centesimi non millesimi!). Fatti un account che ogni tanto è comunque utile per testare alcune cose "al volo", oltre ad avere già lo schema del circuito da postare all'occorrenza...


Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

miky_police

Scusa se posso sembrare un po duro, ma:
1) se usi millis() non ti puoi andare ad incasinare con delay() successivamente se non strettamente necessario...
2) la sequenza del codice richiesto all'inizio del topic è semplicissima, ovvero:
- leggi la fotocellula e vedi se c'è qualcosa davanti
- se c'è la cabina prendi nota di millis() perché dovrà attendere 2 secondi per l'apertura
- attesi i 2 secondi apri la porta
- attendi altro tempo per richiudere la porta
- richiudi la porta.
Cosa c'è di così trascendentale???
adesso, quello appena spiegato cerco di rappresentartelo sotto forma di listato (come diceva qualcuno :D )

Code: [Select]

#define pinPhoto 6
#define pinM1 7
#define pinM2 8
#define pinM3 9
int attesa = 2000;
unsigned long tempoPhoto;
unsigned long startMovimento;
boolean startTempo = false;
boolean aperturaEffettuata = false;

void setup() {
  pinMode(pinPhoto, INPUT); // pin fotocellula
  pinMode(pinM1, OUTPUT); // questi tre per il motore
  pinMode(pinM2, OUTPUT);
  pinMode(pinM3, OUTPUT);
  tempoPhoto = 0;
  startMovimento = 0;
}

void loop() {
  byte lettura = digitalRead(pinPhoto); //leggo lo stato della fotocellula
  if (aperturaEffettuata == false) { //se non è stata eseguita l'apertura
    if (lettura == LOW) { //se c'è la cabina
      if (startTempo == false) { //se non è stato settato il tempo
        tempoPhoto = millis(); //lo settiamo adesso
        startTempo = true; //alzo il flag per escludere questo dal prossimo loop
      }
      if (millis() - tempoPhoto >= attesa && startTempo == true) { // se è terminata l'attesa di 2 sec ed è stato fissato lo start
        muoviMotore(); // avvio il movimento di apertura chiusura porta
      }
    }
  }
}

void muoviMotore() {
  startMovimento = millis();
  while (millis() - startMovimento <= 500) { //per mezzo secondo deve eseguire questo che c'è di seguito
    digitalWrite(pinM1, LOW);
    digitalWrite(pinM2, HIGH);
    analogWrite(pinM3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  }
  // dopo blocchiamo il motore
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, LOW);

  //impostiamo l'attesa con la porta aperta
  delay(5000); //aspettiamo 5 secondi a porta aperta

  startMovimento = millis(); // aggiorno la variabile per eseguire la chiusura
  while (millis() - startMovimento <= 500) { //come per l'apertura ma con i pin al contrario
    digitalWrite(pinM1, HIGH);
    digitalWrite(pinM2, LOW);
    analogWrite(pinM3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  }

  //blocchiamo il motore
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, LOW);
  startTempo = false; //riporto il flag a false per ricominciare tutto
  aperturaEffettuata = true; // alzo il flag per prevenire che si riapra la cabina all'infinito
}



Prerequisiti :
1) saper utilizzare millis()
2) programmazione a stati finiti.
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

gtanix

Scusa se posso sembrare un po duro, ma:
1) se usi millis() non ti puoi andare ad incasinare con delay() successivamente se non strettamente necessario...
2) la sequenza del codice richiesto all'inizio del topic è semplicissima, ovvero:
- leggi la fotocellula e vedi se c'è qualcosa davanti
- se c'è la cabina prendi nota di millis() perché dovrà attendere 2 secondi per l'apertura
- attesi i 2 secondi apri la porta
- attendi altro tempo per richiudere la porta
- richiudi la porta.
Cosa c'è di così trascendentale???
adesso, quello appena spiegato cerco di rappresentartelo sotto forma di listato (come diceva qualcuno :D )

Code: [Select]

#define pinPhoto 6
#define pinM1 7
#define pinM2 8
#define pinM3 9
int attesa = 2000;
unsigned long tempoPhoto;
unsigned long startMovimento;
boolean startTempo = false;
boolean aperturaEffettuata = false;

void setup() {
  pinMode(pinPhoto, INPUT); // pin fotocellula
  pinMode(pinM1, OUTPUT); // questi tre per il motore
  pinMode(pinM2, OUTPUT);
  pinMode(pinM3, OUTPUT);
  tempoPhoto = 0;
  startMovimento = 0;
}

void loop() {
  byte lettura = digitalRead(pinPhoto); //leggo lo stato della fotocellula
  if (aperturaEffettuata == false) { //se non è stata eseguita l'apertura
    if (lettura == LOW) { //se c'è la cabina
      if (startTempo == false) { //se non è stato settato il tempo
        tempoPhoto = millis(); //lo settiamo adesso
        startTempo = true; //alzo il flag per escludere questo dal prossimo loop
      }
      if (millis() - tempoPhoto >= attesa && startTempo == true) { // se è terminata l'attesa di 2 sec ed è stato fissato lo start
        muoviMotore(); // avvio il movimento di apertura chiusura porta
      }
    }
  }
}

void muoviMotore() {
  startMovimento = millis();
  while (millis() - startMovimento <= 500) { //per mezzo secondo deve eseguire questo che c'è di seguito
    digitalWrite(pinM1, LOW);
    digitalWrite(pinM2, HIGH);
    analogWrite(pinM3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  }
  // dopo blocchiamo il motore
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, LOW);

  //impostiamo l'attesa con la porta aperta
  delay(5000); //aspettiamo 5 secondi a porta aperta

  startMovimento = millis(); // aggiorno la variabile per eseguire la chiusura
  while (millis() - startMovimento <= 500) { //come per l'apertura ma con i pin al contrario
    digitalWrite(pinM1, HIGH);
    digitalWrite(pinM2, LOW);
    analogWrite(pinM3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  }

  //blocchiamo il motore
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, LOW);
  startTempo = false; //riporto il flag a false per ricominciare tutto
  aperturaEffettuata = true; // alzo il flag per prevenire che si riapra la cabina all'infinito
}



Prerequisiti :
1) saper utilizzare millis()
2) programmazione a stati finiti.
Ma questo e' un solo motore, conta che ce ne sono altri 3

miky_police

#36
Jun 27, 2018, 09:45 pm Last Edit: Jun 27, 2018, 09:54 pm by miky_police
quindi??
Non vedo quale sia il problema...
Dove sono posizionati questi motori?? Quando dovrebbero entrare in azione??
Se intendi 3 motori di cui 1 per aprire la porta al "piano terra", 1 per far salire l'asensore ed 1 per aprire la porta del "primo piano" non vedo alcuna difficoltà nella realizzazione... devi solo ripetere quello che ho postato per 3... ti ho pure aggiunto la funzione che permette, dopo aver aperto e chiuso la porta scorrevole, di non riaprirla e richiuderla all'infinito... e quindi disabilitarla solo dopo che ci sia stata esplicita richiesta (pulsante, chiamata dell'ascensore, ecc)...

Poi, penso che ci sia un problema di fondo.. l'ho notato mentre buttavo giu la bozza che ho postato, poiché ho preso spunto dal tuo esempio dove il movimento del motore è dettato dal delay()...
Erratissimo usare un motore dc senza coadiuvarsi con un encoder/switch fine corsa per compiere movimenti che debbano rispettare delle posizioni precise...
Per non metter su switch/encoder/ecc puoi usare un semplicissimo stepper motor versione mini come questo in modo tale da poter programmare quanti step servono per l'apertura e chiusura in modo mooooolto più preciso... Ma, se per te questo non ha importanza continuiamo su questa linea...
EDIT: non citare tutto il post per riferire la tua risposta. Se al mio reply segue il tuo è evidente che la risposta è inerente all'ultimo post... in caso diverso, se vuoi rispondere a qualche post indietro o fai la citazione parziale oppure dici "ciao miky_police, al tuo post #34......." ;)
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

miky_police

Code: [Select]

void muoviMotore() {
  startMovimento = millis();
  while (millis() - startMovimento <= 500) { //per mezzo secondo deve eseguire questo che c'è di seguito
    digitalWrite(pinM1, LOW);
    digitalWrite(pinM2, HIGH);
    analogWrite(pinM3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  }
  // dopo blocchiamo il motore
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, LOW);

  //impostiamo l'attesa con la porta aperta
  delay(5000); //aspettiamo 5 secondi a porta aperta

  startMovimento = millis(); // aggiorno la variabile per eseguire la chiusura
  while (millis() - startMovimento <= 500) { //come per l'apertura ma con i pin al contrario
    digitalWrite(pinM1, HIGH);
    digitalWrite(pinM2, LOW);
    analogWrite(pinM3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  }

  //blocchiamo il motore
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, LOW);
  startTempo = false; //riporto il flag a false per ricominciare tutto
  aperturaEffettuata = true; // alzo il flag per prevenire che si riapra la cabina all'infinito
}



mi sono appena accorto che millis() per l'apertura e chiusura non ha senso con il while. In quel caso si può usare il delay(). Anche perché mentre l'ascensore apre e chiude la porta non deve fare nient'altro.
Quindi ho corretto il codice e te lo posto. Ho tolto la variabile startMovimento e modificato il codice per renderlo funzionante... vedrai che è molto simile al precedente, ho modificato sostanzialmente la seconda parte (la comodità della programmazione a stati finiti).
Code: [Select]

#define pinPhoto 6
#define pinM1 7
#define pinM2 8
#define pinM3 9
int attesa = 2000;
unsigned long tempoPhoto;
boolean startTempo = false;
boolean aperturaEffettuata = false;

void setup() {
  pinMode(pinPhoto, INPUT); // pin fotocellula
  pinMode(pinM1, OUTPUT); // questi tre per il motore
  pinMode(pinM2, OUTPUT);
  pinMode(pinM3, OUTPUT);
  tempoPhoto = 0;
}

void loop() {
  byte lettura = digitalRead(pinPhoto); //leggo lo stato della fotocellula
  if (aperturaEffettuata == false) { //se non è stata eseguita l'apertura
    if (lettura == LOW) { //se c'è la cabina
      if (startTempo == false) { //se non è stato settato il tempo
        tempoPhoto = millis(); //lo settiamo adesso
        startTempo = true; //alzo il flag per escludere questo dal prossimo loop
      }
      if (millis() - tempoPhoto >= attesa && startTempo == true) { // se è terminata l'attesa di 2 sec ed è stato fissato lo start
        muoviMotore();
      }
    }
  }
}

void muoviMotore() {
  //vado ad effettuare subito l'apertura
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, HIGH);
  analogWrite(pinM3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  delay(500); //questo serve per far andare il motore fino a quando non apre completamente

  // ad apertura completata blocchiamo il motore
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, LOW);

  //impostiamo l'attesa con la porta aperta
  delay(5000); //aspettiamo 5 secondi a porta aperta

  //come per l'apertura ma con i pin al contrario
  digitalWrite(pinM1, HIGH);
  digitalWrite(pinM2, LOW);
  analogWrite(pinM3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  delay(500);

  //blocchiamo il motore
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM2, LOW);
  startTempo = false; //riporto il flag a false per ricominciare tutto
  aperturaEffettuata = true; // alzo il flag per prevenire che si riapra la cabina all'infinito
}



Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

miky_police

Di seguito un altro modo per mettere più motori, anche se ce ne sono decine di modi diversi....
Code: [Select]

#define pinPhoto 6
int attesa = 2000;
unsigned long tempoPhoto;
boolean startTempo = false;
boolean aperturaEffettuata = false;

//definizione nuovo tipo di dato
typedef struct {
  const byte pin1;
  const byte pin2;
  const byte pin3;
} pinMotor;
//associazione pin di ogni motore basati su pinMotor
pinMotor motore1 = {7, 8, 9};
pinMotor motore2 = {4, 5, 6};
//in questo modo puoi aggiungere quanti motori vuoi

void setup() {

  pinMode(pinPhoto, INPUT); // pin fotocellula
  pinMode(motore1.pin1, OUTPUT);
  pinMode(motore1.pin2, OUTPUT);
  pinMode(motore1.pin3, OUTPUT);
  pinMode(motore2.pin1, OUTPUT);
  pinMode(motore2.pin2, OUTPUT);
  pinMode(motore2.pin3, OUTPUT);
  tempoPhoto = 0;
}

void loop() {
  byte lettura = digitalRead(pinPhoto); //leggo lo stato della fotocellula
  if (aperturaEffettuata == false) { //se non è stata eseguita l'apertura
    if (lettura == LOW) { //se c'è la cabina
      if (startTempo == false) { //se non è stato settato il tempo
        tempoPhoto = millis(); //lo settiamo adesso
        startTempo = true; //alzo il flag per escludere questo dal prossimo loop
      }
      if (millis() - tempoPhoto >= attesa && startTempo == true) { // se è terminata l'attesa di 2 sec ed è stato fissato lo start
        muoviMotore(motore1.pin1, motore1.pin2, motore1.pin3); //se vuoi muovere il motore 1
        /*muoviMotore(motore2.pin1, motore2.pin2, motore2.pin3);
         *  se vuoi muovere il motore 2
         *  ovviamente devi mettere sotto un if per capire
         *  quale motore deve essere processato su muoviMotore()
         */
      }
    }
  }
}

void muoviMotore(const byte pinA, const byte pinB, const byte pinC) {
  //vado ad effettuare subito l'apertura
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, HIGH);
  analogWrite(pinC, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  delay(500); //questo serve per far andare il motore fino a quando non apre completamente

  // ad apertura completata blocchiamo il motore
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);

  //impostiamo l'attesa con la porta aperta
  delay(5000); //aspettiamo 5 secondi a porta aperta

  //come per l'apertura ma con i pin al contrario
  digitalWrite(pinA, HIGH);
  digitalWrite(pinB, LOW);
  analogWrite(pinC, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  delay(500);

  //blocchiamo il motore
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  startTempo = false; //riporto il flag a false per ricominciare tutto
  aperturaEffettuata = true; // alzo il flag per prevenire che si riapra la cabina all'infinito
}
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

gtanix

Ciao, inanzi tutto grazie mille a tutti, siete stati grandiosi, ho provato ad aggiungere i motori eccetera ma mi da dei problemi, vi posto il codice e l errore
Code: [Select]

#define pinPhotoZer A0
#define pinPhotoUno A1
#define pinPhotoDue A2
#define pinPhotoTre A3
int attesa = 2000;
unsigned long tempoPhoto;
boolean startTempo = false;
boolean aperturaEffettuata = false;

//definizione nuovo tipo di dato
typedef struct {
  const byte pin1;
  const byte pin2;
  const byte pin3;
} pinMotor;
//associazione pin di ogni motore basati su pinMotor
pinMotor motore1 = {0, 1, 2};
pinMotor motore2 = {3, 4, 5};
pinMotor motere3 = {6, 7, 8};
pinMotor motore4 = {9,10,11};
//in questo modo puoi aggiungere quanti motori vuoi

void setup() {

  pinMode(pinPhotoZer, INPUT);
  pinMode(pinPhotoUno, INPUT);
  pinMode(pinPhotoDue, INPUT);
  pinMode(pinPhotoTre, INPUT);// pin fotocellula
  pinMode(motore1.pin1, OUTPUT);
  pinMode(motore1.pin2, OUTPUT);
  pinMode(motore1.pin3, OUTPUT);
  pinMode(motore2.pin1, OUTPUT);
  pinMode(motore2.pin2, OUTPUT);
  pinMode(motore2.pin3, OUTPUT);
  pinMode(motore3.pin1, OUTPUT);
  pinMode(motore3.pin2, OUTPUT);
  pinMode(motore3.pin3, OUTPUT);
  pinMode(motore4.pin1, OUTPUT);
  pinMode(motore4.pin2, OUTPUT);
  pinMode(motore4.pin3, OUTPUT);
  tempoPhoto = 0;
}

void loop() {
  byte lettura = digitalRead(pinPhoto); //leggo lo stato della fotocellula
  if (aperturaEffettuata == false) { //se non è stata eseguita l'apertura
    if (lettura == LOW) { //se c'è la cabina
      if (startTempo == false) { //se non è stato settato il tempo
        tempoPhoto = millis(); //lo settiamo adesso
        startTempo = true; //alzo il flag per escludere questo dal prossimo loop
      }
      if (millis() - tempoPhoto >= attesa && startTempo == true) { // se è terminata l'attesa di 2 sec ed è stato fissato lo start
        muoviMotore(motore1.pin1, motore1.pin2, motore1.pin3);
        muoviMotore(motore2.pin1, motore1.pin2, motore1.pin3);
        muoviMotore(motore3.pin1, motore1.pin2, motore1.pin3);
        muoviMotore(motore4.pin1, motore1.pin2, motore1.pin3);//se vuoi muovere il motore 1
        /*muoviMotore(motore2.pin1, motore2.pin2, motore2.pin3);
         *  se vuoi muovere il motore 2
         *  ovviamente devi mettere sotto un if per capire
         *  quale motore deve essere processato su muoviMotore()
         */
      }
    }
  }
}

void muoviMotore(const byte pin1, const byte pin2, const byte pin3) {
  //vado ad effettuare subito l'apertura
  digitalWrite(pin1, LOW);
  digitalWrite(pin2, HIGH);
  analogWrite(pin3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  delay(500); //questo serve per far andare il motore fino a quando non apre completamente

  // ad apertura completata blocchiamo il motore
  digitalWrite(pin1, LOW);
  digitalWrite(pin2, LOW);

  //impostiamo l'attesa con la porta aperta
  delay(5000); //aspettiamo 5 secondi a porta aperta

  //come per l'apertura ma con i pin al contrario
  digitalWrite(pin1, HIGH);
  digitalWrite(pin2, LOW);
  analogWrite(pin3, 30); //questi ultimi 3 dati sono a caso... da impostare sul campo
  delay(500);

  //blocchiamo il motore
  digitalWrite(pin1, LOW);
  digitalWrite(pin2, LOW);
  startTempo = false; //riporto il flag a false per ricominciare tutto
  aperturaEffettuata = true; // alzo il flag per prevenire che si riapra la cabina all'infinito
}
questo e' l errore
Code: [Select]
Arduino:1.8.5 (Windows 7), Scheda:"Arduino/Genuino Uno"

C:\Users\gaetano\AppData\Local\Temp\arduino_modified_sketch_112513\sketch_jun28a.ino: In function 'void setup()':

sketch_jun28a:36: error: 'motore3' was not declared in this scope

   pinMode(motore3.pin1, OUTPUT);

           ^

C:\Users\gaetano\AppData\Local\Temp\arduino_modified_sketch_112513\sketch_jun28a.ino: In function 'void loop()':

sketch_jun28a:46: error: 'pinPhoto' was not declared in this scope

   byte lettura = digitalRead(pinPhoto); //leggo lo stato della fotocellula

                              ^

exit status 1
'motore3' was not declared in this scope

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

miky_police

Quote
pinMotor motere3 = {6, 7, 8}
lo hai dichiarato come motere e non MOTORE
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

miky_police

#41
Jun 28, 2018, 08:57 pm Last Edit: Jun 28, 2018, 09:05 pm by miky_police
attento però perché per come hai scritto il codice i motori si muoveranno uno alla volta proprio perché la funzione muoviMotore() è così detta bloccante per via dei delay() nonché per come è stato pensato e redatto il codice...

EDIT: altra nota di rilievo è la definizione del pin3 che deve essere necessariamente pwm per utilizzare analogWrite() in muoviMotore().

EDIT2: il secondo errore sulla fotocellula è dovuto al fatto che hai cambiato il nome della variabile prima del setup ma poi non hai adeguato il loop
Quote
byte lettura = digitalRead(pinPhoto);
Come vedi hai lasciato il nome che ho assegnato io e che tu hai cambiato in altro (pinPhotoZer, ecc)

Che i big mi riprendano tranquillamente se indico castronate :D
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

miky_police

pensandoci, ti ho suggerito il typedef struct nonostante non l'ho mai utilizzato... l'ho scritto, ha compilato senza errori e te l'ho girato... Non è che scrivo codice da tantissimo, ma mi applico per capire le cose e non sempre per progetti che mi riguardano direttamente... pian piano arriverò a scrivermi le prime librerie :D
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

miky_police

quindi dopo 43 post com'è finita??? :D
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

Go Up