Come ritardare un ingresso

Salve ragazzi spero di riuscire a spiegarmi:

Io ho un ciclo if di questo tipo

if ( p1==high)&&(p2==high)&&(p3==high) {

condizione = 1 ;
}

ora io vi chiedo è possibile ritardare il p3 in modo che comunque l'if dia un risultato true

il p3 nel mio caso è una fotocellula che all'inizio del ciclo per 2 secondi non è allineata per poi esserlo successivamente .

Spero di essermi spiegato....perdonatemi

ciao...a te servono tutte e tre le condizioni contemporaneamente ma con P3 true solo se mantieno lo stato HIGH per x tempo o serve che P1 e P2 mantengano uno stato HIGH, anche se poi passano a LOW, e poi verificare se P3 è HIGH per x tempo?

La tua seconda affermazione è quello che mi serve

beh se sei sicuro dei 2 secondi

if (( p1==high)&&(p2==high)) {
   delay(2000);
   if (p3==high) {
      condizione = 1 ;
   }
}

... high va scritto HIGH altrimenti non funziona :wink:

ciao, cosi' come l'hai scritto la condizione non viene eseguita, c'è una attesa per aspettare il p3,a me serve che la condizione venga comunque eseguita senza p3 che entrerà a far parte della and in un secondo momento...

Cosa allora?
si P1 e P2 devono essere HIGH e dopo 2 secondi anche P3 non si puó avere il risultato prima che i 2 secondi siano trascorsi.
Spiegati meglio.
Ciao Uwe

ciao...potresti fare (fai bene attenzione a quello che ho scritto potresti dover modificare qualche cosa):

  if (P1 == LOW) {
    P1 = digitalRead(x1);
  }
  if (P2 == LOW) {
    P2 = digitalRead(x2);
  }
  if (P1 && P2) {
    if (digitalRead(x3)) {
      if ( myMillis - millis() >= 2000) {
        // fai quello che devi fare
        P1 = LOW;
        P2 = LOW;
      }
    }
    else {
      myMillis = millis();
    }
  }

intanto grazie,mi riservo di sperimentare.
graizie

Più che scrivere il codice, qui la cosa difficile è capire cosa vuoi fare.

Vediamo se ho capito.

P3 si attiva dopo un paio di secondi DALL'ACCENSIONE DEL SISTEMA, quindi vorresti per i primi 2 secondi fare l'if solo con P1 e P2

potresti anche mettere un delay(2000) alla fine del setup così il loop si avvia con P3 già pronto

Oppure....

P3 si attiva due secondi DOPO L'ATTIVAZIONE di P1 e / o P2

allora dovresti usare un flag da mettere a true se si sono attivati P1 e P2, se questo flag è true usi millis() per vedere quando passano i 2 secondi dall'attivazione del flag e leggi P3, se è 1 fai quello che devi fare e rimetti il flag a false, altrimenti rimetti soltanto il flag a false. Ovviamente devi fare l'if su P1 e P2 solo quando il flag è false, altrimenti ti riparte sempre il contatore.

ciao,intanto grazie per la collaborazione.Dunque la tua prima parte della risposta non va bene in quanto mettendo un delay nel setup non funziona nulla e dunque non raggiungo la condizione di partenza. mentre la seconda è corretta in quanto il ciclo comincia e solo dopo entra in gioco la p3 che poi mi servirà per il resto del ciclo.Potresti mettere due righe di sketch solo ad indicazione.....

ais26:
Io ho un ciclo if di questo tipo

if non è un ciclo. Probabilmente volevi dire: "all'interno di un ciclo ho un if di questo tipo"....

ora io vi chiedo è possibile ritardare il p3 in modo che comunque l'if dia un risultato true
il p3 nel mio caso è una fotocellula che all'inizio del ciclo per 2 secondi non è allineata per poi esserlo successivamente

Di solito una domanda ben posta è già mezza soluzione (adesso la metto in firma...).

In questo caso mi sembra che sia la domanda che il titolo del post portino totalmente fuori strada.

Da quanto capisco sul discorso della fotocellula, non hai nessun un ingresso da ritardare, ma una condizione da rendere comunque vera per i primi due secondi dall'avvio, in attesa che la fotocellula diventi operativa. In sostanza hai un ingresso da anticipare.

Quindi si tratta solo di:

  • scrivere un timer (con millis) che stia alto solo per i primi due secondi dall'avvio
  • fare un OR tra P3 (che continua a funzionare come prima) e l'uscita del timer

Serviranno due variabili per il timer:

boolean  tOut = true;
uint16_t tTime = millis();

Servirà una riga nel ciclo per far funzionare e scadere il timer:

if(tOut  &&  (uint16_t)millis() - tTime > 2000) tOut = false;

E basta aggiungere l'OR alla condizione:

if(p1 && p2 && (p3 || tOut))

sono tre righe e una modifica, e con la variabile a 16 bit risparmiamo anche due byte di memoria.

In pratica, sintetizzando CLAUDIO, devi FORZARE p3 high per 2 secondi per poi passare il "comando" alla fotocellula...

grazie per la pazienza....continuo le prove ma mi hai dato delle belle dritte....

Se deve essere ignorata per i primi 2 secondi dall’accensione:

if (p1==HIGH && p2==HIGH && (p3==HIGH||millis()<2000)) condizione=1 ;

Datman:
Se deve essere ignorata per i primi 2 secondi dall’accensione:

if (p1==HIGH && p2==HIGH && (p3==HIGH || millis()<2000)) condizione=1 ;

Funziona. Però ogni volta che il contatore di millis si azzera (circa ogni 1190 ore) quel pezzo di condizione ritorna attivo per due secondi (nascondendo il vero stato della fotocellula). Può dare fastidio?

byte pippo=0; // bool occupa comunque 1 byte.


if (p1==HIGH && p2==HIGH && (p3==HIGH || (millis()<2000&&pippo==0) )) condizione=1;
if (pippo==0 && millis()>=2000) pippo=1;

credo che ci siamo anche perchè la macchina verrà ogni tanto spenta quindi al riavvio di arduino il millis ripartirà .
Continuo con gli esperimenti…
grazie ragazzi…

Claudio_FF:

      • Una domanda ben posta è già mezza soluzione. * * *

Posso suggerirti " Una domanda ben posta è già mezza risposta."? :slight_smile: