Variazione ingresso led acceso..

Salve, ho questo problema. NON voglio controllarlo con software, ma con un circuito esterno.
Ho un ingresso che riceve un 'input' di volt,
quando cambia l'ingresso, quindi da alto a basso o da basso a alto, deve accendermi un led per circa 4 secondi.
Non riesco a capire come fare il circuito.
qualcuno può aiutarmi?
Grazieeeeeeeeeee

bitmanrc:
Salve, ho questo problema. NON voglio controllarlo con software, ma con un circuito esterno.

Quindi Arduino NON c'entra nulla ? ? ?

Guglielmo

Si centra. Siccome per motivi di programmazione il ciclo di arduino si ripete o meglio ha un delay di 2 secondi (cosa che non vorrei togliere) neppure facendo una lettura con millis()+tempo X, allora vorrei lasciare alto o basso l'ingresso per 4 secondi, il tempo di "attesa", che arduino faccia il ciclo ''void loop() ''

... orrore ...

Guglielmo

Ok, un variometro

Seguito da un impostabile

Nulla di difficile

Certamente più facile che cambiare uno sketch.....

docsavage:
Certamente più facile che cambiare uno sketch.....

Guglielmo

bitmanrc:
vorrei lasciare alto o basso l'ingresso per 4 secondi, il tempo di "attesa", che arduino faccia il ciclo ''void loop() ''

Rabbrividiamo....
Scusa ma il delay() si usa SOLAMENTE se il programma deve fare poche cose ed in particolare sequenza, o per attendere BREVI intervalli che l'hardware faccia "qualcosa" e non è necessario fare altro.

Per cui se vuoi evolvere nell'uso di Arduino ti consiglio CALDAMENTE di rivedere lo sketch e adattarlo in tal senso, altrimenti all'aumentare della complessità dei programmi la gestibilità decresce col quadrato dei delay() utilizzati...

... se proprio NON vuoi mettere mano al programma e togliere il delay() ... collega quel segnale ad un pin con "interrupt" e, nella relativa ISR, alzi solo una flag che poi interroghi comodamente nel loop() quando vuoi.

Guglielmo

Lo sketch è un antifurto,
ogni minuto arduino invia ad un database dei valori e informazioni dello status.
se in quel frangente di 'invio' al database dovesse avere ritardi "nell'agganciare" il client, (in alcuni casi ci mette anche 1 secondo ad inviare), quindi devo essere sicuro che se è andato in allarme l'ingresso dovrà essere letto anche nei secondi successivi all'intervento del sensore posto in giro per l'appartamento.
Conclusione... se ho "ritardi' involontari al sketch, devo essere sicuro che l'ingresso sè è cambiato, deve essere attivo almeno per 3/4 secondi.
Grazie

allego schema del circuito …
sw1, sw2, sw3 sono swicht per simulare l’ingresso alto o basso.

antifurto_contatti2.pdf (7.16 KB)

Come già detto da Guglielmo, usa gli interrupt .
Mi pare stupido usare componenti esterni quando se ne puo’ fare a meno

scusate, ma NON ho molta conoscenza su arduino.
Quindi lo stato dell'ingresso in allarme, potrebbe ritornare in "normale" nel frattempo che arduino si è fermato a eseguire un invio o altro, è quindi il LOOP e 'bloccato'. quando riprende potrebbe NON vederlo più in allarme.
Ecco perchè uso dei componenti esterni.
Secondo voi è sempre valido il vostro consiglio di usare gli interrupt ?
Grazie

Si fa tutto anche via software…
E’ semplice, ti salvi in una variabile (es. “startEvent”) l’istante (con millis() ) dell’evento ON e da quel momento ignori tutti gli altri eventi ON finché millis()-startEvent < tempoMax (con tempoMax in millisecondo quindi 4000).

Così è più concepibile

Ha un processo non interrompibile (una comunicazione)

e quindi lo deve memorizzare

Maledetto correttore di Android

Non impostabile

Ma monostabile

Un monostabile a tre quattro secondi....

Santo 555

Io guarderei in quella direzione....

docdoc:
Si fa tutto anche via software…
E’ semplice, ti salvi in una variabile (es. “startEvent”) l’istante (con millis() ) dell’evento ON e da quel momento ignori tutti gli altri eventi ON finché millis()-startEvent < tempoMax (con tempoMax in millisecondo quindi 4000).

void setuo()
{ 
bla.bla.
pin=22; pinmode(pin,OUTPUT)
}

void loop()
{ 
bla.bla.bla.bla.
}

void InvioDB()
{ 
bla.bla.bla.bla.
}

mi faresti un esempio banale.

Grazie

direi una cosa di questo tipo:

long startEvent = 0;
int lastState = 0;
#define TEMPOMAX 4000

void setuo()
{ 
  //bla.bla.
  pin=22; 
  pinmode(pin,OUTPUT);
}

void loop()
{ 
  //bla.bla.bla.bla.
  int curState = digitalRead(pin);
  // Lo stato corrente è diverso dal precedente?
  if ( curState != lastState ) {
    // Lo stato è diventato HIGH?
    if ( curState == HIGH ) {
	  // Sono passati almeno TEMPOMAX millisecondi?
	  if ( millis()-startEvent >= TEMPOMAX ) {
	    // Allora procedo
        startEvent = millis();
	    InvioDB();
	  }
	} 
	else // stato LOW, resetto startEvent
	  startEvent = 0;
  }
  lastState = curState;
}

void InvioDB()
{ 
  //bla.bla.bla.bla.
}

Scritta al volo, devi provarla ovviamente, ma il senso è questo.

bitmanrc:
Secondo voi è sempre valido il vostro consiglio di usare gli interrupt ?

OGNI volta che hai un evento imprevisto (rispetto al codice) da intercettare la soluzione migliore è un interrupt !

Nel tuo caso è BANALE … e l’unica modifica a livello del codice che già hai è, nel corso del loop(), quando ti è possibile, il controllo di una variabile che, ad esempio, normalmente deve essere FALSE e che se invece trovi TRUE … indica che c’è stato l’evento.

Studiati un po’ di basi QUI e poi la attachInterrupt().

Guglielmo

gpb01:
Nel tuo caso è BANALE ... e l'unica modifica a livello del codice che già hai è, nel corso del loop()

Esattamente, sempre meglio ma comunque sia non basta, se vuole ignorare altri eventi deve sempre tenere traccia del millis() dell'ultimo ed ignorare tutti gli eventi fino a che non sono trascorsi almeno "x" secondi.

docdoc:
Esattamente, sempre meglio ma comunque sia non basta, se vuole ignorare altri eventi ....

Non credo che a lui serva contare QUANTE volte si è avuto un impulso, a lui serve sapese SE c'è stato (allarme) ...
... l'interrupt alza la flag il codice, quando può, DOPO avela letta, la riabassa.

Se invece vuole rendere "sordo" il sistema per X tempo dopo l'evento, allora si, può memorizzare millis() e non risollevare la flag sino al superamento del tempo impostato.

Guglielmo

Giusto, NON mi serve avere il numero di conteggi, ma solo che ogni cambio status del PIN, venga "percepito" da arduino, senza perdere un colpo.
Immaginate che mentre arduino invia il suo aggiornamento è il client è in attesa di collegamento/conferma di
'Client.connect', si verifichi un'introduzione e NON viene percepita da arduino. l'allarme NON si attiverà mai !!!!
Il sistema NON deve essere "sordo", ma in grado di memorizzare (io lo faccio con componenti esterni), il cambio status del PIN, al fine di avere sicurezza di intervento.
Il codice che mi avete suggerito NON credo proprio che sia in grado di interrompere l'invio vero e proprio al DB che si sta verificando in quel momento. Quindi se il 'Client.connect' non è TRUE, non va aventi con il LOOP, ma sta fermo li. ho verificato realmente il programma modificato. ci mette circa 1 secondo per se NON di più a decidere se 'Client.connect' e FALSE o TRUE.
Giusto?