Go Down

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

brunello22

forse è meglio se fai

Code: [Select]
if ( millis() - tempoPorta >= 2000)

e queste due righe, cosa dovrebbero fare ?

Code: [Select]
  digitalWrite (9, 30);
...........
  digitalWrite (9, 100);



gtanix

forse è meglio se fai

Code: [Select]
if ( millis() - tempoPorta >= 2000)

e queste due righe, cosa dovrebbero fare ?

Code: [Select]
  digitalWrite (9, 30);
...........
  digitalWrite (9, 100);



imposta la velocita' del motorino, l ho scritto diverso per fare una prova ma in realta' basta scriverlo una volta sola

brunello22

Forse volevi scrivere analogWrite(9, 100 );

gtanix

Forse volevi scrivere analogWrite(9, 100 );
si esatto scusami, comunque ci siamo quasi, purtroppo non ho modo di testare con millis perche non ho ancora le fotocellule, ma suppongo funzionino come un tasto, quindi non mi rimane che dire ad arduino: quando il tasto rimane premuto per 2 secondi apri e chiudi la porta una sola volta. purtroppo non saprei proprio come dirgli di farlo una sola volta e non saprei proprio come fare una cosa del genere
:
Code: [Select]
byte confronto ()
{
  boolean uguale = true;
for (byte val = HIGH);
{if ( millis() - tempoPorta >= 2000)
{
fai quello che devi fare
}

}
}
che ne dite?

miky_police

Brunello grazie per la correzione tuo #15 su millis().
Svistona (gaffona) :D
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

gtanix

raga nessuno mi risponde?

docdoc

raga nessuno mi risponde?
Qual è la domanda?

Se intendi come fare "quando il tasto rimane premuto per 2 secondi apri e chiudi la porta una sola volta" la funzione "byte confronto ()" che hai postato è completamente priva di significato oltre che non valida (ad esempio "for (byte val = HIGH);" che roba è?).

Inizia a farti da zero uno sketch autonomo che fa (simulando con pulsante e LED) quello che vorresti fare, e poi posta quello. Ma intero, così te lo possiamo provare anche noi. Quando ci sono problemi, sempre separare il problema e sperimentare singolarmente.


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

gtanix

Qual è la domanda?

Se intendi come fare "quando il tasto rimane premuto per 2 secondi apri e chiudi la porta una sola volta" la funzione "byte confronto ()" che hai postato è completamente priva di significato oltre che non valida (ad esempio "for (byte val = HIGH);" che roba è?).

Inizia a farti da zero uno sketch autonomo che fa (simulando con pulsante e LED) quello che vorresti fare, e poi posta quello. Ma intero, così te lo possiamo provare anche noi. Quando ci sono problemi, sempre separare il problema e sperimentare singolarmente.



guarda ci ho provato e riprovato, non riesco in alcun modo ad utilizzare i sensori ottici per dire ad arduino quando il sensore rileva la cabina per 2 secondi apri la porta

gtanix

Ho saputo fare questo fino ad ora , proprio come suggeritomi infatti ho pensato tutto come se fosse solo un led da accendere


Code: [Select]
#define LED 13               
#define SENSORE 7           
int  val = 0;               
 
void setup() { 
  pinMode(LED, OUTPUT);       
  pinMode(SENSORE, INPUT);     

 
void loop() { 
  val = digitalRead(SENSORE);
 
 
  if (val == HIGH) { 
    digitalWrite(LED, HIGH);
  } 
  else { 
    digitalWrite(LED, LOW); 
  } 

docdoc

Ok, quel codice quindi accende il LED finché tieni premuto il pulsante.
Quindi ora devi aggiungere l'implementazione della logica ossia se premi e TIENI PREMUTO il tasto per almeno 2 secondi, accendi il LED (poi per spegnerlo vedremo dopo, sempre per il criterio "un passo alla volta").

Riesci a farlo o ti serve una mano? (aiutino: devi usare millis() memorizzando in una variabile quando rilevi per la PRIMA volta il tasto a HIGH, e resettare la variabile quando diventa LOW...)
Posta i tuoi tentativi così ti aiutiamo.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gtanix

Ok, quel codice quindi accende il LED finché tieni premuto il pulsante.
Quindi ora devi aggiungere l'implementazione della logica ossia se premi e TIENI PREMUTO il tasto per almeno 2 secondi, accendi il LED (poi per spegnerlo vedremo dopo, sempre per il criterio "un passo alla volta").

Riesci a farlo o ti serve una mano? (aiutino: devi usare millis() memorizzando in una variabile quando rilevi per la PRIMA volta il tasto a HIGH, e resettare la variabile quando diventa LOW...)
Posta i tuoi tentativi così ti aiutiamo.

Grazie di cuore,dimmi che ne pensi:
Code: [Select]
#define LED 13
#define SENSORE 7
int  val = 0;
long tempoPremuto = millis;


void setup() {
  pinMode(LED, OUTPUT);
  pinMode(SENSORE, INPUT);
}

void loop() {
  val = digitalRead(SENSORE);
  if (millis() - tempoPremuto > 2000)
  {
    if (val == HIGH) {
      digitalWrite(LED, HIGH);
    }
    else {
      digitalWrite(LED, LOW);
    }
  }
}

docdoc

Beh ad occhio direi che intanto non puoi usare millis in quel modo (mancano le parentesi ed in genere inizializzazioni è meglio metterle nel setup), poi dovresti memorizzare il valore se è la prima volta che risulta premuto.

Prova questo (non testato, né verificato, vedi tu):

Code: [Select]
#define LED 13
#define SENSORE 7

// Millisecondi di attivazione
#define TEMPO 2000

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


void setup() {
  pinMode(LED, OUTPUT);
  pinMode(SENSORE, INPUT);
}

void loop() {
  if ( digitalRead(SENSORE) == HIGH ) {
    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);
  }

}

Questo quindi dovrebbe accendere il LED se premi il pulsante per almeno 2 secondi, prova e vedi se va (cerca di capire bene cosa ho fatto, se hai dubbi chiedi!).

Quando ti funziona, inizia a ragionare su quando dovrai poi spegnerlo, e quindi come fare.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gtanix

Beh ad occhio direi che intanto non puoi usare millis in quel modo (mancano le parentesi ed in genere inizializzazioni è meglio metterle nel setup), poi dovresti memorizzare il valore se è la prima volta che risulta premuto.

Prova questo (non testato, né verificato, vedi tu):

Code: [Select]
#define LED 13
#define SENSORE 7

// Millisecondi di attivazione
#define TEMPO 2000

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


void setup() {
  pinMode(LED, OUTPUT);
  pinMode(SENSORE, INPUT);
}

void loop() {
  if ( digitalRead(SENSORE) == HIGH ) {
    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);
  }

}

Questo quindi dovrebbe accendere il LED se premi il pulsante per almeno 2 secondi, prova e vedi se va (cerca di capire bene cosa ho fatto, se hai dubbi chiedi!).

Quando ti funziona, inizia a ragionare su quando dovrai poi spegnerlo, e quindi come fare.

che ne dici ?
Code: [Select]
#define LED 13
#define SENSORE 7

// Millisecondi di attivazione
#define TEMPO 2000

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


void setup() {
  pinMode(LED, OUTPUT);
  pinMode(SENSORE, INPUT);
}

void loop() {
  if ( digitalRead(SENSORE) == 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);
      delay (3000); //rimane acceso per 3 secondi dopo di che si spegne
      digitalWrite(LED,LOW);
  }


}

docdoc

Se in quei 3 secondi non devi fare altro, va bene, ma non è ancora completo.
Prova ad immaginare (o realizza il circuito e provalo in pratica): cosa succede se tengo premuto il pulsante per più di 5 secondi? E perché?

E soprattutto è una questione di "requisiti" che hai in mente, o che devi necessariamente definire per decidere come implementare una cosa. Ossia al di là di questa implementazione, cosa dovrebbe fare quando, tenendo premuto il tasto, la luce si accende e poi si spegne dopo 3 secondi? Non si deve spegnere finché è premuto? O si deve spegnere dopo 3 secondi e ripetere il tutto solo se rialzo il tasto e lo ripremo per altri 2 secondi?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gtanix

Se in quei 3 secondi non devi fare altro, va bene, ma non è ancora completo.
Prova ad immaginare (o realizza il circuito e provalo in pratica): cosa succede se tengo premuto il pulsante per più di 5 secondi? E perché?

E soprattutto è una questione di "requisiti" che hai in mente, o che devi necessariamente definire per decidere come implementare una cosa. Ossia al di là di questa implementazione, cosa dovrebbe fare quando, tenendo premuto il tasto, la luce si accende e poi si spegne dopo 3 secondi? Non si deve spegnere finché è premuto? O si deve spegnere dopo 3 secondi e ripetere il tutto solo se rialzo il tasto e lo ripremo per altri 2 secondi?
si accende il led ma dopo 3 secondi si spegne anche se tengo premuto il pulsante, perche con il delay la loop si ferma, quindi per far rimanere il led acceso servirebbe un secondo millis, pero' ti dico che a me in realta serve proprio che poi si spenga anche se il pulsante e' chiuso, ho capito bene?

Go Up